blob: 08016683e8aac7b9482698ecff481ba21cbf131d [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"
Linus Torvalds1da177e2005-04-16 15:20:36 -070035
Linus Torvalds1da177e2005-04-16 15:20:36 -070036/* Handle HCI Event packets */
37
Marcel Holtmanna9de9242007-10-20 13:33:56 +020038static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070039{
Marcel Holtmanna9de9242007-10-20 13:33:56 +020040 __u8 status = *((__u8 *) skb->data);
Linus Torvalds1da177e2005-04-16 15:20:36 -070041
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030042 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -070043
Andre Guedes82f47852013-04-30 15:29:34 -030044 if (status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +020045 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -070046
Andre Guedes89352e72011-11-04 14:16:53 -030047 clear_bit(HCI_INQUIRY, &hdev->flags);
Andre Guedes3e13fa12013-03-27 20:04:56 -030048 smp_mb__after_clear_bit(); /* wake_up_bit advises about this barrier */
49 wake_up_bit(&hdev->flags, HCI_INQUIRY);
Andre Guedes89352e72011-11-04 14:16:53 -030050
Marcel Holtmanna9de9242007-10-20 13:33:56 +020051 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -070052}
53
Andre Guedes4d934832012-03-21 00:03:35 -030054static void hci_cc_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
55{
56 __u8 status = *((__u8 *) skb->data);
57
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030058 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesae854a72012-03-21 00:03:36 -030059
60 if (status)
61 return;
62
63 set_bit(HCI_PERIODIC_INQ, &hdev->dev_flags);
Andre Guedes4d934832012-03-21 00:03:35 -030064}
65
Marcel Holtmanna9de9242007-10-20 13:33:56 +020066static void hci_cc_exit_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070067{
Marcel Holtmanna9de9242007-10-20 13:33:56 +020068 __u8 status = *((__u8 *) skb->data);
69
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030070 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +020071
72 if (status)
73 return;
74
Andre Guedesae854a72012-03-21 00:03:36 -030075 clear_bit(HCI_PERIODIC_INQ, &hdev->dev_flags);
76
Marcel Holtmanna9de9242007-10-20 13:33:56 +020077 hci_conn_check_pending(hdev);
78}
79
Gustavo Padovan807deac2012-05-17 00:36:24 -030080static void hci_cc_remote_name_req_cancel(struct hci_dev *hdev,
81 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +020082{
83 BT_DBG("%s", hdev->name);
84}
85
86static void hci_cc_role_discovery(struct hci_dev *hdev, struct sk_buff *skb)
87{
88 struct hci_rp_role_discovery *rp = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -070089 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -070090
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030091 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -070092
Marcel Holtmanna9de9242007-10-20 13:33:56 +020093 if (rp->status)
94 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -070095
Marcel Holtmanna9de9242007-10-20 13:33:56 +020096 hci_dev_lock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -070097
Marcel Holtmanna9de9242007-10-20 13:33:56 +020098 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
99 if (conn) {
100 if (rp->role)
101 conn->link_mode &= ~HCI_LM_MASTER;
102 else
103 conn->link_mode |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700104 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200105
106 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700107}
108
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200109static void hci_cc_read_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
110{
111 struct hci_rp_read_link_policy *rp = (void *) skb->data;
112 struct hci_conn *conn;
113
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300114 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200115
116 if (rp->status)
117 return;
118
119 hci_dev_lock(hdev);
120
121 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
122 if (conn)
123 conn->link_policy = __le16_to_cpu(rp->policy);
124
125 hci_dev_unlock(hdev);
126}
127
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200128static void hci_cc_write_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700129{
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200130 struct hci_rp_write_link_policy *rp = (void *) skb->data;
131 struct hci_conn *conn;
132 void *sent;
133
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300134 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200135
136 if (rp->status)
137 return;
138
139 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LINK_POLICY);
140 if (!sent)
141 return;
142
143 hci_dev_lock(hdev);
144
145 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200146 if (conn)
Harvey Harrison83985312008-05-02 16:25:46 -0700147 conn->link_policy = get_unaligned_le16(sent + 2);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200148
149 hci_dev_unlock(hdev);
150}
151
Gustavo Padovan807deac2012-05-17 00:36:24 -0300152static void hci_cc_read_def_link_policy(struct hci_dev *hdev,
153 struct sk_buff *skb)
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200154{
155 struct hci_rp_read_def_link_policy *rp = (void *) skb->data;
156
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300157 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200158
159 if (rp->status)
160 return;
161
162 hdev->link_policy = __le16_to_cpu(rp->policy);
163}
164
Gustavo Padovan807deac2012-05-17 00:36:24 -0300165static void hci_cc_write_def_link_policy(struct hci_dev *hdev,
166 struct sk_buff *skb)
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200167{
168 __u8 status = *((__u8 *) skb->data);
169 void *sent;
170
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300171 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200172
173 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_DEF_LINK_POLICY);
174 if (!sent)
175 return;
176
177 if (!status)
178 hdev->link_policy = get_unaligned_le16(sent);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200179}
180
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200181static void hci_cc_reset(struct hci_dev *hdev, struct sk_buff *skb)
182{
183 __u8 status = *((__u8 *) skb->data);
184
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300185 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200186
Gustavo F. Padovan10572132011-03-16 15:36:29 -0300187 clear_bit(HCI_RESET, &hdev->flags);
188
Johan Hedberga297e972012-02-21 17:55:47 +0200189 /* Reset all non-persistent flags */
Johan Hedberg2cc6fb02013-03-15 17:06:57 -0500190 hdev->dev_flags &= ~HCI_PERSISTENT_MASK;
Andre Guedes69775ff2012-02-23 16:50:05 +0200191
192 hdev->discovery.state = DISCOVERY_STOPPED;
Johan Hedbergbbaf4442012-11-08 01:22:59 +0100193 hdev->inq_tx_power = HCI_TX_POWER_INVALID;
194 hdev->adv_tx_power = HCI_TX_POWER_INVALID;
Johan Hedberg3f0f5242012-11-08 01:23:00 +0100195
196 memset(hdev->adv_data, 0, sizeof(hdev->adv_data));
197 hdev->adv_data_len = 0;
Marcel Holtmannf8e808b2013-10-16 00:16:47 -0700198
199 memset(hdev->scan_rsp_data, 0, sizeof(hdev->scan_rsp_data));
200 hdev->scan_rsp_data_len = 0;
Marcel Holtmann06f5b772013-10-19 07:09:11 -0700201
Marcel Holtmann533553f2014-03-21 12:18:10 -0700202 hdev->le_scan_type = LE_SCAN_PASSIVE;
203
Marcel Holtmann06f5b772013-10-19 07:09:11 -0700204 hdev->ssp_debug_mode = 0;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200205}
206
207static void hci_cc_write_local_name(struct hci_dev *hdev, struct sk_buff *skb)
208{
209 __u8 status = *((__u8 *) skb->data);
210 void *sent;
211
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300212 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200213
214 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LOCAL_NAME);
215 if (!sent)
216 return;
217
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200218 hci_dev_lock(hdev);
219
Johan Hedbergf51d5b22012-02-22 18:17:32 +0200220 if (test_bit(HCI_MGMT, &hdev->dev_flags))
221 mgmt_set_local_name_complete(hdev, sent, status);
Johan Hedberg28cc7bd2012-02-22 21:06:55 +0200222 else if (!status)
223 memcpy(hdev->dev_name, sent, HCI_MAX_NAME_LENGTH);
Johan Hedbergf51d5b22012-02-22 18:17:32 +0200224
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200225 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200226}
227
228static void hci_cc_read_local_name(struct hci_dev *hdev, struct sk_buff *skb)
229{
230 struct hci_rp_read_local_name *rp = (void *) skb->data;
231
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300232 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200233
234 if (rp->status)
235 return;
236
Johan Hedbergdb99b5f2012-02-22 20:14:22 +0200237 if (test_bit(HCI_SETUP, &hdev->dev_flags))
238 memcpy(hdev->dev_name, rp->name, HCI_MAX_NAME_LENGTH);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200239}
240
241static void hci_cc_write_auth_enable(struct hci_dev *hdev, struct sk_buff *skb)
242{
243 __u8 status = *((__u8 *) skb->data);
244 void *sent;
245
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300246 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200247
248 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_AUTH_ENABLE);
249 if (!sent)
250 return;
251
252 if (!status) {
253 __u8 param = *((__u8 *) sent);
254
255 if (param == AUTH_ENABLED)
256 set_bit(HCI_AUTH, &hdev->flags);
257 else
258 clear_bit(HCI_AUTH, &hdev->flags);
259 }
260
Johan Hedberg33ef95e2012-02-16 23:56:27 +0200261 if (test_bit(HCI_MGMT, &hdev->dev_flags))
262 mgmt_auth_enable_complete(hdev, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200263}
264
265static void hci_cc_write_encrypt_mode(struct hci_dev *hdev, struct sk_buff *skb)
266{
267 __u8 status = *((__u8 *) skb->data);
268 void *sent;
269
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300270 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200271
272 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_ENCRYPT_MODE);
273 if (!sent)
274 return;
275
276 if (!status) {
277 __u8 param = *((__u8 *) sent);
278
279 if (param)
280 set_bit(HCI_ENCRYPT, &hdev->flags);
281 else
282 clear_bit(HCI_ENCRYPT, &hdev->flags);
283 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200284}
285
286static void hci_cc_write_scan_enable(struct hci_dev *hdev, struct sk_buff *skb)
287{
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200288 __u8 param, status = *((__u8 *) skb->data);
289 int old_pscan, old_iscan;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200290 void *sent;
291
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300292 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200293
294 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SCAN_ENABLE);
295 if (!sent)
296 return;
297
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200298 param = *((__u8 *) sent);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200299
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200300 hci_dev_lock(hdev);
301
Mikel Astizfa1bd912012-08-09 09:52:29 +0200302 if (status) {
Johan Hedberg744cf192011-11-08 20:40:14 +0200303 mgmt_write_scan_failed(hdev, param, status);
Johan Hedberg2d7cee52011-11-07 22:16:03 +0200304 hdev->discov_timeout = 0;
305 goto done;
306 }
307
Johan Hedberg0663ca22013-10-02 13:43:14 +0300308 /* We need to ensure that we set this back on if someone changed
309 * the scan mode through a raw HCI socket.
310 */
311 set_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);
312
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200313 old_pscan = test_and_clear_bit(HCI_PSCAN, &hdev->flags);
314 old_iscan = test_and_clear_bit(HCI_ISCAN, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200315
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200316 if (param & SCAN_INQUIRY) {
317 set_bit(HCI_ISCAN, &hdev->flags);
318 if (!old_iscan)
Johan Hedberg744cf192011-11-08 20:40:14 +0200319 mgmt_discoverable(hdev, 1);
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200320 } else if (old_iscan)
Johan Hedberg744cf192011-11-08 20:40:14 +0200321 mgmt_discoverable(hdev, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200322
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200323 if (param & SCAN_PAGE) {
324 set_bit(HCI_PSCAN, &hdev->flags);
325 if (!old_pscan)
Johan Hedberg744cf192011-11-08 20:40:14 +0200326 mgmt_connectable(hdev, 1);
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200327 } else if (old_pscan)
Johan Hedberg744cf192011-11-08 20:40:14 +0200328 mgmt_connectable(hdev, 0);
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200329
330done:
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200331 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200332}
333
334static void hci_cc_read_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
335{
336 struct hci_rp_read_class_of_dev *rp = (void *) skb->data;
337
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300338 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200339
340 if (rp->status)
341 return;
342
343 memcpy(hdev->dev_class, rp->dev_class, 3);
344
345 BT_DBG("%s class 0x%.2x%.2x%.2x", hdev->name,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300346 hdev->dev_class[2], hdev->dev_class[1], hdev->dev_class[0]);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200347}
348
349static void hci_cc_write_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
350{
351 __u8 status = *((__u8 *) skb->data);
352 void *sent;
353
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300354 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200355
356 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_CLASS_OF_DEV);
357 if (!sent)
358 return;
359
Marcel Holtmann7f9a9032012-02-22 18:38:01 +0100360 hci_dev_lock(hdev);
361
362 if (status == 0)
363 memcpy(hdev->dev_class, sent, 3);
364
365 if (test_bit(HCI_MGMT, &hdev->dev_flags))
366 mgmt_set_class_of_dev_complete(hdev, sent, status);
367
368 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200369}
370
371static void hci_cc_read_voice_setting(struct hci_dev *hdev, struct sk_buff *skb)
372{
373 struct hci_rp_read_voice_setting *rp = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700374 __u16 setting;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200375
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300376 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200377
378 if (rp->status)
379 return;
380
381 setting = __le16_to_cpu(rp->voice_setting);
382
Marcel Holtmannf383f272008-07-14 20:13:47 +0200383 if (hdev->voice_setting == setting)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200384 return;
385
386 hdev->voice_setting = setting;
387
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300388 BT_DBG("%s voice setting 0x%4.4x", hdev->name, setting);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200389
Gustavo F. Padovan3c547112011-12-14 22:58:44 -0200390 if (hdev->notify)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200391 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200392}
393
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300394static void hci_cc_write_voice_setting(struct hci_dev *hdev,
395 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200396{
397 __u8 status = *((__u8 *) skb->data);
Marcel Holtmannf383f272008-07-14 20:13:47 +0200398 __u16 setting;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700399 void *sent;
400
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300401 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700402
Marcel Holtmannf383f272008-07-14 20:13:47 +0200403 if (status)
404 return;
405
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200406 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_VOICE_SETTING);
407 if (!sent)
408 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700409
Marcel Holtmannf383f272008-07-14 20:13:47 +0200410 setting = get_unaligned_le16(sent);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700411
Marcel Holtmannf383f272008-07-14 20:13:47 +0200412 if (hdev->voice_setting == setting)
413 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700414
Marcel Holtmannf383f272008-07-14 20:13:47 +0200415 hdev->voice_setting = setting;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300417 BT_DBG("%s voice setting 0x%4.4x", hdev->name, setting);
Marcel Holtmannf383f272008-07-14 20:13:47 +0200418
Gustavo F. Padovan3c547112011-12-14 22:58:44 -0200419 if (hdev->notify)
Marcel Holtmannf383f272008-07-14 20:13:47 +0200420 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700421}
422
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -0700423static void hci_cc_read_num_supported_iac(struct hci_dev *hdev,
424 struct sk_buff *skb)
425{
426 struct hci_rp_read_num_supported_iac *rp = (void *) skb->data;
427
428 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
429
430 if (rp->status)
431 return;
432
433 hdev->num_iac = rp->num_iac;
434
435 BT_DBG("%s num iac %d", hdev->name, hdev->num_iac);
436}
437
Marcel Holtmann333140b2008-07-14 20:13:48 +0200438static void hci_cc_write_ssp_mode(struct hci_dev *hdev, struct sk_buff *skb)
439{
440 __u8 status = *((__u8 *) skb->data);
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300441 struct hci_cp_write_ssp_mode *sent;
Marcel Holtmann333140b2008-07-14 20:13:48 +0200442
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300443 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann333140b2008-07-14 20:13:48 +0200444
Marcel Holtmann333140b2008-07-14 20:13:48 +0200445 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SSP_MODE);
446 if (!sent)
447 return;
448
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300449 if (!status) {
450 if (sent->mode)
Johan Hedbergcad718e2013-04-17 15:00:51 +0300451 hdev->features[1][0] |= LMP_HOST_SSP;
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300452 else
Johan Hedbergcad718e2013-04-17 15:00:51 +0300453 hdev->features[1][0] &= ~LMP_HOST_SSP;
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300454 }
455
Johan Hedberged2c4ee2012-02-17 00:56:28 +0200456 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300457 mgmt_ssp_enable_complete(hdev, sent->mode, status);
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200458 else if (!status) {
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300459 if (sent->mode)
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200460 set_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
461 else
462 clear_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
463 }
Marcel Holtmann333140b2008-07-14 20:13:48 +0200464}
465
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800466static void hci_cc_write_sc_support(struct hci_dev *hdev, struct sk_buff *skb)
467{
468 u8 status = *((u8 *) skb->data);
469 struct hci_cp_write_sc_support *sent;
470
471 BT_DBG("%s status 0x%2.2x", hdev->name, status);
472
473 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SC_SUPPORT);
474 if (!sent)
475 return;
476
477 if (!status) {
478 if (sent->support)
479 hdev->features[1][0] |= LMP_HOST_SC;
480 else
481 hdev->features[1][0] &= ~LMP_HOST_SC;
482 }
483
484 if (test_bit(HCI_MGMT, &hdev->dev_flags))
485 mgmt_sc_enable_complete(hdev, sent->support, status);
486 else if (!status) {
487 if (sent->support)
488 set_bit(HCI_SC_ENABLED, &hdev->dev_flags);
489 else
490 clear_bit(HCI_SC_ENABLED, &hdev->dev_flags);
491 }
492}
493
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200494static void hci_cc_read_local_version(struct hci_dev *hdev, struct sk_buff *skb)
495{
496 struct hci_rp_read_local_version *rp = (void *) skb->data;
497
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300498 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200499
500 if (rp->status)
Johan Hedberg42c6b122013-03-05 20:37:49 +0200501 return;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200502
Marcel Holtmann0d5551f2013-10-18 12:04:50 -0700503 if (test_bit(HCI_SETUP, &hdev->dev_flags)) {
504 hdev->hci_ver = rp->hci_ver;
505 hdev->hci_rev = __le16_to_cpu(rp->hci_rev);
506 hdev->lmp_ver = rp->lmp_ver;
507 hdev->manufacturer = __le16_to_cpu(rp->manufacturer);
508 hdev->lmp_subver = __le16_to_cpu(rp->lmp_subver);
509 }
Johan Hedbergd5859e22011-01-25 01:19:58 +0200510}
511
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300512static void hci_cc_read_local_commands(struct hci_dev *hdev,
513 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200514{
515 struct hci_rp_read_local_commands *rp = (void *) skb->data;
516
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300517 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200518
Marcel Holtmann6a070e62013-10-31 04:54:33 -0700519 if (rp->status)
520 return;
521
522 if (test_bit(HCI_SETUP, &hdev->dev_flags))
Johan Hedberg2177bab2013-03-05 20:37:43 +0200523 memcpy(hdev->commands, rp->commands, sizeof(hdev->commands));
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200524}
525
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300526static void hci_cc_read_local_features(struct hci_dev *hdev,
527 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200528{
529 struct hci_rp_read_local_features *rp = (void *) skb->data;
530
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300531 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200532
533 if (rp->status)
534 return;
535
536 memcpy(hdev->features, rp->features, 8);
537
538 /* Adjust default settings according to features
539 * supported by device. */
540
Johan Hedbergcad718e2013-04-17 15:00:51 +0300541 if (hdev->features[0][0] & LMP_3SLOT)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200542 hdev->pkt_type |= (HCI_DM3 | HCI_DH3);
543
Johan Hedbergcad718e2013-04-17 15:00:51 +0300544 if (hdev->features[0][0] & LMP_5SLOT)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200545 hdev->pkt_type |= (HCI_DM5 | HCI_DH5);
546
Johan Hedbergcad718e2013-04-17 15:00:51 +0300547 if (hdev->features[0][1] & LMP_HV2) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200548 hdev->pkt_type |= (HCI_HV2);
549 hdev->esco_type |= (ESCO_HV2);
550 }
551
Johan Hedbergcad718e2013-04-17 15:00:51 +0300552 if (hdev->features[0][1] & LMP_HV3) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200553 hdev->pkt_type |= (HCI_HV3);
554 hdev->esco_type |= (ESCO_HV3);
555 }
556
Andre Guedes45db810f2012-07-24 15:03:49 -0300557 if (lmp_esco_capable(hdev))
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200558 hdev->esco_type |= (ESCO_EV3);
559
Johan Hedbergcad718e2013-04-17 15:00:51 +0300560 if (hdev->features[0][4] & LMP_EV4)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200561 hdev->esco_type |= (ESCO_EV4);
562
Johan Hedbergcad718e2013-04-17 15:00:51 +0300563 if (hdev->features[0][4] & LMP_EV5)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200564 hdev->esco_type |= (ESCO_EV5);
565
Johan Hedbergcad718e2013-04-17 15:00:51 +0300566 if (hdev->features[0][5] & LMP_EDR_ESCO_2M)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100567 hdev->esco_type |= (ESCO_2EV3);
568
Johan Hedbergcad718e2013-04-17 15:00:51 +0300569 if (hdev->features[0][5] & LMP_EDR_ESCO_3M)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100570 hdev->esco_type |= (ESCO_3EV3);
571
Johan Hedbergcad718e2013-04-17 15:00:51 +0300572 if (hdev->features[0][5] & LMP_EDR_3S_ESCO)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100573 hdev->esco_type |= (ESCO_2EV5 | ESCO_3EV5);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200574}
575
Andre Guedes971e3a42011-06-30 19:20:52 -0300576static void hci_cc_read_local_ext_features(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300577 struct sk_buff *skb)
Andre Guedes971e3a42011-06-30 19:20:52 -0300578{
579 struct hci_rp_read_local_ext_features *rp = (void *) skb->data;
580
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300581 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andre Guedes971e3a42011-06-30 19:20:52 -0300582
583 if (rp->status)
Johan Hedberg42c6b122013-03-05 20:37:49 +0200584 return;
Andre Guedes971e3a42011-06-30 19:20:52 -0300585
Marcel Holtmann57af75a2013-10-18 12:04:47 -0700586 if (hdev->max_page < rp->max_page)
587 hdev->max_page = rp->max_page;
Johan Hedbergd2c5d772013-04-17 15:00:52 +0300588
Johan Hedbergcad718e2013-04-17 15:00:51 +0300589 if (rp->page < HCI_MAX_PAGES)
590 memcpy(hdev->features[rp->page], rp->features, 8);
Andre Guedes971e3a42011-06-30 19:20:52 -0300591}
592
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200593static void hci_cc_read_flow_control_mode(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300594 struct sk_buff *skb)
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200595{
596 struct hci_rp_read_flow_control_mode *rp = (void *) skb->data;
597
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300598 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200599
Johan Hedberg42c6b122013-03-05 20:37:49 +0200600 if (!rp->status)
601 hdev->flow_ctl_mode = rp->mode;
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200602}
603
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200604static void hci_cc_read_buffer_size(struct hci_dev *hdev, struct sk_buff *skb)
605{
606 struct hci_rp_read_buffer_size *rp = (void *) skb->data;
607
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300608 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200609
610 if (rp->status)
611 return;
612
613 hdev->acl_mtu = __le16_to_cpu(rp->acl_mtu);
614 hdev->sco_mtu = rp->sco_mtu;
615 hdev->acl_pkts = __le16_to_cpu(rp->acl_max_pkt);
616 hdev->sco_pkts = __le16_to_cpu(rp->sco_max_pkt);
617
618 if (test_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks)) {
619 hdev->sco_mtu = 64;
620 hdev->sco_pkts = 8;
621 }
622
623 hdev->acl_cnt = hdev->acl_pkts;
624 hdev->sco_cnt = hdev->sco_pkts;
625
Gustavo Padovan807deac2012-05-17 00:36:24 -0300626 BT_DBG("%s acl mtu %d:%d sco mtu %d:%d", hdev->name, hdev->acl_mtu,
627 hdev->acl_pkts, hdev->sco_mtu, hdev->sco_pkts);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200628}
629
630static void hci_cc_read_bd_addr(struct hci_dev *hdev, struct sk_buff *skb)
631{
632 struct hci_rp_read_bd_addr *rp = (void *) skb->data;
633
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300634 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200635
636 if (!rp->status)
637 bacpy(&hdev->bdaddr, &rp->bdaddr);
Johan Hedberg23bb5762010-12-21 23:01:27 +0200638}
639
Johan Hedbergf332ec62013-03-15 17:07:11 -0500640static void hci_cc_read_page_scan_activity(struct hci_dev *hdev,
641 struct sk_buff *skb)
642{
643 struct hci_rp_read_page_scan_activity *rp = (void *) skb->data;
644
645 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
646
647 if (test_bit(HCI_INIT, &hdev->flags) && !rp->status) {
648 hdev->page_scan_interval = __le16_to_cpu(rp->interval);
649 hdev->page_scan_window = __le16_to_cpu(rp->window);
650 }
651}
652
Johan Hedberg4a3ee762013-03-15 17:07:12 -0500653static void hci_cc_write_page_scan_activity(struct hci_dev *hdev,
654 struct sk_buff *skb)
655{
656 u8 status = *((u8 *) skb->data);
657 struct hci_cp_write_page_scan_activity *sent;
658
659 BT_DBG("%s status 0x%2.2x", hdev->name, status);
660
661 if (status)
662 return;
663
664 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY);
665 if (!sent)
666 return;
667
668 hdev->page_scan_interval = __le16_to_cpu(sent->interval);
669 hdev->page_scan_window = __le16_to_cpu(sent->window);
670}
671
Johan Hedbergf332ec62013-03-15 17:07:11 -0500672static void hci_cc_read_page_scan_type(struct hci_dev *hdev,
673 struct sk_buff *skb)
674{
675 struct hci_rp_read_page_scan_type *rp = (void *) skb->data;
676
677 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
678
679 if (test_bit(HCI_INIT, &hdev->flags) && !rp->status)
680 hdev->page_scan_type = rp->type;
681}
682
Johan Hedberg4a3ee762013-03-15 17:07:12 -0500683static void hci_cc_write_page_scan_type(struct hci_dev *hdev,
684 struct sk_buff *skb)
685{
686 u8 status = *((u8 *) skb->data);
687 u8 *type;
688
689 BT_DBG("%s status 0x%2.2x", hdev->name, status);
690
691 if (status)
692 return;
693
694 type = hci_sent_cmd_data(hdev, HCI_OP_WRITE_PAGE_SCAN_TYPE);
695 if (type)
696 hdev->page_scan_type = *type;
697}
698
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200699static void hci_cc_read_data_block_size(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300700 struct sk_buff *skb)
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200701{
702 struct hci_rp_read_data_block_size *rp = (void *) skb->data;
703
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300704 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200705
706 if (rp->status)
707 return;
708
709 hdev->block_mtu = __le16_to_cpu(rp->max_acl_len);
710 hdev->block_len = __le16_to_cpu(rp->block_len);
711 hdev->num_blocks = __le16_to_cpu(rp->num_blocks);
712
713 hdev->block_cnt = hdev->num_blocks;
714
715 BT_DBG("%s blk mtu %d cnt %d len %d", hdev->name, hdev->block_mtu,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300716 hdev->block_cnt, hdev->block_len);
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200717}
718
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300719static void hci_cc_read_local_amp_info(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300720 struct sk_buff *skb)
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300721{
722 struct hci_rp_read_local_amp_info *rp = (void *) skb->data;
723
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300724 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300725
726 if (rp->status)
Andrei Emeltchenko8e2a0d92012-09-27 17:26:08 +0300727 goto a2mp_rsp;
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300728
729 hdev->amp_status = rp->amp_status;
730 hdev->amp_total_bw = __le32_to_cpu(rp->total_bw);
731 hdev->amp_max_bw = __le32_to_cpu(rp->max_bw);
732 hdev->amp_min_latency = __le32_to_cpu(rp->min_latency);
733 hdev->amp_max_pdu = __le32_to_cpu(rp->max_pdu);
734 hdev->amp_type = rp->amp_type;
735 hdev->amp_pal_cap = __le16_to_cpu(rp->pal_cap);
736 hdev->amp_assoc_size = __le16_to_cpu(rp->max_assoc_size);
737 hdev->amp_be_flush_to = __le32_to_cpu(rp->be_flush_to);
738 hdev->amp_max_flush_to = __le32_to_cpu(rp->max_flush_to);
739
Andrei Emeltchenko8e2a0d92012-09-27 17:26:08 +0300740a2mp_rsp:
741 a2mp_send_getinfo_rsp(hdev);
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300742}
743
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300744static void hci_cc_read_local_amp_assoc(struct hci_dev *hdev,
745 struct sk_buff *skb)
746{
747 struct hci_rp_read_local_amp_assoc *rp = (void *) skb->data;
748 struct amp_assoc *assoc = &hdev->loc_assoc;
749 size_t rem_len, frag_len;
750
751 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
752
753 if (rp->status)
754 goto a2mp_rsp;
755
756 frag_len = skb->len - sizeof(*rp);
757 rem_len = __le16_to_cpu(rp->rem_len);
758
759 if (rem_len > frag_len) {
Andrei Emeltchenko2e430be32012-09-28 14:44:23 +0300760 BT_DBG("frag_len %zu rem_len %zu", frag_len, rem_len);
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300761
762 memcpy(assoc->data + assoc->offset, rp->frag, frag_len);
763 assoc->offset += frag_len;
764
765 /* Read other fragments */
766 amp_read_loc_assoc_frag(hdev, rp->phy_handle);
767
768 return;
769 }
770
771 memcpy(assoc->data + assoc->offset, rp->frag, rem_len);
772 assoc->len = assoc->offset + rem_len;
773 assoc->offset = 0;
774
775a2mp_rsp:
776 /* Send A2MP Rsp when all fragments are received */
777 a2mp_send_getampassoc_rsp(hdev, rp->status);
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +0300778 a2mp_send_create_phy_link_req(hdev, rp->status);
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300779}
780
Johan Hedbergd5859e22011-01-25 01:19:58 +0200781static void hci_cc_read_inq_rsp_tx_power(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300782 struct sk_buff *skb)
Johan Hedbergd5859e22011-01-25 01:19:58 +0200783{
Marcel Holtmann91c4e9b2012-03-11 19:27:21 -0700784 struct hci_rp_read_inq_rsp_tx_power *rp = (void *) skb->data;
Johan Hedbergd5859e22011-01-25 01:19:58 +0200785
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300786 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedbergd5859e22011-01-25 01:19:58 +0200787
Marcel Holtmann91c4e9b2012-03-11 19:27:21 -0700788 if (!rp->status)
789 hdev->inq_tx_power = rp->tx_power;
Johan Hedbergd5859e22011-01-25 01:19:58 +0200790}
791
Johan Hedberg980e1a52011-01-22 06:10:07 +0200792static void hci_cc_pin_code_reply(struct hci_dev *hdev, struct sk_buff *skb)
793{
794 struct hci_rp_pin_code_reply *rp = (void *) skb->data;
795 struct hci_cp_pin_code_reply *cp;
796 struct hci_conn *conn;
797
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300798 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200799
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200800 hci_dev_lock(hdev);
801
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200802 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg744cf192011-11-08 20:40:14 +0200803 mgmt_pin_code_reply_complete(hdev, &rp->bdaddr, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200804
Mikel Astizfa1bd912012-08-09 09:52:29 +0200805 if (rp->status)
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200806 goto unlock;
Johan Hedberg980e1a52011-01-22 06:10:07 +0200807
808 cp = hci_sent_cmd_data(hdev, HCI_OP_PIN_CODE_REPLY);
809 if (!cp)
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200810 goto unlock;
Johan Hedberg980e1a52011-01-22 06:10:07 +0200811
812 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
813 if (conn)
814 conn->pin_length = cp->pin_len;
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200815
816unlock:
817 hci_dev_unlock(hdev);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200818}
819
820static void hci_cc_pin_code_neg_reply(struct hci_dev *hdev, struct sk_buff *skb)
821{
822 struct hci_rp_pin_code_neg_reply *rp = (void *) skb->data;
823
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300824 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200825
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200826 hci_dev_lock(hdev);
827
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200828 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg744cf192011-11-08 20:40:14 +0200829 mgmt_pin_code_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300830 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200831
832 hci_dev_unlock(hdev);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200833}
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200834
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300835static void hci_cc_le_read_buffer_size(struct hci_dev *hdev,
836 struct sk_buff *skb)
837{
838 struct hci_rp_le_read_buffer_size *rp = (void *) skb->data;
839
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300840 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300841
842 if (rp->status)
843 return;
844
845 hdev->le_mtu = __le16_to_cpu(rp->le_mtu);
846 hdev->le_pkts = rp->le_max_pkt;
847
848 hdev->le_cnt = hdev->le_pkts;
849
850 BT_DBG("%s le mtu %d:%d", hdev->name, hdev->le_mtu, hdev->le_pkts);
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300851}
Johan Hedberg980e1a52011-01-22 06:10:07 +0200852
Johan Hedberg60e77322013-01-22 14:01:59 +0200853static void hci_cc_le_read_local_features(struct hci_dev *hdev,
854 struct sk_buff *skb)
855{
856 struct hci_rp_le_read_local_features *rp = (void *) skb->data;
857
858 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
859
860 if (!rp->status)
861 memcpy(hdev->le_features, rp->features, 8);
Johan Hedberg60e77322013-01-22 14:01:59 +0200862}
863
Johan Hedberg8fa19092012-10-19 20:57:49 +0300864static void hci_cc_le_read_adv_tx_power(struct hci_dev *hdev,
865 struct sk_buff *skb)
866{
867 struct hci_rp_le_read_adv_tx_power *rp = (void *) skb->data;
868
869 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
870
Johan Hedberg04b4edc2013-03-15 17:07:01 -0500871 if (!rp->status)
Johan Hedberg8fa19092012-10-19 20:57:49 +0300872 hdev->adv_tx_power = rp->tx_power;
Johan Hedberg8fa19092012-10-19 20:57:49 +0300873}
874
Johan Hedberga5c29682011-02-19 12:05:57 -0300875static void hci_cc_user_confirm_reply(struct hci_dev *hdev, struct sk_buff *skb)
876{
877 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
878
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300879 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberga5c29682011-02-19 12:05:57 -0300880
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200881 hci_dev_lock(hdev);
882
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200883 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300884 mgmt_user_confirm_reply_complete(hdev, &rp->bdaddr, ACL_LINK, 0,
885 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200886
887 hci_dev_unlock(hdev);
Johan Hedberga5c29682011-02-19 12:05:57 -0300888}
889
890static void hci_cc_user_confirm_neg_reply(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300891 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -0300892{
893 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
894
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300895 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberga5c29682011-02-19 12:05:57 -0300896
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200897 hci_dev_lock(hdev);
898
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200899 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg744cf192011-11-08 20:40:14 +0200900 mgmt_user_confirm_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300901 ACL_LINK, 0, rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200902
903 hci_dev_unlock(hdev);
Johan Hedberga5c29682011-02-19 12:05:57 -0300904}
905
Brian Gix1143d452011-11-23 08:28:34 -0800906static void hci_cc_user_passkey_reply(struct hci_dev *hdev, struct sk_buff *skb)
907{
908 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
909
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300910 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800911
912 hci_dev_lock(hdev);
913
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200914 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg272d90d2012-02-09 15:26:12 +0200915 mgmt_user_passkey_reply_complete(hdev, &rp->bdaddr, ACL_LINK,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300916 0, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800917
918 hci_dev_unlock(hdev);
919}
920
921static void hci_cc_user_passkey_neg_reply(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300922 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -0800923{
924 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
925
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300926 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800927
928 hci_dev_lock(hdev);
929
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200930 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Brian Gix1143d452011-11-23 08:28:34 -0800931 mgmt_user_passkey_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300932 ACL_LINK, 0, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800933
934 hci_dev_unlock(hdev);
935}
936
Marcel Holtmann4d2d2792014-01-10 02:07:26 -0800937static void hci_cc_read_local_oob_data(struct hci_dev *hdev,
938 struct sk_buff *skb)
Szymon Jancc35938b2011-03-22 13:12:21 +0100939{
940 struct hci_rp_read_local_oob_data *rp = (void *) skb->data;
941
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300942 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Szymon Jancc35938b2011-03-22 13:12:21 +0100943
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200944 hci_dev_lock(hdev);
Marcel Holtmann4d2d2792014-01-10 02:07:26 -0800945 mgmt_read_local_oob_data_complete(hdev, rp->hash, rp->randomizer,
946 NULL, NULL, rp->status);
947 hci_dev_unlock(hdev);
948}
949
950static void hci_cc_read_local_oob_ext_data(struct hci_dev *hdev,
951 struct sk_buff *skb)
952{
953 struct hci_rp_read_local_oob_ext_data *rp = (void *) skb->data;
954
955 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
956
957 hci_dev_lock(hdev);
958 mgmt_read_local_oob_data_complete(hdev, rp->hash192, rp->randomizer192,
959 rp->hash256, rp->randomizer256,
960 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200961 hci_dev_unlock(hdev);
Szymon Jancc35938b2011-03-22 13:12:21 +0100962}
963
Marcel Holtmann7a4cd512014-02-19 19:52:13 -0800964
965static void hci_cc_le_set_random_addr(struct hci_dev *hdev, struct sk_buff *skb)
966{
967 __u8 status = *((__u8 *) skb->data);
968 bdaddr_t *sent;
969
970 BT_DBG("%s status 0x%2.2x", hdev->name, status);
971
972 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_RANDOM_ADDR);
973 if (!sent)
974 return;
975
976 hci_dev_lock(hdev);
977
978 if (!status)
979 bacpy(&hdev->random_addr, sent);
980
981 hci_dev_unlock(hdev);
982}
983
Johan Hedbergc1d5dc42012-11-08 01:23:01 +0100984static void hci_cc_le_set_adv_enable(struct hci_dev *hdev, struct sk_buff *skb)
985{
986 __u8 *sent, status = *((__u8 *) skb->data);
987
988 BT_DBG("%s status 0x%2.2x", hdev->name, status);
989
990 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_ENABLE);
991 if (!sent)
992 return;
993
Johan Hedberg3c857752014-03-25 10:30:49 +0200994 if (status)
995 return;
996
Johan Hedbergc1d5dc42012-11-08 01:23:01 +0100997 hci_dev_lock(hdev);
998
Johan Hedberg3c857752014-03-25 10:30:49 +0200999 /* If we're doing connection initation as peripheral. Set a
1000 * timeout in case something goes wrong.
1001 */
1002 if (*sent) {
1003 struct hci_conn *conn;
1004
1005 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
1006 if (conn)
1007 queue_delayed_work(hdev->workqueue,
1008 &conn->le_conn_timeout,
1009 HCI_LE_CONN_TIMEOUT);
1010 }
1011
1012 mgmt_advertising(hdev, *sent);
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001013
Johan Hedberg04b4edc2013-03-15 17:07:01 -05001014 hci_dev_unlock(hdev);
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001015}
1016
Marcel Holtmann533553f2014-03-21 12:18:10 -07001017static void hci_cc_le_set_scan_param(struct hci_dev *hdev, struct sk_buff *skb)
1018{
1019 struct hci_cp_le_set_scan_param *cp;
1020 __u8 status = *((__u8 *) skb->data);
1021
1022 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1023
1024 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_PARAM);
1025 if (!cp)
1026 return;
1027
1028 hci_dev_lock(hdev);
1029
1030 if (!status)
1031 hdev->le_scan_type = cp->type;
1032
1033 hci_dev_unlock(hdev);
1034}
1035
Johan Hedbergb9a63282014-03-25 10:51:52 +02001036static bool has_pending_adv_report(struct hci_dev *hdev)
1037{
1038 struct discovery_state *d = &hdev->discovery;
1039
1040 return bacmp(&d->last_adv_addr, BDADDR_ANY);
1041}
1042
1043static void clear_pending_adv_report(struct hci_dev *hdev)
1044{
1045 struct discovery_state *d = &hdev->discovery;
1046
1047 bacpy(&d->last_adv_addr, BDADDR_ANY);
1048 d->last_adv_data_len = 0;
1049}
1050
1051static void store_pending_adv_report(struct hci_dev *hdev, bdaddr_t *bdaddr,
Johan Hedbergff5cd292014-03-25 14:40:52 +02001052 u8 bdaddr_type, s8 rssi, u8 *data, u8 len)
Johan Hedbergb9a63282014-03-25 10:51:52 +02001053{
1054 struct discovery_state *d = &hdev->discovery;
1055
1056 bacpy(&d->last_adv_addr, bdaddr);
1057 d->last_adv_addr_type = bdaddr_type;
Johan Hedbergff5cd292014-03-25 14:40:52 +02001058 d->last_adv_rssi = rssi;
Johan Hedbergb9a63282014-03-25 10:51:52 +02001059 memcpy(d->last_adv_data, data, len);
1060 d->last_adv_data_len = len;
1061}
1062
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001063static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001064 struct sk_buff *skb)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001065{
1066 struct hci_cp_le_set_scan_enable *cp;
1067 __u8 status = *((__u8 *) skb->data);
1068
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001069 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001070
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001071 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_ENABLE);
1072 if (!cp)
1073 return;
1074
Andre Guedes3fd319b2013-04-30 15:29:36 -03001075 if (status)
1076 return;
1077
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001078 switch (cp->enable) {
Andre Guedes76a388b2013-04-04 20:21:02 -03001079 case LE_SCAN_ENABLE:
Andre Guedesd23264a2011-11-25 20:53:38 -03001080 set_bit(HCI_LE_SCAN, &hdev->dev_flags);
Johan Hedbergb9a63282014-03-25 10:51:52 +02001081 if (hdev->le_scan_type == LE_SCAN_ACTIVE)
1082 clear_pending_adv_report(hdev);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001083 break;
1084
Andre Guedes76a388b2013-04-04 20:21:02 -03001085 case LE_SCAN_DISABLE:
Johan Hedbergb9a63282014-03-25 10:51:52 +02001086 /* We do this here instead of when setting DISCOVERY_STOPPED
1087 * since the latter would potentially require waiting for
1088 * inquiry to stop too.
1089 */
1090 if (has_pending_adv_report(hdev)) {
1091 struct discovery_state *d = &hdev->discovery;
1092
1093 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001094 d->last_adv_addr_type, NULL,
1095 d->last_adv_rssi, 0, 1,
1096 d->last_adv_data,
Johan Hedbergb9a63282014-03-25 10:51:52 +02001097 d->last_adv_data_len, NULL, 0);
1098 }
1099
Johan Hedberg317ac8c2014-02-28 20:26:12 +02001100 /* Cancel this timer so that we don't try to disable scanning
1101 * when it's already disabled.
1102 */
1103 cancel_delayed_work(&hdev->le_scan_disable);
1104
Andre Guedesd23264a2011-11-25 20:53:38 -03001105 clear_bit(HCI_LE_SCAN, &hdev->dev_flags);
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001106 /* The HCI_LE_SCAN_INTERRUPTED flag indicates that we
1107 * interrupted scanning due to a connect request. Mark
1108 * therefore discovery as stopped.
1109 */
1110 if (test_and_clear_bit(HCI_LE_SCAN_INTERRUPTED,
1111 &hdev->dev_flags))
1112 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001113 break;
1114
1115 default:
1116 BT_ERR("Used reserved LE_Scan_Enable param %d", cp->enable);
1117 break;
Andre Guedes35815082011-05-26 16:23:53 -03001118 }
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001119}
1120
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001121static void hci_cc_le_read_white_list_size(struct hci_dev *hdev,
1122 struct sk_buff *skb)
1123{
1124 struct hci_rp_le_read_white_list_size *rp = (void *) skb->data;
1125
1126 BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size);
1127
1128 if (!rp->status)
1129 hdev->le_white_list_size = rp->size;
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001130}
1131
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001132static void hci_cc_le_clear_white_list(struct hci_dev *hdev,
1133 struct sk_buff *skb)
1134{
1135 __u8 status = *((__u8 *) skb->data);
1136
1137 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1138
1139 if (!status)
1140 hci_white_list_clear(hdev);
1141}
1142
1143static void hci_cc_le_add_to_white_list(struct hci_dev *hdev,
1144 struct sk_buff *skb)
1145{
1146 struct hci_cp_le_add_to_white_list *sent;
1147 __u8 status = *((__u8 *) skb->data);
1148
1149 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1150
1151 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_ADD_TO_WHITE_LIST);
1152 if (!sent)
1153 return;
1154
1155 if (!status)
1156 hci_white_list_add(hdev, &sent->bdaddr, sent->bdaddr_type);
1157}
1158
1159static void hci_cc_le_del_from_white_list(struct hci_dev *hdev,
1160 struct sk_buff *skb)
1161{
1162 struct hci_cp_le_del_from_white_list *sent;
1163 __u8 status = *((__u8 *) skb->data);
1164
1165 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1166
1167 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_DEL_FROM_WHITE_LIST);
1168 if (!sent)
1169 return;
1170
1171 if (!status)
1172 hci_white_list_del(hdev, &sent->bdaddr, sent->bdaddr_type);
1173}
1174
Johan Hedberg9b008c02013-01-22 14:02:01 +02001175static void hci_cc_le_read_supported_states(struct hci_dev *hdev,
1176 struct sk_buff *skb)
1177{
1178 struct hci_rp_le_read_supported_states *rp = (void *) skb->data;
1179
1180 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1181
1182 if (!rp->status)
1183 memcpy(hdev->le_states, rp->le_states, 8);
Johan Hedberg9b008c02013-01-22 14:02:01 +02001184}
1185
Gustavo Padovan6039aa732012-05-23 04:04:18 -03001186static void hci_cc_write_le_host_supported(struct hci_dev *hdev,
1187 struct sk_buff *skb)
Andre Guedesf9b49302011-06-30 19:20:53 -03001188{
Johan Hedberg06199cf2012-02-22 16:37:11 +02001189 struct hci_cp_write_le_host_supported *sent;
Andre Guedesf9b49302011-06-30 19:20:53 -03001190 __u8 status = *((__u8 *) skb->data);
1191
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001192 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesf9b49302011-06-30 19:20:53 -03001193
Johan Hedberg06199cf2012-02-22 16:37:11 +02001194 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001195 if (!sent)
Andre Guedesf9b49302011-06-30 19:20:53 -03001196 return;
1197
Johan Hedberg8f984df2012-02-28 01:07:22 +02001198 if (!status) {
Johan Hedberg416a4ae2013-09-25 13:26:08 +03001199 if (sent->le) {
Johan Hedbergcad718e2013-04-17 15:00:51 +03001200 hdev->features[1][0] |= LMP_HOST_LE;
Johan Hedberg416a4ae2013-09-25 13:26:08 +03001201 set_bit(HCI_LE_ENABLED, &hdev->dev_flags);
1202 } else {
Johan Hedbergcad718e2013-04-17 15:00:51 +03001203 hdev->features[1][0] &= ~LMP_HOST_LE;
Johan Hedberg416a4ae2013-09-25 13:26:08 +03001204 clear_bit(HCI_LE_ENABLED, &hdev->dev_flags);
Johan Hedbergf3d3444a2013-10-05 12:01:04 +02001205 clear_bit(HCI_ADVERTISING, &hdev->dev_flags);
Johan Hedberg416a4ae2013-09-25 13:26:08 +03001206 }
Johan Hedberg53b2caa2012-10-24 21:11:59 +03001207
1208 if (sent->simul)
Johan Hedbergcad718e2013-04-17 15:00:51 +03001209 hdev->features[1][0] |= LMP_HOST_LE_BREDR;
Johan Hedberg53b2caa2012-10-24 21:11:59 +03001210 else
Johan Hedbergcad718e2013-04-17 15:00:51 +03001211 hdev->features[1][0] &= ~LMP_HOST_LE_BREDR;
Johan Hedberg8f984df2012-02-28 01:07:22 +02001212 }
Andre Guedesf9b49302011-06-30 19:20:53 -03001213}
1214
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02001215static void hci_cc_set_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
1216{
1217 struct hci_cp_le_set_adv_param *cp;
1218 u8 status = *((u8 *) skb->data);
1219
1220 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1221
1222 if (status)
1223 return;
1224
1225 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_PARAM);
1226 if (!cp)
1227 return;
1228
1229 hci_dev_lock(hdev);
1230 hdev->adv_addr_type = cp->own_address_type;
1231 hci_dev_unlock(hdev);
1232}
1233
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001234static void hci_cc_write_remote_amp_assoc(struct hci_dev *hdev,
1235 struct sk_buff *skb)
1236{
1237 struct hci_rp_write_remote_amp_assoc *rp = (void *) skb->data;
1238
1239 BT_DBG("%s status 0x%2.2x phy_handle 0x%2.2x",
1240 hdev->name, rp->status, rp->phy_handle);
1241
1242 if (rp->status)
1243 return;
1244
1245 amp_write_rem_assoc_continue(hdev, rp->phy_handle);
1246}
1247
Gustavo Padovan6039aa732012-05-23 04:04:18 -03001248static void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001249{
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001250 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001251
1252 if (status) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001253 hci_conn_check_pending(hdev);
Johan Hedberg314b2382011-04-27 10:29:57 -04001254 return;
1255 }
1256
Andre Guedes89352e72011-11-04 14:16:53 -03001257 set_bit(HCI_INQUIRY, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001258}
1259
Gustavo Padovan6039aa732012-05-23 04:04:18 -03001260static void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001261{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001262 struct hci_cp_create_conn *cp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001263 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001264
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001265 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001266
1267 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_CONN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001268 if (!cp)
1269 return;
1270
1271 hci_dev_lock(hdev);
1272
1273 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1274
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001275 BT_DBG("%s bdaddr %pMR hcon %p", hdev->name, &cp->bdaddr, conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001276
1277 if (status) {
1278 if (conn && conn->state == BT_CONNECT) {
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001279 if (status != 0x0c || conn->attempt > 2) {
1280 conn->state = BT_CLOSED;
1281 hci_proto_connect_cfm(conn, status);
1282 hci_conn_del(conn);
1283 } else
1284 conn->state = BT_CONNECT2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001285 }
1286 } else {
1287 if (!conn) {
1288 conn = hci_conn_add(hdev, ACL_LINK, &cp->bdaddr);
1289 if (conn) {
Johan Hedberga0c808b2012-01-16 09:49:58 +02001290 conn->out = true;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001291 conn->link_mode |= HCI_LM_MASTER;
1292 } else
Gustavo F. Padovan893ef972010-07-18 15:13:37 -03001293 BT_ERR("No memory for new connection");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001294 }
1295 }
1296
1297 hci_dev_unlock(hdev);
1298}
1299
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001300static void hci_cs_add_sco(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001301{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001302 struct hci_cp_add_sco *cp;
1303 struct hci_conn *acl, *sco;
1304 __u16 handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001305
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001306 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001307
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001308 if (!status)
1309 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001310
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001311 cp = hci_sent_cmd_data(hdev, HCI_OP_ADD_SCO);
1312 if (!cp)
1313 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001314
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001315 handle = __le16_to_cpu(cp->handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001316
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001317 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001318
1319 hci_dev_lock(hdev);
1320
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001321 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001322 if (acl) {
1323 sco = acl->link;
1324 if (sco) {
1325 sco->state = BT_CLOSED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001326
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001327 hci_proto_connect_cfm(sco, status);
1328 hci_conn_del(sco);
1329 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001330 }
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001331
1332 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001333}
1334
Marcel Holtmannf8558552008-07-14 20:13:49 +02001335static void hci_cs_auth_requested(struct hci_dev *hdev, __u8 status)
1336{
1337 struct hci_cp_auth_requested *cp;
1338 struct hci_conn *conn;
1339
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001340 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001341
1342 if (!status)
1343 return;
1344
1345 cp = hci_sent_cmd_data(hdev, HCI_OP_AUTH_REQUESTED);
1346 if (!cp)
1347 return;
1348
1349 hci_dev_lock(hdev);
1350
1351 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1352 if (conn) {
1353 if (conn->state == BT_CONFIG) {
1354 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001355 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001356 }
1357 }
1358
1359 hci_dev_unlock(hdev);
1360}
1361
1362static void hci_cs_set_conn_encrypt(struct hci_dev *hdev, __u8 status)
1363{
1364 struct hci_cp_set_conn_encrypt *cp;
1365 struct hci_conn *conn;
1366
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001367 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001368
1369 if (!status)
1370 return;
1371
1372 cp = hci_sent_cmd_data(hdev, HCI_OP_SET_CONN_ENCRYPT);
1373 if (!cp)
1374 return;
1375
1376 hci_dev_lock(hdev);
1377
1378 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1379 if (conn) {
1380 if (conn->state == BT_CONFIG) {
1381 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001382 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001383 }
1384 }
1385
1386 hci_dev_unlock(hdev);
1387}
1388
Johan Hedberg127178d2010-11-18 22:22:29 +02001389static int hci_outgoing_auth_needed(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001390 struct hci_conn *conn)
Johan Hedberg392599b2010-11-18 22:22:28 +02001391{
Johan Hedberg392599b2010-11-18 22:22:28 +02001392 if (conn->state != BT_CONFIG || !conn->out)
1393 return 0;
1394
Johan Hedberg765c2a92011-01-19 12:06:52 +05301395 if (conn->pending_sec_level == BT_SECURITY_SDP)
Johan Hedberg392599b2010-11-18 22:22:28 +02001396 return 0;
1397
1398 /* Only request authentication for SSP connections or non-SSP
Johan Hedberg264b8b42014-01-08 16:40:39 +02001399 * devices with sec_level MEDIUM or HIGH or if MITM protection
1400 * is requested.
1401 */
Gustavo Padovan807deac2012-05-17 00:36:24 -03001402 if (!hci_conn_ssp_enabled(conn) && !(conn->auth_type & 0x01) &&
Johan Hedberg264b8b42014-01-08 16:40:39 +02001403 conn->pending_sec_level != BT_SECURITY_HIGH &&
1404 conn->pending_sec_level != BT_SECURITY_MEDIUM)
Johan Hedberg392599b2010-11-18 22:22:28 +02001405 return 0;
1406
Johan Hedberg392599b2010-11-18 22:22:28 +02001407 return 1;
1408}
1409
Gustavo Padovan6039aa732012-05-23 04:04:18 -03001410static int hci_resolve_name(struct hci_dev *hdev,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001411 struct inquiry_entry *e)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001412{
1413 struct hci_cp_remote_name_req cp;
1414
1415 memset(&cp, 0, sizeof(cp));
1416
1417 bacpy(&cp.bdaddr, &e->data.bdaddr);
1418 cp.pscan_rep_mode = e->data.pscan_rep_mode;
1419 cp.pscan_mode = e->data.pscan_mode;
1420 cp.clock_offset = e->data.clock_offset;
1421
1422 return hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
1423}
1424
Johan Hedbergb644ba32012-01-17 21:48:47 +02001425static bool hci_resolve_next_name(struct hci_dev *hdev)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001426{
1427 struct discovery_state *discov = &hdev->discovery;
1428 struct inquiry_entry *e;
1429
Johan Hedbergb644ba32012-01-17 21:48:47 +02001430 if (list_empty(&discov->resolve))
1431 return false;
1432
1433 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
Ram Malovanyc8100892012-07-19 10:26:09 +03001434 if (!e)
1435 return false;
1436
Johan Hedbergb644ba32012-01-17 21:48:47 +02001437 if (hci_resolve_name(hdev, e) == 0) {
1438 e->name_state = NAME_PENDING;
1439 return true;
1440 }
1441
1442 return false;
1443}
1444
1445static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001446 bdaddr_t *bdaddr, u8 *name, u8 name_len)
Johan Hedbergb644ba32012-01-17 21:48:47 +02001447{
1448 struct discovery_state *discov = &hdev->discovery;
1449 struct inquiry_entry *e;
1450
1451 if (conn && !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001452 mgmt_device_connected(hdev, bdaddr, ACL_LINK, 0x00, 0, name,
1453 name_len, conn->dev_class);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001454
1455 if (discov->state == DISCOVERY_STOPPED)
1456 return;
1457
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001458 if (discov->state == DISCOVERY_STOPPING)
1459 goto discov_complete;
1460
1461 if (discov->state != DISCOVERY_RESOLVING)
1462 return;
1463
1464 e = hci_inquiry_cache_lookup_resolve(hdev, bdaddr, NAME_PENDING);
Ram Malovany7cc83802012-07-19 10:26:10 +03001465 /* If the device was not found in a list of found devices names of which
1466 * are pending. there is no need to continue resolving a next name as it
1467 * will be done upon receiving another Remote Name Request Complete
1468 * Event */
1469 if (!e)
1470 return;
1471
1472 list_del(&e->list);
1473 if (name) {
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001474 e->name_state = NAME_KNOWN;
Ram Malovany7cc83802012-07-19 10:26:10 +03001475 mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00,
1476 e->data.rssi, name, name_len);
Ram Malovanyc3e7c0d2012-07-19 10:26:11 +03001477 } else {
1478 e->name_state = NAME_NOT_KNOWN;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001479 }
1480
Johan Hedbergb644ba32012-01-17 21:48:47 +02001481 if (hci_resolve_next_name(hdev))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001482 return;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001483
1484discov_complete:
1485 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1486}
1487
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001488static void hci_cs_remote_name_req(struct hci_dev *hdev, __u8 status)
1489{
Johan Hedberg127178d2010-11-18 22:22:29 +02001490 struct hci_cp_remote_name_req *cp;
1491 struct hci_conn *conn;
1492
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001493 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Johan Hedberg127178d2010-11-18 22:22:29 +02001494
1495 /* If successful wait for the name req complete event before
1496 * checking for the need to do authentication */
1497 if (!status)
1498 return;
1499
1500 cp = hci_sent_cmd_data(hdev, HCI_OP_REMOTE_NAME_REQ);
1501 if (!cp)
1502 return;
1503
1504 hci_dev_lock(hdev);
1505
1506 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001507
1508 if (test_bit(HCI_MGMT, &hdev->dev_flags))
1509 hci_check_pending_name(hdev, conn, &cp->bdaddr, NULL, 0);
1510
Johan Hedberg79c6c702011-04-28 11:28:55 -07001511 if (!conn)
1512 goto unlock;
1513
1514 if (!hci_outgoing_auth_needed(hdev, conn))
1515 goto unlock;
1516
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001517 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02001518 struct hci_cp_auth_requested auth_cp;
1519
1520 auth_cp.handle = __cpu_to_le16(conn->handle);
1521 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED,
1522 sizeof(auth_cp), &auth_cp);
Johan Hedberg127178d2010-11-18 22:22:29 +02001523 }
1524
Johan Hedberg79c6c702011-04-28 11:28:55 -07001525unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02001526 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001527}
1528
Marcel Holtmann769be972008-07-14 20:13:49 +02001529static void hci_cs_read_remote_features(struct hci_dev *hdev, __u8 status)
1530{
1531 struct hci_cp_read_remote_features *cp;
1532 struct hci_conn *conn;
1533
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001534 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001535
1536 if (!status)
1537 return;
1538
1539 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_FEATURES);
1540 if (!cp)
1541 return;
1542
1543 hci_dev_lock(hdev);
1544
1545 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1546 if (conn) {
1547 if (conn->state == BT_CONFIG) {
Marcel Holtmann769be972008-07-14 20:13:49 +02001548 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001549 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001550 }
1551 }
1552
1553 hci_dev_unlock(hdev);
1554}
1555
1556static void hci_cs_read_remote_ext_features(struct hci_dev *hdev, __u8 status)
1557{
1558 struct hci_cp_read_remote_ext_features *cp;
1559 struct hci_conn *conn;
1560
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001561 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001562
1563 if (!status)
1564 return;
1565
1566 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES);
1567 if (!cp)
1568 return;
1569
1570 hci_dev_lock(hdev);
1571
1572 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1573 if (conn) {
1574 if (conn->state == BT_CONFIG) {
Marcel Holtmann769be972008-07-14 20:13:49 +02001575 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001576 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001577 }
1578 }
1579
1580 hci_dev_unlock(hdev);
1581}
1582
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001583static void hci_cs_setup_sync_conn(struct hci_dev *hdev, __u8 status)
1584{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001585 struct hci_cp_setup_sync_conn *cp;
1586 struct hci_conn *acl, *sco;
1587 __u16 handle;
1588
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001589 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001590
1591 if (!status)
1592 return;
1593
1594 cp = hci_sent_cmd_data(hdev, HCI_OP_SETUP_SYNC_CONN);
1595 if (!cp)
1596 return;
1597
1598 handle = __le16_to_cpu(cp->handle);
1599
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001600 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001601
1602 hci_dev_lock(hdev);
1603
1604 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001605 if (acl) {
1606 sco = acl->link;
1607 if (sco) {
1608 sco->state = BT_CLOSED;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001609
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001610 hci_proto_connect_cfm(sco, status);
1611 hci_conn_del(sco);
1612 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001613 }
1614
1615 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001616}
1617
1618static void hci_cs_sniff_mode(struct hci_dev *hdev, __u8 status)
1619{
1620 struct hci_cp_sniff_mode *cp;
1621 struct hci_conn *conn;
1622
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001623 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001624
1625 if (!status)
1626 return;
1627
1628 cp = hci_sent_cmd_data(hdev, HCI_OP_SNIFF_MODE);
1629 if (!cp)
1630 return;
1631
1632 hci_dev_lock(hdev);
1633
1634 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001635 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001636 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001637
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001638 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001639 hci_sco_setup(conn, status);
1640 }
1641
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001642 hci_dev_unlock(hdev);
1643}
1644
1645static void hci_cs_exit_sniff_mode(struct hci_dev *hdev, __u8 status)
1646{
1647 struct hci_cp_exit_sniff_mode *cp;
1648 struct hci_conn *conn;
1649
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001650 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001651
1652 if (!status)
1653 return;
1654
1655 cp = hci_sent_cmd_data(hdev, HCI_OP_EXIT_SNIFF_MODE);
1656 if (!cp)
1657 return;
1658
1659 hci_dev_lock(hdev);
1660
1661 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001662 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001663 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001664
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001665 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001666 hci_sco_setup(conn, status);
1667 }
1668
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001669 hci_dev_unlock(hdev);
1670}
1671
Johan Hedberg88c3df12012-02-09 14:27:38 +02001672static void hci_cs_disconnect(struct hci_dev *hdev, u8 status)
1673{
1674 struct hci_cp_disconnect *cp;
1675 struct hci_conn *conn;
1676
1677 if (!status)
1678 return;
1679
1680 cp = hci_sent_cmd_data(hdev, HCI_OP_DISCONNECT);
1681 if (!cp)
1682 return;
1683
1684 hci_dev_lock(hdev);
1685
1686 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1687 if (conn)
1688 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001689 conn->dst_type, status);
Johan Hedberg88c3df12012-02-09 14:27:38 +02001690
1691 hci_dev_unlock(hdev);
1692}
1693
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001694static void hci_cs_create_phylink(struct hci_dev *hdev, u8 status)
1695{
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001696 struct hci_cp_create_phy_link *cp;
1697
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001698 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001699
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001700 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_PHY_LINK);
1701 if (!cp)
1702 return;
1703
Andrei Emeltchenkoe58917b2012-10-31 15:46:33 +02001704 hci_dev_lock(hdev);
1705
1706 if (status) {
1707 struct hci_conn *hcon;
1708
1709 hcon = hci_conn_hash_lookup_handle(hdev, cp->phy_handle);
1710 if (hcon)
1711 hci_conn_del(hcon);
1712 } else {
1713 amp_write_remote_assoc(hdev, cp->phy_handle);
1714 }
1715
1716 hci_dev_unlock(hdev);
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001717}
1718
Andrei Emeltchenko0b26ab92012-09-27 17:26:24 +03001719static void hci_cs_accept_phylink(struct hci_dev *hdev, u8 status)
1720{
1721 struct hci_cp_accept_phy_link *cp;
1722
1723 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1724
1725 if (status)
1726 return;
1727
1728 cp = hci_sent_cmd_data(hdev, HCI_OP_ACCEPT_PHY_LINK);
1729 if (!cp)
1730 return;
1731
1732 amp_write_remote_assoc(hdev, cp->phy_handle);
1733}
1734
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001735static void hci_cs_le_create_conn(struct hci_dev *hdev, u8 status)
1736{
1737 struct hci_cp_le_create_conn *cp;
1738 struct hci_conn *conn;
1739
1740 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1741
1742 /* All connection failure handling is taken care of by the
1743 * hci_le_conn_failed function which is triggered by the HCI
1744 * request completion callbacks used for connecting.
1745 */
1746 if (status)
1747 return;
1748
1749 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_CREATE_CONN);
1750 if (!cp)
1751 return;
1752
1753 hci_dev_lock(hdev);
1754
1755 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->peer_addr);
1756 if (!conn)
1757 goto unlock;
1758
1759 /* Store the initiator and responder address information which
1760 * is needed for SMP. These values will not change during the
1761 * lifetime of the connection.
1762 */
1763 conn->init_addr_type = cp->own_address_type;
1764 if (cp->own_address_type == ADDR_LE_DEV_RANDOM)
1765 bacpy(&conn->init_addr, &hdev->random_addr);
1766 else
1767 bacpy(&conn->init_addr, &hdev->bdaddr);
1768
1769 conn->resp_addr_type = cp->peer_addr_type;
1770 bacpy(&conn->resp_addr, &cp->peer_addr);
1771
Johan Hedberg9489eca2014-02-28 17:45:46 +02001772 /* We don't want the connection attempt to stick around
1773 * indefinitely since LE doesn't have a page timeout concept
1774 * like BR/EDR. Set a timer for any connection that doesn't use
1775 * the white list for connecting.
1776 */
1777 if (cp->filter_policy == HCI_LE_USE_PEER_ADDR)
1778 queue_delayed_work(conn->hdev->workqueue,
1779 &conn->le_conn_timeout,
1780 HCI_LE_CONN_TIMEOUT);
1781
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001782unlock:
1783 hci_dev_unlock(hdev);
1784}
1785
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02001786static void hci_cs_le_start_enc(struct hci_dev *hdev, u8 status)
1787{
1788 struct hci_cp_le_start_enc *cp;
1789 struct hci_conn *conn;
1790
1791 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1792
1793 if (!status)
1794 return;
1795
1796 hci_dev_lock(hdev);
1797
1798 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_START_ENC);
1799 if (!cp)
1800 goto unlock;
1801
1802 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1803 if (!conn)
1804 goto unlock;
1805
1806 if (conn->state != BT_CONNECTED)
1807 goto unlock;
1808
1809 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
1810 hci_conn_drop(conn);
1811
1812unlock:
1813 hci_dev_unlock(hdev);
1814}
1815
Gustavo Padovan6039aa732012-05-23 04:04:18 -03001816static void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001817{
1818 __u8 status = *((__u8 *) skb->data);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001819 struct discovery_state *discov = &hdev->discovery;
1820 struct inquiry_entry *e;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001821
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001822 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001823
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001824 hci_conn_check_pending(hdev);
Andre Guedes89352e72011-11-04 14:16:53 -03001825
1826 if (!test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
1827 return;
1828
Andre Guedes3e13fa12013-03-27 20:04:56 -03001829 smp_mb__after_clear_bit(); /* wake_up_bit advises about this barrier */
1830 wake_up_bit(&hdev->flags, HCI_INQUIRY);
1831
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02001832 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001833 return;
1834
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001835 hci_dev_lock(hdev);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001836
Andre Guedes343f9352012-02-17 20:39:37 -03001837 if (discov->state != DISCOVERY_FINDING)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001838 goto unlock;
1839
1840 if (list_empty(&discov->resolve)) {
1841 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1842 goto unlock;
1843 }
1844
1845 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
1846 if (e && hci_resolve_name(hdev, e) == 0) {
1847 e->name_state = NAME_PENDING;
1848 hci_discovery_set_state(hdev, DISCOVERY_RESOLVING);
1849 } else {
1850 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1851 }
1852
1853unlock:
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001854 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001855}
1856
Gustavo Padovan6039aa732012-05-23 04:04:18 -03001857static void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001858{
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001859 struct inquiry_data data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001860 struct inquiry_info *info = (void *) (skb->data + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001861 int num_rsp = *((__u8 *) skb->data);
1862
1863 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
1864
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001865 if (!num_rsp)
1866 return;
1867
Andre Guedes1519cc12012-03-21 00:03:38 -03001868 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
1869 return;
1870
Linus Torvalds1da177e2005-04-16 15:20:36 -07001871 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001872
Johan Hedberge17acd42011-03-30 23:57:16 +03001873 for (; num_rsp; num_rsp--, info++) {
Johan Hedberg388fc8f2012-02-23 00:38:59 +02001874 bool name_known, ssp;
Johan Hedberg31754052012-01-04 13:39:52 +02001875
Linus Torvalds1da177e2005-04-16 15:20:36 -07001876 bacpy(&data.bdaddr, &info->bdaddr);
1877 data.pscan_rep_mode = info->pscan_rep_mode;
1878 data.pscan_period_mode = info->pscan_period_mode;
1879 data.pscan_mode = info->pscan_mode;
1880 memcpy(data.dev_class, info->dev_class, 3);
1881 data.clock_offset = info->clock_offset;
1882 data.rssi = 0x00;
Marcel Holtmann41a96212008-07-14 20:13:48 +02001883 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02001884
Johan Hedberg388fc8f2012-02-23 00:38:59 +02001885 name_known = hci_inquiry_cache_update(hdev, &data, false, &ssp);
Johan Hedberg48264f02011-11-09 13:58:58 +02001886 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001887 info->dev_class, 0, !name_known, ssp, NULL,
Johan Hedberg5d2e9fa2014-03-25 10:30:47 +02001888 0, NULL, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001889 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001890
Linus Torvalds1da177e2005-04-16 15:20:36 -07001891 hci_dev_unlock(hdev);
1892}
1893
Gustavo Padovan6039aa732012-05-23 04:04:18 -03001894static void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001895{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001896 struct hci_ev_conn_complete *ev = (void *) skb->data;
1897 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001898
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001899 BT_DBG("%s", hdev->name);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001900
Linus Torvalds1da177e2005-04-16 15:20:36 -07001901 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001902
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001903 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann94992372009-04-19 19:30:03 +02001904 if (!conn) {
1905 if (ev->link_type != SCO_LINK)
1906 goto unlock;
1907
1908 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
1909 if (!conn)
1910 goto unlock;
1911
1912 conn->type = SCO_LINK;
1913 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001914
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001915 if (!ev->status) {
1916 conn->handle = __le16_to_cpu(ev->handle);
Marcel Holtmann769be972008-07-14 20:13:49 +02001917
1918 if (conn->type == ACL_LINK) {
1919 conn->state = BT_CONFIG;
1920 hci_conn_hold(conn);
Szymon Janca9ea3ed2012-07-19 14:46:08 +02001921
1922 if (!conn->out && !hci_conn_ssp_enabled(conn) &&
1923 !hci_find_link_key(hdev, &ev->bdaddr))
1924 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
1925 else
1926 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Marcel Holtmann769be972008-07-14 20:13:49 +02001927 } else
1928 conn->state = BT_CONNECTED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001929
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02001930 hci_conn_add_sysfs(conn);
1931
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001932 if (test_bit(HCI_AUTH, &hdev->flags))
1933 conn->link_mode |= HCI_LM_AUTH;
1934
1935 if (test_bit(HCI_ENCRYPT, &hdev->flags))
1936 conn->link_mode |= HCI_LM_ENCRYPT;
1937
1938 /* Get remote features */
1939 if (conn->type == ACL_LINK) {
1940 struct hci_cp_read_remote_features cp;
1941 cp.handle = ev->handle;
Marcel Holtmann769be972008-07-14 20:13:49 +02001942 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_FEATURES,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001943 sizeof(cp), &cp);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001944 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001945
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001946 /* Set packet type for incoming connection */
Andrei Emeltchenkod095c1e2011-12-01 14:33:27 +02001947 if (!conn->out && hdev->hci_ver < BLUETOOTH_VER_2_0) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001948 struct hci_cp_change_conn_ptype cp;
1949 cp.handle = ev->handle;
Marcel Holtmanna8746412008-07-14 20:13:46 +02001950 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001951 hci_send_cmd(hdev, HCI_OP_CHANGE_CONN_PTYPE, sizeof(cp),
1952 &cp);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001953 }
Johan Hedberg17d5c042011-01-22 06:09:08 +02001954 } else {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001955 conn->state = BT_CLOSED;
Johan Hedberg17d5c042011-01-22 06:09:08 +02001956 if (conn->type == ACL_LINK)
Marcel Holtmann64c7b772014-02-18 14:22:20 -08001957 mgmt_connect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001958 conn->dst_type, ev->status);
Johan Hedberg17d5c042011-01-22 06:09:08 +02001959 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001960
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001961 if (conn->type == ACL_LINK)
1962 hci_sco_setup(conn, ev->status);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001963
Marcel Holtmann769be972008-07-14 20:13:49 +02001964 if (ev->status) {
1965 hci_proto_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001966 hci_conn_del(conn);
Marcel Holtmannc89b6e62009-01-15 21:57:03 +01001967 } else if (ev->link_type != ACL_LINK)
1968 hci_proto_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001969
1970unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001971 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001972
1973 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001974}
1975
Gustavo Padovan6039aa732012-05-23 04:04:18 -03001976static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001977{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001978 struct hci_ev_conn_request *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001979 int mask = hdev->link_mode;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01001980 __u8 flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001981
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001982 BT_DBG("%s bdaddr %pMR type 0x%x", hdev->name, &ev->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001983 ev->link_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001984
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01001985 mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type,
1986 &flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001987
Szymon Janc138d22e2011-02-17 16:44:23 +01001988 if ((mask & HCI_LM_ACCEPT) &&
Marcel Holtmannb9ee0a72013-10-17 17:24:13 -07001989 !hci_blacklist_lookup(hdev, &ev->bdaddr, BDADDR_BREDR)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001990 /* Connection accepted */
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02001991 struct inquiry_entry *ie;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001992 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001993
1994 hci_dev_lock(hdev);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001995
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02001996 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
1997 if (ie)
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02001998 memcpy(ie->data.dev_class, ev->dev_class, 3);
1999
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03002000 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type,
2001 &ev->bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002002 if (!conn) {
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02002003 conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr);
2004 if (!conn) {
Gustavo F. Padovan893ef972010-07-18 15:13:37 -03002005 BT_ERR("No memory for new connection");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002006 hci_dev_unlock(hdev);
2007 return;
2008 }
2009 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002010
Linus Torvalds1da177e2005-04-16 15:20:36 -07002011 memcpy(conn->dev_class, ev->dev_class, 3);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002012
Linus Torvalds1da177e2005-04-16 15:20:36 -07002013 hci_dev_unlock(hdev);
2014
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002015 if (ev->link_type == ACL_LINK ||
2016 (!(flags & HCI_PROTO_DEFER) && !lmp_esco_capable(hdev))) {
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002017 struct hci_cp_accept_conn_req cp;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002018 conn->state = BT_CONNECT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002019
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002020 bacpy(&cp.bdaddr, &ev->bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002021
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002022 if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER))
2023 cp.role = 0x00; /* Become master */
2024 else
2025 cp.role = 0x01; /* Remain slave */
2026
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002027 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp),
2028 &cp);
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002029 } else if (!(flags & HCI_PROTO_DEFER)) {
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002030 struct hci_cp_accept_sync_conn_req cp;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002031 conn->state = BT_CONNECT;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002032
2033 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmanna8746412008-07-14 20:13:46 +02002034 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002035
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002036 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
2037 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
2038 cp.max_latency = cpu_to_le16(0xffff);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002039 cp.content_format = cpu_to_le16(hdev->voice_setting);
2040 cp.retrans_effort = 0xff;
2041
2042 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002043 sizeof(cp), &cp);
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002044 } else {
2045 conn->state = BT_CONNECT2;
2046 hci_proto_connect_cfm(conn, 0);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002047 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002048 } else {
2049 /* Connection rejected */
2050 struct hci_cp_reject_conn_req cp;
2051
2052 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02002053 cp.reason = HCI_ERROR_REJ_BAD_ADDR;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002054 hci_send_cmd(hdev, HCI_OP_REJECT_CONN_REQ, sizeof(cp), &cp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002055 }
2056}
2057
Mikel Astizf0d6a0e2012-08-09 09:52:30 +02002058static u8 hci_to_mgmt_reason(u8 err)
2059{
2060 switch (err) {
2061 case HCI_ERROR_CONNECTION_TIMEOUT:
2062 return MGMT_DEV_DISCONN_TIMEOUT;
2063 case HCI_ERROR_REMOTE_USER_TERM:
2064 case HCI_ERROR_REMOTE_LOW_RESOURCES:
2065 case HCI_ERROR_REMOTE_POWER_OFF:
2066 return MGMT_DEV_DISCONN_REMOTE;
2067 case HCI_ERROR_LOCAL_HOST_TERM:
2068 return MGMT_DEV_DISCONN_LOCAL_HOST;
2069 default:
2070 return MGMT_DEV_DISCONN_UNKNOWN;
2071 }
2072}
2073
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002074static void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002075{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002076 struct hci_ev_disconn_complete *ev = (void *) skb->data;
Andre Guedesabf54a52013-11-07 17:36:09 -03002077 u8 reason = hci_to_mgmt_reason(ev->reason);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002078 struct hci_conn_params *params;
Marcel Holtmann04837f62006-07-03 10:02:33 +02002079 struct hci_conn *conn;
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002080 bool mgmt_connected;
Andre Guedes38462202013-11-07 17:36:10 -03002081 u8 type;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002082
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002083 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002084
Linus Torvalds1da177e2005-04-16 15:20:36 -07002085 hci_dev_lock(hdev);
2086
Marcel Holtmann04837f62006-07-03 10:02:33 +02002087 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergf7520542011-01-20 12:34:39 +02002088 if (!conn)
2089 goto unlock;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002090
Andre Guedesabf54a52013-11-07 17:36:09 -03002091 if (ev->status) {
2092 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
2093 conn->dst_type, ev->status);
2094 goto unlock;
Johan Hedberg37d9ef72011-11-10 15:54:39 +02002095 }
Johan Hedbergf7520542011-01-20 12:34:39 +02002096
Andre Guedes38462202013-11-07 17:36:10 -03002097 conn->state = BT_CLOSED;
2098
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002099 mgmt_connected = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags);
2100 mgmt_device_disconnected(hdev, &conn->dst, conn->type, conn->dst_type,
2101 reason, mgmt_connected);
Andre Guedesabf54a52013-11-07 17:36:09 -03002102
Andre Guedes38462202013-11-07 17:36:10 -03002103 if (conn->type == ACL_LINK && conn->flush_key)
2104 hci_remove_link_key(hdev, &conn->dst);
Johan Hedberg22102462013-10-05 12:01:06 +02002105
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002106 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
2107 if (params) {
2108 switch (params->auto_connect) {
2109 case HCI_AUTO_CONN_LINK_LOSS:
2110 if (ev->reason != HCI_ERROR_CONNECTION_TIMEOUT)
2111 break;
2112 /* Fall through */
2113
2114 case HCI_AUTO_CONN_ALWAYS:
2115 hci_pend_le_conn_add(hdev, &conn->dst, conn->dst_type);
2116 break;
2117
2118 default:
2119 break;
2120 }
2121 }
2122
Andre Guedes38462202013-11-07 17:36:10 -03002123 type = conn->type;
Johan Hedberg22102462013-10-05 12:01:06 +02002124
Andre Guedes38462202013-11-07 17:36:10 -03002125 hci_proto_disconn_cfm(conn, ev->reason);
2126 hci_conn_del(conn);
2127
2128 /* Re-enable advertising if necessary, since it might
2129 * have been disabled by the connection. From the
2130 * HCI_LE_Set_Advertise_Enable command description in
2131 * the core specification (v4.0):
2132 * "The Controller shall continue advertising until the Host
2133 * issues an LE_Set_Advertise_Enable command with
2134 * Advertising_Enable set to 0x00 (Advertising is disabled)
2135 * or until a connection is created or until the Advertising
2136 * is timed out due to Directed Advertising."
2137 */
2138 if (type == LE_LINK)
2139 mgmt_reenable_advertising(hdev);
Johan Hedbergf7520542011-01-20 12:34:39 +02002140
2141unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002142 hci_dev_unlock(hdev);
2143}
2144
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002145static void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002146{
2147 struct hci_ev_auth_complete *ev = (void *) skb->data;
2148 struct hci_conn *conn;
2149
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002150 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002151
2152 hci_dev_lock(hdev);
2153
2154 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002155 if (!conn)
2156 goto unlock;
2157
2158 if (!ev->status) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002159 if (!hci_conn_ssp_enabled(conn) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03002160 test_bit(HCI_CONN_REAUTH_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002161 BT_INFO("re-auth of legacy device is not possible.");
Johan Hedberg2a611692011-02-19 12:06:00 -03002162 } else {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002163 conn->link_mode |= HCI_LM_AUTH;
2164 conn->sec_level = conn->pending_sec_level;
Johan Hedberg2a611692011-02-19 12:06:00 -03002165 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002166 } else {
Johan Hedbergbab73cb2012-02-09 16:07:29 +02002167 mgmt_auth_failed(hdev, &conn->dst, conn->type, conn->dst_type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002168 ev->status);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002169 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002170
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002171 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
2172 clear_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002173
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002174 if (conn->state == BT_CONFIG) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002175 if (!ev->status && hci_conn_ssp_enabled(conn)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002176 struct hci_cp_set_conn_encrypt cp;
2177 cp.handle = ev->handle;
2178 cp.encrypt = 0x01;
2179 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002180 &cp);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002181 } else {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002182 conn->state = BT_CONNECTED;
2183 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002184 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002185 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002186 } else {
2187 hci_auth_cfm(conn, ev->status);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002188
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002189 hci_conn_hold(conn);
2190 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02002191 hci_conn_drop(conn);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002192 }
2193
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002194 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002195 if (!ev->status) {
2196 struct hci_cp_set_conn_encrypt cp;
2197 cp.handle = ev->handle;
2198 cp.encrypt = 0x01;
2199 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002200 &cp);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002201 } else {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002202 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002203 hci_encrypt_cfm(conn, ev->status, 0x00);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002204 }
2205 }
2206
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002207unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002208 hci_dev_unlock(hdev);
2209}
2210
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002211static void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002212{
Johan Hedberg127178d2010-11-18 22:22:29 +02002213 struct hci_ev_remote_name *ev = (void *) skb->data;
2214 struct hci_conn *conn;
2215
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002216 BT_DBG("%s", hdev->name);
2217
2218 hci_conn_check_pending(hdev);
Johan Hedberg127178d2010-11-18 22:22:29 +02002219
2220 hci_dev_lock(hdev);
2221
2222 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002223
2224 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
2225 goto check_auth;
2226
2227 if (ev->status == 0)
2228 hci_check_pending_name(hdev, conn, &ev->bdaddr, ev->name,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002229 strnlen(ev->name, HCI_MAX_NAME_LENGTH));
Johan Hedbergb644ba32012-01-17 21:48:47 +02002230 else
2231 hci_check_pending_name(hdev, conn, &ev->bdaddr, NULL, 0);
2232
2233check_auth:
Johan Hedberg79c6c702011-04-28 11:28:55 -07002234 if (!conn)
2235 goto unlock;
2236
2237 if (!hci_outgoing_auth_needed(hdev, conn))
2238 goto unlock;
2239
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002240 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002241 struct hci_cp_auth_requested cp;
2242 cp.handle = __cpu_to_le16(conn->handle);
2243 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp);
2244 }
2245
Johan Hedberg79c6c702011-04-28 11:28:55 -07002246unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02002247 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002248}
2249
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002250static void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002251{
2252 struct hci_ev_encrypt_change *ev = (void *) skb->data;
2253 struct hci_conn *conn;
2254
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002255 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002256
2257 hci_dev_lock(hdev);
2258
2259 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002260 if (!conn)
2261 goto unlock;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002262
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002263 if (!ev->status) {
2264 if (ev->encrypt) {
2265 /* Encryption implies authentication */
2266 conn->link_mode |= HCI_LM_AUTH;
2267 conn->link_mode |= HCI_LM_ENCRYPT;
2268 conn->sec_level = conn->pending_sec_level;
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002269
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002270 /* P-256 authentication key implies FIPS */
2271 if (conn->key_type == HCI_LK_AUTH_COMBINATION_P256)
2272 conn->link_mode |= HCI_LM_FIPS;
2273
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002274 if ((conn->type == ACL_LINK && ev->encrypt == 0x02) ||
2275 conn->type == LE_LINK)
2276 set_bit(HCI_CONN_AES_CCM, &conn->flags);
2277 } else {
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002278 conn->link_mode &= ~HCI_LM_ENCRYPT;
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002279 clear_bit(HCI_CONN_AES_CCM, &conn->flags);
2280 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002281 }
2282
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002283 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
2284
2285 if (ev->status && conn->state == BT_CONNECTED) {
2286 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2287 hci_conn_drop(conn);
2288 goto unlock;
2289 }
2290
2291 if (conn->state == BT_CONFIG) {
2292 if (!ev->status)
2293 conn->state = BT_CONNECTED;
2294
Marcel Holtmann40b552a2014-03-19 14:10:25 -07002295 /* In Secure Connections Only mode, do not allow any
2296 * connections that are not encrypted with AES-CCM
2297 * using a P-256 authenticated combination key.
2298 */
2299 if (test_bit(HCI_SC_ONLY, &hdev->dev_flags) &&
2300 (!test_bit(HCI_CONN_AES_CCM, &conn->flags) ||
2301 conn->key_type != HCI_LK_AUTH_COMBINATION_P256)) {
2302 hci_proto_connect_cfm(conn, HCI_ERROR_AUTH_FAILURE);
2303 hci_conn_drop(conn);
2304 goto unlock;
2305 }
2306
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002307 hci_proto_connect_cfm(conn, ev->status);
2308 hci_conn_drop(conn);
2309 } else
2310 hci_encrypt_cfm(conn, ev->status, ev->encrypt);
2311
Gustavo Padovana7d77232012-05-13 03:20:07 -03002312unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002313 hci_dev_unlock(hdev);
2314}
2315
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002316static void hci_change_link_key_complete_evt(struct hci_dev *hdev,
2317 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002318{
2319 struct hci_ev_change_link_key_complete *ev = (void *) skb->data;
2320 struct hci_conn *conn;
2321
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002322 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002323
2324 hci_dev_lock(hdev);
2325
2326 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
2327 if (conn) {
2328 if (!ev->status)
2329 conn->link_mode |= HCI_LM_SECURE;
2330
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002331 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002332
2333 hci_key_change_cfm(conn, ev->status);
2334 }
2335
2336 hci_dev_unlock(hdev);
2337}
2338
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002339static void hci_remote_features_evt(struct hci_dev *hdev,
2340 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002341{
2342 struct hci_ev_remote_features *ev = (void *) skb->data;
2343 struct hci_conn *conn;
2344
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002345 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002346
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002347 hci_dev_lock(hdev);
2348
2349 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02002350 if (!conn)
2351 goto unlock;
Marcel Holtmann769be972008-07-14 20:13:49 +02002352
Johan Hedbergccd556f2010-11-10 17:11:51 +02002353 if (!ev->status)
Johan Hedbergcad718e2013-04-17 15:00:51 +03002354 memcpy(conn->features[0], ev->features, 8);
Johan Hedbergccd556f2010-11-10 17:11:51 +02002355
2356 if (conn->state != BT_CONFIG)
2357 goto unlock;
2358
2359 if (!ev->status && lmp_ssp_capable(hdev) && lmp_ssp_capable(conn)) {
2360 struct hci_cp_read_remote_ext_features cp;
2361 cp.handle = ev->handle;
2362 cp.page = 0x01;
2363 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002364 sizeof(cp), &cp);
Johan Hedberg392599b2010-11-18 22:22:28 +02002365 goto unlock;
2366 }
2367
Johan Hedberg671267b2012-05-12 16:11:50 -03002368 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002369 struct hci_cp_remote_name_req cp;
2370 memset(&cp, 0, sizeof(cp));
2371 bacpy(&cp.bdaddr, &conn->dst);
2372 cp.pscan_rep_mode = 0x02;
2373 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002374 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
2375 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002376 conn->dst_type, 0, NULL, 0,
2377 conn->dev_class);
Johan Hedberg392599b2010-11-18 22:22:28 +02002378
Johan Hedberg127178d2010-11-18 22:22:29 +02002379 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002380 conn->state = BT_CONNECTED;
2381 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002382 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02002383 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002384
Johan Hedbergccd556f2010-11-10 17:11:51 +02002385unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002386 hci_dev_unlock(hdev);
2387}
2388
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002389static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002390{
2391 struct hci_ev_cmd_complete *ev = (void *) skb->data;
Johan Hedberg9238f362013-03-05 20:37:48 +02002392 u8 status = skb->data[sizeof(*ev)];
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002393 __u16 opcode;
2394
2395 skb_pull(skb, sizeof(*ev));
2396
2397 opcode = __le16_to_cpu(ev->opcode);
2398
2399 switch (opcode) {
2400 case HCI_OP_INQUIRY_CANCEL:
2401 hci_cc_inquiry_cancel(hdev, skb);
2402 break;
2403
Andre Guedes4d934832012-03-21 00:03:35 -03002404 case HCI_OP_PERIODIC_INQ:
2405 hci_cc_periodic_inq(hdev, skb);
2406 break;
2407
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002408 case HCI_OP_EXIT_PERIODIC_INQ:
2409 hci_cc_exit_periodic_inq(hdev, skb);
2410 break;
2411
2412 case HCI_OP_REMOTE_NAME_REQ_CANCEL:
2413 hci_cc_remote_name_req_cancel(hdev, skb);
2414 break;
2415
2416 case HCI_OP_ROLE_DISCOVERY:
2417 hci_cc_role_discovery(hdev, skb);
2418 break;
2419
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002420 case HCI_OP_READ_LINK_POLICY:
2421 hci_cc_read_link_policy(hdev, skb);
2422 break;
2423
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002424 case HCI_OP_WRITE_LINK_POLICY:
2425 hci_cc_write_link_policy(hdev, skb);
2426 break;
2427
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002428 case HCI_OP_READ_DEF_LINK_POLICY:
2429 hci_cc_read_def_link_policy(hdev, skb);
2430 break;
2431
2432 case HCI_OP_WRITE_DEF_LINK_POLICY:
2433 hci_cc_write_def_link_policy(hdev, skb);
2434 break;
2435
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002436 case HCI_OP_RESET:
2437 hci_cc_reset(hdev, skb);
2438 break;
2439
2440 case HCI_OP_WRITE_LOCAL_NAME:
2441 hci_cc_write_local_name(hdev, skb);
2442 break;
2443
2444 case HCI_OP_READ_LOCAL_NAME:
2445 hci_cc_read_local_name(hdev, skb);
2446 break;
2447
2448 case HCI_OP_WRITE_AUTH_ENABLE:
2449 hci_cc_write_auth_enable(hdev, skb);
2450 break;
2451
2452 case HCI_OP_WRITE_ENCRYPT_MODE:
2453 hci_cc_write_encrypt_mode(hdev, skb);
2454 break;
2455
2456 case HCI_OP_WRITE_SCAN_ENABLE:
2457 hci_cc_write_scan_enable(hdev, skb);
2458 break;
2459
2460 case HCI_OP_READ_CLASS_OF_DEV:
2461 hci_cc_read_class_of_dev(hdev, skb);
2462 break;
2463
2464 case HCI_OP_WRITE_CLASS_OF_DEV:
2465 hci_cc_write_class_of_dev(hdev, skb);
2466 break;
2467
2468 case HCI_OP_READ_VOICE_SETTING:
2469 hci_cc_read_voice_setting(hdev, skb);
2470 break;
2471
2472 case HCI_OP_WRITE_VOICE_SETTING:
2473 hci_cc_write_voice_setting(hdev, skb);
2474 break;
2475
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -07002476 case HCI_OP_READ_NUM_SUPPORTED_IAC:
2477 hci_cc_read_num_supported_iac(hdev, skb);
2478 break;
2479
Marcel Holtmann333140b2008-07-14 20:13:48 +02002480 case HCI_OP_WRITE_SSP_MODE:
2481 hci_cc_write_ssp_mode(hdev, skb);
2482 break;
2483
Marcel Holtmanneac83dc2014-01-10 02:07:23 -08002484 case HCI_OP_WRITE_SC_SUPPORT:
2485 hci_cc_write_sc_support(hdev, skb);
2486 break;
2487
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002488 case HCI_OP_READ_LOCAL_VERSION:
2489 hci_cc_read_local_version(hdev, skb);
2490 break;
2491
2492 case HCI_OP_READ_LOCAL_COMMANDS:
2493 hci_cc_read_local_commands(hdev, skb);
2494 break;
2495
2496 case HCI_OP_READ_LOCAL_FEATURES:
2497 hci_cc_read_local_features(hdev, skb);
2498 break;
2499
Andre Guedes971e3a42011-06-30 19:20:52 -03002500 case HCI_OP_READ_LOCAL_EXT_FEATURES:
2501 hci_cc_read_local_ext_features(hdev, skb);
2502 break;
2503
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002504 case HCI_OP_READ_BUFFER_SIZE:
2505 hci_cc_read_buffer_size(hdev, skb);
2506 break;
2507
2508 case HCI_OP_READ_BD_ADDR:
2509 hci_cc_read_bd_addr(hdev, skb);
2510 break;
2511
Johan Hedbergf332ec62013-03-15 17:07:11 -05002512 case HCI_OP_READ_PAGE_SCAN_ACTIVITY:
2513 hci_cc_read_page_scan_activity(hdev, skb);
2514 break;
2515
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002516 case HCI_OP_WRITE_PAGE_SCAN_ACTIVITY:
2517 hci_cc_write_page_scan_activity(hdev, skb);
2518 break;
2519
Johan Hedbergf332ec62013-03-15 17:07:11 -05002520 case HCI_OP_READ_PAGE_SCAN_TYPE:
2521 hci_cc_read_page_scan_type(hdev, skb);
2522 break;
2523
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002524 case HCI_OP_WRITE_PAGE_SCAN_TYPE:
2525 hci_cc_write_page_scan_type(hdev, skb);
2526 break;
2527
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +02002528 case HCI_OP_READ_DATA_BLOCK_SIZE:
2529 hci_cc_read_data_block_size(hdev, skb);
2530 break;
2531
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +02002532 case HCI_OP_READ_FLOW_CONTROL_MODE:
2533 hci_cc_read_flow_control_mode(hdev, skb);
2534 break;
2535
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +03002536 case HCI_OP_READ_LOCAL_AMP_INFO:
2537 hci_cc_read_local_amp_info(hdev, skb);
2538 break;
2539
Andrei Emeltchenko903e4542012-09-27 17:26:09 +03002540 case HCI_OP_READ_LOCAL_AMP_ASSOC:
2541 hci_cc_read_local_amp_assoc(hdev, skb);
2542 break;
2543
Johan Hedbergd5859e22011-01-25 01:19:58 +02002544 case HCI_OP_READ_INQ_RSP_TX_POWER:
2545 hci_cc_read_inq_rsp_tx_power(hdev, skb);
2546 break;
2547
Johan Hedberg980e1a52011-01-22 06:10:07 +02002548 case HCI_OP_PIN_CODE_REPLY:
2549 hci_cc_pin_code_reply(hdev, skb);
2550 break;
2551
2552 case HCI_OP_PIN_CODE_NEG_REPLY:
2553 hci_cc_pin_code_neg_reply(hdev, skb);
2554 break;
2555
Szymon Jancc35938b2011-03-22 13:12:21 +01002556 case HCI_OP_READ_LOCAL_OOB_DATA:
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08002557 hci_cc_read_local_oob_data(hdev, skb);
2558 break;
2559
2560 case HCI_OP_READ_LOCAL_OOB_EXT_DATA:
2561 hci_cc_read_local_oob_ext_data(hdev, skb);
Szymon Jancc35938b2011-03-22 13:12:21 +01002562 break;
2563
Ville Tervo6ed58ec2011-02-10 22:38:48 -03002564 case HCI_OP_LE_READ_BUFFER_SIZE:
2565 hci_cc_le_read_buffer_size(hdev, skb);
2566 break;
2567
Johan Hedberg60e77322013-01-22 14:01:59 +02002568 case HCI_OP_LE_READ_LOCAL_FEATURES:
2569 hci_cc_le_read_local_features(hdev, skb);
2570 break;
2571
Johan Hedberg8fa19092012-10-19 20:57:49 +03002572 case HCI_OP_LE_READ_ADV_TX_POWER:
2573 hci_cc_le_read_adv_tx_power(hdev, skb);
2574 break;
2575
Johan Hedberga5c29682011-02-19 12:05:57 -03002576 case HCI_OP_USER_CONFIRM_REPLY:
2577 hci_cc_user_confirm_reply(hdev, skb);
2578 break;
2579
2580 case HCI_OP_USER_CONFIRM_NEG_REPLY:
2581 hci_cc_user_confirm_neg_reply(hdev, skb);
2582 break;
2583
Brian Gix1143d452011-11-23 08:28:34 -08002584 case HCI_OP_USER_PASSKEY_REPLY:
2585 hci_cc_user_passkey_reply(hdev, skb);
2586 break;
2587
2588 case HCI_OP_USER_PASSKEY_NEG_REPLY:
2589 hci_cc_user_passkey_neg_reply(hdev, skb);
Szymon Janc16cde992012-04-13 12:32:42 +02002590 break;
Andre Guedes07f7fa52011-12-02 21:13:31 +09002591
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08002592 case HCI_OP_LE_SET_RANDOM_ADDR:
2593 hci_cc_le_set_random_addr(hdev, skb);
2594 break;
2595
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01002596 case HCI_OP_LE_SET_ADV_ENABLE:
2597 hci_cc_le_set_adv_enable(hdev, skb);
2598 break;
2599
Marcel Holtmann533553f2014-03-21 12:18:10 -07002600 case HCI_OP_LE_SET_SCAN_PARAM:
2601 hci_cc_le_set_scan_param(hdev, skb);
2602 break;
2603
Andre Guedeseb9d91f2011-05-26 16:23:52 -03002604 case HCI_OP_LE_SET_SCAN_ENABLE:
2605 hci_cc_le_set_scan_enable(hdev, skb);
2606 break;
2607
Johan Hedbergcf1d0812013-01-22 14:02:00 +02002608 case HCI_OP_LE_READ_WHITE_LIST_SIZE:
2609 hci_cc_le_read_white_list_size(hdev, skb);
2610 break;
2611
Marcel Holtmann0f36b582014-02-27 20:37:31 -08002612 case HCI_OP_LE_CLEAR_WHITE_LIST:
2613 hci_cc_le_clear_white_list(hdev, skb);
2614 break;
2615
2616 case HCI_OP_LE_ADD_TO_WHITE_LIST:
2617 hci_cc_le_add_to_white_list(hdev, skb);
2618 break;
2619
2620 case HCI_OP_LE_DEL_FROM_WHITE_LIST:
2621 hci_cc_le_del_from_white_list(hdev, skb);
2622 break;
2623
Johan Hedberg9b008c02013-01-22 14:02:01 +02002624 case HCI_OP_LE_READ_SUPPORTED_STATES:
2625 hci_cc_le_read_supported_states(hdev, skb);
2626 break;
2627
Andre Guedesf9b49302011-06-30 19:20:53 -03002628 case HCI_OP_WRITE_LE_HOST_SUPPORTED:
2629 hci_cc_write_le_host_supported(hdev, skb);
2630 break;
2631
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02002632 case HCI_OP_LE_SET_ADV_PARAM:
2633 hci_cc_set_adv_param(hdev, skb);
2634 break;
2635
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03002636 case HCI_OP_WRITE_REMOTE_AMP_ASSOC:
2637 hci_cc_write_remote_amp_assoc(hdev, skb);
2638 break;
2639
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002640 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002641 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002642 break;
2643 }
2644
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002645 if (opcode != HCI_OP_NOP)
Ville Tervo6bd32322011-02-16 16:32:41 +02002646 del_timer(&hdev->cmd_timer);
2647
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002648 hci_req_cmd_complete(hdev, opcode, status);
Johan Hedberg9238f362013-03-05 20:37:48 +02002649
Szymon Jancdbccd792012-12-11 08:51:19 +01002650 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002651 atomic_set(&hdev->cmd_cnt, 1);
2652 if (!skb_queue_empty(&hdev->cmd_q))
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02002653 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002654 }
2655}
2656
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002657static void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002658{
2659 struct hci_ev_cmd_status *ev = (void *) skb->data;
2660 __u16 opcode;
2661
2662 skb_pull(skb, sizeof(*ev));
2663
2664 opcode = __le16_to_cpu(ev->opcode);
2665
2666 switch (opcode) {
2667 case HCI_OP_INQUIRY:
2668 hci_cs_inquiry(hdev, ev->status);
2669 break;
2670
2671 case HCI_OP_CREATE_CONN:
2672 hci_cs_create_conn(hdev, ev->status);
2673 break;
2674
2675 case HCI_OP_ADD_SCO:
2676 hci_cs_add_sco(hdev, ev->status);
2677 break;
2678
Marcel Holtmannf8558552008-07-14 20:13:49 +02002679 case HCI_OP_AUTH_REQUESTED:
2680 hci_cs_auth_requested(hdev, ev->status);
2681 break;
2682
2683 case HCI_OP_SET_CONN_ENCRYPT:
2684 hci_cs_set_conn_encrypt(hdev, ev->status);
2685 break;
2686
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002687 case HCI_OP_REMOTE_NAME_REQ:
2688 hci_cs_remote_name_req(hdev, ev->status);
2689 break;
2690
Marcel Holtmann769be972008-07-14 20:13:49 +02002691 case HCI_OP_READ_REMOTE_FEATURES:
2692 hci_cs_read_remote_features(hdev, ev->status);
2693 break;
2694
2695 case HCI_OP_READ_REMOTE_EXT_FEATURES:
2696 hci_cs_read_remote_ext_features(hdev, ev->status);
2697 break;
2698
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002699 case HCI_OP_SETUP_SYNC_CONN:
2700 hci_cs_setup_sync_conn(hdev, ev->status);
2701 break;
2702
2703 case HCI_OP_SNIFF_MODE:
2704 hci_cs_sniff_mode(hdev, ev->status);
2705 break;
2706
2707 case HCI_OP_EXIT_SNIFF_MODE:
2708 hci_cs_exit_sniff_mode(hdev, ev->status);
2709 break;
2710
Johan Hedberg8962ee72011-01-20 12:40:27 +02002711 case HCI_OP_DISCONNECT:
Johan Hedberg88c3df12012-02-09 14:27:38 +02002712 hci_cs_disconnect(hdev, ev->status);
Johan Hedberg8962ee72011-01-20 12:40:27 +02002713 break;
2714
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03002715 case HCI_OP_CREATE_PHY_LINK:
2716 hci_cs_create_phylink(hdev, ev->status);
2717 break;
2718
Andrei Emeltchenko0b26ab92012-09-27 17:26:24 +03002719 case HCI_OP_ACCEPT_PHY_LINK:
2720 hci_cs_accept_phylink(hdev, ev->status);
2721 break;
2722
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002723 case HCI_OP_LE_CREATE_CONN:
2724 hci_cs_le_create_conn(hdev, ev->status);
2725 break;
2726
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02002727 case HCI_OP_LE_START_ENC:
2728 hci_cs_le_start_enc(hdev, ev->status);
2729 break;
2730
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002731 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002732 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002733 break;
2734 }
2735
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002736 if (opcode != HCI_OP_NOP)
Ville Tervo6bd32322011-02-16 16:32:41 +02002737 del_timer(&hdev->cmd_timer);
2738
Johan Hedberg02350a72013-04-03 21:50:29 +03002739 if (ev->status ||
2740 (hdev->sent_cmd && !bt_cb(hdev->sent_cmd)->req.event))
2741 hci_req_cmd_complete(hdev, opcode, ev->status);
Johan Hedberg9238f362013-03-05 20:37:48 +02002742
Gustavo F. Padovan10572132011-03-16 15:36:29 -03002743 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002744 atomic_set(&hdev->cmd_cnt, 1);
2745 if (!skb_queue_empty(&hdev->cmd_q))
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02002746 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002747 }
2748}
2749
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002750static void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002751{
2752 struct hci_ev_role_change *ev = (void *) skb->data;
2753 struct hci_conn *conn;
2754
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002755 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002756
2757 hci_dev_lock(hdev);
2758
2759 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
2760 if (conn) {
2761 if (!ev->status) {
2762 if (ev->role)
2763 conn->link_mode &= ~HCI_LM_MASTER;
2764 else
2765 conn->link_mode |= HCI_LM_MASTER;
2766 }
2767
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002768 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002769
2770 hci_role_switch_cfm(conn, ev->status, ev->role);
2771 }
2772
2773 hci_dev_unlock(hdev);
2774}
2775
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002776static void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002777{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002778 struct hci_ev_num_comp_pkts *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002779 int i;
2780
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02002781 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_PACKET_BASED) {
2782 BT_ERR("Wrong event for mode %d", hdev->flow_ctl_mode);
2783 return;
2784 }
2785
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02002786 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03002787 ev->num_hndl * sizeof(struct hci_comp_pkts_info)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002788 BT_DBG("%s bad parameters", hdev->name);
2789 return;
2790 }
2791
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02002792 BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl);
2793
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02002794 for (i = 0; i < ev->num_hndl; i++) {
2795 struct hci_comp_pkts_info *info = &ev->handles[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002796 struct hci_conn *conn;
2797 __u16 handle, count;
2798
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02002799 handle = __le16_to_cpu(info->handle);
2800 count = __le16_to_cpu(info->count);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002801
2802 conn = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002803 if (!conn)
2804 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002805
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002806 conn->sent -= count;
2807
2808 switch (conn->type) {
2809 case ACL_LINK:
2810 hdev->acl_cnt += count;
2811 if (hdev->acl_cnt > hdev->acl_pkts)
2812 hdev->acl_cnt = hdev->acl_pkts;
2813 break;
2814
2815 case LE_LINK:
2816 if (hdev->le_pkts) {
2817 hdev->le_cnt += count;
2818 if (hdev->le_cnt > hdev->le_pkts)
2819 hdev->le_cnt = hdev->le_pkts;
2820 } else {
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02002821 hdev->acl_cnt += count;
2822 if (hdev->acl_cnt > hdev->acl_pkts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002823 hdev->acl_cnt = hdev->acl_pkts;
2824 }
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002825 break;
2826
2827 case SCO_LINK:
2828 hdev->sco_cnt += count;
2829 if (hdev->sco_cnt > hdev->sco_pkts)
2830 hdev->sco_cnt = hdev->sco_pkts;
2831 break;
2832
2833 default:
2834 BT_ERR("Unknown type %d conn %p", conn->type, conn);
2835 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002836 }
2837 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002838
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02002839 queue_work(hdev->workqueue, &hdev->tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002840}
2841
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03002842static struct hci_conn *__hci_conn_lookup_handle(struct hci_dev *hdev,
2843 __u16 handle)
2844{
2845 struct hci_chan *chan;
2846
2847 switch (hdev->dev_type) {
2848 case HCI_BREDR:
2849 return hci_conn_hash_lookup_handle(hdev, handle);
2850 case HCI_AMP:
2851 chan = hci_chan_lookup_handle(hdev, handle);
2852 if (chan)
2853 return chan->conn;
2854 break;
2855 default:
2856 BT_ERR("%s unknown dev_type %d", hdev->name, hdev->dev_type);
2857 break;
2858 }
2859
2860 return NULL;
2861}
2862
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002863static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002864{
2865 struct hci_ev_num_comp_blocks *ev = (void *) skb->data;
2866 int i;
2867
2868 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_BLOCK_BASED) {
2869 BT_ERR("Wrong event for mode %d", hdev->flow_ctl_mode);
2870 return;
2871 }
2872
2873 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03002874 ev->num_hndl * sizeof(struct hci_comp_blocks_info)) {
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002875 BT_DBG("%s bad parameters", hdev->name);
2876 return;
2877 }
2878
2879 BT_DBG("%s num_blocks %d num_hndl %d", hdev->name, ev->num_blocks,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002880 ev->num_hndl);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002881
2882 for (i = 0; i < ev->num_hndl; i++) {
2883 struct hci_comp_blocks_info *info = &ev->handles[i];
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03002884 struct hci_conn *conn = NULL;
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002885 __u16 handle, block_count;
2886
2887 handle = __le16_to_cpu(info->handle);
2888 block_count = __le16_to_cpu(info->blocks);
2889
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03002890 conn = __hci_conn_lookup_handle(hdev, handle);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002891 if (!conn)
2892 continue;
2893
2894 conn->sent -= block_count;
2895
2896 switch (conn->type) {
2897 case ACL_LINK:
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03002898 case AMP_LINK:
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002899 hdev->block_cnt += block_count;
2900 if (hdev->block_cnt > hdev->num_blocks)
2901 hdev->block_cnt = hdev->num_blocks;
2902 break;
2903
2904 default:
2905 BT_ERR("Unknown type %d conn %p", conn->type, conn);
2906 break;
2907 }
2908 }
2909
2910 queue_work(hdev->workqueue, &hdev->tx_work);
2911}
2912
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002913static void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002914{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002915 struct hci_ev_mode_change *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02002916 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002917
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002918 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002919
2920 hci_dev_lock(hdev);
2921
Marcel Holtmann04837f62006-07-03 10:02:33 +02002922 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
2923 if (conn) {
2924 conn->mode = ev->mode;
Marcel Holtmann04837f62006-07-03 10:02:33 +02002925
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03002926 if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND,
2927 &conn->flags)) {
Marcel Holtmann04837f62006-07-03 10:02:33 +02002928 if (conn->mode == HCI_CM_ACTIVE)
Johan Hedberg58a681e2012-01-16 06:47:28 +02002929 set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02002930 else
Johan Hedberg58a681e2012-01-16 06:47:28 +02002931 clear_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02002932 }
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002933
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002934 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002935 hci_sco_setup(conn, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02002936 }
2937
2938 hci_dev_unlock(hdev);
2939}
2940
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002941static void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002942{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002943 struct hci_ev_pin_code_req *ev = (void *) skb->data;
2944 struct hci_conn *conn;
2945
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002946 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002947
2948 hci_dev_lock(hdev);
2949
2950 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02002951 if (!conn)
2952 goto unlock;
2953
2954 if (conn->state == BT_CONNECTED) {
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002955 hci_conn_hold(conn);
2956 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02002957 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002958 }
2959
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02002960 if (!test_bit(HCI_PAIRABLE, &hdev->dev_flags))
Johan Hedberg03b555e2011-01-04 15:40:05 +02002961 hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002962 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02002963 else if (test_bit(HCI_MGMT, &hdev->dev_flags)) {
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02002964 u8 secure;
2965
2966 if (conn->pending_sec_level == BT_SECURITY_HIGH)
2967 secure = 1;
2968 else
2969 secure = 0;
2970
Johan Hedberg744cf192011-11-08 20:40:14 +02002971 mgmt_pin_code_request(hdev, &ev->bdaddr, secure);
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02002972 }
Johan Hedberg980e1a52011-01-22 06:10:07 +02002973
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02002974unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002975 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002976}
2977
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002978static void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002979{
Johan Hedberg55ed8ca2011-01-17 14:41:05 +02002980 struct hci_ev_link_key_req *ev = (void *) skb->data;
2981 struct hci_cp_link_key_reply cp;
2982 struct hci_conn *conn;
2983 struct link_key *key;
2984
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002985 BT_DBG("%s", hdev->name);
Johan Hedberg55ed8ca2011-01-17 14:41:05 +02002986
Andrei Emeltchenko034cbea2013-05-14 11:44:16 +03002987 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg55ed8ca2011-01-17 14:41:05 +02002988 return;
2989
2990 hci_dev_lock(hdev);
2991
2992 key = hci_find_link_key(hdev, &ev->bdaddr);
2993 if (!key) {
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03002994 BT_DBG("%s link key not found for %pMR", hdev->name,
2995 &ev->bdaddr);
Johan Hedberg55ed8ca2011-01-17 14:41:05 +02002996 goto not_found;
2997 }
2998
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03002999 BT_DBG("%s found key type %u for %pMR", hdev->name, key->type,
3000 &ev->bdaddr);
Johan Hedberg55ed8ca2011-01-17 14:41:05 +02003001
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003002 if (!test_bit(HCI_DEBUG_KEYS, &hdev->dev_flags) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03003003 key->type == HCI_LK_DEBUG_COMBINATION) {
Johan Hedberg55ed8ca2011-01-17 14:41:05 +02003004 BT_DBG("%s ignoring debug key", hdev->name);
3005 goto not_found;
3006 }
3007
3008 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003009 if (conn) {
Marcel Holtmann66138ce2014-01-10 02:07:20 -08003010 if ((key->type == HCI_LK_UNAUTH_COMBINATION_P192 ||
3011 key->type == HCI_LK_UNAUTH_COMBINATION_P256) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03003012 conn->auth_type != 0xff && (conn->auth_type & 0x01)) {
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003013 BT_DBG("%s ignoring unauthenticated key", hdev->name);
3014 goto not_found;
3015 }
Johan Hedberg55ed8ca2011-01-17 14:41:05 +02003016
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003017 if (key->type == HCI_LK_COMBINATION && key->pin_len < 16 &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03003018 conn->pending_sec_level == BT_SECURITY_HIGH) {
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003019 BT_DBG("%s ignoring key unauthenticated for high security",
3020 hdev->name);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003021 goto not_found;
3022 }
3023
3024 conn->key_type = key->type;
3025 conn->pin_length = key->pin_len;
Johan Hedberg55ed8ca2011-01-17 14:41:05 +02003026 }
3027
3028 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9b3b4462012-05-23 11:31:20 +03003029 memcpy(cp.link_key, key->val, HCI_LINK_KEY_SIZE);
Johan Hedberg55ed8ca2011-01-17 14:41:05 +02003030
3031 hci_send_cmd(hdev, HCI_OP_LINK_KEY_REPLY, sizeof(cp), &cp);
3032
3033 hci_dev_unlock(hdev);
3034
3035 return;
3036
3037not_found:
3038 hci_send_cmd(hdev, HCI_OP_LINK_KEY_NEG_REPLY, 6, &ev->bdaddr);
3039 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003040}
3041
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003042static void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003043{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003044 struct hci_ev_link_key_notify *ev = (void *) skb->data;
3045 struct hci_conn *conn;
Johan Hedberg55ed8ca2011-01-17 14:41:05 +02003046 u8 pin_len = 0;
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003047
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003048 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003049
3050 hci_dev_lock(hdev);
3051
3052 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3053 if (conn) {
3054 hci_conn_hold(conn);
3055 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Johan Hedberg980e1a52011-01-22 06:10:07 +02003056 pin_len = conn->pin_length;
Waldemar Rymarkiewicz13d39312011-04-28 12:07:55 +02003057
3058 if (ev->key_type != HCI_LK_CHANGED_COMBINATION)
3059 conn->key_type = ev->key_type;
3060
David Herrmann76a68ba2013-04-06 20:28:37 +02003061 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003062 }
3063
Andrei Emeltchenko034cbea2013-05-14 11:44:16 +03003064 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedbergd25e28a2011-04-28 11:28:59 -07003065 hci_add_link_key(hdev, conn, 1, &ev->bdaddr, ev->link_key,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003066 ev->key_type, pin_len);
Johan Hedberg55ed8ca2011-01-17 14:41:05 +02003067
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003068 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003069}
3070
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003071static void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04837f62006-07-03 10:02:33 +02003072{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003073 struct hci_ev_clock_offset *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003074 struct hci_conn *conn;
3075
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003076 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003077
3078 hci_dev_lock(hdev);
3079
3080 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003081 if (conn && !ev->status) {
3082 struct inquiry_entry *ie;
3083
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003084 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3085 if (ie) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003086 ie->data.clock_offset = ev->clock_offset;
3087 ie->timestamp = jiffies;
3088 }
3089 }
3090
3091 hci_dev_unlock(hdev);
3092}
3093
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003094static void hci_pkt_type_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna8746412008-07-14 20:13:46 +02003095{
3096 struct hci_ev_pkt_type_change *ev = (void *) skb->data;
3097 struct hci_conn *conn;
3098
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003099 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna8746412008-07-14 20:13:46 +02003100
3101 hci_dev_lock(hdev);
3102
3103 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3104 if (conn && !ev->status)
3105 conn->pkt_type = __le16_to_cpu(ev->pkt_type);
3106
3107 hci_dev_unlock(hdev);
3108}
3109
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003110static void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003111{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003112 struct hci_ev_pscan_rep_mode *ev = (void *) skb->data;
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003113 struct inquiry_entry *ie;
3114
3115 BT_DBG("%s", hdev->name);
3116
3117 hci_dev_lock(hdev);
3118
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003119 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3120 if (ie) {
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003121 ie->data.pscan_rep_mode = ev->pscan_rep_mode;
3122 ie->timestamp = jiffies;
3123 }
3124
3125 hci_dev_unlock(hdev);
3126}
3127
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003128static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
3129 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003130{
3131 struct inquiry_data data;
3132 int num_rsp = *((__u8 *) skb->data);
Johan Hedberg388fc8f2012-02-23 00:38:59 +02003133 bool name_known, ssp;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003134
3135 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3136
3137 if (!num_rsp)
3138 return;
3139
Andre Guedes1519cc12012-03-21 00:03:38 -03003140 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
3141 return;
3142
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003143 hci_dev_lock(hdev);
3144
3145 if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) {
Szymon Janc138d22e2011-02-17 16:44:23 +01003146 struct inquiry_info_with_rssi_and_pscan_mode *info;
3147 info = (void *) (skb->data + 1);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003148
Johan Hedberge17acd42011-03-30 23:57:16 +03003149 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003150 bacpy(&data.bdaddr, &info->bdaddr);
3151 data.pscan_rep_mode = info->pscan_rep_mode;
3152 data.pscan_period_mode = info->pscan_period_mode;
3153 data.pscan_mode = info->pscan_mode;
3154 memcpy(data.dev_class, info->dev_class, 3);
3155 data.clock_offset = info->clock_offset;
3156 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003157 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02003158
3159 name_known = hci_inquiry_cache_update(hdev, &data,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003160 false, &ssp);
Johan Hedberg48264f02011-11-09 13:58:58 +02003161 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003162 info->dev_class, info->rssi,
Johan Hedberg5d2e9fa2014-03-25 10:30:47 +02003163 !name_known, ssp, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003164 }
3165 } else {
3166 struct inquiry_info_with_rssi *info = (void *) (skb->data + 1);
3167
Johan Hedberge17acd42011-03-30 23:57:16 +03003168 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003169 bacpy(&data.bdaddr, &info->bdaddr);
3170 data.pscan_rep_mode = info->pscan_rep_mode;
3171 data.pscan_period_mode = info->pscan_period_mode;
3172 data.pscan_mode = 0x00;
3173 memcpy(data.dev_class, info->dev_class, 3);
3174 data.clock_offset = info->clock_offset;
3175 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003176 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02003177 name_known = hci_inquiry_cache_update(hdev, &data,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003178 false, &ssp);
Johan Hedberg48264f02011-11-09 13:58:58 +02003179 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003180 info->dev_class, info->rssi,
Johan Hedberg5d2e9fa2014-03-25 10:30:47 +02003181 !name_known, ssp, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003182 }
3183 }
3184
3185 hci_dev_unlock(hdev);
3186}
3187
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003188static void hci_remote_ext_features_evt(struct hci_dev *hdev,
3189 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003190{
Marcel Holtmann41a96212008-07-14 20:13:48 +02003191 struct hci_ev_remote_ext_features *ev = (void *) skb->data;
3192 struct hci_conn *conn;
3193
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003194 BT_DBG("%s", hdev->name);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003195
Marcel Holtmann41a96212008-07-14 20:13:48 +02003196 hci_dev_lock(hdev);
3197
3198 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02003199 if (!conn)
3200 goto unlock;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003201
Johan Hedbergcad718e2013-04-17 15:00:51 +03003202 if (ev->page < HCI_MAX_PAGES)
3203 memcpy(conn->features[ev->page], ev->features, 8);
3204
Johan Hedbergccd556f2010-11-10 17:11:51 +02003205 if (!ev->status && ev->page == 0x01) {
3206 struct inquiry_entry *ie;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003207
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003208 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3209 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003210 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann769be972008-07-14 20:13:49 +02003211
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303212 if (ev->features[0] & LMP_HOST_SSP) {
Johan Hedberg58a681e2012-01-16 06:47:28 +02003213 set_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303214 } else {
3215 /* It is mandatory by the Bluetooth specification that
3216 * Extended Inquiry Results are only used when Secure
3217 * Simple Pairing is enabled, but some devices violate
3218 * this.
3219 *
3220 * To make these devices work, the internal SSP
3221 * enabled flag needs to be cleared if the remote host
3222 * features do not indicate SSP support */
3223 clear_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
3224 }
Marcel Holtmanneb9a8f32014-01-15 22:37:38 -08003225
3226 if (ev->features[0] & LMP_HOST_SC)
3227 set_bit(HCI_CONN_SC_ENABLED, &conn->flags);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003228 }
3229
Johan Hedbergccd556f2010-11-10 17:11:51 +02003230 if (conn->state != BT_CONFIG)
3231 goto unlock;
3232
Johan Hedberg671267b2012-05-12 16:11:50 -03003233 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02003234 struct hci_cp_remote_name_req cp;
3235 memset(&cp, 0, sizeof(cp));
3236 bacpy(&cp.bdaddr, &conn->dst);
3237 cp.pscan_rep_mode = 0x02;
3238 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02003239 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
3240 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003241 conn->dst_type, 0, NULL, 0,
3242 conn->dev_class);
Johan Hedberg392599b2010-11-18 22:22:28 +02003243
Johan Hedberg127178d2010-11-18 22:22:29 +02003244 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02003245 conn->state = BT_CONNECTED;
3246 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003247 hci_conn_drop(conn);
Johan Hedbergccd556f2010-11-10 17:11:51 +02003248 }
3249
3250unlock:
Marcel Holtmann41a96212008-07-14 20:13:48 +02003251 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003252}
3253
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003254static void hci_sync_conn_complete_evt(struct hci_dev *hdev,
3255 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003256{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003257 struct hci_ev_sync_conn_complete *ev = (void *) skb->data;
3258 struct hci_conn *conn;
3259
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003260 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003261
3262 hci_dev_lock(hdev);
3263
3264 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003265 if (!conn) {
3266 if (ev->link_type == ESCO_LINK)
3267 goto unlock;
3268
3269 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
3270 if (!conn)
3271 goto unlock;
3272
3273 conn->type = SCO_LINK;
3274 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003275
Marcel Holtmann732547f2009-04-19 19:14:14 +02003276 switch (ev->status) {
3277 case 0x00:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003278 conn->handle = __le16_to_cpu(ev->handle);
3279 conn->state = BT_CONNECTED;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02003280
3281 hci_conn_add_sysfs(conn);
Marcel Holtmann732547f2009-04-19 19:14:14 +02003282 break;
3283
Frédéric Dalleau1a4c9582013-08-19 14:24:02 +02003284 case 0x0d: /* Connection Rejected due to Limited Resources */
Stephen Coe705e5712010-02-16 11:29:44 -05003285 case 0x11: /* Unsupported Feature or Parameter Value */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003286 case 0x1c: /* SCO interval rejected */
Nick Pelly1038a002010-02-03 11:42:26 -08003287 case 0x1a: /* Unsupported Remote Feature */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003288 case 0x1f: /* Unspecified error */
Andrew Earl27539bc2014-03-10 10:31:04 +00003289 case 0x20: /* Unsupported LMP Parameter value */
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003290 if (conn->out) {
Marcel Holtmann732547f2009-04-19 19:14:14 +02003291 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
3292 (hdev->esco_type & EDR_ESCO_MASK);
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003293 if (hci_setup_sync(conn, conn->link->handle))
3294 goto unlock;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003295 }
3296 /* fall through */
3297
3298 default:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003299 conn->state = BT_CLOSED;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003300 break;
3301 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003302
3303 hci_proto_connect_cfm(conn, ev->status);
3304 if (ev->status)
3305 hci_conn_del(conn);
3306
3307unlock:
3308 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003309}
3310
Marcel Holtmannefdcf8e2013-10-15 10:31:12 -07003311static inline size_t eir_get_length(u8 *eir, size_t eir_len)
3312{
3313 size_t parsed = 0;
3314
3315 while (parsed < eir_len) {
3316 u8 field_len = eir[0];
3317
3318 if (field_len == 0)
3319 return parsed;
3320
3321 parsed += field_len + 1;
3322 eir += field_len + 1;
3323 }
3324
3325 return eir_len;
3326}
3327
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003328static void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
3329 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003330{
3331 struct inquiry_data data;
3332 struct extended_inquiry_info *info = (void *) (skb->data + 1);
3333 int num_rsp = *((__u8 *) skb->data);
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303334 size_t eir_len;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003335
3336 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3337
3338 if (!num_rsp)
3339 return;
3340
Andre Guedes1519cc12012-03-21 00:03:38 -03003341 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
3342 return;
3343
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003344 hci_dev_lock(hdev);
3345
Johan Hedberge17acd42011-03-30 23:57:16 +03003346 for (; num_rsp; num_rsp--, info++) {
Johan Hedberg388fc8f2012-02-23 00:38:59 +02003347 bool name_known, ssp;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003348
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003349 bacpy(&data.bdaddr, &info->bdaddr);
Szymon Janc138d22e2011-02-17 16:44:23 +01003350 data.pscan_rep_mode = info->pscan_rep_mode;
3351 data.pscan_period_mode = info->pscan_period_mode;
3352 data.pscan_mode = 0x00;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003353 memcpy(data.dev_class, info->dev_class, 3);
Szymon Janc138d22e2011-02-17 16:44:23 +01003354 data.clock_offset = info->clock_offset;
3355 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003356 data.ssp_mode = 0x01;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003357
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003358 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg4ddb1932012-01-15 20:04:43 +02003359 name_known = eir_has_data_type(info->data,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003360 sizeof(info->data),
3361 EIR_NAME_COMPLETE);
Johan Hedberg561aafb2012-01-04 13:31:59 +02003362 else
3363 name_known = true;
3364
Johan Hedberg388fc8f2012-02-23 00:38:59 +02003365 name_known = hci_inquiry_cache_update(hdev, &data, name_known,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003366 &ssp);
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303367 eir_len = eir_get_length(info->data, sizeof(info->data));
Johan Hedberg48264f02011-11-09 13:58:58 +02003368 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003369 info->dev_class, info->rssi, !name_known,
Johan Hedberg5d2e9fa2014-03-25 10:30:47 +02003370 ssp, info->data, eir_len, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003371 }
3372
3373 hci_dev_unlock(hdev);
3374}
3375
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003376static void hci_key_refresh_complete_evt(struct hci_dev *hdev,
3377 struct sk_buff *skb)
3378{
3379 struct hci_ev_key_refresh_complete *ev = (void *) skb->data;
3380 struct hci_conn *conn;
3381
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003382 BT_DBG("%s status 0x%2.2x handle 0x%4.4x", hdev->name, ev->status,
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003383 __le16_to_cpu(ev->handle));
3384
3385 hci_dev_lock(hdev);
3386
3387 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3388 if (!conn)
3389 goto unlock;
3390
3391 if (!ev->status)
3392 conn->sec_level = conn->pending_sec_level;
3393
3394 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
3395
3396 if (ev->status && conn->state == BT_CONNECTED) {
Andre Guedesbed71742013-01-30 11:50:56 -03003397 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
David Herrmann76a68ba2013-04-06 20:28:37 +02003398 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003399 goto unlock;
3400 }
3401
3402 if (conn->state == BT_CONFIG) {
3403 if (!ev->status)
3404 conn->state = BT_CONNECTED;
3405
3406 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003407 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003408 } else {
3409 hci_auth_cfm(conn, ev->status);
3410
3411 hci_conn_hold(conn);
3412 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003413 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003414 }
3415
3416unlock:
3417 hci_dev_unlock(hdev);
3418}
3419
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003420static u8 hci_get_auth_req(struct hci_conn *conn)
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003421{
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003422 /* If remote requests no-bonding follow that lead */
Mikel Astizacabae92013-06-28 10:56:28 +02003423 if (conn->remote_auth == HCI_AT_NO_BONDING ||
3424 conn->remote_auth == HCI_AT_NO_BONDING_MITM)
Waldemar Rymarkiewicz58797bf2011-04-28 12:07:58 +02003425 return conn->remote_auth | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003426
Mikel Astizb7f94c82014-04-08 14:21:31 +02003427 /* For general bonding, use the given auth_type */
3428 if (conn->remote_auth == HCI_AT_GENERAL_BONDING ||
3429 conn->remote_auth == HCI_AT_GENERAL_BONDING_MITM)
3430 return conn->auth_type;
3431
3432 /* If both remote and local have enough IO capabilities, require
3433 * MITM protection
3434 */
3435 if (conn->remote_cap != HCI_IO_NO_INPUT_OUTPUT &&
3436 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT)
3437 return conn->remote_auth | 0x01;
3438
3439 /* No MITM protection possible so remove requirement */
3440 return conn->remote_auth & ~0x01;
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003441}
3442
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003443static void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003444{
3445 struct hci_ev_io_capa_request *ev = (void *) skb->data;
3446 struct hci_conn *conn;
3447
3448 BT_DBG("%s", hdev->name);
3449
3450 hci_dev_lock(hdev);
3451
3452 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003453 if (!conn)
3454 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02003455
Johan Hedberg03b555e2011-01-04 15:40:05 +02003456 hci_conn_hold(conn);
3457
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003458 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg03b555e2011-01-04 15:40:05 +02003459 goto unlock;
3460
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003461 if (test_bit(HCI_PAIRABLE, &hdev->dev_flags) ||
Gustavo Padovan807deac2012-05-17 00:36:24 -03003462 (conn->remote_auth & ~0x01) == HCI_AT_NO_BONDING) {
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003463 struct hci_cp_io_capability_reply cp;
3464
3465 bacpy(&cp.bdaddr, &ev->bdaddr);
Hemant Gupta7a7f1e72012-01-16 13:34:29 +05303466 /* Change the IO capability from KeyboardDisplay
3467 * to DisplayYesNo as it is not supported by BT spec. */
3468 cp.capability = (conn->io_capability == 0x04) ?
Mikel Astiza7676312013-06-28 10:56:29 +02003469 HCI_IO_DISPLAY_YESNO : conn->io_capability;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003470
3471 /* If we are initiators, there is no remote information yet */
3472 if (conn->remote_auth == 0xff) {
3473 cp.authentication = conn->auth_type;
3474 } else {
3475 conn->auth_type = hci_get_auth_req(conn);
3476 cp.authentication = conn->auth_type;
3477 }
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003478
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003479 if (hci_find_remote_oob_data(hdev, &conn->dst) &&
3480 (conn->out || test_bit(HCI_CONN_REMOTE_OOB, &conn->flags)))
Szymon Jancce85ee12011-03-22 13:12:23 +01003481 cp.oob_data = 0x01;
3482 else
3483 cp.oob_data = 0x00;
3484
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003485 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003486 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003487 } else {
3488 struct hci_cp_io_capability_neg_reply cp;
3489
3490 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003491 cp.reason = HCI_ERROR_PAIRING_NOT_ALLOWED;
Johan Hedberg03b555e2011-01-04 15:40:05 +02003492
3493 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003494 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003495 }
3496
3497unlock:
3498 hci_dev_unlock(hdev);
3499}
3500
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003501static void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *skb)
Johan Hedberg03b555e2011-01-04 15:40:05 +02003502{
3503 struct hci_ev_io_capa_reply *ev = (void *) skb->data;
3504 struct hci_conn *conn;
3505
3506 BT_DBG("%s", hdev->name);
3507
3508 hci_dev_lock(hdev);
3509
3510 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3511 if (!conn)
3512 goto unlock;
3513
Johan Hedberg03b555e2011-01-04 15:40:05 +02003514 conn->remote_cap = ev->capability;
Johan Hedberg03b555e2011-01-04 15:40:05 +02003515 conn->remote_auth = ev->authentication;
Johan Hedberg58a681e2012-01-16 06:47:28 +02003516 if (ev->oob_data)
3517 set_bit(HCI_CONN_REMOTE_OOB, &conn->flags);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003518
3519unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02003520 hci_dev_unlock(hdev);
3521}
3522
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003523static void hci_user_confirm_request_evt(struct hci_dev *hdev,
3524 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -03003525{
3526 struct hci_ev_user_confirm_req *ev = (void *) skb->data;
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003527 int loc_mitm, rem_mitm, confirm_hint = 0;
Johan Hedberg7a828902011-04-28 11:28:53 -07003528 struct hci_conn *conn;
Johan Hedberga5c29682011-02-19 12:05:57 -03003529
3530 BT_DBG("%s", hdev->name);
3531
3532 hci_dev_lock(hdev);
3533
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003534 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg7a828902011-04-28 11:28:53 -07003535 goto unlock;
Johan Hedberga5c29682011-02-19 12:05:57 -03003536
Johan Hedberg7a828902011-04-28 11:28:53 -07003537 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3538 if (!conn)
3539 goto unlock;
3540
3541 loc_mitm = (conn->auth_type & 0x01);
3542 rem_mitm = (conn->remote_auth & 0x01);
3543
3544 /* If we require MITM but the remote device can't provide that
3545 * (it has NoInputNoOutput) then reject the confirmation
3546 * request. The only exception is when we're dedicated bonding
3547 * initiators (connect_cfm_cb set) since then we always have the MITM
3548 * bit set. */
Mikel Astiza7676312013-06-28 10:56:29 +02003549 if (!conn->connect_cfm_cb && loc_mitm &&
3550 conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) {
Johan Hedberg7a828902011-04-28 11:28:53 -07003551 BT_DBG("Rejecting request: remote device can't provide MITM");
3552 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003553 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07003554 goto unlock;
3555 }
3556
3557 /* If no side requires MITM protection; auto-accept */
Mikel Astiza7676312013-06-28 10:56:29 +02003558 if ((!loc_mitm || conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) &&
3559 (!rem_mitm || conn->io_capability == HCI_IO_NO_INPUT_OUTPUT)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003560
3561 /* If we're not the initiators request authorization to
3562 * proceed from user space (mgmt_user_confirm with
3563 * confirm_hint set to 1). */
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003564 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003565 BT_DBG("Confirming auto-accept as acceptor");
3566 confirm_hint = 1;
3567 goto confirm;
3568 }
3569
Johan Hedberg9f616562011-04-28 11:28:54 -07003570 BT_DBG("Auto-accept of user confirmation with %ums delay",
Gustavo Padovan807deac2012-05-17 00:36:24 -03003571 hdev->auto_accept_delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07003572
3573 if (hdev->auto_accept_delay > 0) {
3574 int delay = msecs_to_jiffies(hdev->auto_accept_delay);
Johan Hedberg7bc18d92013-10-16 18:11:39 +03003575 queue_delayed_work(conn->hdev->workqueue,
3576 &conn->auto_accept_work, delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07003577 goto unlock;
3578 }
3579
Johan Hedberg7a828902011-04-28 11:28:53 -07003580 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003581 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07003582 goto unlock;
3583 }
3584
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003585confirm:
Johan Hedberg39adbff2014-03-20 08:18:14 +02003586 mgmt_user_confirm_request(hdev, &ev->bdaddr, ACL_LINK, 0,
3587 le32_to_cpu(ev->passkey), confirm_hint);
Johan Hedberg7a828902011-04-28 11:28:53 -07003588
3589unlock:
Johan Hedberga5c29682011-02-19 12:05:57 -03003590 hci_dev_unlock(hdev);
3591}
3592
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003593static void hci_user_passkey_request_evt(struct hci_dev *hdev,
3594 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -08003595{
3596 struct hci_ev_user_passkey_req *ev = (void *) skb->data;
3597
3598 BT_DBG("%s", hdev->name);
3599
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003600 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg272d90d2012-02-09 15:26:12 +02003601 mgmt_user_passkey_request(hdev, &ev->bdaddr, ACL_LINK, 0);
Brian Gix1143d452011-11-23 08:28:34 -08003602}
3603
Johan Hedberg92a25252012-09-06 18:39:26 +03003604static void hci_user_passkey_notify_evt(struct hci_dev *hdev,
3605 struct sk_buff *skb)
3606{
3607 struct hci_ev_user_passkey_notify *ev = (void *) skb->data;
3608 struct hci_conn *conn;
3609
3610 BT_DBG("%s", hdev->name);
3611
3612 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3613 if (!conn)
3614 return;
3615
3616 conn->passkey_notify = __le32_to_cpu(ev->passkey);
3617 conn->passkey_entered = 0;
3618
3619 if (test_bit(HCI_MGMT, &hdev->dev_flags))
3620 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
3621 conn->dst_type, conn->passkey_notify,
3622 conn->passkey_entered);
3623}
3624
3625static void hci_keypress_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
3626{
3627 struct hci_ev_keypress_notify *ev = (void *) skb->data;
3628 struct hci_conn *conn;
3629
3630 BT_DBG("%s", hdev->name);
3631
3632 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3633 if (!conn)
3634 return;
3635
3636 switch (ev->type) {
3637 case HCI_KEYPRESS_STARTED:
3638 conn->passkey_entered = 0;
3639 return;
3640
3641 case HCI_KEYPRESS_ENTERED:
3642 conn->passkey_entered++;
3643 break;
3644
3645 case HCI_KEYPRESS_ERASED:
3646 conn->passkey_entered--;
3647 break;
3648
3649 case HCI_KEYPRESS_CLEARED:
3650 conn->passkey_entered = 0;
3651 break;
3652
3653 case HCI_KEYPRESS_COMPLETED:
3654 return;
3655 }
3656
3657 if (test_bit(HCI_MGMT, &hdev->dev_flags))
3658 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
3659 conn->dst_type, conn->passkey_notify,
3660 conn->passkey_entered);
3661}
3662
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003663static void hci_simple_pair_complete_evt(struct hci_dev *hdev,
3664 struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003665{
3666 struct hci_ev_simple_pair_complete *ev = (void *) skb->data;
3667 struct hci_conn *conn;
3668
3669 BT_DBG("%s", hdev->name);
3670
3671 hci_dev_lock(hdev);
3672
3673 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg2a611692011-02-19 12:06:00 -03003674 if (!conn)
3675 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02003676
Johan Hedberg2a611692011-02-19 12:06:00 -03003677 /* To avoid duplicate auth_failed events to user space we check
3678 * the HCI_CONN_AUTH_PEND flag which will be set if we
3679 * initiated the authentication. A traditional auth_complete
3680 * event gets always produced as initiator and is also mapped to
3681 * the mgmt_auth_failed event */
Mikel Astizfa1bd912012-08-09 09:52:29 +02003682 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) && ev->status)
Johan Hedbergbab73cb2012-02-09 16:07:29 +02003683 mgmt_auth_failed(hdev, &conn->dst, conn->type, conn->dst_type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003684 ev->status);
Johan Hedberg2a611692011-02-19 12:06:00 -03003685
David Herrmann76a68ba2013-04-06 20:28:37 +02003686 hci_conn_drop(conn);
Johan Hedberg2a611692011-02-19 12:06:00 -03003687
3688unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02003689 hci_dev_unlock(hdev);
3690}
3691
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003692static void hci_remote_host_features_evt(struct hci_dev *hdev,
3693 struct sk_buff *skb)
Marcel Holtmann41a96212008-07-14 20:13:48 +02003694{
3695 struct hci_ev_remote_host_features *ev = (void *) skb->data;
3696 struct inquiry_entry *ie;
Johan Hedbergcad718e2013-04-17 15:00:51 +03003697 struct hci_conn *conn;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003698
3699 BT_DBG("%s", hdev->name);
3700
3701 hci_dev_lock(hdev);
3702
Johan Hedbergcad718e2013-04-17 15:00:51 +03003703 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3704 if (conn)
3705 memcpy(conn->features[1], ev->features, 8);
3706
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003707 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3708 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003709 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003710
3711 hci_dev_unlock(hdev);
3712}
3713
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003714static void hci_remote_oob_data_request_evt(struct hci_dev *hdev,
3715 struct sk_buff *skb)
Szymon Janc2763eda2011-03-22 13:12:22 +01003716{
3717 struct hci_ev_remote_oob_data_request *ev = (void *) skb->data;
3718 struct oob_data *data;
3719
3720 BT_DBG("%s", hdev->name);
3721
3722 hci_dev_lock(hdev);
3723
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003724 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Szymon Jance1ba1f12011-04-06 13:01:59 +02003725 goto unlock;
3726
Szymon Janc2763eda2011-03-22 13:12:22 +01003727 data = hci_find_remote_oob_data(hdev, &ev->bdaddr);
3728 if (data) {
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003729 if (test_bit(HCI_SC_ENABLED, &hdev->dev_flags)) {
3730 struct hci_cp_remote_oob_ext_data_reply cp;
Szymon Janc2763eda2011-03-22 13:12:22 +01003731
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003732 bacpy(&cp.bdaddr, &ev->bdaddr);
3733 memcpy(cp.hash192, data->hash192, sizeof(cp.hash192));
3734 memcpy(cp.randomizer192, data->randomizer192,
3735 sizeof(cp.randomizer192));
3736 memcpy(cp.hash256, data->hash256, sizeof(cp.hash256));
3737 memcpy(cp.randomizer256, data->randomizer256,
3738 sizeof(cp.randomizer256));
Szymon Janc2763eda2011-03-22 13:12:22 +01003739
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003740 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_EXT_DATA_REPLY,
3741 sizeof(cp), &cp);
3742 } else {
3743 struct hci_cp_remote_oob_data_reply cp;
3744
3745 bacpy(&cp.bdaddr, &ev->bdaddr);
3746 memcpy(cp.hash, data->hash192, sizeof(cp.hash));
3747 memcpy(cp.randomizer, data->randomizer192,
3748 sizeof(cp.randomizer));
3749
3750 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_REPLY,
3751 sizeof(cp), &cp);
3752 }
Szymon Janc2763eda2011-03-22 13:12:22 +01003753 } else {
3754 struct hci_cp_remote_oob_data_neg_reply cp;
3755
3756 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003757 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_NEG_REPLY,
3758 sizeof(cp), &cp);
Szymon Janc2763eda2011-03-22 13:12:22 +01003759 }
3760
Szymon Jance1ba1f12011-04-06 13:01:59 +02003761unlock:
Szymon Janc2763eda2011-03-22 13:12:22 +01003762 hci_dev_unlock(hdev);
3763}
3764
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003765static void hci_phy_link_complete_evt(struct hci_dev *hdev,
3766 struct sk_buff *skb)
3767{
3768 struct hci_ev_phy_link_complete *ev = (void *) skb->data;
3769 struct hci_conn *hcon, *bredr_hcon;
3770
3771 BT_DBG("%s handle 0x%2.2x status 0x%2.2x", hdev->name, ev->phy_handle,
3772 ev->status);
3773
3774 hci_dev_lock(hdev);
3775
3776 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
3777 if (!hcon) {
3778 hci_dev_unlock(hdev);
3779 return;
3780 }
3781
3782 if (ev->status) {
3783 hci_conn_del(hcon);
3784 hci_dev_unlock(hdev);
3785 return;
3786 }
3787
3788 bredr_hcon = hcon->amp_mgr->l2cap_conn->hcon;
3789
3790 hcon->state = BT_CONNECTED;
3791 bacpy(&hcon->dst, &bredr_hcon->dst);
3792
3793 hci_conn_hold(hcon);
3794 hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003795 hci_conn_drop(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003796
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003797 hci_conn_add_sysfs(hcon);
3798
Andrei Emeltchenkocf70ff22012-10-31 15:46:36 +02003799 amp_physical_cfm(bredr_hcon, hcon);
3800
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003801 hci_dev_unlock(hdev);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003802}
3803
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03003804static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
3805{
3806 struct hci_ev_logical_link_complete *ev = (void *) skb->data;
3807 struct hci_conn *hcon;
3808 struct hci_chan *hchan;
3809 struct amp_mgr *mgr;
3810
3811 BT_DBG("%s log_handle 0x%4.4x phy_handle 0x%2.2x status 0x%2.2x",
3812 hdev->name, le16_to_cpu(ev->handle), ev->phy_handle,
3813 ev->status);
3814
3815 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
3816 if (!hcon)
3817 return;
3818
3819 /* Create AMP hchan */
3820 hchan = hci_chan_create(hcon);
3821 if (!hchan)
3822 return;
3823
3824 hchan->handle = le16_to_cpu(ev->handle);
3825
3826 BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
3827
3828 mgr = hcon->amp_mgr;
3829 if (mgr && mgr->bredr_chan) {
3830 struct l2cap_chan *bredr_chan = mgr->bredr_chan;
3831
3832 l2cap_chan_lock(bredr_chan);
3833
3834 bredr_chan->conn->mtu = hdev->block_mtu;
3835 l2cap_logical_cfm(bredr_chan, hchan, 0);
3836 hci_conn_hold(hcon);
3837
3838 l2cap_chan_unlock(bredr_chan);
3839 }
3840}
3841
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02003842static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
3843 struct sk_buff *skb)
3844{
3845 struct hci_ev_disconn_logical_link_complete *ev = (void *) skb->data;
3846 struct hci_chan *hchan;
3847
3848 BT_DBG("%s log handle 0x%4.4x status 0x%2.2x", hdev->name,
3849 le16_to_cpu(ev->handle), ev->status);
3850
3851 if (ev->status)
3852 return;
3853
3854 hci_dev_lock(hdev);
3855
3856 hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
3857 if (!hchan)
3858 goto unlock;
3859
3860 amp_destroy_logical_link(hchan, ev->reason);
3861
3862unlock:
3863 hci_dev_unlock(hdev);
3864}
3865
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02003866static void hci_disconn_phylink_complete_evt(struct hci_dev *hdev,
3867 struct sk_buff *skb)
3868{
3869 struct hci_ev_disconn_phy_link_complete *ev = (void *) skb->data;
3870 struct hci_conn *hcon;
3871
3872 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
3873
3874 if (ev->status)
3875 return;
3876
3877 hci_dev_lock(hdev);
3878
3879 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
3880 if (hcon) {
3881 hcon->state = BT_CLOSED;
3882 hci_conn_del(hcon);
3883 }
3884
3885 hci_dev_unlock(hdev);
3886}
3887
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003888static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03003889{
3890 struct hci_ev_le_conn_complete *ev = (void *) skb->data;
3891 struct hci_conn *conn;
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02003892 struct smp_irk *irk;
Ville Tervofcd89c02011-02-10 22:38:47 -03003893
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003894 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Ville Tervofcd89c02011-02-10 22:38:47 -03003895
3896 hci_dev_lock(hdev);
3897
Andre Guedesb47a09b2012-07-27 15:10:15 -03003898 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
Ville Tervob62f3282011-02-10 22:38:50 -03003899 if (!conn) {
3900 conn = hci_conn_add(hdev, LE_LINK, &ev->bdaddr);
3901 if (!conn) {
3902 BT_ERR("No memory for new connection");
Andre Guedes230fd162012-07-27 15:10:10 -03003903 goto unlock;
Ville Tervob62f3282011-02-10 22:38:50 -03003904 }
Andre Guedes29b79882011-05-31 14:20:54 -03003905
3906 conn->dst_type = ev->bdaddr_type;
Andre Guedesb9b343d2012-07-27 15:10:11 -03003907
3908 if (ev->role == LE_CONN_ROLE_MASTER) {
3909 conn->out = true;
3910 conn->link_mode |= HCI_LM_MASTER;
3911 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02003912
3913 /* If we didn't have a hci_conn object previously
3914 * but we're in master role this must be something
3915 * initiated using a white list. Since white list based
3916 * connections are not "first class citizens" we don't
3917 * have full tracking of them. Therefore, we go ahead
3918 * with a "best effort" approach of determining the
3919 * initiator address based on the HCI_PRIVACY flag.
3920 */
3921 if (conn->out) {
3922 conn->resp_addr_type = ev->bdaddr_type;
3923 bacpy(&conn->resp_addr, &ev->bdaddr);
3924 if (test_bit(HCI_PRIVACY, &hdev->dev_flags)) {
3925 conn->init_addr_type = ADDR_LE_DEV_RANDOM;
3926 bacpy(&conn->init_addr, &hdev->rpa);
3927 } else {
3928 hci_copy_identity_address(hdev,
3929 &conn->init_addr,
3930 &conn->init_addr_type);
3931 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02003932 }
Johan Hedberg9489eca2014-02-28 17:45:46 +02003933 } else {
3934 cancel_delayed_work(&conn->le_conn_timeout);
Ville Tervob62f3282011-02-10 22:38:50 -03003935 }
Ville Tervofcd89c02011-02-10 22:38:47 -03003936
Johan Hedberg80c24ab2014-03-24 20:21:51 +02003937 if (!conn->out) {
3938 /* Set the responder (our side) address type based on
3939 * the advertising address type.
3940 */
3941 conn->resp_addr_type = hdev->adv_addr_type;
3942 if (hdev->adv_addr_type == ADDR_LE_DEV_RANDOM)
3943 bacpy(&conn->resp_addr, &hdev->random_addr);
3944 else
3945 bacpy(&conn->resp_addr, &hdev->bdaddr);
3946
3947 conn->init_addr_type = ev->bdaddr_type;
3948 bacpy(&conn->init_addr, &ev->bdaddr);
3949 }
3950
Marcel Holtmannedb4b462014-02-18 15:13:43 -08003951 /* Lookup the identity address from the stored connection
3952 * address and address type.
3953 *
3954 * When establishing connections to an identity address, the
3955 * connection procedure will store the resolvable random
3956 * address first. Now if it can be converted back into the
3957 * identity address, start using the identity address from
3958 * now on.
3959 */
3960 irk = hci_get_irk(hdev, &conn->dst, conn->dst_type);
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02003961 if (irk) {
3962 bacpy(&conn->dst, &irk->bdaddr);
3963 conn->dst_type = irk->addr_type;
3964 }
3965
Andre Guedescd17dec2012-07-27 15:10:16 -03003966 if (ev->status) {
Andre Guedes06c053f2014-02-26 20:21:41 -03003967 hci_le_conn_failed(conn, ev->status);
Andre Guedescd17dec2012-07-27 15:10:16 -03003968 goto unlock;
3969 }
3970
Johan Hedbergb644ba32012-01-17 21:48:47 +02003971 if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Marcel Holtmann01fdb0f2014-02-18 14:22:19 -08003972 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003973 conn->dst_type, 0, NULL, 0, NULL);
Vinicius Costa Gomes83bc71b2011-05-06 18:41:43 -03003974
Vinicius Costa Gomes7b5c0d52011-06-09 18:50:50 -03003975 conn->sec_level = BT_SECURITY_LOW;
Ville Tervofcd89c02011-02-10 22:38:47 -03003976 conn->handle = __le16_to_cpu(ev->handle);
3977 conn->state = BT_CONNECTED;
3978
Jukka Rissanen18722c22013-12-11 17:05:37 +02003979 if (test_bit(HCI_6LOWPAN_ENABLED, &hdev->dev_flags))
3980 set_bit(HCI_CONN_6LOWPAN, &conn->flags);
3981
Ville Tervofcd89c02011-02-10 22:38:47 -03003982 hci_conn_add_sysfs(conn);
3983
3984 hci_proto_connect_cfm(conn, ev->status);
3985
Andre Guedesa4790db2014-02-26 20:21:47 -03003986 hci_pend_le_conn_del(hdev, &conn->dst, conn->dst_type);
3987
Ville Tervofcd89c02011-02-10 22:38:47 -03003988unlock:
3989 hci_dev_unlock(hdev);
3990}
3991
Andre Guedesa4790db2014-02-26 20:21:47 -03003992/* This function requires the caller holds hdev->lock */
3993static void check_pending_le_conn(struct hci_dev *hdev, bdaddr_t *addr,
3994 u8 addr_type)
3995{
3996 struct hci_conn *conn;
Andre Guedes5b906a82014-02-26 20:21:53 -03003997 struct smp_irk *irk;
3998
3999 /* If this is a resolvable address, we should resolve it and then
4000 * update address and address type variables.
4001 */
4002 irk = hci_get_irk(hdev, addr, addr_type);
4003 if (irk) {
4004 addr = &irk->bdaddr;
4005 addr_type = irk->addr_type;
4006 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004007
4008 if (!hci_pend_le_conn_lookup(hdev, addr, addr_type))
4009 return;
4010
4011 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
4012 HCI_AT_NO_BONDING);
4013 if (!IS_ERR(conn))
4014 return;
4015
4016 switch (PTR_ERR(conn)) {
4017 case -EBUSY:
4018 /* If hci_connect() returns -EBUSY it means there is already
4019 * an LE connection attempt going on. Since controllers don't
4020 * support more than one connection attempt at the time, we
4021 * don't consider this an error case.
4022 */
4023 break;
4024 default:
4025 BT_DBG("Failed to connect: err %ld", PTR_ERR(conn));
4026 }
4027}
4028
Johan Hedberg4af605d2014-03-24 10:48:00 +02004029static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
4030 u8 bdaddr_type, s8 rssi, u8 *data, u8 len)
4031{
Johan Hedbergb9a63282014-03-25 10:51:52 +02004032 struct discovery_state *d = &hdev->discovery;
Johan Hedberg474ee062014-03-25 14:34:59 +02004033 bool match;
Johan Hedbergb9a63282014-03-25 10:51:52 +02004034
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004035 /* Passive scanning shouldn't trigger any device found events */
4036 if (hdev->le_scan_type == LE_SCAN_PASSIVE) {
4037 if (type == LE_ADV_IND || type == LE_ADV_DIRECT_IND)
4038 check_pending_le_conn(hdev, bdaddr, bdaddr_type);
4039 return;
4040 }
Johan Hedberg4af605d2014-03-24 10:48:00 +02004041
Johan Hedbergb9a63282014-03-25 10:51:52 +02004042 /* If there's nothing pending either store the data from this
4043 * event or send an immediate device found event if the data
4044 * should not be stored for later.
4045 */
4046 if (!has_pending_adv_report(hdev)) {
4047 /* If the report will trigger a SCAN_REQ store it for
4048 * later merging.
4049 */
4050 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4051 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004052 rssi, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004053 return;
4054 }
4055
4056 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
4057 rssi, 0, 1, data, len, NULL, 0);
4058 return;
4059 }
4060
Johan Hedberg474ee062014-03-25 14:34:59 +02004061 /* Check if the pending report is for the same device as the new one */
4062 match = (!bacmp(bdaddr, &d->last_adv_addr) &&
4063 bdaddr_type == d->last_adv_addr_type);
4064
Johan Hedbergb9a63282014-03-25 10:51:52 +02004065 /* If the pending data doesn't match this report or this isn't a
4066 * scan response (e.g. we got a duplicate ADV_IND) then force
4067 * sending of the pending data.
4068 */
Johan Hedberg474ee062014-03-25 14:34:59 +02004069 if (type != LE_ADV_SCAN_RSP || !match) {
4070 /* Send out whatever is in the cache, but skip duplicates */
4071 if (!match)
4072 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004073 d->last_adv_addr_type, NULL,
4074 d->last_adv_rssi, 0, 1,
4075 d->last_adv_data,
Johan Hedberg474ee062014-03-25 14:34:59 +02004076 d->last_adv_data_len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004077
4078 /* If the new report will trigger a SCAN_REQ store it for
4079 * later merging.
4080 */
4081 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4082 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004083 rssi, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004084 return;
4085 }
4086
4087 /* The advertising reports cannot be merged, so clear
4088 * the pending report and send out a device found event.
4089 */
4090 clear_pending_adv_report(hdev);
Johan Hedberg5c5b93e2014-03-29 08:39:53 +02004091 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
4092 rssi, 0, 1, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004093 return;
4094 }
4095
4096 /* If we get here we've got a pending ADV_IND or ADV_SCAN_IND and
4097 * the new event is a SCAN_RSP. We can therefore proceed with
4098 * sending a merged device found event.
4099 */
4100 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
4101 d->last_adv_addr_type, NULL, rssi, 0, 1, data, len,
4102 d->last_adv_data, d->last_adv_data_len);
4103 clear_pending_adv_report(hdev);
Johan Hedberg4af605d2014-03-24 10:48:00 +02004104}
4105
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004106static void hci_le_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andre Guedes9aa04c92011-05-26 16:23:51 -03004107{
Andre Guedese95beb42011-09-26 20:48:35 -03004108 u8 num_reports = skb->data[0];
4109 void *ptr = &skb->data[1];
Andre Guedes9aa04c92011-05-26 16:23:51 -03004110
Andre Guedesa4790db2014-02-26 20:21:47 -03004111 hci_dev_lock(hdev);
4112
Andre Guedese95beb42011-09-26 20:48:35 -03004113 while (num_reports--) {
4114 struct hci_ev_le_advertising_info *ev = ptr;
Johan Hedberg4af605d2014-03-24 10:48:00 +02004115 s8 rssi;
Andre Guedesa4790db2014-02-26 20:21:47 -03004116
Andre Guedes3c9e9192012-01-10 18:20:50 -03004117 rssi = ev->data[ev->length];
Johan Hedberg4af605d2014-03-24 10:48:00 +02004118 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
4119 ev->bdaddr_type, rssi, ev->data, ev->length);
Andre Guedes3c9e9192012-01-10 18:20:50 -03004120
Andre Guedese95beb42011-09-26 20:48:35 -03004121 ptr += sizeof(*ev) + ev->length + 1;
Andre Guedes9aa04c92011-05-26 16:23:51 -03004122 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004123
4124 hci_dev_unlock(hdev);
Andre Guedes9aa04c92011-05-26 16:23:51 -03004125}
4126
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004127static void hci_le_ltk_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004128{
4129 struct hci_ev_le_ltk_req *ev = (void *) skb->data;
4130 struct hci_cp_le_ltk_reply cp;
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004131 struct hci_cp_le_ltk_neg_reply neg;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004132 struct hci_conn *conn;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004133 struct smp_ltk *ltk;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004134
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004135 BT_DBG("%s handle 0x%4.4x", hdev->name, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004136
4137 hci_dev_lock(hdev);
4138
4139 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004140 if (conn == NULL)
4141 goto not_found;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004142
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08004143 ltk = hci_find_ltk(hdev, ev->ediv, ev->rand, conn->out);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004144 if (ltk == NULL)
4145 goto not_found;
4146
4147 memcpy(cp.ltk, ltk->val, sizeof(ltk->val));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004148 cp.handle = cpu_to_le16(conn->handle);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004149
4150 if (ltk->authenticated)
Andre Guedesf8776212013-07-31 16:25:28 -03004151 conn->pending_sec_level = BT_SECURITY_HIGH;
4152 else
4153 conn->pending_sec_level = BT_SECURITY_MEDIUM;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004154
Andre Guedes89cbb4d2013-07-31 16:25:29 -03004155 conn->enc_key_size = ltk->enc_size;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004156
4157 hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp);
4158
Claudio Takahasi5981a882013-07-25 16:34:24 -03004159 /* Ref. Bluetooth Core SPEC pages 1975 and 2004. STK is a
4160 * temporary key used to encrypt a connection following
4161 * pairing. It is used during the Encrypted Session Setup to
4162 * distribute the keys. Later, security can be re-established
4163 * using a distributed LTK.
4164 */
4165 if (ltk->type == HCI_SMP_STK_SLAVE) {
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004166 list_del(&ltk->list);
4167 kfree(ltk);
4168 }
4169
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004170 hci_dev_unlock(hdev);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004171
4172 return;
4173
4174not_found:
4175 neg.handle = ev->handle;
4176 hci_send_cmd(hdev, HCI_OP_LE_LTK_NEG_REPLY, sizeof(neg), &neg);
4177 hci_dev_unlock(hdev);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004178}
4179
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004180static void hci_le_meta_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004181{
4182 struct hci_ev_le_meta *le_ev = (void *) skb->data;
4183
4184 skb_pull(skb, sizeof(*le_ev));
4185
4186 switch (le_ev->subevent) {
4187 case HCI_EV_LE_CONN_COMPLETE:
4188 hci_le_conn_complete_evt(hdev, skb);
4189 break;
4190
Andre Guedes9aa04c92011-05-26 16:23:51 -03004191 case HCI_EV_LE_ADVERTISING_REPORT:
4192 hci_le_adv_report_evt(hdev, skb);
4193 break;
4194
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004195 case HCI_EV_LE_LTK_REQ:
4196 hci_le_ltk_request_evt(hdev, skb);
4197 break;
4198
Ville Tervofcd89c02011-02-10 22:38:47 -03004199 default:
4200 break;
4201 }
4202}
4203
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03004204static void hci_chan_selected_evt(struct hci_dev *hdev, struct sk_buff *skb)
4205{
4206 struct hci_ev_channel_selected *ev = (void *) skb->data;
4207 struct hci_conn *hcon;
4208
4209 BT_DBG("%s handle 0x%2.2x", hdev->name, ev->phy_handle);
4210
4211 skb_pull(skb, sizeof(*ev));
4212
4213 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4214 if (!hcon)
4215 return;
4216
4217 amp_read_loc_assoc_final_data(hdev, hcon);
4218}
4219
Linus Torvalds1da177e2005-04-16 15:20:36 -07004220void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
4221{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004222 struct hci_event_hdr *hdr = (void *) skb->data;
4223 __u8 event = hdr->evt;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004224
Johan Hedbergb6ddb632013-04-02 13:34:31 +03004225 hci_dev_lock(hdev);
4226
4227 /* Received events are (currently) only needed when a request is
4228 * ongoing so avoid unnecessary memory allocation.
4229 */
4230 if (hdev->req_status == HCI_REQ_PEND) {
4231 kfree_skb(hdev->recv_evt);
4232 hdev->recv_evt = skb_clone(skb, GFP_KERNEL);
4233 }
4234
4235 hci_dev_unlock(hdev);
4236
Linus Torvalds1da177e2005-04-16 15:20:36 -07004237 skb_pull(skb, HCI_EVENT_HDR_SIZE);
4238
Johan Hedberg02350a72013-04-03 21:50:29 +03004239 if (hdev->sent_cmd && bt_cb(hdev->sent_cmd)->req.event == event) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02004240 struct hci_command_hdr *cmd_hdr = (void *) hdev->sent_cmd->data;
4241 u16 opcode = __le16_to_cpu(cmd_hdr->opcode);
Johan Hedberg02350a72013-04-03 21:50:29 +03004242
4243 hci_req_cmd_complete(hdev, opcode, 0);
4244 }
4245
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004246 switch (event) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004247 case HCI_EV_INQUIRY_COMPLETE:
4248 hci_inquiry_complete_evt(hdev, skb);
4249 break;
4250
4251 case HCI_EV_INQUIRY_RESULT:
4252 hci_inquiry_result_evt(hdev, skb);
4253 break;
4254
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004255 case HCI_EV_CONN_COMPLETE:
4256 hci_conn_complete_evt(hdev, skb);
Marcel Holtmann21d9e302005-09-13 01:32:25 +02004257 break;
4258
Linus Torvalds1da177e2005-04-16 15:20:36 -07004259 case HCI_EV_CONN_REQUEST:
4260 hci_conn_request_evt(hdev, skb);
4261 break;
4262
Linus Torvalds1da177e2005-04-16 15:20:36 -07004263 case HCI_EV_DISCONN_COMPLETE:
4264 hci_disconn_complete_evt(hdev, skb);
4265 break;
4266
Linus Torvalds1da177e2005-04-16 15:20:36 -07004267 case HCI_EV_AUTH_COMPLETE:
4268 hci_auth_complete_evt(hdev, skb);
4269 break;
4270
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004271 case HCI_EV_REMOTE_NAME:
4272 hci_remote_name_evt(hdev, skb);
4273 break;
4274
Linus Torvalds1da177e2005-04-16 15:20:36 -07004275 case HCI_EV_ENCRYPT_CHANGE:
4276 hci_encrypt_change_evt(hdev, skb);
4277 break;
4278
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004279 case HCI_EV_CHANGE_LINK_KEY_COMPLETE:
4280 hci_change_link_key_complete_evt(hdev, skb);
4281 break;
4282
4283 case HCI_EV_REMOTE_FEATURES:
4284 hci_remote_features_evt(hdev, skb);
4285 break;
4286
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004287 case HCI_EV_CMD_COMPLETE:
4288 hci_cmd_complete_evt(hdev, skb);
4289 break;
4290
4291 case HCI_EV_CMD_STATUS:
4292 hci_cmd_status_evt(hdev, skb);
4293 break;
4294
4295 case HCI_EV_ROLE_CHANGE:
4296 hci_role_change_evt(hdev, skb);
4297 break;
4298
4299 case HCI_EV_NUM_COMP_PKTS:
4300 hci_num_comp_pkts_evt(hdev, skb);
4301 break;
4302
4303 case HCI_EV_MODE_CHANGE:
4304 hci_mode_change_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004305 break;
4306
4307 case HCI_EV_PIN_CODE_REQ:
4308 hci_pin_code_request_evt(hdev, skb);
4309 break;
4310
4311 case HCI_EV_LINK_KEY_REQ:
4312 hci_link_key_request_evt(hdev, skb);
4313 break;
4314
4315 case HCI_EV_LINK_KEY_NOTIFY:
4316 hci_link_key_notify_evt(hdev, skb);
4317 break;
4318
4319 case HCI_EV_CLOCK_OFFSET:
4320 hci_clock_offset_evt(hdev, skb);
4321 break;
4322
Marcel Holtmanna8746412008-07-14 20:13:46 +02004323 case HCI_EV_PKT_TYPE_CHANGE:
4324 hci_pkt_type_change_evt(hdev, skb);
4325 break;
4326
Marcel Holtmann85a1e932005-08-09 20:28:02 -07004327 case HCI_EV_PSCAN_REP_MODE:
4328 hci_pscan_rep_mode_evt(hdev, skb);
4329 break;
4330
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004331 case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
4332 hci_inquiry_result_with_rssi_evt(hdev, skb);
4333 break;
4334
4335 case HCI_EV_REMOTE_EXT_FEATURES:
4336 hci_remote_ext_features_evt(hdev, skb);
4337 break;
4338
4339 case HCI_EV_SYNC_CONN_COMPLETE:
4340 hci_sync_conn_complete_evt(hdev, skb);
4341 break;
4342
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004343 case HCI_EV_EXTENDED_INQUIRY_RESULT:
4344 hci_extended_inquiry_result_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004345 break;
4346
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004347 case HCI_EV_KEY_REFRESH_COMPLETE:
4348 hci_key_refresh_complete_evt(hdev, skb);
4349 break;
4350
Marcel Holtmann04936842008-07-14 20:13:48 +02004351 case HCI_EV_IO_CAPA_REQUEST:
4352 hci_io_capa_request_evt(hdev, skb);
4353 break;
4354
Johan Hedberg03b555e2011-01-04 15:40:05 +02004355 case HCI_EV_IO_CAPA_REPLY:
4356 hci_io_capa_reply_evt(hdev, skb);
4357 break;
4358
Johan Hedberga5c29682011-02-19 12:05:57 -03004359 case HCI_EV_USER_CONFIRM_REQUEST:
4360 hci_user_confirm_request_evt(hdev, skb);
4361 break;
4362
Brian Gix1143d452011-11-23 08:28:34 -08004363 case HCI_EV_USER_PASSKEY_REQUEST:
4364 hci_user_passkey_request_evt(hdev, skb);
4365 break;
4366
Johan Hedberg92a25252012-09-06 18:39:26 +03004367 case HCI_EV_USER_PASSKEY_NOTIFY:
4368 hci_user_passkey_notify_evt(hdev, skb);
4369 break;
4370
4371 case HCI_EV_KEYPRESS_NOTIFY:
4372 hci_keypress_notify_evt(hdev, skb);
4373 break;
4374
Marcel Holtmann04936842008-07-14 20:13:48 +02004375 case HCI_EV_SIMPLE_PAIR_COMPLETE:
4376 hci_simple_pair_complete_evt(hdev, skb);
4377 break;
4378
Marcel Holtmann41a96212008-07-14 20:13:48 +02004379 case HCI_EV_REMOTE_HOST_FEATURES:
4380 hci_remote_host_features_evt(hdev, skb);
4381 break;
4382
Ville Tervofcd89c02011-02-10 22:38:47 -03004383 case HCI_EV_LE_META:
4384 hci_le_meta_evt(hdev, skb);
4385 break;
4386
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03004387 case HCI_EV_CHANNEL_SELECTED:
4388 hci_chan_selected_evt(hdev, skb);
4389 break;
4390
Szymon Janc2763eda2011-03-22 13:12:22 +01004391 case HCI_EV_REMOTE_OOB_DATA_REQUEST:
4392 hci_remote_oob_data_request_evt(hdev, skb);
4393 break;
4394
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004395 case HCI_EV_PHY_LINK_COMPLETE:
4396 hci_phy_link_complete_evt(hdev, skb);
4397 break;
4398
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004399 case HCI_EV_LOGICAL_LINK_COMPLETE:
4400 hci_loglink_complete_evt(hdev, skb);
4401 break;
4402
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02004403 case HCI_EV_DISCONN_LOGICAL_LINK_COMPLETE:
4404 hci_disconn_loglink_complete_evt(hdev, skb);
4405 break;
4406
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004407 case HCI_EV_DISCONN_PHY_LINK_COMPLETE:
4408 hci_disconn_phylink_complete_evt(hdev, skb);
4409 break;
4410
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02004411 case HCI_EV_NUM_COMP_BLOCKS:
4412 hci_num_comp_blocks_evt(hdev, skb);
4413 break;
4414
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004415 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004416 BT_DBG("%s event 0x%2.2x", hdev->name, event);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004417 break;
4418 }
4419
4420 kfree_skb(skb);
4421 hdev->stat.evt_rx++;
4422}