blob: 9e0b2e888bbac79b15fb5bfa493e0330cb197d08 [file] [log] [blame]
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 BlueZ - Bluetooth protocol stack for Linux
Ron Shaffer2d0a0342010-05-28 11:53:46 -04003 Copyright (c) 2000-2001, 2010, Code Aurora Forum. All rights reserved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
10
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090015 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Linus Torvalds1da177e2005-04-16 15:20:36 -070018 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090020 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 SOFTWARE IS DISCLAIMED.
23*/
24
25/* Bluetooth HCI event handling. */
26
Linus Torvalds1da177e2005-04-16 15:20:36 -070027#include <asm/unaligned.h>
28
29#include <net/bluetooth/bluetooth.h>
30#include <net/bluetooth/hci_core.h>
Mikel Astizf0d6a0e2012-08-09 09:52:30 +020031#include <net/bluetooth/mgmt.h>
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070032
Marcel Holtmann70247282013-10-10 14:54:15 -070033#include "a2mp.h"
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070034#include "amp.h"
Johan Hedberg2ceba532014-06-16 19:25:16 +030035#include "smp.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070036
Linus Torvalds1da177e2005-04-16 15:20:36 -070037/* Handle HCI Event packets */
38
Marcel Holtmanna9de9242007-10-20 13:33:56 +020039static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070040{
Marcel Holtmanna9de9242007-10-20 13:33:56 +020041 __u8 status = *((__u8 *) skb->data);
Linus Torvalds1da177e2005-04-16 15:20:36 -070042
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030043 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -070044
Andre Guedes82f47852013-04-30 15:29:34 -030045 if (status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +020046 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -070047
Andre Guedes89352e72011-11-04 14:16:53 -030048 clear_bit(HCI_INQUIRY, &hdev->flags);
Peter Zijlstra4e857c52014-03-17 18:06:10 +010049 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -030050 wake_up_bit(&hdev->flags, HCI_INQUIRY);
Andre Guedes89352e72011-11-04 14:16:53 -030051
Johan Hedberg50143a42014-06-10 14:05:57 +030052 hci_dev_lock(hdev);
53 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
54 hci_dev_unlock(hdev);
55
Marcel Holtmanna9de9242007-10-20 13:33:56 +020056 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -070057}
58
Andre Guedes4d934832012-03-21 00:03:35 -030059static void hci_cc_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
60{
61 __u8 status = *((__u8 *) skb->data);
62
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030063 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesae854a72012-03-21 00:03:36 -030064
65 if (status)
66 return;
67
68 set_bit(HCI_PERIODIC_INQ, &hdev->dev_flags);
Andre Guedes4d934832012-03-21 00:03:35 -030069}
70
Marcel Holtmanna9de9242007-10-20 13:33:56 +020071static void hci_cc_exit_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070072{
Marcel Holtmanna9de9242007-10-20 13:33:56 +020073 __u8 status = *((__u8 *) skb->data);
74
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030075 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +020076
77 if (status)
78 return;
79
Andre Guedesae854a72012-03-21 00:03:36 -030080 clear_bit(HCI_PERIODIC_INQ, &hdev->dev_flags);
81
Marcel Holtmanna9de9242007-10-20 13:33:56 +020082 hci_conn_check_pending(hdev);
83}
84
Gustavo Padovan807deac2012-05-17 00:36:24 -030085static void hci_cc_remote_name_req_cancel(struct hci_dev *hdev,
86 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +020087{
88 BT_DBG("%s", hdev->name);
89}
90
91static void hci_cc_role_discovery(struct hci_dev *hdev, struct sk_buff *skb)
92{
93 struct hci_rp_role_discovery *rp = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -070094 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -070095
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030096 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -070097
Marcel Holtmanna9de9242007-10-20 13:33:56 +020098 if (rp->status)
99 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700100
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200101 hci_dev_lock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200103 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
104 if (conn) {
105 if (rp->role)
Johan Hedberg4dae2792014-06-24 17:03:50 +0300106 clear_bit(HCI_CONN_MASTER, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200107 else
Johan Hedberg4dae2792014-06-24 17:03:50 +0300108 set_bit(HCI_CONN_MASTER, &conn->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700109 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200110
111 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112}
113
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200114static void hci_cc_read_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
115{
116 struct hci_rp_read_link_policy *rp = (void *) skb->data;
117 struct hci_conn *conn;
118
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300119 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200120
121 if (rp->status)
122 return;
123
124 hci_dev_lock(hdev);
125
126 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
127 if (conn)
128 conn->link_policy = __le16_to_cpu(rp->policy);
129
130 hci_dev_unlock(hdev);
131}
132
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200133static void hci_cc_write_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700134{
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200135 struct hci_rp_write_link_policy *rp = (void *) skb->data;
136 struct hci_conn *conn;
137 void *sent;
138
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300139 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200140
141 if (rp->status)
142 return;
143
144 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LINK_POLICY);
145 if (!sent)
146 return;
147
148 hci_dev_lock(hdev);
149
150 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200151 if (conn)
Harvey Harrison83985312008-05-02 16:25:46 -0700152 conn->link_policy = get_unaligned_le16(sent + 2);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200153
154 hci_dev_unlock(hdev);
155}
156
Gustavo Padovan807deac2012-05-17 00:36:24 -0300157static void hci_cc_read_def_link_policy(struct hci_dev *hdev,
158 struct sk_buff *skb)
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200159{
160 struct hci_rp_read_def_link_policy *rp = (void *) skb->data;
161
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300162 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200163
164 if (rp->status)
165 return;
166
167 hdev->link_policy = __le16_to_cpu(rp->policy);
168}
169
Gustavo Padovan807deac2012-05-17 00:36:24 -0300170static void hci_cc_write_def_link_policy(struct hci_dev *hdev,
171 struct sk_buff *skb)
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200172{
173 __u8 status = *((__u8 *) skb->data);
174 void *sent;
175
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300176 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200177
178 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_DEF_LINK_POLICY);
179 if (!sent)
180 return;
181
182 if (!status)
183 hdev->link_policy = get_unaligned_le16(sent);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200184}
185
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200186static void hci_cc_reset(struct hci_dev *hdev, struct sk_buff *skb)
187{
188 __u8 status = *((__u8 *) skb->data);
189
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300190 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200191
Gustavo F. Padovan10572132011-03-16 15:36:29 -0300192 clear_bit(HCI_RESET, &hdev->flags);
193
Johan Hedberga297e972012-02-21 17:55:47 +0200194 /* Reset all non-persistent flags */
Johan Hedberg2cc6fb02013-03-15 17:06:57 -0500195 hdev->dev_flags &= ~HCI_PERSISTENT_MASK;
Andre Guedes69775ff2012-02-23 16:50:05 +0200196
197 hdev->discovery.state = DISCOVERY_STOPPED;
Johan Hedbergbbaf4442012-11-08 01:22:59 +0100198 hdev->inq_tx_power = HCI_TX_POWER_INVALID;
199 hdev->adv_tx_power = HCI_TX_POWER_INVALID;
Johan Hedberg3f0f5242012-11-08 01:23:00 +0100200
201 memset(hdev->adv_data, 0, sizeof(hdev->adv_data));
202 hdev->adv_data_len = 0;
Marcel Holtmannf8e808b2013-10-16 00:16:47 -0700203
204 memset(hdev->scan_rsp_data, 0, sizeof(hdev->scan_rsp_data));
205 hdev->scan_rsp_data_len = 0;
Marcel Holtmann06f5b772013-10-19 07:09:11 -0700206
Marcel Holtmann533553f2014-03-21 12:18:10 -0700207 hdev->le_scan_type = LE_SCAN_PASSIVE;
208
Marcel Holtmann06f5b772013-10-19 07:09:11 -0700209 hdev->ssp_debug_mode = 0;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200210}
211
212static void hci_cc_write_local_name(struct hci_dev *hdev, struct sk_buff *skb)
213{
214 __u8 status = *((__u8 *) skb->data);
215 void *sent;
216
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300217 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200218
219 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LOCAL_NAME);
220 if (!sent)
221 return;
222
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200223 hci_dev_lock(hdev);
224
Johan Hedbergf51d5b22012-02-22 18:17:32 +0200225 if (test_bit(HCI_MGMT, &hdev->dev_flags))
226 mgmt_set_local_name_complete(hdev, sent, status);
Johan Hedberg28cc7bd2012-02-22 21:06:55 +0200227 else if (!status)
228 memcpy(hdev->dev_name, sent, HCI_MAX_NAME_LENGTH);
Johan Hedbergf51d5b22012-02-22 18:17:32 +0200229
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200230 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200231}
232
233static void hci_cc_read_local_name(struct hci_dev *hdev, struct sk_buff *skb)
234{
235 struct hci_rp_read_local_name *rp = (void *) skb->data;
236
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300237 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200238
239 if (rp->status)
240 return;
241
Johan Hedbergdb99b5f2012-02-22 20:14:22 +0200242 if (test_bit(HCI_SETUP, &hdev->dev_flags))
243 memcpy(hdev->dev_name, rp->name, HCI_MAX_NAME_LENGTH);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200244}
245
246static void hci_cc_write_auth_enable(struct hci_dev *hdev, struct sk_buff *skb)
247{
248 __u8 status = *((__u8 *) skb->data);
249 void *sent;
250
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300251 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200252
253 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_AUTH_ENABLE);
254 if (!sent)
255 return;
256
257 if (!status) {
258 __u8 param = *((__u8 *) sent);
259
260 if (param == AUTH_ENABLED)
261 set_bit(HCI_AUTH, &hdev->flags);
262 else
263 clear_bit(HCI_AUTH, &hdev->flags);
264 }
265
Johan Hedberg33ef95e2012-02-16 23:56:27 +0200266 if (test_bit(HCI_MGMT, &hdev->dev_flags))
267 mgmt_auth_enable_complete(hdev, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200268}
269
270static void hci_cc_write_encrypt_mode(struct hci_dev *hdev, struct sk_buff *skb)
271{
272 __u8 status = *((__u8 *) skb->data);
273 void *sent;
274
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300275 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200276
277 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_ENCRYPT_MODE);
278 if (!sent)
279 return;
280
281 if (!status) {
282 __u8 param = *((__u8 *) sent);
283
284 if (param)
285 set_bit(HCI_ENCRYPT, &hdev->flags);
286 else
287 clear_bit(HCI_ENCRYPT, &hdev->flags);
288 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200289}
290
291static void hci_cc_write_scan_enable(struct hci_dev *hdev, struct sk_buff *skb)
292{
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200293 __u8 param, status = *((__u8 *) skb->data);
294 int old_pscan, old_iscan;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200295 void *sent;
296
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300297 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200298
299 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SCAN_ENABLE);
300 if (!sent)
301 return;
302
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200303 param = *((__u8 *) sent);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200304
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200305 hci_dev_lock(hdev);
306
Mikel Astizfa1bd912012-08-09 09:52:29 +0200307 if (status) {
Johan Hedberg744cf192011-11-08 20:40:14 +0200308 mgmt_write_scan_failed(hdev, param, status);
Johan Hedberg2d7cee52011-11-07 22:16:03 +0200309 hdev->discov_timeout = 0;
310 goto done;
311 }
312
Johan Hedberg0663ca22013-10-02 13:43:14 +0300313 /* We need to ensure that we set this back on if someone changed
314 * the scan mode through a raw HCI socket.
315 */
316 set_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);
317
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200318 old_pscan = test_and_clear_bit(HCI_PSCAN, &hdev->flags);
319 old_iscan = test_and_clear_bit(HCI_ISCAN, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200320
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200321 if (param & SCAN_INQUIRY) {
322 set_bit(HCI_ISCAN, &hdev->flags);
323 if (!old_iscan)
Johan Hedberg744cf192011-11-08 20:40:14 +0200324 mgmt_discoverable(hdev, 1);
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200325 } else if (old_iscan)
Johan Hedberg744cf192011-11-08 20:40:14 +0200326 mgmt_discoverable(hdev, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200327
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200328 if (param & SCAN_PAGE) {
329 set_bit(HCI_PSCAN, &hdev->flags);
330 if (!old_pscan)
Johan Hedberg744cf192011-11-08 20:40:14 +0200331 mgmt_connectable(hdev, 1);
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200332 } else if (old_pscan)
Johan Hedberg744cf192011-11-08 20:40:14 +0200333 mgmt_connectable(hdev, 0);
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200334
335done:
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200336 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200337}
338
339static void hci_cc_read_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
340{
341 struct hci_rp_read_class_of_dev *rp = (void *) skb->data;
342
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300343 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200344
345 if (rp->status)
346 return;
347
348 memcpy(hdev->dev_class, rp->dev_class, 3);
349
350 BT_DBG("%s class 0x%.2x%.2x%.2x", hdev->name,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300351 hdev->dev_class[2], hdev->dev_class[1], hdev->dev_class[0]);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200352}
353
354static void hci_cc_write_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
355{
356 __u8 status = *((__u8 *) skb->data);
357 void *sent;
358
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300359 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200360
361 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_CLASS_OF_DEV);
362 if (!sent)
363 return;
364
Marcel Holtmann7f9a9032012-02-22 18:38:01 +0100365 hci_dev_lock(hdev);
366
367 if (status == 0)
368 memcpy(hdev->dev_class, sent, 3);
369
370 if (test_bit(HCI_MGMT, &hdev->dev_flags))
371 mgmt_set_class_of_dev_complete(hdev, sent, status);
372
373 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200374}
375
376static void hci_cc_read_voice_setting(struct hci_dev *hdev, struct sk_buff *skb)
377{
378 struct hci_rp_read_voice_setting *rp = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700379 __u16 setting;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200380
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300381 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200382
383 if (rp->status)
384 return;
385
386 setting = __le16_to_cpu(rp->voice_setting);
387
Marcel Holtmannf383f272008-07-14 20:13:47 +0200388 if (hdev->voice_setting == setting)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200389 return;
390
391 hdev->voice_setting = setting;
392
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300393 BT_DBG("%s voice setting 0x%4.4x", hdev->name, setting);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200394
Gustavo F. Padovan3c547112011-12-14 22:58:44 -0200395 if (hdev->notify)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200396 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200397}
398
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300399static void hci_cc_write_voice_setting(struct hci_dev *hdev,
400 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200401{
402 __u8 status = *((__u8 *) skb->data);
Marcel Holtmannf383f272008-07-14 20:13:47 +0200403 __u16 setting;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700404 void *sent;
405
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300406 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700407
Marcel Holtmannf383f272008-07-14 20:13:47 +0200408 if (status)
409 return;
410
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200411 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_VOICE_SETTING);
412 if (!sent)
413 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700414
Marcel Holtmannf383f272008-07-14 20:13:47 +0200415 setting = get_unaligned_le16(sent);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416
Marcel Holtmannf383f272008-07-14 20:13:47 +0200417 if (hdev->voice_setting == setting)
418 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700419
Marcel Holtmannf383f272008-07-14 20:13:47 +0200420 hdev->voice_setting = setting;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700421
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300422 BT_DBG("%s voice setting 0x%4.4x", hdev->name, setting);
Marcel Holtmannf383f272008-07-14 20:13:47 +0200423
Gustavo F. Padovan3c547112011-12-14 22:58:44 -0200424 if (hdev->notify)
Marcel Holtmannf383f272008-07-14 20:13:47 +0200425 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700426}
427
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -0700428static void hci_cc_read_num_supported_iac(struct hci_dev *hdev,
429 struct sk_buff *skb)
430{
431 struct hci_rp_read_num_supported_iac *rp = (void *) skb->data;
432
433 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
434
435 if (rp->status)
436 return;
437
438 hdev->num_iac = rp->num_iac;
439
440 BT_DBG("%s num iac %d", hdev->name, hdev->num_iac);
441}
442
Marcel Holtmann333140b2008-07-14 20:13:48 +0200443static void hci_cc_write_ssp_mode(struct hci_dev *hdev, struct sk_buff *skb)
444{
445 __u8 status = *((__u8 *) skb->data);
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300446 struct hci_cp_write_ssp_mode *sent;
Marcel Holtmann333140b2008-07-14 20:13:48 +0200447
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300448 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann333140b2008-07-14 20:13:48 +0200449
Marcel Holtmann333140b2008-07-14 20:13:48 +0200450 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SSP_MODE);
451 if (!sent)
452 return;
453
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300454 if (!status) {
455 if (sent->mode)
Johan Hedbergcad718e2013-04-17 15:00:51 +0300456 hdev->features[1][0] |= LMP_HOST_SSP;
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300457 else
Johan Hedbergcad718e2013-04-17 15:00:51 +0300458 hdev->features[1][0] &= ~LMP_HOST_SSP;
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300459 }
460
Johan Hedberged2c4ee2012-02-17 00:56:28 +0200461 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300462 mgmt_ssp_enable_complete(hdev, sent->mode, status);
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200463 else if (!status) {
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300464 if (sent->mode)
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200465 set_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
466 else
467 clear_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
468 }
Marcel Holtmann333140b2008-07-14 20:13:48 +0200469}
470
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800471static void hci_cc_write_sc_support(struct hci_dev *hdev, struct sk_buff *skb)
472{
473 u8 status = *((u8 *) skb->data);
474 struct hci_cp_write_sc_support *sent;
475
476 BT_DBG("%s status 0x%2.2x", hdev->name, status);
477
478 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SC_SUPPORT);
479 if (!sent)
480 return;
481
482 if (!status) {
483 if (sent->support)
484 hdev->features[1][0] |= LMP_HOST_SC;
485 else
486 hdev->features[1][0] &= ~LMP_HOST_SC;
487 }
488
489 if (test_bit(HCI_MGMT, &hdev->dev_flags))
490 mgmt_sc_enable_complete(hdev, sent->support, status);
491 else if (!status) {
492 if (sent->support)
493 set_bit(HCI_SC_ENABLED, &hdev->dev_flags);
494 else
495 clear_bit(HCI_SC_ENABLED, &hdev->dev_flags);
496 }
497}
498
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200499static void hci_cc_read_local_version(struct hci_dev *hdev, struct sk_buff *skb)
500{
501 struct hci_rp_read_local_version *rp = (void *) skb->data;
502
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300503 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200504
505 if (rp->status)
Johan Hedberg42c6b122013-03-05 20:37:49 +0200506 return;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200507
Marcel Holtmann0d5551f2013-10-18 12:04:50 -0700508 if (test_bit(HCI_SETUP, &hdev->dev_flags)) {
509 hdev->hci_ver = rp->hci_ver;
510 hdev->hci_rev = __le16_to_cpu(rp->hci_rev);
511 hdev->lmp_ver = rp->lmp_ver;
512 hdev->manufacturer = __le16_to_cpu(rp->manufacturer);
513 hdev->lmp_subver = __le16_to_cpu(rp->lmp_subver);
514 }
Johan Hedbergd5859e22011-01-25 01:19:58 +0200515}
516
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300517static void hci_cc_read_local_commands(struct hci_dev *hdev,
518 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200519{
520 struct hci_rp_read_local_commands *rp = (void *) skb->data;
521
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300522 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200523
Marcel Holtmann6a070e62013-10-31 04:54:33 -0700524 if (rp->status)
525 return;
526
527 if (test_bit(HCI_SETUP, &hdev->dev_flags))
Johan Hedberg2177bab2013-03-05 20:37:43 +0200528 memcpy(hdev->commands, rp->commands, sizeof(hdev->commands));
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200529}
530
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300531static void hci_cc_read_local_features(struct hci_dev *hdev,
532 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200533{
534 struct hci_rp_read_local_features *rp = (void *) skb->data;
535
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300536 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200537
538 if (rp->status)
539 return;
540
541 memcpy(hdev->features, rp->features, 8);
542
543 /* Adjust default settings according to features
544 * supported by device. */
545
Johan Hedbergcad718e2013-04-17 15:00:51 +0300546 if (hdev->features[0][0] & LMP_3SLOT)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200547 hdev->pkt_type |= (HCI_DM3 | HCI_DH3);
548
Johan Hedbergcad718e2013-04-17 15:00:51 +0300549 if (hdev->features[0][0] & LMP_5SLOT)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200550 hdev->pkt_type |= (HCI_DM5 | HCI_DH5);
551
Johan Hedbergcad718e2013-04-17 15:00:51 +0300552 if (hdev->features[0][1] & LMP_HV2) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200553 hdev->pkt_type |= (HCI_HV2);
554 hdev->esco_type |= (ESCO_HV2);
555 }
556
Johan Hedbergcad718e2013-04-17 15:00:51 +0300557 if (hdev->features[0][1] & LMP_HV3) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200558 hdev->pkt_type |= (HCI_HV3);
559 hdev->esco_type |= (ESCO_HV3);
560 }
561
Andre Guedes45db810f2012-07-24 15:03:49 -0300562 if (lmp_esco_capable(hdev))
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200563 hdev->esco_type |= (ESCO_EV3);
564
Johan Hedbergcad718e2013-04-17 15:00:51 +0300565 if (hdev->features[0][4] & LMP_EV4)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200566 hdev->esco_type |= (ESCO_EV4);
567
Johan Hedbergcad718e2013-04-17 15:00:51 +0300568 if (hdev->features[0][4] & LMP_EV5)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200569 hdev->esco_type |= (ESCO_EV5);
570
Johan Hedbergcad718e2013-04-17 15:00:51 +0300571 if (hdev->features[0][5] & LMP_EDR_ESCO_2M)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100572 hdev->esco_type |= (ESCO_2EV3);
573
Johan Hedbergcad718e2013-04-17 15:00:51 +0300574 if (hdev->features[0][5] & LMP_EDR_ESCO_3M)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100575 hdev->esco_type |= (ESCO_3EV3);
576
Johan Hedbergcad718e2013-04-17 15:00:51 +0300577 if (hdev->features[0][5] & LMP_EDR_3S_ESCO)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100578 hdev->esco_type |= (ESCO_2EV5 | ESCO_3EV5);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200579}
580
Andre Guedes971e3a42011-06-30 19:20:52 -0300581static void hci_cc_read_local_ext_features(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300582 struct sk_buff *skb)
Andre Guedes971e3a42011-06-30 19:20:52 -0300583{
584 struct hci_rp_read_local_ext_features *rp = (void *) skb->data;
585
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300586 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andre Guedes971e3a42011-06-30 19:20:52 -0300587
588 if (rp->status)
Johan Hedberg42c6b122013-03-05 20:37:49 +0200589 return;
Andre Guedes971e3a42011-06-30 19:20:52 -0300590
Marcel Holtmann57af75a2013-10-18 12:04:47 -0700591 if (hdev->max_page < rp->max_page)
592 hdev->max_page = rp->max_page;
Johan Hedbergd2c5d772013-04-17 15:00:52 +0300593
Johan Hedbergcad718e2013-04-17 15:00:51 +0300594 if (rp->page < HCI_MAX_PAGES)
595 memcpy(hdev->features[rp->page], rp->features, 8);
Andre Guedes971e3a42011-06-30 19:20:52 -0300596}
597
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200598static void hci_cc_read_flow_control_mode(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300599 struct sk_buff *skb)
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200600{
601 struct hci_rp_read_flow_control_mode *rp = (void *) skb->data;
602
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300603 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200604
Johan Hedberg42c6b122013-03-05 20:37:49 +0200605 if (!rp->status)
606 hdev->flow_ctl_mode = rp->mode;
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200607}
608
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200609static void hci_cc_read_buffer_size(struct hci_dev *hdev, struct sk_buff *skb)
610{
611 struct hci_rp_read_buffer_size *rp = (void *) skb->data;
612
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300613 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200614
615 if (rp->status)
616 return;
617
618 hdev->acl_mtu = __le16_to_cpu(rp->acl_mtu);
619 hdev->sco_mtu = rp->sco_mtu;
620 hdev->acl_pkts = __le16_to_cpu(rp->acl_max_pkt);
621 hdev->sco_pkts = __le16_to_cpu(rp->sco_max_pkt);
622
623 if (test_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks)) {
624 hdev->sco_mtu = 64;
625 hdev->sco_pkts = 8;
626 }
627
628 hdev->acl_cnt = hdev->acl_pkts;
629 hdev->sco_cnt = hdev->sco_pkts;
630
Gustavo Padovan807deac2012-05-17 00:36:24 -0300631 BT_DBG("%s acl mtu %d:%d sco mtu %d:%d", hdev->name, hdev->acl_mtu,
632 hdev->acl_pkts, hdev->sco_mtu, hdev->sco_pkts);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200633}
634
635static void hci_cc_read_bd_addr(struct hci_dev *hdev, struct sk_buff *skb)
636{
637 struct hci_rp_read_bd_addr *rp = (void *) skb->data;
638
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300639 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200640
641 if (!rp->status)
642 bacpy(&hdev->bdaddr, &rp->bdaddr);
Johan Hedberg23bb5762010-12-21 23:01:27 +0200643}
644
Johan Hedbergf332ec62013-03-15 17:07:11 -0500645static void hci_cc_read_page_scan_activity(struct hci_dev *hdev,
646 struct sk_buff *skb)
647{
648 struct hci_rp_read_page_scan_activity *rp = (void *) skb->data;
649
650 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
651
652 if (test_bit(HCI_INIT, &hdev->flags) && !rp->status) {
653 hdev->page_scan_interval = __le16_to_cpu(rp->interval);
654 hdev->page_scan_window = __le16_to_cpu(rp->window);
655 }
656}
657
Johan Hedberg4a3ee762013-03-15 17:07:12 -0500658static void hci_cc_write_page_scan_activity(struct hci_dev *hdev,
659 struct sk_buff *skb)
660{
661 u8 status = *((u8 *) skb->data);
662 struct hci_cp_write_page_scan_activity *sent;
663
664 BT_DBG("%s status 0x%2.2x", hdev->name, status);
665
666 if (status)
667 return;
668
669 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY);
670 if (!sent)
671 return;
672
673 hdev->page_scan_interval = __le16_to_cpu(sent->interval);
674 hdev->page_scan_window = __le16_to_cpu(sent->window);
675}
676
Johan Hedbergf332ec62013-03-15 17:07:11 -0500677static void hci_cc_read_page_scan_type(struct hci_dev *hdev,
678 struct sk_buff *skb)
679{
680 struct hci_rp_read_page_scan_type *rp = (void *) skb->data;
681
682 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
683
684 if (test_bit(HCI_INIT, &hdev->flags) && !rp->status)
685 hdev->page_scan_type = rp->type;
686}
687
Johan Hedberg4a3ee762013-03-15 17:07:12 -0500688static void hci_cc_write_page_scan_type(struct hci_dev *hdev,
689 struct sk_buff *skb)
690{
691 u8 status = *((u8 *) skb->data);
692 u8 *type;
693
694 BT_DBG("%s status 0x%2.2x", hdev->name, status);
695
696 if (status)
697 return;
698
699 type = hci_sent_cmd_data(hdev, HCI_OP_WRITE_PAGE_SCAN_TYPE);
700 if (type)
701 hdev->page_scan_type = *type;
702}
703
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200704static void hci_cc_read_data_block_size(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300705 struct sk_buff *skb)
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200706{
707 struct hci_rp_read_data_block_size *rp = (void *) skb->data;
708
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300709 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200710
711 if (rp->status)
712 return;
713
714 hdev->block_mtu = __le16_to_cpu(rp->max_acl_len);
715 hdev->block_len = __le16_to_cpu(rp->block_len);
716 hdev->num_blocks = __le16_to_cpu(rp->num_blocks);
717
718 hdev->block_cnt = hdev->num_blocks;
719
720 BT_DBG("%s blk mtu %d cnt %d len %d", hdev->name, hdev->block_mtu,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300721 hdev->block_cnt, hdev->block_len);
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200722}
723
Johan Hedberg33f35722014-06-28 17:54:06 +0300724static void hci_cc_read_clock(struct hci_dev *hdev, struct sk_buff *skb)
725{
726 struct hci_rp_read_clock *rp = (void *) skb->data;
727 struct hci_cp_read_clock *cp;
728 struct hci_conn *conn;
729
730 BT_DBG("%s", hdev->name);
731
732 if (skb->len < sizeof(*rp))
733 return;
734
735 if (rp->status)
736 return;
737
738 hci_dev_lock(hdev);
739
740 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_CLOCK);
741 if (!cp)
742 goto unlock;
743
744 if (cp->which == 0x00) {
745 hdev->clock = le32_to_cpu(rp->clock);
746 goto unlock;
747 }
748
749 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
750 if (conn) {
751 conn->clock = le32_to_cpu(rp->clock);
752 conn->clock_accuracy = le16_to_cpu(rp->accuracy);
753 }
754
755unlock:
756 hci_dev_unlock(hdev);
757}
758
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300759static void hci_cc_read_local_amp_info(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300760 struct sk_buff *skb)
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300761{
762 struct hci_rp_read_local_amp_info *rp = (void *) skb->data;
763
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300764 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300765
766 if (rp->status)
Andrei Emeltchenko8e2a0d92012-09-27 17:26:08 +0300767 goto a2mp_rsp;
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300768
769 hdev->amp_status = rp->amp_status;
770 hdev->amp_total_bw = __le32_to_cpu(rp->total_bw);
771 hdev->amp_max_bw = __le32_to_cpu(rp->max_bw);
772 hdev->amp_min_latency = __le32_to_cpu(rp->min_latency);
773 hdev->amp_max_pdu = __le32_to_cpu(rp->max_pdu);
774 hdev->amp_type = rp->amp_type;
775 hdev->amp_pal_cap = __le16_to_cpu(rp->pal_cap);
776 hdev->amp_assoc_size = __le16_to_cpu(rp->max_assoc_size);
777 hdev->amp_be_flush_to = __le32_to_cpu(rp->be_flush_to);
778 hdev->amp_max_flush_to = __le32_to_cpu(rp->max_flush_to);
779
Andrei Emeltchenko8e2a0d92012-09-27 17:26:08 +0300780a2mp_rsp:
781 a2mp_send_getinfo_rsp(hdev);
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300782}
783
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300784static void hci_cc_read_local_amp_assoc(struct hci_dev *hdev,
785 struct sk_buff *skb)
786{
787 struct hci_rp_read_local_amp_assoc *rp = (void *) skb->data;
788 struct amp_assoc *assoc = &hdev->loc_assoc;
789 size_t rem_len, frag_len;
790
791 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
792
793 if (rp->status)
794 goto a2mp_rsp;
795
796 frag_len = skb->len - sizeof(*rp);
797 rem_len = __le16_to_cpu(rp->rem_len);
798
799 if (rem_len > frag_len) {
Andrei Emeltchenko2e430be32012-09-28 14:44:23 +0300800 BT_DBG("frag_len %zu rem_len %zu", frag_len, rem_len);
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300801
802 memcpy(assoc->data + assoc->offset, rp->frag, frag_len);
803 assoc->offset += frag_len;
804
805 /* Read other fragments */
806 amp_read_loc_assoc_frag(hdev, rp->phy_handle);
807
808 return;
809 }
810
811 memcpy(assoc->data + assoc->offset, rp->frag, rem_len);
812 assoc->len = assoc->offset + rem_len;
813 assoc->offset = 0;
814
815a2mp_rsp:
816 /* Send A2MP Rsp when all fragments are received */
817 a2mp_send_getampassoc_rsp(hdev, rp->status);
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +0300818 a2mp_send_create_phy_link_req(hdev, rp->status);
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300819}
820
Johan Hedbergd5859e22011-01-25 01:19:58 +0200821static void hci_cc_read_inq_rsp_tx_power(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300822 struct sk_buff *skb)
Johan Hedbergd5859e22011-01-25 01:19:58 +0200823{
Marcel Holtmann91c4e9b2012-03-11 19:27:21 -0700824 struct hci_rp_read_inq_rsp_tx_power *rp = (void *) skb->data;
Johan Hedbergd5859e22011-01-25 01:19:58 +0200825
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300826 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedbergd5859e22011-01-25 01:19:58 +0200827
Marcel Holtmann91c4e9b2012-03-11 19:27:21 -0700828 if (!rp->status)
829 hdev->inq_tx_power = rp->tx_power;
Johan Hedbergd5859e22011-01-25 01:19:58 +0200830}
831
Johan Hedberg980e1a52011-01-22 06:10:07 +0200832static void hci_cc_pin_code_reply(struct hci_dev *hdev, struct sk_buff *skb)
833{
834 struct hci_rp_pin_code_reply *rp = (void *) skb->data;
835 struct hci_cp_pin_code_reply *cp;
836 struct hci_conn *conn;
837
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300838 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200839
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200840 hci_dev_lock(hdev);
841
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200842 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg744cf192011-11-08 20:40:14 +0200843 mgmt_pin_code_reply_complete(hdev, &rp->bdaddr, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200844
Mikel Astizfa1bd912012-08-09 09:52:29 +0200845 if (rp->status)
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200846 goto unlock;
Johan Hedberg980e1a52011-01-22 06:10:07 +0200847
848 cp = hci_sent_cmd_data(hdev, HCI_OP_PIN_CODE_REPLY);
849 if (!cp)
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200850 goto unlock;
Johan Hedberg980e1a52011-01-22 06:10:07 +0200851
852 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
853 if (conn)
854 conn->pin_length = cp->pin_len;
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200855
856unlock:
857 hci_dev_unlock(hdev);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200858}
859
860static void hci_cc_pin_code_neg_reply(struct hci_dev *hdev, struct sk_buff *skb)
861{
862 struct hci_rp_pin_code_neg_reply *rp = (void *) skb->data;
863
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300864 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200865
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200866 hci_dev_lock(hdev);
867
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200868 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg744cf192011-11-08 20:40:14 +0200869 mgmt_pin_code_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300870 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200871
872 hci_dev_unlock(hdev);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200873}
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200874
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300875static void hci_cc_le_read_buffer_size(struct hci_dev *hdev,
876 struct sk_buff *skb)
877{
878 struct hci_rp_le_read_buffer_size *rp = (void *) skb->data;
879
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300880 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300881
882 if (rp->status)
883 return;
884
885 hdev->le_mtu = __le16_to_cpu(rp->le_mtu);
886 hdev->le_pkts = rp->le_max_pkt;
887
888 hdev->le_cnt = hdev->le_pkts;
889
890 BT_DBG("%s le mtu %d:%d", hdev->name, hdev->le_mtu, hdev->le_pkts);
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300891}
Johan Hedberg980e1a52011-01-22 06:10:07 +0200892
Johan Hedberg60e77322013-01-22 14:01:59 +0200893static void hci_cc_le_read_local_features(struct hci_dev *hdev,
894 struct sk_buff *skb)
895{
896 struct hci_rp_le_read_local_features *rp = (void *) skb->data;
897
898 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
899
900 if (!rp->status)
901 memcpy(hdev->le_features, rp->features, 8);
Johan Hedberg60e77322013-01-22 14:01:59 +0200902}
903
Johan Hedberg8fa19092012-10-19 20:57:49 +0300904static void hci_cc_le_read_adv_tx_power(struct hci_dev *hdev,
905 struct sk_buff *skb)
906{
907 struct hci_rp_le_read_adv_tx_power *rp = (void *) skb->data;
908
909 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
910
Johan Hedberg04b4edc2013-03-15 17:07:01 -0500911 if (!rp->status)
Johan Hedberg8fa19092012-10-19 20:57:49 +0300912 hdev->adv_tx_power = rp->tx_power;
Johan Hedberg8fa19092012-10-19 20:57:49 +0300913}
914
Johan Hedberga5c29682011-02-19 12:05:57 -0300915static void hci_cc_user_confirm_reply(struct hci_dev *hdev, struct sk_buff *skb)
916{
917 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
918
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300919 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberga5c29682011-02-19 12:05:57 -0300920
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200921 hci_dev_lock(hdev);
922
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200923 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300924 mgmt_user_confirm_reply_complete(hdev, &rp->bdaddr, ACL_LINK, 0,
925 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200926
927 hci_dev_unlock(hdev);
Johan Hedberga5c29682011-02-19 12:05:57 -0300928}
929
930static void hci_cc_user_confirm_neg_reply(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300931 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -0300932{
933 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
934
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300935 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberga5c29682011-02-19 12:05:57 -0300936
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200937 hci_dev_lock(hdev);
938
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200939 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg744cf192011-11-08 20:40:14 +0200940 mgmt_user_confirm_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300941 ACL_LINK, 0, rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200942
943 hci_dev_unlock(hdev);
Johan Hedberga5c29682011-02-19 12:05:57 -0300944}
945
Brian Gix1143d452011-11-23 08:28:34 -0800946static void hci_cc_user_passkey_reply(struct hci_dev *hdev, struct sk_buff *skb)
947{
948 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
949
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300950 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800951
952 hci_dev_lock(hdev);
953
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200954 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg272d90d2012-02-09 15:26:12 +0200955 mgmt_user_passkey_reply_complete(hdev, &rp->bdaddr, ACL_LINK,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300956 0, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800957
958 hci_dev_unlock(hdev);
959}
960
961static void hci_cc_user_passkey_neg_reply(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300962 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -0800963{
964 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
965
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300966 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800967
968 hci_dev_lock(hdev);
969
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200970 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Brian Gix1143d452011-11-23 08:28:34 -0800971 mgmt_user_passkey_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300972 ACL_LINK, 0, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800973
974 hci_dev_unlock(hdev);
975}
976
Marcel Holtmann4d2d2792014-01-10 02:07:26 -0800977static void hci_cc_read_local_oob_data(struct hci_dev *hdev,
978 struct sk_buff *skb)
Szymon Jancc35938b2011-03-22 13:12:21 +0100979{
980 struct hci_rp_read_local_oob_data *rp = (void *) skb->data;
981
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300982 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Szymon Jancc35938b2011-03-22 13:12:21 +0100983
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200984 hci_dev_lock(hdev);
Marcel Holtmann4d2d2792014-01-10 02:07:26 -0800985 mgmt_read_local_oob_data_complete(hdev, rp->hash, rp->randomizer,
986 NULL, NULL, rp->status);
987 hci_dev_unlock(hdev);
988}
989
990static void hci_cc_read_local_oob_ext_data(struct hci_dev *hdev,
991 struct sk_buff *skb)
992{
993 struct hci_rp_read_local_oob_ext_data *rp = (void *) skb->data;
994
995 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
996
997 hci_dev_lock(hdev);
998 mgmt_read_local_oob_data_complete(hdev, rp->hash192, rp->randomizer192,
999 rp->hash256, rp->randomizer256,
1000 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001001 hci_dev_unlock(hdev);
Szymon Jancc35938b2011-03-22 13:12:21 +01001002}
1003
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001004
1005static void hci_cc_le_set_random_addr(struct hci_dev *hdev, struct sk_buff *skb)
1006{
1007 __u8 status = *((__u8 *) skb->data);
1008 bdaddr_t *sent;
1009
1010 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1011
1012 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_RANDOM_ADDR);
1013 if (!sent)
1014 return;
1015
1016 hci_dev_lock(hdev);
1017
1018 if (!status)
1019 bacpy(&hdev->random_addr, sent);
1020
1021 hci_dev_unlock(hdev);
1022}
1023
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001024static void hci_cc_le_set_adv_enable(struct hci_dev *hdev, struct sk_buff *skb)
1025{
1026 __u8 *sent, status = *((__u8 *) skb->data);
1027
1028 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1029
1030 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_ENABLE);
1031 if (!sent)
1032 return;
1033
Johan Hedberg3c857752014-03-25 10:30:49 +02001034 if (status)
1035 return;
1036
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001037 hci_dev_lock(hdev);
1038
Johan Hedberg3c857752014-03-25 10:30:49 +02001039 /* If we're doing connection initation as peripheral. Set a
1040 * timeout in case something goes wrong.
1041 */
1042 if (*sent) {
1043 struct hci_conn *conn;
1044
1045 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
1046 if (conn)
1047 queue_delayed_work(hdev->workqueue,
1048 &conn->le_conn_timeout,
1049 HCI_LE_CONN_TIMEOUT);
1050 }
1051
1052 mgmt_advertising(hdev, *sent);
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001053
Johan Hedberg04b4edc2013-03-15 17:07:01 -05001054 hci_dev_unlock(hdev);
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001055}
1056
Marcel Holtmann533553f2014-03-21 12:18:10 -07001057static void hci_cc_le_set_scan_param(struct hci_dev *hdev, struct sk_buff *skb)
1058{
1059 struct hci_cp_le_set_scan_param *cp;
1060 __u8 status = *((__u8 *) skb->data);
1061
1062 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1063
1064 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_PARAM);
1065 if (!cp)
1066 return;
1067
1068 hci_dev_lock(hdev);
1069
1070 if (!status)
1071 hdev->le_scan_type = cp->type;
1072
1073 hci_dev_unlock(hdev);
1074}
1075
Johan Hedbergb9a63282014-03-25 10:51:52 +02001076static bool has_pending_adv_report(struct hci_dev *hdev)
1077{
1078 struct discovery_state *d = &hdev->discovery;
1079
1080 return bacmp(&d->last_adv_addr, BDADDR_ANY);
1081}
1082
1083static void clear_pending_adv_report(struct hci_dev *hdev)
1084{
1085 struct discovery_state *d = &hdev->discovery;
1086
1087 bacpy(&d->last_adv_addr, BDADDR_ANY);
1088 d->last_adv_data_len = 0;
1089}
1090
1091static void store_pending_adv_report(struct hci_dev *hdev, bdaddr_t *bdaddr,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001092 u8 bdaddr_type, s8 rssi, u32 flags,
1093 u8 *data, u8 len)
Johan Hedbergb9a63282014-03-25 10:51:52 +02001094{
1095 struct discovery_state *d = &hdev->discovery;
1096
1097 bacpy(&d->last_adv_addr, bdaddr);
1098 d->last_adv_addr_type = bdaddr_type;
Johan Hedbergff5cd292014-03-25 14:40:52 +02001099 d->last_adv_rssi = rssi;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001100 d->last_adv_flags = flags;
Johan Hedbergb9a63282014-03-25 10:51:52 +02001101 memcpy(d->last_adv_data, data, len);
1102 d->last_adv_data_len = len;
1103}
1104
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001105static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001106 struct sk_buff *skb)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001107{
1108 struct hci_cp_le_set_scan_enable *cp;
1109 __u8 status = *((__u8 *) skb->data);
1110
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001111 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001112
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001113 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_ENABLE);
1114 if (!cp)
1115 return;
1116
Andre Guedes3fd319b2013-04-30 15:29:36 -03001117 if (status)
1118 return;
1119
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001120 switch (cp->enable) {
Andre Guedes76a388b2013-04-04 20:21:02 -03001121 case LE_SCAN_ENABLE:
Andre Guedesd23264a2011-11-25 20:53:38 -03001122 set_bit(HCI_LE_SCAN, &hdev->dev_flags);
Johan Hedbergb9a63282014-03-25 10:51:52 +02001123 if (hdev->le_scan_type == LE_SCAN_ACTIVE)
1124 clear_pending_adv_report(hdev);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001125 break;
1126
Andre Guedes76a388b2013-04-04 20:21:02 -03001127 case LE_SCAN_DISABLE:
Johan Hedbergb9a63282014-03-25 10:51:52 +02001128 /* We do this here instead of when setting DISCOVERY_STOPPED
1129 * since the latter would potentially require waiting for
1130 * inquiry to stop too.
1131 */
1132 if (has_pending_adv_report(hdev)) {
1133 struct discovery_state *d = &hdev->discovery;
1134
1135 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001136 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001137 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001138 d->last_adv_data,
Johan Hedbergb9a63282014-03-25 10:51:52 +02001139 d->last_adv_data_len, NULL, 0);
1140 }
1141
Johan Hedberg317ac8c2014-02-28 20:26:12 +02001142 /* Cancel this timer so that we don't try to disable scanning
1143 * when it's already disabled.
1144 */
1145 cancel_delayed_work(&hdev->le_scan_disable);
1146
Andre Guedesd23264a2011-11-25 20:53:38 -03001147 clear_bit(HCI_LE_SCAN, &hdev->dev_flags);
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001148 /* The HCI_LE_SCAN_INTERRUPTED flag indicates that we
1149 * interrupted scanning due to a connect request. Mark
1150 * therefore discovery as stopped.
1151 */
1152 if (test_and_clear_bit(HCI_LE_SCAN_INTERRUPTED,
1153 &hdev->dev_flags))
1154 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001155 break;
1156
1157 default:
1158 BT_ERR("Used reserved LE_Scan_Enable param %d", cp->enable);
1159 break;
Andre Guedes35815082011-05-26 16:23:53 -03001160 }
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001161}
1162
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001163static void hci_cc_le_read_white_list_size(struct hci_dev *hdev,
1164 struct sk_buff *skb)
1165{
1166 struct hci_rp_le_read_white_list_size *rp = (void *) skb->data;
1167
1168 BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size);
1169
1170 if (!rp->status)
1171 hdev->le_white_list_size = rp->size;
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001172}
1173
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001174static void hci_cc_le_clear_white_list(struct hci_dev *hdev,
1175 struct sk_buff *skb)
1176{
1177 __u8 status = *((__u8 *) skb->data);
1178
1179 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1180
1181 if (!status)
1182 hci_white_list_clear(hdev);
1183}
1184
1185static void hci_cc_le_add_to_white_list(struct hci_dev *hdev,
1186 struct sk_buff *skb)
1187{
1188 struct hci_cp_le_add_to_white_list *sent;
1189 __u8 status = *((__u8 *) skb->data);
1190
1191 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1192
1193 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_ADD_TO_WHITE_LIST);
1194 if (!sent)
1195 return;
1196
1197 if (!status)
1198 hci_white_list_add(hdev, &sent->bdaddr, sent->bdaddr_type);
1199}
1200
1201static void hci_cc_le_del_from_white_list(struct hci_dev *hdev,
1202 struct sk_buff *skb)
1203{
1204 struct hci_cp_le_del_from_white_list *sent;
1205 __u8 status = *((__u8 *) skb->data);
1206
1207 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1208
1209 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_DEL_FROM_WHITE_LIST);
1210 if (!sent)
1211 return;
1212
1213 if (!status)
1214 hci_white_list_del(hdev, &sent->bdaddr, sent->bdaddr_type);
1215}
1216
Johan Hedberg9b008c02013-01-22 14:02:01 +02001217static void hci_cc_le_read_supported_states(struct hci_dev *hdev,
1218 struct sk_buff *skb)
1219{
1220 struct hci_rp_le_read_supported_states *rp = (void *) skb->data;
1221
1222 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1223
1224 if (!rp->status)
1225 memcpy(hdev->le_states, rp->le_states, 8);
Johan Hedberg9b008c02013-01-22 14:02:01 +02001226}
1227
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001228static void hci_cc_write_le_host_supported(struct hci_dev *hdev,
1229 struct sk_buff *skb)
Andre Guedesf9b49302011-06-30 19:20:53 -03001230{
Johan Hedberg06199cf2012-02-22 16:37:11 +02001231 struct hci_cp_write_le_host_supported *sent;
Andre Guedesf9b49302011-06-30 19:20:53 -03001232 __u8 status = *((__u8 *) skb->data);
1233
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001234 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesf9b49302011-06-30 19:20:53 -03001235
Johan Hedberg06199cf2012-02-22 16:37:11 +02001236 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001237 if (!sent)
Andre Guedesf9b49302011-06-30 19:20:53 -03001238 return;
1239
Johan Hedberg8f984df2012-02-28 01:07:22 +02001240 if (!status) {
Johan Hedberg416a4ae2013-09-25 13:26:08 +03001241 if (sent->le) {
Johan Hedbergcad718e2013-04-17 15:00:51 +03001242 hdev->features[1][0] |= LMP_HOST_LE;
Johan Hedberg416a4ae2013-09-25 13:26:08 +03001243 set_bit(HCI_LE_ENABLED, &hdev->dev_flags);
1244 } else {
Johan Hedbergcad718e2013-04-17 15:00:51 +03001245 hdev->features[1][0] &= ~LMP_HOST_LE;
Johan Hedberg416a4ae2013-09-25 13:26:08 +03001246 clear_bit(HCI_LE_ENABLED, &hdev->dev_flags);
Johan Hedbergf3d3444a2013-10-05 12:01:04 +02001247 clear_bit(HCI_ADVERTISING, &hdev->dev_flags);
Johan Hedberg416a4ae2013-09-25 13:26:08 +03001248 }
Johan Hedberg53b2caa2012-10-24 21:11:59 +03001249
1250 if (sent->simul)
Johan Hedbergcad718e2013-04-17 15:00:51 +03001251 hdev->features[1][0] |= LMP_HOST_LE_BREDR;
Johan Hedberg53b2caa2012-10-24 21:11:59 +03001252 else
Johan Hedbergcad718e2013-04-17 15:00:51 +03001253 hdev->features[1][0] &= ~LMP_HOST_LE_BREDR;
Johan Hedberg8f984df2012-02-28 01:07:22 +02001254 }
Andre Guedesf9b49302011-06-30 19:20:53 -03001255}
1256
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02001257static void hci_cc_set_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
1258{
1259 struct hci_cp_le_set_adv_param *cp;
1260 u8 status = *((u8 *) skb->data);
1261
1262 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1263
1264 if (status)
1265 return;
1266
1267 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_PARAM);
1268 if (!cp)
1269 return;
1270
1271 hci_dev_lock(hdev);
1272 hdev->adv_addr_type = cp->own_address_type;
1273 hci_dev_unlock(hdev);
1274}
1275
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001276static void hci_cc_write_remote_amp_assoc(struct hci_dev *hdev,
1277 struct sk_buff *skb)
1278{
1279 struct hci_rp_write_remote_amp_assoc *rp = (void *) skb->data;
1280
1281 BT_DBG("%s status 0x%2.2x phy_handle 0x%2.2x",
1282 hdev->name, rp->status, rp->phy_handle);
1283
1284 if (rp->status)
1285 return;
1286
1287 amp_write_rem_assoc_continue(hdev, rp->phy_handle);
1288}
1289
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02001290static void hci_cc_read_rssi(struct hci_dev *hdev, struct sk_buff *skb)
1291{
1292 struct hci_rp_read_rssi *rp = (void *) skb->data;
1293 struct hci_conn *conn;
1294
1295 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1296
1297 if (rp->status)
1298 return;
1299
1300 hci_dev_lock(hdev);
1301
1302 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
1303 if (conn)
1304 conn->rssi = rp->rssi;
1305
1306 hci_dev_unlock(hdev);
1307}
1308
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001309static void hci_cc_read_tx_power(struct hci_dev *hdev, struct sk_buff *skb)
1310{
1311 struct hci_cp_read_tx_power *sent;
1312 struct hci_rp_read_tx_power *rp = (void *) skb->data;
1313 struct hci_conn *conn;
1314
1315 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1316
1317 if (rp->status)
1318 return;
1319
1320 sent = hci_sent_cmd_data(hdev, HCI_OP_READ_TX_POWER);
1321 if (!sent)
1322 return;
1323
1324 hci_dev_lock(hdev);
1325
1326 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001327 if (!conn)
1328 goto unlock;
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001329
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001330 switch (sent->type) {
1331 case 0x00:
1332 conn->tx_power = rp->tx_power;
1333 break;
1334 case 0x01:
1335 conn->max_tx_power = rp->tx_power;
1336 break;
1337 }
1338
1339unlock:
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001340 hci_dev_unlock(hdev);
1341}
1342
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001343static void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001344{
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001345 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001346
1347 if (status) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001348 hci_conn_check_pending(hdev);
Johan Hedberg314b2382011-04-27 10:29:57 -04001349 return;
1350 }
1351
Andre Guedes89352e72011-11-04 14:16:53 -03001352 set_bit(HCI_INQUIRY, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001353}
1354
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001355static void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001356{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001357 struct hci_cp_create_conn *cp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001358 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001359
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001360 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001361
1362 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_CONN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001363 if (!cp)
1364 return;
1365
1366 hci_dev_lock(hdev);
1367
1368 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1369
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001370 BT_DBG("%s bdaddr %pMR hcon %p", hdev->name, &cp->bdaddr, conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001371
1372 if (status) {
1373 if (conn && conn->state == BT_CONNECT) {
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001374 if (status != 0x0c || conn->attempt > 2) {
1375 conn->state = BT_CLOSED;
1376 hci_proto_connect_cfm(conn, status);
1377 hci_conn_del(conn);
1378 } else
1379 conn->state = BT_CONNECT2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001380 }
1381 } else {
1382 if (!conn) {
1383 conn = hci_conn_add(hdev, ACL_LINK, &cp->bdaddr);
1384 if (conn) {
Johan Hedberga0c808b2012-01-16 09:49:58 +02001385 conn->out = true;
Johan Hedberg4dae2792014-06-24 17:03:50 +03001386 set_bit(HCI_CONN_MASTER, &conn->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001387 } else
Gustavo F. Padovan893ef972010-07-18 15:13:37 -03001388 BT_ERR("No memory for new connection");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001389 }
1390 }
1391
1392 hci_dev_unlock(hdev);
1393}
1394
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001395static void hci_cs_add_sco(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001396{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001397 struct hci_cp_add_sco *cp;
1398 struct hci_conn *acl, *sco;
1399 __u16 handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001400
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001401 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001402
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001403 if (!status)
1404 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001405
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001406 cp = hci_sent_cmd_data(hdev, HCI_OP_ADD_SCO);
1407 if (!cp)
1408 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001409
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001410 handle = __le16_to_cpu(cp->handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001411
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001412 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001413
1414 hci_dev_lock(hdev);
1415
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001416 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001417 if (acl) {
1418 sco = acl->link;
1419 if (sco) {
1420 sco->state = BT_CLOSED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001421
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001422 hci_proto_connect_cfm(sco, status);
1423 hci_conn_del(sco);
1424 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001425 }
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001426
1427 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001428}
1429
Marcel Holtmannf8558552008-07-14 20:13:49 +02001430static void hci_cs_auth_requested(struct hci_dev *hdev, __u8 status)
1431{
1432 struct hci_cp_auth_requested *cp;
1433 struct hci_conn *conn;
1434
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001435 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001436
1437 if (!status)
1438 return;
1439
1440 cp = hci_sent_cmd_data(hdev, HCI_OP_AUTH_REQUESTED);
1441 if (!cp)
1442 return;
1443
1444 hci_dev_lock(hdev);
1445
1446 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1447 if (conn) {
1448 if (conn->state == BT_CONFIG) {
1449 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001450 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001451 }
1452 }
1453
1454 hci_dev_unlock(hdev);
1455}
1456
1457static void hci_cs_set_conn_encrypt(struct hci_dev *hdev, __u8 status)
1458{
1459 struct hci_cp_set_conn_encrypt *cp;
1460 struct hci_conn *conn;
1461
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001462 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001463
1464 if (!status)
1465 return;
1466
1467 cp = hci_sent_cmd_data(hdev, HCI_OP_SET_CONN_ENCRYPT);
1468 if (!cp)
1469 return;
1470
1471 hci_dev_lock(hdev);
1472
1473 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1474 if (conn) {
1475 if (conn->state == BT_CONFIG) {
1476 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001477 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001478 }
1479 }
1480
1481 hci_dev_unlock(hdev);
1482}
1483
Johan Hedberg127178d2010-11-18 22:22:29 +02001484static int hci_outgoing_auth_needed(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001485 struct hci_conn *conn)
Johan Hedberg392599b2010-11-18 22:22:28 +02001486{
Johan Hedberg392599b2010-11-18 22:22:28 +02001487 if (conn->state != BT_CONFIG || !conn->out)
1488 return 0;
1489
Johan Hedberg765c2a92011-01-19 12:06:52 +05301490 if (conn->pending_sec_level == BT_SECURITY_SDP)
Johan Hedberg392599b2010-11-18 22:22:28 +02001491 return 0;
1492
1493 /* Only request authentication for SSP connections or non-SSP
Johan Hedberg264b8b42014-01-08 16:40:39 +02001494 * devices with sec_level MEDIUM or HIGH or if MITM protection
1495 * is requested.
1496 */
Gustavo Padovan807deac2012-05-17 00:36:24 -03001497 if (!hci_conn_ssp_enabled(conn) && !(conn->auth_type & 0x01) &&
Johan Hedberg7e3691e2014-05-30 14:45:19 +03001498 conn->pending_sec_level != BT_SECURITY_FIPS &&
Johan Hedberg264b8b42014-01-08 16:40:39 +02001499 conn->pending_sec_level != BT_SECURITY_HIGH &&
1500 conn->pending_sec_level != BT_SECURITY_MEDIUM)
Johan Hedberg392599b2010-11-18 22:22:28 +02001501 return 0;
1502
Johan Hedberg392599b2010-11-18 22:22:28 +02001503 return 1;
1504}
1505
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001506static int hci_resolve_name(struct hci_dev *hdev,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001507 struct inquiry_entry *e)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001508{
1509 struct hci_cp_remote_name_req cp;
1510
1511 memset(&cp, 0, sizeof(cp));
1512
1513 bacpy(&cp.bdaddr, &e->data.bdaddr);
1514 cp.pscan_rep_mode = e->data.pscan_rep_mode;
1515 cp.pscan_mode = e->data.pscan_mode;
1516 cp.clock_offset = e->data.clock_offset;
1517
1518 return hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
1519}
1520
Johan Hedbergb644ba32012-01-17 21:48:47 +02001521static bool hci_resolve_next_name(struct hci_dev *hdev)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001522{
1523 struct discovery_state *discov = &hdev->discovery;
1524 struct inquiry_entry *e;
1525
Johan Hedbergb644ba32012-01-17 21:48:47 +02001526 if (list_empty(&discov->resolve))
1527 return false;
1528
1529 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
Ram Malovanyc8100892012-07-19 10:26:09 +03001530 if (!e)
1531 return false;
1532
Johan Hedbergb644ba32012-01-17 21:48:47 +02001533 if (hci_resolve_name(hdev, e) == 0) {
1534 e->name_state = NAME_PENDING;
1535 return true;
1536 }
1537
1538 return false;
1539}
1540
1541static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001542 bdaddr_t *bdaddr, u8 *name, u8 name_len)
Johan Hedbergb644ba32012-01-17 21:48:47 +02001543{
1544 struct discovery_state *discov = &hdev->discovery;
1545 struct inquiry_entry *e;
1546
1547 if (conn && !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001548 mgmt_device_connected(hdev, bdaddr, ACL_LINK, 0x00, 0, name,
1549 name_len, conn->dev_class);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001550
1551 if (discov->state == DISCOVERY_STOPPED)
1552 return;
1553
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001554 if (discov->state == DISCOVERY_STOPPING)
1555 goto discov_complete;
1556
1557 if (discov->state != DISCOVERY_RESOLVING)
1558 return;
1559
1560 e = hci_inquiry_cache_lookup_resolve(hdev, bdaddr, NAME_PENDING);
Ram Malovany7cc83802012-07-19 10:26:10 +03001561 /* If the device was not found in a list of found devices names of which
1562 * are pending. there is no need to continue resolving a next name as it
1563 * will be done upon receiving another Remote Name Request Complete
1564 * Event */
1565 if (!e)
1566 return;
1567
1568 list_del(&e->list);
1569 if (name) {
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001570 e->name_state = NAME_KNOWN;
Ram Malovany7cc83802012-07-19 10:26:10 +03001571 mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00,
1572 e->data.rssi, name, name_len);
Ram Malovanyc3e7c0d2012-07-19 10:26:11 +03001573 } else {
1574 e->name_state = NAME_NOT_KNOWN;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001575 }
1576
Johan Hedbergb644ba32012-01-17 21:48:47 +02001577 if (hci_resolve_next_name(hdev))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001578 return;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001579
1580discov_complete:
1581 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1582}
1583
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001584static void hci_cs_remote_name_req(struct hci_dev *hdev, __u8 status)
1585{
Johan Hedberg127178d2010-11-18 22:22:29 +02001586 struct hci_cp_remote_name_req *cp;
1587 struct hci_conn *conn;
1588
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001589 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Johan Hedberg127178d2010-11-18 22:22:29 +02001590
1591 /* If successful wait for the name req complete event before
1592 * checking for the need to do authentication */
1593 if (!status)
1594 return;
1595
1596 cp = hci_sent_cmd_data(hdev, HCI_OP_REMOTE_NAME_REQ);
1597 if (!cp)
1598 return;
1599
1600 hci_dev_lock(hdev);
1601
1602 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001603
1604 if (test_bit(HCI_MGMT, &hdev->dev_flags))
1605 hci_check_pending_name(hdev, conn, &cp->bdaddr, NULL, 0);
1606
Johan Hedberg79c6c702011-04-28 11:28:55 -07001607 if (!conn)
1608 goto unlock;
1609
1610 if (!hci_outgoing_auth_needed(hdev, conn))
1611 goto unlock;
1612
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001613 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02001614 struct hci_cp_auth_requested auth_cp;
1615
1616 auth_cp.handle = __cpu_to_le16(conn->handle);
1617 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED,
1618 sizeof(auth_cp), &auth_cp);
Johan Hedberg127178d2010-11-18 22:22:29 +02001619 }
1620
Johan Hedberg79c6c702011-04-28 11:28:55 -07001621unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02001622 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001623}
1624
Marcel Holtmann769be972008-07-14 20:13:49 +02001625static void hci_cs_read_remote_features(struct hci_dev *hdev, __u8 status)
1626{
1627 struct hci_cp_read_remote_features *cp;
1628 struct hci_conn *conn;
1629
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001630 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001631
1632 if (!status)
1633 return;
1634
1635 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_FEATURES);
1636 if (!cp)
1637 return;
1638
1639 hci_dev_lock(hdev);
1640
1641 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1642 if (conn) {
1643 if (conn->state == BT_CONFIG) {
Marcel Holtmann769be972008-07-14 20:13:49 +02001644 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001645 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001646 }
1647 }
1648
1649 hci_dev_unlock(hdev);
1650}
1651
1652static void hci_cs_read_remote_ext_features(struct hci_dev *hdev, __u8 status)
1653{
1654 struct hci_cp_read_remote_ext_features *cp;
1655 struct hci_conn *conn;
1656
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001657 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001658
1659 if (!status)
1660 return;
1661
1662 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES);
1663 if (!cp)
1664 return;
1665
1666 hci_dev_lock(hdev);
1667
1668 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1669 if (conn) {
1670 if (conn->state == BT_CONFIG) {
Marcel Holtmann769be972008-07-14 20:13:49 +02001671 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001672 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001673 }
1674 }
1675
1676 hci_dev_unlock(hdev);
1677}
1678
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001679static void hci_cs_setup_sync_conn(struct hci_dev *hdev, __u8 status)
1680{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001681 struct hci_cp_setup_sync_conn *cp;
1682 struct hci_conn *acl, *sco;
1683 __u16 handle;
1684
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001685 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001686
1687 if (!status)
1688 return;
1689
1690 cp = hci_sent_cmd_data(hdev, HCI_OP_SETUP_SYNC_CONN);
1691 if (!cp)
1692 return;
1693
1694 handle = __le16_to_cpu(cp->handle);
1695
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001696 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001697
1698 hci_dev_lock(hdev);
1699
1700 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001701 if (acl) {
1702 sco = acl->link;
1703 if (sco) {
1704 sco->state = BT_CLOSED;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001705
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001706 hci_proto_connect_cfm(sco, status);
1707 hci_conn_del(sco);
1708 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001709 }
1710
1711 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001712}
1713
1714static void hci_cs_sniff_mode(struct hci_dev *hdev, __u8 status)
1715{
1716 struct hci_cp_sniff_mode *cp;
1717 struct hci_conn *conn;
1718
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001719 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001720
1721 if (!status)
1722 return;
1723
1724 cp = hci_sent_cmd_data(hdev, HCI_OP_SNIFF_MODE);
1725 if (!cp)
1726 return;
1727
1728 hci_dev_lock(hdev);
1729
1730 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001731 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001732 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001733
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001734 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001735 hci_sco_setup(conn, status);
1736 }
1737
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001738 hci_dev_unlock(hdev);
1739}
1740
1741static void hci_cs_exit_sniff_mode(struct hci_dev *hdev, __u8 status)
1742{
1743 struct hci_cp_exit_sniff_mode *cp;
1744 struct hci_conn *conn;
1745
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001746 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001747
1748 if (!status)
1749 return;
1750
1751 cp = hci_sent_cmd_data(hdev, HCI_OP_EXIT_SNIFF_MODE);
1752 if (!cp)
1753 return;
1754
1755 hci_dev_lock(hdev);
1756
1757 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001758 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001759 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001760
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001761 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001762 hci_sco_setup(conn, status);
1763 }
1764
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001765 hci_dev_unlock(hdev);
1766}
1767
Johan Hedberg88c3df12012-02-09 14:27:38 +02001768static void hci_cs_disconnect(struct hci_dev *hdev, u8 status)
1769{
1770 struct hci_cp_disconnect *cp;
1771 struct hci_conn *conn;
1772
1773 if (!status)
1774 return;
1775
1776 cp = hci_sent_cmd_data(hdev, HCI_OP_DISCONNECT);
1777 if (!cp)
1778 return;
1779
1780 hci_dev_lock(hdev);
1781
1782 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1783 if (conn)
1784 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001785 conn->dst_type, status);
Johan Hedberg88c3df12012-02-09 14:27:38 +02001786
1787 hci_dev_unlock(hdev);
1788}
1789
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001790static void hci_cs_create_phylink(struct hci_dev *hdev, u8 status)
1791{
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001792 struct hci_cp_create_phy_link *cp;
1793
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001794 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001795
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001796 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_PHY_LINK);
1797 if (!cp)
1798 return;
1799
Andrei Emeltchenkoe58917b2012-10-31 15:46:33 +02001800 hci_dev_lock(hdev);
1801
1802 if (status) {
1803 struct hci_conn *hcon;
1804
1805 hcon = hci_conn_hash_lookup_handle(hdev, cp->phy_handle);
1806 if (hcon)
1807 hci_conn_del(hcon);
1808 } else {
1809 amp_write_remote_assoc(hdev, cp->phy_handle);
1810 }
1811
1812 hci_dev_unlock(hdev);
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001813}
1814
Andrei Emeltchenko0b26ab92012-09-27 17:26:24 +03001815static void hci_cs_accept_phylink(struct hci_dev *hdev, u8 status)
1816{
1817 struct hci_cp_accept_phy_link *cp;
1818
1819 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1820
1821 if (status)
1822 return;
1823
1824 cp = hci_sent_cmd_data(hdev, HCI_OP_ACCEPT_PHY_LINK);
1825 if (!cp)
1826 return;
1827
1828 amp_write_remote_assoc(hdev, cp->phy_handle);
1829}
1830
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001831static void hci_cs_le_create_conn(struct hci_dev *hdev, u8 status)
1832{
1833 struct hci_cp_le_create_conn *cp;
1834 struct hci_conn *conn;
1835
1836 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1837
1838 /* All connection failure handling is taken care of by the
1839 * hci_le_conn_failed function which is triggered by the HCI
1840 * request completion callbacks used for connecting.
1841 */
1842 if (status)
1843 return;
1844
1845 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_CREATE_CONN);
1846 if (!cp)
1847 return;
1848
1849 hci_dev_lock(hdev);
1850
1851 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->peer_addr);
1852 if (!conn)
1853 goto unlock;
1854
1855 /* Store the initiator and responder address information which
1856 * is needed for SMP. These values will not change during the
1857 * lifetime of the connection.
1858 */
1859 conn->init_addr_type = cp->own_address_type;
1860 if (cp->own_address_type == ADDR_LE_DEV_RANDOM)
1861 bacpy(&conn->init_addr, &hdev->random_addr);
1862 else
1863 bacpy(&conn->init_addr, &hdev->bdaddr);
1864
1865 conn->resp_addr_type = cp->peer_addr_type;
1866 bacpy(&conn->resp_addr, &cp->peer_addr);
1867
Johan Hedberg9489eca2014-02-28 17:45:46 +02001868 /* We don't want the connection attempt to stick around
1869 * indefinitely since LE doesn't have a page timeout concept
1870 * like BR/EDR. Set a timer for any connection that doesn't use
1871 * the white list for connecting.
1872 */
1873 if (cp->filter_policy == HCI_LE_USE_PEER_ADDR)
1874 queue_delayed_work(conn->hdev->workqueue,
1875 &conn->le_conn_timeout,
1876 HCI_LE_CONN_TIMEOUT);
1877
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001878unlock:
1879 hci_dev_unlock(hdev);
1880}
1881
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02001882static void hci_cs_le_start_enc(struct hci_dev *hdev, u8 status)
1883{
1884 struct hci_cp_le_start_enc *cp;
1885 struct hci_conn *conn;
1886
1887 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1888
1889 if (!status)
1890 return;
1891
1892 hci_dev_lock(hdev);
1893
1894 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_START_ENC);
1895 if (!cp)
1896 goto unlock;
1897
1898 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1899 if (!conn)
1900 goto unlock;
1901
1902 if (conn->state != BT_CONNECTED)
1903 goto unlock;
1904
1905 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
1906 hci_conn_drop(conn);
1907
1908unlock:
1909 hci_dev_unlock(hdev);
1910}
1911
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001912static void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001913{
1914 __u8 status = *((__u8 *) skb->data);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001915 struct discovery_state *discov = &hdev->discovery;
1916 struct inquiry_entry *e;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001917
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001918 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001919
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001920 hci_conn_check_pending(hdev);
Andre Guedes89352e72011-11-04 14:16:53 -03001921
1922 if (!test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
1923 return;
1924
Peter Zijlstra4e857c52014-03-17 18:06:10 +01001925 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -03001926 wake_up_bit(&hdev->flags, HCI_INQUIRY);
1927
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02001928 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001929 return;
1930
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001931 hci_dev_lock(hdev);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001932
Andre Guedes343f9352012-02-17 20:39:37 -03001933 if (discov->state != DISCOVERY_FINDING)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001934 goto unlock;
1935
1936 if (list_empty(&discov->resolve)) {
1937 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1938 goto unlock;
1939 }
1940
1941 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
1942 if (e && hci_resolve_name(hdev, e) == 0) {
1943 e->name_state = NAME_PENDING;
1944 hci_discovery_set_state(hdev, DISCOVERY_RESOLVING);
1945 } else {
1946 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1947 }
1948
1949unlock:
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001950 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001951}
1952
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001953static void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001954{
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001955 struct inquiry_data data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001956 struct inquiry_info *info = (void *) (skb->data + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001957 int num_rsp = *((__u8 *) skb->data);
1958
1959 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
1960
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001961 if (!num_rsp)
1962 return;
1963
Andre Guedes1519cc12012-03-21 00:03:38 -03001964 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
1965 return;
1966
Linus Torvalds1da177e2005-04-16 15:20:36 -07001967 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001968
Johan Hedberge17acd42011-03-30 23:57:16 +03001969 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02001970 u32 flags;
Johan Hedberg31754052012-01-04 13:39:52 +02001971
Linus Torvalds1da177e2005-04-16 15:20:36 -07001972 bacpy(&data.bdaddr, &info->bdaddr);
1973 data.pscan_rep_mode = info->pscan_rep_mode;
1974 data.pscan_period_mode = info->pscan_period_mode;
1975 data.pscan_mode = info->pscan_mode;
1976 memcpy(data.dev_class, info->dev_class, 3);
1977 data.clock_offset = info->clock_offset;
1978 data.rssi = 0x00;
Marcel Holtmann41a96212008-07-14 20:13:48 +02001979 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02001980
Marcel Holtmannaf589252014-07-01 14:11:20 +02001981 flags = hci_inquiry_cache_update(hdev, &data, false);
1982
Johan Hedberg48264f02011-11-09 13:58:58 +02001983 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannaf589252014-07-01 14:11:20 +02001984 info->dev_class, 0, flags, NULL, 0, NULL, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001985 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001986
Linus Torvalds1da177e2005-04-16 15:20:36 -07001987 hci_dev_unlock(hdev);
1988}
1989
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001990static void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001991{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001992 struct hci_ev_conn_complete *ev = (void *) skb->data;
1993 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001994
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001995 BT_DBG("%s", hdev->name);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001996
Linus Torvalds1da177e2005-04-16 15:20:36 -07001997 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001998
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001999 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann94992372009-04-19 19:30:03 +02002000 if (!conn) {
2001 if (ev->link_type != SCO_LINK)
2002 goto unlock;
2003
2004 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
2005 if (!conn)
2006 goto unlock;
2007
2008 conn->type = SCO_LINK;
2009 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002010
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002011 if (!ev->status) {
2012 conn->handle = __le16_to_cpu(ev->handle);
Marcel Holtmann769be972008-07-14 20:13:49 +02002013
2014 if (conn->type == ACL_LINK) {
2015 conn->state = BT_CONFIG;
2016 hci_conn_hold(conn);
Szymon Janca9ea3ed2012-07-19 14:46:08 +02002017
2018 if (!conn->out && !hci_conn_ssp_enabled(conn) &&
2019 !hci_find_link_key(hdev, &ev->bdaddr))
2020 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
2021 else
2022 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Marcel Holtmann769be972008-07-14 20:13:49 +02002023 } else
2024 conn->state = BT_CONNECTED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002025
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002026 hci_conn_add_sysfs(conn);
2027
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002028 if (test_bit(HCI_AUTH, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002029 set_bit(HCI_CONN_AUTH, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002030
2031 if (test_bit(HCI_ENCRYPT, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002032 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002033
2034 /* Get remote features */
2035 if (conn->type == ACL_LINK) {
2036 struct hci_cp_read_remote_features cp;
2037 cp.handle = ev->handle;
Marcel Holtmann769be972008-07-14 20:13:49 +02002038 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_FEATURES,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002039 sizeof(cp), &cp);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002040 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002041
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002042 /* Set packet type for incoming connection */
Andrei Emeltchenkod095c1e2011-12-01 14:33:27 +02002043 if (!conn->out && hdev->hci_ver < BLUETOOTH_VER_2_0) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002044 struct hci_cp_change_conn_ptype cp;
2045 cp.handle = ev->handle;
Marcel Holtmanna8746412008-07-14 20:13:46 +02002046 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002047 hci_send_cmd(hdev, HCI_OP_CHANGE_CONN_PTYPE, sizeof(cp),
2048 &cp);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002049 }
Johan Hedberg17d5c042011-01-22 06:09:08 +02002050 } else {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002051 conn->state = BT_CLOSED;
Johan Hedberg17d5c042011-01-22 06:09:08 +02002052 if (conn->type == ACL_LINK)
Marcel Holtmann64c7b772014-02-18 14:22:20 -08002053 mgmt_connect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002054 conn->dst_type, ev->status);
Johan Hedberg17d5c042011-01-22 06:09:08 +02002055 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002056
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002057 if (conn->type == ACL_LINK)
2058 hci_sco_setup(conn, ev->status);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002059
Marcel Holtmann769be972008-07-14 20:13:49 +02002060 if (ev->status) {
2061 hci_proto_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002062 hci_conn_del(conn);
Marcel Holtmannc89b6e62009-01-15 21:57:03 +01002063 } else if (ev->link_type != ACL_LINK)
2064 hci_proto_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002065
2066unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002067 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002068
2069 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002070}
2071
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002072static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002073{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002074 struct hci_ev_conn_request *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002075 int mask = hdev->link_mode;
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002076 __u8 flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002077
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03002078 BT_DBG("%s bdaddr %pMR type 0x%x", hdev->name, &ev->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002079 ev->link_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002080
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002081 mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type,
2082 &flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002083
Szymon Janc138d22e2011-02-17 16:44:23 +01002084 if ((mask & HCI_LM_ACCEPT) &&
Marcel Holtmannb9ee0a72013-10-17 17:24:13 -07002085 !hci_blacklist_lookup(hdev, &ev->bdaddr, BDADDR_BREDR)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002086 /* Connection accepted */
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02002087 struct inquiry_entry *ie;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002088 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002089
2090 hci_dev_lock(hdev);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002091
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02002092 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
2093 if (ie)
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02002094 memcpy(ie->data.dev_class, ev->dev_class, 3);
2095
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03002096 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type,
2097 &ev->bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002098 if (!conn) {
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02002099 conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr);
2100 if (!conn) {
Gustavo F. Padovan893ef972010-07-18 15:13:37 -03002101 BT_ERR("No memory for new connection");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002102 hci_dev_unlock(hdev);
2103 return;
2104 }
2105 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002106
Linus Torvalds1da177e2005-04-16 15:20:36 -07002107 memcpy(conn->dev_class, ev->dev_class, 3);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002108
Linus Torvalds1da177e2005-04-16 15:20:36 -07002109 hci_dev_unlock(hdev);
2110
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002111 if (ev->link_type == ACL_LINK ||
2112 (!(flags & HCI_PROTO_DEFER) && !lmp_esco_capable(hdev))) {
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002113 struct hci_cp_accept_conn_req cp;
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002114 conn->state = BT_CONNECT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002115
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002116 bacpy(&cp.bdaddr, &ev->bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002117
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002118 if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER))
2119 cp.role = 0x00; /* Become master */
2120 else
2121 cp.role = 0x01; /* Remain slave */
2122
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002123 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp),
2124 &cp);
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002125 } else if (!(flags & HCI_PROTO_DEFER)) {
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002126 struct hci_cp_accept_sync_conn_req cp;
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002127 conn->state = BT_CONNECT;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002128
2129 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmanna8746412008-07-14 20:13:46 +02002130 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002131
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002132 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
2133 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
2134 cp.max_latency = cpu_to_le16(0xffff);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002135 cp.content_format = cpu_to_le16(hdev->voice_setting);
2136 cp.retrans_effort = 0xff;
2137
2138 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002139 sizeof(cp), &cp);
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002140 } else {
2141 conn->state = BT_CONNECT2;
2142 hci_proto_connect_cfm(conn, 0);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002143 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002144 } else {
2145 /* Connection rejected */
2146 struct hci_cp_reject_conn_req cp;
2147
2148 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02002149 cp.reason = HCI_ERROR_REJ_BAD_ADDR;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002150 hci_send_cmd(hdev, HCI_OP_REJECT_CONN_REQ, sizeof(cp), &cp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002151 }
2152}
2153
Mikel Astizf0d6a0e2012-08-09 09:52:30 +02002154static u8 hci_to_mgmt_reason(u8 err)
2155{
2156 switch (err) {
2157 case HCI_ERROR_CONNECTION_TIMEOUT:
2158 return MGMT_DEV_DISCONN_TIMEOUT;
2159 case HCI_ERROR_REMOTE_USER_TERM:
2160 case HCI_ERROR_REMOTE_LOW_RESOURCES:
2161 case HCI_ERROR_REMOTE_POWER_OFF:
2162 return MGMT_DEV_DISCONN_REMOTE;
2163 case HCI_ERROR_LOCAL_HOST_TERM:
2164 return MGMT_DEV_DISCONN_LOCAL_HOST;
2165 default:
2166 return MGMT_DEV_DISCONN_UNKNOWN;
2167 }
2168}
2169
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002170static void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002171{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002172 struct hci_ev_disconn_complete *ev = (void *) skb->data;
Andre Guedesabf54a52013-11-07 17:36:09 -03002173 u8 reason = hci_to_mgmt_reason(ev->reason);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002174 struct hci_conn_params *params;
Marcel Holtmann04837f62006-07-03 10:02:33 +02002175 struct hci_conn *conn;
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002176 bool mgmt_connected;
Andre Guedes38462202013-11-07 17:36:10 -03002177 u8 type;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002178
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002179 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002180
Linus Torvalds1da177e2005-04-16 15:20:36 -07002181 hci_dev_lock(hdev);
2182
Marcel Holtmann04837f62006-07-03 10:02:33 +02002183 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergf7520542011-01-20 12:34:39 +02002184 if (!conn)
2185 goto unlock;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002186
Andre Guedesabf54a52013-11-07 17:36:09 -03002187 if (ev->status) {
2188 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
2189 conn->dst_type, ev->status);
2190 goto unlock;
Johan Hedberg37d9ef72011-11-10 15:54:39 +02002191 }
Johan Hedbergf7520542011-01-20 12:34:39 +02002192
Andre Guedes38462202013-11-07 17:36:10 -03002193 conn->state = BT_CLOSED;
2194
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002195 mgmt_connected = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags);
2196 mgmt_device_disconnected(hdev, &conn->dst, conn->type, conn->dst_type,
2197 reason, mgmt_connected);
Andre Guedesabf54a52013-11-07 17:36:09 -03002198
Johan Hedbergaf6a9c32014-06-24 13:15:53 +03002199 if (conn->type == ACL_LINK &&
2200 test_bit(HCI_CONN_FLUSH_KEY, &conn->flags))
Andre Guedes38462202013-11-07 17:36:10 -03002201 hci_remove_link_key(hdev, &conn->dst);
Johan Hedberg22102462013-10-05 12:01:06 +02002202
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002203 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
2204 if (params) {
2205 switch (params->auto_connect) {
2206 case HCI_AUTO_CONN_LINK_LOSS:
2207 if (ev->reason != HCI_ERROR_CONNECTION_TIMEOUT)
2208 break;
2209 /* Fall through */
2210
2211 case HCI_AUTO_CONN_ALWAYS:
Johan Hedberg418025d2014-07-04 12:37:24 +03002212 list_del_init(&params->action);
2213 list_add(&params->action, &hdev->pend_le_conns);
2214 hci_update_background_scan(hdev);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002215 break;
2216
2217 default:
2218 break;
2219 }
2220 }
2221
Andre Guedes38462202013-11-07 17:36:10 -03002222 type = conn->type;
Johan Hedberg22102462013-10-05 12:01:06 +02002223
Andre Guedes38462202013-11-07 17:36:10 -03002224 hci_proto_disconn_cfm(conn, ev->reason);
2225 hci_conn_del(conn);
2226
2227 /* Re-enable advertising if necessary, since it might
2228 * have been disabled by the connection. From the
2229 * HCI_LE_Set_Advertise_Enable command description in
2230 * the core specification (v4.0):
2231 * "The Controller shall continue advertising until the Host
2232 * issues an LE_Set_Advertise_Enable command with
2233 * Advertising_Enable set to 0x00 (Advertising is disabled)
2234 * or until a connection is created or until the Advertising
2235 * is timed out due to Directed Advertising."
2236 */
2237 if (type == LE_LINK)
2238 mgmt_reenable_advertising(hdev);
Johan Hedbergf7520542011-01-20 12:34:39 +02002239
2240unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002241 hci_dev_unlock(hdev);
2242}
2243
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002244static void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002245{
2246 struct hci_ev_auth_complete *ev = (void *) skb->data;
2247 struct hci_conn *conn;
2248
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002249 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002250
2251 hci_dev_lock(hdev);
2252
2253 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002254 if (!conn)
2255 goto unlock;
2256
2257 if (!ev->status) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002258 if (!hci_conn_ssp_enabled(conn) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03002259 test_bit(HCI_CONN_REAUTH_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002260 BT_INFO("re-auth of legacy device is not possible.");
Johan Hedberg2a611692011-02-19 12:06:00 -03002261 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002262 set_bit(HCI_CONN_AUTH, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002263 conn->sec_level = conn->pending_sec_level;
Johan Hedberg2a611692011-02-19 12:06:00 -03002264 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002265 } else {
Johan Hedbergbab73cb2012-02-09 16:07:29 +02002266 mgmt_auth_failed(hdev, &conn->dst, conn->type, conn->dst_type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002267 ev->status);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002268 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002269
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002270 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
2271 clear_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002272
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002273 if (conn->state == BT_CONFIG) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002274 if (!ev->status && hci_conn_ssp_enabled(conn)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002275 struct hci_cp_set_conn_encrypt cp;
2276 cp.handle = ev->handle;
2277 cp.encrypt = 0x01;
2278 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002279 &cp);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002280 } else {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002281 conn->state = BT_CONNECTED;
2282 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002283 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002284 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002285 } else {
2286 hci_auth_cfm(conn, ev->status);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002287
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002288 hci_conn_hold(conn);
2289 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02002290 hci_conn_drop(conn);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002291 }
2292
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002293 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002294 if (!ev->status) {
2295 struct hci_cp_set_conn_encrypt cp;
2296 cp.handle = ev->handle;
2297 cp.encrypt = 0x01;
2298 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002299 &cp);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002300 } else {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002301 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002302 hci_encrypt_cfm(conn, ev->status, 0x00);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002303 }
2304 }
2305
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002306unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002307 hci_dev_unlock(hdev);
2308}
2309
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002310static void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002311{
Johan Hedberg127178d2010-11-18 22:22:29 +02002312 struct hci_ev_remote_name *ev = (void *) skb->data;
2313 struct hci_conn *conn;
2314
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002315 BT_DBG("%s", hdev->name);
2316
2317 hci_conn_check_pending(hdev);
Johan Hedberg127178d2010-11-18 22:22:29 +02002318
2319 hci_dev_lock(hdev);
2320
2321 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002322
2323 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
2324 goto check_auth;
2325
2326 if (ev->status == 0)
2327 hci_check_pending_name(hdev, conn, &ev->bdaddr, ev->name,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002328 strnlen(ev->name, HCI_MAX_NAME_LENGTH));
Johan Hedbergb644ba32012-01-17 21:48:47 +02002329 else
2330 hci_check_pending_name(hdev, conn, &ev->bdaddr, NULL, 0);
2331
2332check_auth:
Johan Hedberg79c6c702011-04-28 11:28:55 -07002333 if (!conn)
2334 goto unlock;
2335
2336 if (!hci_outgoing_auth_needed(hdev, conn))
2337 goto unlock;
2338
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002339 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002340 struct hci_cp_auth_requested cp;
2341 cp.handle = __cpu_to_le16(conn->handle);
2342 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp);
2343 }
2344
Johan Hedberg79c6c702011-04-28 11:28:55 -07002345unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02002346 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002347}
2348
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002349static void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002350{
2351 struct hci_ev_encrypt_change *ev = (void *) skb->data;
2352 struct hci_conn *conn;
2353
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002354 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002355
2356 hci_dev_lock(hdev);
2357
2358 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002359 if (!conn)
2360 goto unlock;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002361
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002362 if (!ev->status) {
2363 if (ev->encrypt) {
2364 /* Encryption implies authentication */
Johan Hedberg4dae2792014-06-24 17:03:50 +03002365 set_bit(HCI_CONN_AUTH, &conn->flags);
2366 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002367 conn->sec_level = conn->pending_sec_level;
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002368
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002369 /* P-256 authentication key implies FIPS */
2370 if (conn->key_type == HCI_LK_AUTH_COMBINATION_P256)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002371 set_bit(HCI_CONN_FIPS, &conn->flags);
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002372
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002373 if ((conn->type == ACL_LINK && ev->encrypt == 0x02) ||
2374 conn->type == LE_LINK)
2375 set_bit(HCI_CONN_AES_CCM, &conn->flags);
2376 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002377 clear_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002378 clear_bit(HCI_CONN_AES_CCM, &conn->flags);
2379 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002380 }
2381
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002382 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
2383
2384 if (ev->status && conn->state == BT_CONNECTED) {
2385 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2386 hci_conn_drop(conn);
2387 goto unlock;
2388 }
2389
2390 if (conn->state == BT_CONFIG) {
2391 if (!ev->status)
2392 conn->state = BT_CONNECTED;
2393
Marcel Holtmann40b552a2014-03-19 14:10:25 -07002394 /* In Secure Connections Only mode, do not allow any
2395 * connections that are not encrypted with AES-CCM
2396 * using a P-256 authenticated combination key.
2397 */
2398 if (test_bit(HCI_SC_ONLY, &hdev->dev_flags) &&
2399 (!test_bit(HCI_CONN_AES_CCM, &conn->flags) ||
2400 conn->key_type != HCI_LK_AUTH_COMBINATION_P256)) {
2401 hci_proto_connect_cfm(conn, HCI_ERROR_AUTH_FAILURE);
2402 hci_conn_drop(conn);
2403 goto unlock;
2404 }
2405
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002406 hci_proto_connect_cfm(conn, ev->status);
2407 hci_conn_drop(conn);
2408 } else
2409 hci_encrypt_cfm(conn, ev->status, ev->encrypt);
2410
Gustavo Padovana7d77232012-05-13 03:20:07 -03002411unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002412 hci_dev_unlock(hdev);
2413}
2414
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002415static void hci_change_link_key_complete_evt(struct hci_dev *hdev,
2416 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002417{
2418 struct hci_ev_change_link_key_complete *ev = (void *) skb->data;
2419 struct hci_conn *conn;
2420
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002421 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002422
2423 hci_dev_lock(hdev);
2424
2425 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
2426 if (conn) {
2427 if (!ev->status)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002428 set_bit(HCI_CONN_SECURE, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002429
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002430 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002431
2432 hci_key_change_cfm(conn, ev->status);
2433 }
2434
2435 hci_dev_unlock(hdev);
2436}
2437
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002438static void hci_remote_features_evt(struct hci_dev *hdev,
2439 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002440{
2441 struct hci_ev_remote_features *ev = (void *) skb->data;
2442 struct hci_conn *conn;
2443
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002444 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002445
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002446 hci_dev_lock(hdev);
2447
2448 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02002449 if (!conn)
2450 goto unlock;
Marcel Holtmann769be972008-07-14 20:13:49 +02002451
Johan Hedbergccd556f2010-11-10 17:11:51 +02002452 if (!ev->status)
Johan Hedbergcad718e2013-04-17 15:00:51 +03002453 memcpy(conn->features[0], ev->features, 8);
Johan Hedbergccd556f2010-11-10 17:11:51 +02002454
2455 if (conn->state != BT_CONFIG)
2456 goto unlock;
2457
2458 if (!ev->status && lmp_ssp_capable(hdev) && lmp_ssp_capable(conn)) {
2459 struct hci_cp_read_remote_ext_features cp;
2460 cp.handle = ev->handle;
2461 cp.page = 0x01;
2462 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002463 sizeof(cp), &cp);
Johan Hedberg392599b2010-11-18 22:22:28 +02002464 goto unlock;
2465 }
2466
Johan Hedberg671267b2012-05-12 16:11:50 -03002467 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002468 struct hci_cp_remote_name_req cp;
2469 memset(&cp, 0, sizeof(cp));
2470 bacpy(&cp.bdaddr, &conn->dst);
2471 cp.pscan_rep_mode = 0x02;
2472 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002473 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
2474 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002475 conn->dst_type, 0, NULL, 0,
2476 conn->dev_class);
Johan Hedberg392599b2010-11-18 22:22:28 +02002477
Johan Hedberg127178d2010-11-18 22:22:29 +02002478 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002479 conn->state = BT_CONNECTED;
2480 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002481 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02002482 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002483
Johan Hedbergccd556f2010-11-10 17:11:51 +02002484unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002485 hci_dev_unlock(hdev);
2486}
2487
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002488static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002489{
2490 struct hci_ev_cmd_complete *ev = (void *) skb->data;
Johan Hedberg9238f362013-03-05 20:37:48 +02002491 u8 status = skb->data[sizeof(*ev)];
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002492 __u16 opcode;
2493
2494 skb_pull(skb, sizeof(*ev));
2495
2496 opcode = __le16_to_cpu(ev->opcode);
2497
2498 switch (opcode) {
2499 case HCI_OP_INQUIRY_CANCEL:
2500 hci_cc_inquiry_cancel(hdev, skb);
2501 break;
2502
Andre Guedes4d934832012-03-21 00:03:35 -03002503 case HCI_OP_PERIODIC_INQ:
2504 hci_cc_periodic_inq(hdev, skb);
2505 break;
2506
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002507 case HCI_OP_EXIT_PERIODIC_INQ:
2508 hci_cc_exit_periodic_inq(hdev, skb);
2509 break;
2510
2511 case HCI_OP_REMOTE_NAME_REQ_CANCEL:
2512 hci_cc_remote_name_req_cancel(hdev, skb);
2513 break;
2514
2515 case HCI_OP_ROLE_DISCOVERY:
2516 hci_cc_role_discovery(hdev, skb);
2517 break;
2518
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002519 case HCI_OP_READ_LINK_POLICY:
2520 hci_cc_read_link_policy(hdev, skb);
2521 break;
2522
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002523 case HCI_OP_WRITE_LINK_POLICY:
2524 hci_cc_write_link_policy(hdev, skb);
2525 break;
2526
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002527 case HCI_OP_READ_DEF_LINK_POLICY:
2528 hci_cc_read_def_link_policy(hdev, skb);
2529 break;
2530
2531 case HCI_OP_WRITE_DEF_LINK_POLICY:
2532 hci_cc_write_def_link_policy(hdev, skb);
2533 break;
2534
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002535 case HCI_OP_RESET:
2536 hci_cc_reset(hdev, skb);
2537 break;
2538
2539 case HCI_OP_WRITE_LOCAL_NAME:
2540 hci_cc_write_local_name(hdev, skb);
2541 break;
2542
2543 case HCI_OP_READ_LOCAL_NAME:
2544 hci_cc_read_local_name(hdev, skb);
2545 break;
2546
2547 case HCI_OP_WRITE_AUTH_ENABLE:
2548 hci_cc_write_auth_enable(hdev, skb);
2549 break;
2550
2551 case HCI_OP_WRITE_ENCRYPT_MODE:
2552 hci_cc_write_encrypt_mode(hdev, skb);
2553 break;
2554
2555 case HCI_OP_WRITE_SCAN_ENABLE:
2556 hci_cc_write_scan_enable(hdev, skb);
2557 break;
2558
2559 case HCI_OP_READ_CLASS_OF_DEV:
2560 hci_cc_read_class_of_dev(hdev, skb);
2561 break;
2562
2563 case HCI_OP_WRITE_CLASS_OF_DEV:
2564 hci_cc_write_class_of_dev(hdev, skb);
2565 break;
2566
2567 case HCI_OP_READ_VOICE_SETTING:
2568 hci_cc_read_voice_setting(hdev, skb);
2569 break;
2570
2571 case HCI_OP_WRITE_VOICE_SETTING:
2572 hci_cc_write_voice_setting(hdev, skb);
2573 break;
2574
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -07002575 case HCI_OP_READ_NUM_SUPPORTED_IAC:
2576 hci_cc_read_num_supported_iac(hdev, skb);
2577 break;
2578
Marcel Holtmann333140b2008-07-14 20:13:48 +02002579 case HCI_OP_WRITE_SSP_MODE:
2580 hci_cc_write_ssp_mode(hdev, skb);
2581 break;
2582
Marcel Holtmanneac83dc2014-01-10 02:07:23 -08002583 case HCI_OP_WRITE_SC_SUPPORT:
2584 hci_cc_write_sc_support(hdev, skb);
2585 break;
2586
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002587 case HCI_OP_READ_LOCAL_VERSION:
2588 hci_cc_read_local_version(hdev, skb);
2589 break;
2590
2591 case HCI_OP_READ_LOCAL_COMMANDS:
2592 hci_cc_read_local_commands(hdev, skb);
2593 break;
2594
2595 case HCI_OP_READ_LOCAL_FEATURES:
2596 hci_cc_read_local_features(hdev, skb);
2597 break;
2598
Andre Guedes971e3a42011-06-30 19:20:52 -03002599 case HCI_OP_READ_LOCAL_EXT_FEATURES:
2600 hci_cc_read_local_ext_features(hdev, skb);
2601 break;
2602
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002603 case HCI_OP_READ_BUFFER_SIZE:
2604 hci_cc_read_buffer_size(hdev, skb);
2605 break;
2606
2607 case HCI_OP_READ_BD_ADDR:
2608 hci_cc_read_bd_addr(hdev, skb);
2609 break;
2610
Johan Hedbergf332ec62013-03-15 17:07:11 -05002611 case HCI_OP_READ_PAGE_SCAN_ACTIVITY:
2612 hci_cc_read_page_scan_activity(hdev, skb);
2613 break;
2614
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002615 case HCI_OP_WRITE_PAGE_SCAN_ACTIVITY:
2616 hci_cc_write_page_scan_activity(hdev, skb);
2617 break;
2618
Johan Hedbergf332ec62013-03-15 17:07:11 -05002619 case HCI_OP_READ_PAGE_SCAN_TYPE:
2620 hci_cc_read_page_scan_type(hdev, skb);
2621 break;
2622
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002623 case HCI_OP_WRITE_PAGE_SCAN_TYPE:
2624 hci_cc_write_page_scan_type(hdev, skb);
2625 break;
2626
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +02002627 case HCI_OP_READ_DATA_BLOCK_SIZE:
2628 hci_cc_read_data_block_size(hdev, skb);
2629 break;
2630
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +02002631 case HCI_OP_READ_FLOW_CONTROL_MODE:
2632 hci_cc_read_flow_control_mode(hdev, skb);
2633 break;
2634
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +03002635 case HCI_OP_READ_LOCAL_AMP_INFO:
2636 hci_cc_read_local_amp_info(hdev, skb);
2637 break;
2638
Johan Hedberg33f35722014-06-28 17:54:06 +03002639 case HCI_OP_READ_CLOCK:
2640 hci_cc_read_clock(hdev, skb);
2641 break;
2642
Andrei Emeltchenko903e4542012-09-27 17:26:09 +03002643 case HCI_OP_READ_LOCAL_AMP_ASSOC:
2644 hci_cc_read_local_amp_assoc(hdev, skb);
2645 break;
2646
Johan Hedbergd5859e22011-01-25 01:19:58 +02002647 case HCI_OP_READ_INQ_RSP_TX_POWER:
2648 hci_cc_read_inq_rsp_tx_power(hdev, skb);
2649 break;
2650
Johan Hedberg980e1a52011-01-22 06:10:07 +02002651 case HCI_OP_PIN_CODE_REPLY:
2652 hci_cc_pin_code_reply(hdev, skb);
2653 break;
2654
2655 case HCI_OP_PIN_CODE_NEG_REPLY:
2656 hci_cc_pin_code_neg_reply(hdev, skb);
2657 break;
2658
Szymon Jancc35938b2011-03-22 13:12:21 +01002659 case HCI_OP_READ_LOCAL_OOB_DATA:
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08002660 hci_cc_read_local_oob_data(hdev, skb);
2661 break;
2662
2663 case HCI_OP_READ_LOCAL_OOB_EXT_DATA:
2664 hci_cc_read_local_oob_ext_data(hdev, skb);
Szymon Jancc35938b2011-03-22 13:12:21 +01002665 break;
2666
Ville Tervo6ed58ec2011-02-10 22:38:48 -03002667 case HCI_OP_LE_READ_BUFFER_SIZE:
2668 hci_cc_le_read_buffer_size(hdev, skb);
2669 break;
2670
Johan Hedberg60e77322013-01-22 14:01:59 +02002671 case HCI_OP_LE_READ_LOCAL_FEATURES:
2672 hci_cc_le_read_local_features(hdev, skb);
2673 break;
2674
Johan Hedberg8fa19092012-10-19 20:57:49 +03002675 case HCI_OP_LE_READ_ADV_TX_POWER:
2676 hci_cc_le_read_adv_tx_power(hdev, skb);
2677 break;
2678
Johan Hedberga5c29682011-02-19 12:05:57 -03002679 case HCI_OP_USER_CONFIRM_REPLY:
2680 hci_cc_user_confirm_reply(hdev, skb);
2681 break;
2682
2683 case HCI_OP_USER_CONFIRM_NEG_REPLY:
2684 hci_cc_user_confirm_neg_reply(hdev, skb);
2685 break;
2686
Brian Gix1143d452011-11-23 08:28:34 -08002687 case HCI_OP_USER_PASSKEY_REPLY:
2688 hci_cc_user_passkey_reply(hdev, skb);
2689 break;
2690
2691 case HCI_OP_USER_PASSKEY_NEG_REPLY:
2692 hci_cc_user_passkey_neg_reply(hdev, skb);
Szymon Janc16cde992012-04-13 12:32:42 +02002693 break;
Andre Guedes07f7fa52011-12-02 21:13:31 +09002694
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08002695 case HCI_OP_LE_SET_RANDOM_ADDR:
2696 hci_cc_le_set_random_addr(hdev, skb);
2697 break;
2698
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01002699 case HCI_OP_LE_SET_ADV_ENABLE:
2700 hci_cc_le_set_adv_enable(hdev, skb);
2701 break;
2702
Marcel Holtmann533553f2014-03-21 12:18:10 -07002703 case HCI_OP_LE_SET_SCAN_PARAM:
2704 hci_cc_le_set_scan_param(hdev, skb);
2705 break;
2706
Andre Guedeseb9d91f2011-05-26 16:23:52 -03002707 case HCI_OP_LE_SET_SCAN_ENABLE:
2708 hci_cc_le_set_scan_enable(hdev, skb);
2709 break;
2710
Johan Hedbergcf1d0812013-01-22 14:02:00 +02002711 case HCI_OP_LE_READ_WHITE_LIST_SIZE:
2712 hci_cc_le_read_white_list_size(hdev, skb);
2713 break;
2714
Marcel Holtmann0f36b582014-02-27 20:37:31 -08002715 case HCI_OP_LE_CLEAR_WHITE_LIST:
2716 hci_cc_le_clear_white_list(hdev, skb);
2717 break;
2718
2719 case HCI_OP_LE_ADD_TO_WHITE_LIST:
2720 hci_cc_le_add_to_white_list(hdev, skb);
2721 break;
2722
2723 case HCI_OP_LE_DEL_FROM_WHITE_LIST:
2724 hci_cc_le_del_from_white_list(hdev, skb);
2725 break;
2726
Johan Hedberg9b008c02013-01-22 14:02:01 +02002727 case HCI_OP_LE_READ_SUPPORTED_STATES:
2728 hci_cc_le_read_supported_states(hdev, skb);
2729 break;
2730
Andre Guedesf9b49302011-06-30 19:20:53 -03002731 case HCI_OP_WRITE_LE_HOST_SUPPORTED:
2732 hci_cc_write_le_host_supported(hdev, skb);
2733 break;
2734
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02002735 case HCI_OP_LE_SET_ADV_PARAM:
2736 hci_cc_set_adv_param(hdev, skb);
2737 break;
2738
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03002739 case HCI_OP_WRITE_REMOTE_AMP_ASSOC:
2740 hci_cc_write_remote_amp_assoc(hdev, skb);
2741 break;
2742
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02002743 case HCI_OP_READ_RSSI:
2744 hci_cc_read_rssi(hdev, skb);
2745 break;
2746
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02002747 case HCI_OP_READ_TX_POWER:
2748 hci_cc_read_tx_power(hdev, skb);
2749 break;
2750
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002751 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002752 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002753 break;
2754 }
2755
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002756 if (opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02002757 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02002758
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002759 hci_req_cmd_complete(hdev, opcode, status);
Johan Hedberg9238f362013-03-05 20:37:48 +02002760
Szymon Jancdbccd792012-12-11 08:51:19 +01002761 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002762 atomic_set(&hdev->cmd_cnt, 1);
2763 if (!skb_queue_empty(&hdev->cmd_q))
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02002764 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002765 }
2766}
2767
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002768static void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002769{
2770 struct hci_ev_cmd_status *ev = (void *) skb->data;
2771 __u16 opcode;
2772
2773 skb_pull(skb, sizeof(*ev));
2774
2775 opcode = __le16_to_cpu(ev->opcode);
2776
2777 switch (opcode) {
2778 case HCI_OP_INQUIRY:
2779 hci_cs_inquiry(hdev, ev->status);
2780 break;
2781
2782 case HCI_OP_CREATE_CONN:
2783 hci_cs_create_conn(hdev, ev->status);
2784 break;
2785
2786 case HCI_OP_ADD_SCO:
2787 hci_cs_add_sco(hdev, ev->status);
2788 break;
2789
Marcel Holtmannf8558552008-07-14 20:13:49 +02002790 case HCI_OP_AUTH_REQUESTED:
2791 hci_cs_auth_requested(hdev, ev->status);
2792 break;
2793
2794 case HCI_OP_SET_CONN_ENCRYPT:
2795 hci_cs_set_conn_encrypt(hdev, ev->status);
2796 break;
2797
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002798 case HCI_OP_REMOTE_NAME_REQ:
2799 hci_cs_remote_name_req(hdev, ev->status);
2800 break;
2801
Marcel Holtmann769be972008-07-14 20:13:49 +02002802 case HCI_OP_READ_REMOTE_FEATURES:
2803 hci_cs_read_remote_features(hdev, ev->status);
2804 break;
2805
2806 case HCI_OP_READ_REMOTE_EXT_FEATURES:
2807 hci_cs_read_remote_ext_features(hdev, ev->status);
2808 break;
2809
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002810 case HCI_OP_SETUP_SYNC_CONN:
2811 hci_cs_setup_sync_conn(hdev, ev->status);
2812 break;
2813
2814 case HCI_OP_SNIFF_MODE:
2815 hci_cs_sniff_mode(hdev, ev->status);
2816 break;
2817
2818 case HCI_OP_EXIT_SNIFF_MODE:
2819 hci_cs_exit_sniff_mode(hdev, ev->status);
2820 break;
2821
Johan Hedberg8962ee72011-01-20 12:40:27 +02002822 case HCI_OP_DISCONNECT:
Johan Hedberg88c3df12012-02-09 14:27:38 +02002823 hci_cs_disconnect(hdev, ev->status);
Johan Hedberg8962ee72011-01-20 12:40:27 +02002824 break;
2825
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03002826 case HCI_OP_CREATE_PHY_LINK:
2827 hci_cs_create_phylink(hdev, ev->status);
2828 break;
2829
Andrei Emeltchenko0b26ab92012-09-27 17:26:24 +03002830 case HCI_OP_ACCEPT_PHY_LINK:
2831 hci_cs_accept_phylink(hdev, ev->status);
2832 break;
2833
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002834 case HCI_OP_LE_CREATE_CONN:
2835 hci_cs_le_create_conn(hdev, ev->status);
2836 break;
2837
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02002838 case HCI_OP_LE_START_ENC:
2839 hci_cs_le_start_enc(hdev, ev->status);
2840 break;
2841
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002842 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002843 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002844 break;
2845 }
2846
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002847 if (opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02002848 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02002849
Johan Hedberg02350a72013-04-03 21:50:29 +03002850 if (ev->status ||
2851 (hdev->sent_cmd && !bt_cb(hdev->sent_cmd)->req.event))
2852 hci_req_cmd_complete(hdev, opcode, ev->status);
Johan Hedberg9238f362013-03-05 20:37:48 +02002853
Gustavo F. Padovan10572132011-03-16 15:36:29 -03002854 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002855 atomic_set(&hdev->cmd_cnt, 1);
2856 if (!skb_queue_empty(&hdev->cmd_q))
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02002857 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002858 }
2859}
2860
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002861static void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002862{
2863 struct hci_ev_role_change *ev = (void *) skb->data;
2864 struct hci_conn *conn;
2865
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002866 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002867
2868 hci_dev_lock(hdev);
2869
2870 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
2871 if (conn) {
2872 if (!ev->status) {
2873 if (ev->role)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002874 clear_bit(HCI_CONN_MASTER, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002875 else
Johan Hedberg4dae2792014-06-24 17:03:50 +03002876 set_bit(HCI_CONN_MASTER, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002877 }
2878
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002879 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002880
2881 hci_role_switch_cfm(conn, ev->status, ev->role);
2882 }
2883
2884 hci_dev_unlock(hdev);
2885}
2886
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002887static void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002888{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002889 struct hci_ev_num_comp_pkts *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002890 int i;
2891
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02002892 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_PACKET_BASED) {
2893 BT_ERR("Wrong event for mode %d", hdev->flow_ctl_mode);
2894 return;
2895 }
2896
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02002897 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03002898 ev->num_hndl * sizeof(struct hci_comp_pkts_info)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002899 BT_DBG("%s bad parameters", hdev->name);
2900 return;
2901 }
2902
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02002903 BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl);
2904
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02002905 for (i = 0; i < ev->num_hndl; i++) {
2906 struct hci_comp_pkts_info *info = &ev->handles[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002907 struct hci_conn *conn;
2908 __u16 handle, count;
2909
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02002910 handle = __le16_to_cpu(info->handle);
2911 count = __le16_to_cpu(info->count);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002912
2913 conn = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002914 if (!conn)
2915 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002916
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002917 conn->sent -= count;
2918
2919 switch (conn->type) {
2920 case ACL_LINK:
2921 hdev->acl_cnt += count;
2922 if (hdev->acl_cnt > hdev->acl_pkts)
2923 hdev->acl_cnt = hdev->acl_pkts;
2924 break;
2925
2926 case LE_LINK:
2927 if (hdev->le_pkts) {
2928 hdev->le_cnt += count;
2929 if (hdev->le_cnt > hdev->le_pkts)
2930 hdev->le_cnt = hdev->le_pkts;
2931 } else {
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02002932 hdev->acl_cnt += count;
2933 if (hdev->acl_cnt > hdev->acl_pkts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002934 hdev->acl_cnt = hdev->acl_pkts;
2935 }
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002936 break;
2937
2938 case SCO_LINK:
2939 hdev->sco_cnt += count;
2940 if (hdev->sco_cnt > hdev->sco_pkts)
2941 hdev->sco_cnt = hdev->sco_pkts;
2942 break;
2943
2944 default:
2945 BT_ERR("Unknown type %d conn %p", conn->type, conn);
2946 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002947 }
2948 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002949
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02002950 queue_work(hdev->workqueue, &hdev->tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002951}
2952
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03002953static struct hci_conn *__hci_conn_lookup_handle(struct hci_dev *hdev,
2954 __u16 handle)
2955{
2956 struct hci_chan *chan;
2957
2958 switch (hdev->dev_type) {
2959 case HCI_BREDR:
2960 return hci_conn_hash_lookup_handle(hdev, handle);
2961 case HCI_AMP:
2962 chan = hci_chan_lookup_handle(hdev, handle);
2963 if (chan)
2964 return chan->conn;
2965 break;
2966 default:
2967 BT_ERR("%s unknown dev_type %d", hdev->name, hdev->dev_type);
2968 break;
2969 }
2970
2971 return NULL;
2972}
2973
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002974static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002975{
2976 struct hci_ev_num_comp_blocks *ev = (void *) skb->data;
2977 int i;
2978
2979 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_BLOCK_BASED) {
2980 BT_ERR("Wrong event for mode %d", hdev->flow_ctl_mode);
2981 return;
2982 }
2983
2984 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03002985 ev->num_hndl * sizeof(struct hci_comp_blocks_info)) {
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002986 BT_DBG("%s bad parameters", hdev->name);
2987 return;
2988 }
2989
2990 BT_DBG("%s num_blocks %d num_hndl %d", hdev->name, ev->num_blocks,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002991 ev->num_hndl);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002992
2993 for (i = 0; i < ev->num_hndl; i++) {
2994 struct hci_comp_blocks_info *info = &ev->handles[i];
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03002995 struct hci_conn *conn = NULL;
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002996 __u16 handle, block_count;
2997
2998 handle = __le16_to_cpu(info->handle);
2999 block_count = __le16_to_cpu(info->blocks);
3000
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003001 conn = __hci_conn_lookup_handle(hdev, handle);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003002 if (!conn)
3003 continue;
3004
3005 conn->sent -= block_count;
3006
3007 switch (conn->type) {
3008 case ACL_LINK:
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03003009 case AMP_LINK:
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003010 hdev->block_cnt += block_count;
3011 if (hdev->block_cnt > hdev->num_blocks)
3012 hdev->block_cnt = hdev->num_blocks;
3013 break;
3014
3015 default:
3016 BT_ERR("Unknown type %d conn %p", conn->type, conn);
3017 break;
3018 }
3019 }
3020
3021 queue_work(hdev->workqueue, &hdev->tx_work);
3022}
3023
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003024static void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003025{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003026 struct hci_ev_mode_change *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003027 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003028
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003029 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003030
3031 hci_dev_lock(hdev);
3032
Marcel Holtmann04837f62006-07-03 10:02:33 +02003033 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3034 if (conn) {
3035 conn->mode = ev->mode;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003036
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003037 if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND,
3038 &conn->flags)) {
Marcel Holtmann04837f62006-07-03 10:02:33 +02003039 if (conn->mode == HCI_CM_ACTIVE)
Johan Hedberg58a681e2012-01-16 06:47:28 +02003040 set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003041 else
Johan Hedberg58a681e2012-01-16 06:47:28 +02003042 clear_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003043 }
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003044
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003045 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003046 hci_sco_setup(conn, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003047 }
3048
3049 hci_dev_unlock(hdev);
3050}
3051
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003052static void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003053{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003054 struct hci_ev_pin_code_req *ev = (void *) skb->data;
3055 struct hci_conn *conn;
3056
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003057 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003058
3059 hci_dev_lock(hdev);
3060
3061 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003062 if (!conn)
3063 goto unlock;
3064
3065 if (conn->state == BT_CONNECTED) {
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003066 hci_conn_hold(conn);
3067 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003068 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003069 }
3070
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003071 if (!test_bit(HCI_PAIRABLE, &hdev->dev_flags))
Johan Hedberg03b555e2011-01-04 15:40:05 +02003072 hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003073 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003074 else if (test_bit(HCI_MGMT, &hdev->dev_flags)) {
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003075 u8 secure;
3076
3077 if (conn->pending_sec_level == BT_SECURITY_HIGH)
3078 secure = 1;
3079 else
3080 secure = 0;
3081
Johan Hedberg744cf192011-11-08 20:40:14 +02003082 mgmt_pin_code_request(hdev, &ev->bdaddr, secure);
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003083 }
Johan Hedberg980e1a52011-01-22 06:10:07 +02003084
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003085unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003086 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003087}
3088
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003089static void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003090{
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003091 struct hci_ev_link_key_req *ev = (void *) skb->data;
3092 struct hci_cp_link_key_reply cp;
3093 struct hci_conn *conn;
3094 struct link_key *key;
3095
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003096 BT_DBG("%s", hdev->name);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003097
Andrei Emeltchenko034cbea2013-05-14 11:44:16 +03003098 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003099 return;
3100
3101 hci_dev_lock(hdev);
3102
3103 key = hci_find_link_key(hdev, &ev->bdaddr);
3104 if (!key) {
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003105 BT_DBG("%s link key not found for %pMR", hdev->name,
3106 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003107 goto not_found;
3108 }
3109
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003110 BT_DBG("%s found key type %u for %pMR", hdev->name, key->type,
3111 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003112
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003113 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003114 if (conn) {
Marcel Holtmann66138ce2014-01-10 02:07:20 -08003115 if ((key->type == HCI_LK_UNAUTH_COMBINATION_P192 ||
3116 key->type == HCI_LK_UNAUTH_COMBINATION_P256) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03003117 conn->auth_type != 0xff && (conn->auth_type & 0x01)) {
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003118 BT_DBG("%s ignoring unauthenticated key", hdev->name);
3119 goto not_found;
3120 }
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003121
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003122 if (key->type == HCI_LK_COMBINATION && key->pin_len < 16 &&
Johan Hedbergf3fb0b52014-06-02 10:12:44 +03003123 (conn->pending_sec_level == BT_SECURITY_HIGH ||
3124 conn->pending_sec_level == BT_SECURITY_FIPS)) {
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003125 BT_DBG("%s ignoring key unauthenticated for high security",
3126 hdev->name);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003127 goto not_found;
3128 }
3129
3130 conn->key_type = key->type;
3131 conn->pin_length = key->pin_len;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003132 }
3133
3134 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9b3b4462012-05-23 11:31:20 +03003135 memcpy(cp.link_key, key->val, HCI_LINK_KEY_SIZE);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003136
3137 hci_send_cmd(hdev, HCI_OP_LINK_KEY_REPLY, sizeof(cp), &cp);
3138
3139 hci_dev_unlock(hdev);
3140
3141 return;
3142
3143not_found:
3144 hci_send_cmd(hdev, HCI_OP_LINK_KEY_NEG_REPLY, 6, &ev->bdaddr);
3145 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003146}
3147
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003148static void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003149{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003150 struct hci_ev_link_key_notify *ev = (void *) skb->data;
3151 struct hci_conn *conn;
Johan Hedberg7652ff62014-06-24 13:15:49 +03003152 struct link_key *key;
3153 bool persistent;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003154 u8 pin_len = 0;
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003155
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003156 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003157
3158 hci_dev_lock(hdev);
3159
3160 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3161 if (conn) {
3162 hci_conn_hold(conn);
3163 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Johan Hedberg980e1a52011-01-22 06:10:07 +02003164 pin_len = conn->pin_length;
Waldemar Rymarkiewicz13d39312011-04-28 12:07:55 +02003165
3166 if (ev->key_type != HCI_LK_CHANGED_COMBINATION)
3167 conn->key_type = ev->key_type;
3168
David Herrmann76a68ba2013-04-06 20:28:37 +02003169 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003170 }
3171
Johan Hedberg7652ff62014-06-24 13:15:49 +03003172 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
3173 goto unlock;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003174
Johan Hedberg7652ff62014-06-24 13:15:49 +03003175 key = hci_add_link_key(hdev, conn, &ev->bdaddr, ev->link_key,
3176 ev->key_type, pin_len, &persistent);
3177 if (!key)
3178 goto unlock;
3179
3180 mgmt_new_link_key(hdev, key, persistent);
3181
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003182 /* Keep debug keys around only if the HCI_KEEP_DEBUG_KEYS flag
3183 * is set. If it's not set simply remove the key from the kernel
3184 * list (we've still notified user space about it but with
3185 * store_hint being 0).
3186 */
3187 if (key->type == HCI_LK_DEBUG_COMBINATION &&
3188 !test_bit(HCI_KEEP_DEBUG_KEYS, &hdev->dev_flags)) {
3189 list_del(&key->list);
3190 kfree(key);
3191 } else if (conn) {
Johan Hedbergaf6a9c32014-06-24 13:15:53 +03003192 if (persistent)
3193 clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3194 else
3195 set_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003196 }
Johan Hedberg7652ff62014-06-24 13:15:49 +03003197
3198unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003199 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003200}
3201
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003202static void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04837f62006-07-03 10:02:33 +02003203{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003204 struct hci_ev_clock_offset *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003205 struct hci_conn *conn;
3206
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003207 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003208
3209 hci_dev_lock(hdev);
3210
3211 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003212 if (conn && !ev->status) {
3213 struct inquiry_entry *ie;
3214
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003215 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3216 if (ie) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003217 ie->data.clock_offset = ev->clock_offset;
3218 ie->timestamp = jiffies;
3219 }
3220 }
3221
3222 hci_dev_unlock(hdev);
3223}
3224
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003225static void hci_pkt_type_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna8746412008-07-14 20:13:46 +02003226{
3227 struct hci_ev_pkt_type_change *ev = (void *) skb->data;
3228 struct hci_conn *conn;
3229
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003230 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna8746412008-07-14 20:13:46 +02003231
3232 hci_dev_lock(hdev);
3233
3234 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3235 if (conn && !ev->status)
3236 conn->pkt_type = __le16_to_cpu(ev->pkt_type);
3237
3238 hci_dev_unlock(hdev);
3239}
3240
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003241static void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003242{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003243 struct hci_ev_pscan_rep_mode *ev = (void *) skb->data;
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003244 struct inquiry_entry *ie;
3245
3246 BT_DBG("%s", hdev->name);
3247
3248 hci_dev_lock(hdev);
3249
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003250 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3251 if (ie) {
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003252 ie->data.pscan_rep_mode = ev->pscan_rep_mode;
3253 ie->timestamp = jiffies;
3254 }
3255
3256 hci_dev_unlock(hdev);
3257}
3258
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003259static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
3260 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003261{
3262 struct inquiry_data data;
3263 int num_rsp = *((__u8 *) skb->data);
3264
3265 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3266
3267 if (!num_rsp)
3268 return;
3269
Andre Guedes1519cc12012-03-21 00:03:38 -03003270 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
3271 return;
3272
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003273 hci_dev_lock(hdev);
3274
3275 if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) {
Szymon Janc138d22e2011-02-17 16:44:23 +01003276 struct inquiry_info_with_rssi_and_pscan_mode *info;
3277 info = (void *) (skb->data + 1);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003278
Johan Hedberge17acd42011-03-30 23:57:16 +03003279 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003280 u32 flags;
3281
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003282 bacpy(&data.bdaddr, &info->bdaddr);
3283 data.pscan_rep_mode = info->pscan_rep_mode;
3284 data.pscan_period_mode = info->pscan_period_mode;
3285 data.pscan_mode = info->pscan_mode;
3286 memcpy(data.dev_class, info->dev_class, 3);
3287 data.clock_offset = info->clock_offset;
3288 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003289 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02003290
Marcel Holtmannaf589252014-07-01 14:11:20 +02003291 flags = hci_inquiry_cache_update(hdev, &data, false);
3292
Johan Hedberg48264f02011-11-09 13:58:58 +02003293 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003294 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003295 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003296 }
3297 } else {
3298 struct inquiry_info_with_rssi *info = (void *) (skb->data + 1);
3299
Johan Hedberge17acd42011-03-30 23:57:16 +03003300 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003301 u32 flags;
3302
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003303 bacpy(&data.bdaddr, &info->bdaddr);
3304 data.pscan_rep_mode = info->pscan_rep_mode;
3305 data.pscan_period_mode = info->pscan_period_mode;
3306 data.pscan_mode = 0x00;
3307 memcpy(data.dev_class, info->dev_class, 3);
3308 data.clock_offset = info->clock_offset;
3309 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003310 data.ssp_mode = 0x00;
Marcel Holtmannaf589252014-07-01 14:11:20 +02003311
3312 flags = hci_inquiry_cache_update(hdev, &data, false);
3313
Johan Hedberg48264f02011-11-09 13:58:58 +02003314 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003315 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003316 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003317 }
3318 }
3319
3320 hci_dev_unlock(hdev);
3321}
3322
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003323static void hci_remote_ext_features_evt(struct hci_dev *hdev,
3324 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003325{
Marcel Holtmann41a96212008-07-14 20:13:48 +02003326 struct hci_ev_remote_ext_features *ev = (void *) skb->data;
3327 struct hci_conn *conn;
3328
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003329 BT_DBG("%s", hdev->name);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003330
Marcel Holtmann41a96212008-07-14 20:13:48 +02003331 hci_dev_lock(hdev);
3332
3333 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02003334 if (!conn)
3335 goto unlock;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003336
Johan Hedbergcad718e2013-04-17 15:00:51 +03003337 if (ev->page < HCI_MAX_PAGES)
3338 memcpy(conn->features[ev->page], ev->features, 8);
3339
Johan Hedbergccd556f2010-11-10 17:11:51 +02003340 if (!ev->status && ev->page == 0x01) {
3341 struct inquiry_entry *ie;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003342
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003343 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3344 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003345 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann769be972008-07-14 20:13:49 +02003346
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303347 if (ev->features[0] & LMP_HOST_SSP) {
Johan Hedberg58a681e2012-01-16 06:47:28 +02003348 set_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303349 } else {
3350 /* It is mandatory by the Bluetooth specification that
3351 * Extended Inquiry Results are only used when Secure
3352 * Simple Pairing is enabled, but some devices violate
3353 * this.
3354 *
3355 * To make these devices work, the internal SSP
3356 * enabled flag needs to be cleared if the remote host
3357 * features do not indicate SSP support */
3358 clear_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
3359 }
Marcel Holtmanneb9a8f32014-01-15 22:37:38 -08003360
3361 if (ev->features[0] & LMP_HOST_SC)
3362 set_bit(HCI_CONN_SC_ENABLED, &conn->flags);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003363 }
3364
Johan Hedbergccd556f2010-11-10 17:11:51 +02003365 if (conn->state != BT_CONFIG)
3366 goto unlock;
3367
Johan Hedberg671267b2012-05-12 16:11:50 -03003368 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02003369 struct hci_cp_remote_name_req cp;
3370 memset(&cp, 0, sizeof(cp));
3371 bacpy(&cp.bdaddr, &conn->dst);
3372 cp.pscan_rep_mode = 0x02;
3373 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02003374 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
3375 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003376 conn->dst_type, 0, NULL, 0,
3377 conn->dev_class);
Johan Hedberg392599b2010-11-18 22:22:28 +02003378
Johan Hedberg127178d2010-11-18 22:22:29 +02003379 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02003380 conn->state = BT_CONNECTED;
3381 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003382 hci_conn_drop(conn);
Johan Hedbergccd556f2010-11-10 17:11:51 +02003383 }
3384
3385unlock:
Marcel Holtmann41a96212008-07-14 20:13:48 +02003386 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003387}
3388
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003389static void hci_sync_conn_complete_evt(struct hci_dev *hdev,
3390 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003391{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003392 struct hci_ev_sync_conn_complete *ev = (void *) skb->data;
3393 struct hci_conn *conn;
3394
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003395 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003396
3397 hci_dev_lock(hdev);
3398
3399 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003400 if (!conn) {
3401 if (ev->link_type == ESCO_LINK)
3402 goto unlock;
3403
3404 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
3405 if (!conn)
3406 goto unlock;
3407
3408 conn->type = SCO_LINK;
3409 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003410
Marcel Holtmann732547f2009-04-19 19:14:14 +02003411 switch (ev->status) {
3412 case 0x00:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003413 conn->handle = __le16_to_cpu(ev->handle);
3414 conn->state = BT_CONNECTED;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02003415
3416 hci_conn_add_sysfs(conn);
Marcel Holtmann732547f2009-04-19 19:14:14 +02003417 break;
3418
Nick Pelly81218d22014-06-30 11:25:01 +05303419 case 0x10: /* Connection Accept Timeout */
Frédéric Dalleau1a4c9582013-08-19 14:24:02 +02003420 case 0x0d: /* Connection Rejected due to Limited Resources */
Stephen Coe705e5712010-02-16 11:29:44 -05003421 case 0x11: /* Unsupported Feature or Parameter Value */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003422 case 0x1c: /* SCO interval rejected */
Nick Pelly1038a002010-02-03 11:42:26 -08003423 case 0x1a: /* Unsupported Remote Feature */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003424 case 0x1f: /* Unspecified error */
Andrew Earl27539bc2014-03-10 10:31:04 +00003425 case 0x20: /* Unsupported LMP Parameter value */
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003426 if (conn->out) {
Marcel Holtmann732547f2009-04-19 19:14:14 +02003427 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
3428 (hdev->esco_type & EDR_ESCO_MASK);
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003429 if (hci_setup_sync(conn, conn->link->handle))
3430 goto unlock;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003431 }
3432 /* fall through */
3433
3434 default:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003435 conn->state = BT_CLOSED;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003436 break;
3437 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003438
3439 hci_proto_connect_cfm(conn, ev->status);
3440 if (ev->status)
3441 hci_conn_del(conn);
3442
3443unlock:
3444 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003445}
3446
Marcel Holtmannefdcf8e2013-10-15 10:31:12 -07003447static inline size_t eir_get_length(u8 *eir, size_t eir_len)
3448{
3449 size_t parsed = 0;
3450
3451 while (parsed < eir_len) {
3452 u8 field_len = eir[0];
3453
3454 if (field_len == 0)
3455 return parsed;
3456
3457 parsed += field_len + 1;
3458 eir += field_len + 1;
3459 }
3460
3461 return eir_len;
3462}
3463
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003464static void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
3465 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003466{
3467 struct inquiry_data data;
3468 struct extended_inquiry_info *info = (void *) (skb->data + 1);
3469 int num_rsp = *((__u8 *) skb->data);
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303470 size_t eir_len;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003471
3472 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3473
3474 if (!num_rsp)
3475 return;
3476
Andre Guedes1519cc12012-03-21 00:03:38 -03003477 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
3478 return;
3479
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003480 hci_dev_lock(hdev);
3481
Johan Hedberge17acd42011-03-30 23:57:16 +03003482 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003483 u32 flags;
3484 bool name_known;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003485
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003486 bacpy(&data.bdaddr, &info->bdaddr);
Szymon Janc138d22e2011-02-17 16:44:23 +01003487 data.pscan_rep_mode = info->pscan_rep_mode;
3488 data.pscan_period_mode = info->pscan_period_mode;
3489 data.pscan_mode = 0x00;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003490 memcpy(data.dev_class, info->dev_class, 3);
Szymon Janc138d22e2011-02-17 16:44:23 +01003491 data.clock_offset = info->clock_offset;
3492 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003493 data.ssp_mode = 0x01;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003494
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003495 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg4ddb1932012-01-15 20:04:43 +02003496 name_known = eir_has_data_type(info->data,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003497 sizeof(info->data),
3498 EIR_NAME_COMPLETE);
Johan Hedberg561aafb2012-01-04 13:31:59 +02003499 else
3500 name_known = true;
3501
Marcel Holtmannaf589252014-07-01 14:11:20 +02003502 flags = hci_inquiry_cache_update(hdev, &data, name_known);
3503
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303504 eir_len = eir_get_length(info->data, sizeof(info->data));
Marcel Holtmannaf589252014-07-01 14:11:20 +02003505
Johan Hedberg48264f02011-11-09 13:58:58 +02003506 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003507 info->dev_class, info->rssi,
3508 flags, info->data, eir_len, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003509 }
3510
3511 hci_dev_unlock(hdev);
3512}
3513
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003514static void hci_key_refresh_complete_evt(struct hci_dev *hdev,
3515 struct sk_buff *skb)
3516{
3517 struct hci_ev_key_refresh_complete *ev = (void *) skb->data;
3518 struct hci_conn *conn;
3519
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003520 BT_DBG("%s status 0x%2.2x handle 0x%4.4x", hdev->name, ev->status,
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003521 __le16_to_cpu(ev->handle));
3522
3523 hci_dev_lock(hdev);
3524
3525 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3526 if (!conn)
3527 goto unlock;
3528
Johan Hedberg9eb1fbf2014-04-11 12:02:31 -07003529 /* For BR/EDR the necessary steps are taken through the
3530 * auth_complete event.
3531 */
3532 if (conn->type != LE_LINK)
3533 goto unlock;
3534
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003535 if (!ev->status)
3536 conn->sec_level = conn->pending_sec_level;
3537
3538 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
3539
3540 if (ev->status && conn->state == BT_CONNECTED) {
Andre Guedesbed71742013-01-30 11:50:56 -03003541 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
David Herrmann76a68ba2013-04-06 20:28:37 +02003542 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003543 goto unlock;
3544 }
3545
3546 if (conn->state == BT_CONFIG) {
3547 if (!ev->status)
3548 conn->state = BT_CONNECTED;
3549
3550 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003551 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003552 } else {
3553 hci_auth_cfm(conn, ev->status);
3554
3555 hci_conn_hold(conn);
3556 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003557 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003558 }
3559
3560unlock:
3561 hci_dev_unlock(hdev);
3562}
3563
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003564static u8 hci_get_auth_req(struct hci_conn *conn)
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003565{
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003566 /* If remote requests no-bonding follow that lead */
Mikel Astizacabae92013-06-28 10:56:28 +02003567 if (conn->remote_auth == HCI_AT_NO_BONDING ||
3568 conn->remote_auth == HCI_AT_NO_BONDING_MITM)
Waldemar Rymarkiewicz58797bf2011-04-28 12:07:58 +02003569 return conn->remote_auth | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003570
Mikel Astizb7f94c82014-04-08 14:21:31 +02003571 /* If both remote and local have enough IO capabilities, require
3572 * MITM protection
3573 */
3574 if (conn->remote_cap != HCI_IO_NO_INPUT_OUTPUT &&
3575 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT)
3576 return conn->remote_auth | 0x01;
3577
Timo Mueller7e741702014-04-08 14:21:33 +02003578 /* No MITM protection possible so ignore remote requirement */
3579 return (conn->remote_auth & ~0x01) | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003580}
3581
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003582static void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003583{
3584 struct hci_ev_io_capa_request *ev = (void *) skb->data;
3585 struct hci_conn *conn;
3586
3587 BT_DBG("%s", hdev->name);
3588
3589 hci_dev_lock(hdev);
3590
3591 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003592 if (!conn)
3593 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02003594
Johan Hedberg03b555e2011-01-04 15:40:05 +02003595 hci_conn_hold(conn);
3596
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003597 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg03b555e2011-01-04 15:40:05 +02003598 goto unlock;
3599
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003600 if (test_bit(HCI_PAIRABLE, &hdev->dev_flags) ||
Gustavo Padovan807deac2012-05-17 00:36:24 -03003601 (conn->remote_auth & ~0x01) == HCI_AT_NO_BONDING) {
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003602 struct hci_cp_io_capability_reply cp;
3603
3604 bacpy(&cp.bdaddr, &ev->bdaddr);
Hemant Gupta7a7f1e72012-01-16 13:34:29 +05303605 /* Change the IO capability from KeyboardDisplay
3606 * to DisplayYesNo as it is not supported by BT spec. */
3607 cp.capability = (conn->io_capability == 0x04) ?
Mikel Astiza7676312013-06-28 10:56:29 +02003608 HCI_IO_DISPLAY_YESNO : conn->io_capability;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003609
3610 /* If we are initiators, there is no remote information yet */
3611 if (conn->remote_auth == 0xff) {
3612 cp.authentication = conn->auth_type;
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003613
Mikel Astizb16c6602014-04-08 14:21:34 +02003614 /* Request MITM protection if our IO caps allow it
Johan Hedberg4ad51a72014-06-09 14:41:25 +03003615 * except for the no-bonding case.
3616 * conn->auth_type is not updated here since
3617 * that might cause the user confirmation to be
3618 * rejected in case the remote doesn't have the
3619 * IO capabilities for MITM.
Mikel Astizb16c6602014-04-08 14:21:34 +02003620 */
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003621 if (conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Mikel Astizb16c6602014-04-08 14:21:34 +02003622 cp.authentication != HCI_AT_NO_BONDING)
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003623 cp.authentication |= 0x01;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003624 } else {
3625 conn->auth_type = hci_get_auth_req(conn);
3626 cp.authentication = conn->auth_type;
3627 }
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003628
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003629 if (hci_find_remote_oob_data(hdev, &conn->dst) &&
3630 (conn->out || test_bit(HCI_CONN_REMOTE_OOB, &conn->flags)))
Szymon Jancce85ee12011-03-22 13:12:23 +01003631 cp.oob_data = 0x01;
3632 else
3633 cp.oob_data = 0x00;
3634
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003635 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003636 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003637 } else {
3638 struct hci_cp_io_capability_neg_reply cp;
3639
3640 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003641 cp.reason = HCI_ERROR_PAIRING_NOT_ALLOWED;
Johan Hedberg03b555e2011-01-04 15:40:05 +02003642
3643 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003644 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003645 }
3646
3647unlock:
3648 hci_dev_unlock(hdev);
3649}
3650
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003651static void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *skb)
Johan Hedberg03b555e2011-01-04 15:40:05 +02003652{
3653 struct hci_ev_io_capa_reply *ev = (void *) skb->data;
3654 struct hci_conn *conn;
3655
3656 BT_DBG("%s", hdev->name);
3657
3658 hci_dev_lock(hdev);
3659
3660 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3661 if (!conn)
3662 goto unlock;
3663
Johan Hedberg03b555e2011-01-04 15:40:05 +02003664 conn->remote_cap = ev->capability;
Johan Hedberg03b555e2011-01-04 15:40:05 +02003665 conn->remote_auth = ev->authentication;
Johan Hedberg58a681e2012-01-16 06:47:28 +02003666 if (ev->oob_data)
3667 set_bit(HCI_CONN_REMOTE_OOB, &conn->flags);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003668
3669unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02003670 hci_dev_unlock(hdev);
3671}
3672
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003673static void hci_user_confirm_request_evt(struct hci_dev *hdev,
3674 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -03003675{
3676 struct hci_ev_user_confirm_req *ev = (void *) skb->data;
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003677 int loc_mitm, rem_mitm, confirm_hint = 0;
Johan Hedberg7a828902011-04-28 11:28:53 -07003678 struct hci_conn *conn;
Johan Hedberga5c29682011-02-19 12:05:57 -03003679
3680 BT_DBG("%s", hdev->name);
3681
3682 hci_dev_lock(hdev);
3683
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003684 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg7a828902011-04-28 11:28:53 -07003685 goto unlock;
Johan Hedberga5c29682011-02-19 12:05:57 -03003686
Johan Hedberg7a828902011-04-28 11:28:53 -07003687 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3688 if (!conn)
3689 goto unlock;
3690
3691 loc_mitm = (conn->auth_type & 0x01);
3692 rem_mitm = (conn->remote_auth & 0x01);
3693
3694 /* If we require MITM but the remote device can't provide that
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003695 * (it has NoInputNoOutput) then reject the confirmation request
3696 */
3697 if (loc_mitm && conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) {
Johan Hedberg7a828902011-04-28 11:28:53 -07003698 BT_DBG("Rejecting request: remote device can't provide MITM");
3699 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003700 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07003701 goto unlock;
3702 }
3703
3704 /* If no side requires MITM protection; auto-accept */
Mikel Astiza7676312013-06-28 10:56:29 +02003705 if ((!loc_mitm || conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) &&
3706 (!rem_mitm || conn->io_capability == HCI_IO_NO_INPUT_OUTPUT)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003707
3708 /* If we're not the initiators request authorization to
3709 * proceed from user space (mgmt_user_confirm with
Johan Hedbergba15a582014-06-09 13:58:14 +03003710 * confirm_hint set to 1). The exception is if neither
3711 * side had MITM in which case we do auto-accept.
3712 */
3713 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) &&
3714 (loc_mitm || rem_mitm)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003715 BT_DBG("Confirming auto-accept as acceptor");
3716 confirm_hint = 1;
3717 goto confirm;
3718 }
3719
Johan Hedberg9f616562011-04-28 11:28:54 -07003720 BT_DBG("Auto-accept of user confirmation with %ums delay",
Gustavo Padovan807deac2012-05-17 00:36:24 -03003721 hdev->auto_accept_delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07003722
3723 if (hdev->auto_accept_delay > 0) {
3724 int delay = msecs_to_jiffies(hdev->auto_accept_delay);
Johan Hedberg7bc18d92013-10-16 18:11:39 +03003725 queue_delayed_work(conn->hdev->workqueue,
3726 &conn->auto_accept_work, delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07003727 goto unlock;
3728 }
3729
Johan Hedberg7a828902011-04-28 11:28:53 -07003730 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003731 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07003732 goto unlock;
3733 }
3734
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003735confirm:
Johan Hedberg39adbff2014-03-20 08:18:14 +02003736 mgmt_user_confirm_request(hdev, &ev->bdaddr, ACL_LINK, 0,
3737 le32_to_cpu(ev->passkey), confirm_hint);
Johan Hedberg7a828902011-04-28 11:28:53 -07003738
3739unlock:
Johan Hedberga5c29682011-02-19 12:05:57 -03003740 hci_dev_unlock(hdev);
3741}
3742
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003743static void hci_user_passkey_request_evt(struct hci_dev *hdev,
3744 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -08003745{
3746 struct hci_ev_user_passkey_req *ev = (void *) skb->data;
3747
3748 BT_DBG("%s", hdev->name);
3749
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003750 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg272d90d2012-02-09 15:26:12 +02003751 mgmt_user_passkey_request(hdev, &ev->bdaddr, ACL_LINK, 0);
Brian Gix1143d452011-11-23 08:28:34 -08003752}
3753
Johan Hedberg92a25252012-09-06 18:39:26 +03003754static void hci_user_passkey_notify_evt(struct hci_dev *hdev,
3755 struct sk_buff *skb)
3756{
3757 struct hci_ev_user_passkey_notify *ev = (void *) skb->data;
3758 struct hci_conn *conn;
3759
3760 BT_DBG("%s", hdev->name);
3761
3762 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3763 if (!conn)
3764 return;
3765
3766 conn->passkey_notify = __le32_to_cpu(ev->passkey);
3767 conn->passkey_entered = 0;
3768
3769 if (test_bit(HCI_MGMT, &hdev->dev_flags))
3770 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
3771 conn->dst_type, conn->passkey_notify,
3772 conn->passkey_entered);
3773}
3774
3775static void hci_keypress_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
3776{
3777 struct hci_ev_keypress_notify *ev = (void *) skb->data;
3778 struct hci_conn *conn;
3779
3780 BT_DBG("%s", hdev->name);
3781
3782 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3783 if (!conn)
3784 return;
3785
3786 switch (ev->type) {
3787 case HCI_KEYPRESS_STARTED:
3788 conn->passkey_entered = 0;
3789 return;
3790
3791 case HCI_KEYPRESS_ENTERED:
3792 conn->passkey_entered++;
3793 break;
3794
3795 case HCI_KEYPRESS_ERASED:
3796 conn->passkey_entered--;
3797 break;
3798
3799 case HCI_KEYPRESS_CLEARED:
3800 conn->passkey_entered = 0;
3801 break;
3802
3803 case HCI_KEYPRESS_COMPLETED:
3804 return;
3805 }
3806
3807 if (test_bit(HCI_MGMT, &hdev->dev_flags))
3808 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
3809 conn->dst_type, conn->passkey_notify,
3810 conn->passkey_entered);
3811}
3812
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003813static void hci_simple_pair_complete_evt(struct hci_dev *hdev,
3814 struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003815{
3816 struct hci_ev_simple_pair_complete *ev = (void *) skb->data;
3817 struct hci_conn *conn;
3818
3819 BT_DBG("%s", hdev->name);
3820
3821 hci_dev_lock(hdev);
3822
3823 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg2a611692011-02-19 12:06:00 -03003824 if (!conn)
3825 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02003826
Johan Hedberg2a611692011-02-19 12:06:00 -03003827 /* To avoid duplicate auth_failed events to user space we check
3828 * the HCI_CONN_AUTH_PEND flag which will be set if we
3829 * initiated the authentication. A traditional auth_complete
3830 * event gets always produced as initiator and is also mapped to
3831 * the mgmt_auth_failed event */
Mikel Astizfa1bd912012-08-09 09:52:29 +02003832 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) && ev->status)
Johan Hedbergbab73cb2012-02-09 16:07:29 +02003833 mgmt_auth_failed(hdev, &conn->dst, conn->type, conn->dst_type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003834 ev->status);
Johan Hedberg2a611692011-02-19 12:06:00 -03003835
David Herrmann76a68ba2013-04-06 20:28:37 +02003836 hci_conn_drop(conn);
Johan Hedberg2a611692011-02-19 12:06:00 -03003837
3838unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02003839 hci_dev_unlock(hdev);
3840}
3841
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003842static void hci_remote_host_features_evt(struct hci_dev *hdev,
3843 struct sk_buff *skb)
Marcel Holtmann41a96212008-07-14 20:13:48 +02003844{
3845 struct hci_ev_remote_host_features *ev = (void *) skb->data;
3846 struct inquiry_entry *ie;
Johan Hedbergcad718e2013-04-17 15:00:51 +03003847 struct hci_conn *conn;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003848
3849 BT_DBG("%s", hdev->name);
3850
3851 hci_dev_lock(hdev);
3852
Johan Hedbergcad718e2013-04-17 15:00:51 +03003853 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3854 if (conn)
3855 memcpy(conn->features[1], ev->features, 8);
3856
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003857 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3858 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003859 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003860
3861 hci_dev_unlock(hdev);
3862}
3863
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003864static void hci_remote_oob_data_request_evt(struct hci_dev *hdev,
3865 struct sk_buff *skb)
Szymon Janc2763eda2011-03-22 13:12:22 +01003866{
3867 struct hci_ev_remote_oob_data_request *ev = (void *) skb->data;
3868 struct oob_data *data;
3869
3870 BT_DBG("%s", hdev->name);
3871
3872 hci_dev_lock(hdev);
3873
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003874 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Szymon Jance1ba1f12011-04-06 13:01:59 +02003875 goto unlock;
3876
Szymon Janc2763eda2011-03-22 13:12:22 +01003877 data = hci_find_remote_oob_data(hdev, &ev->bdaddr);
3878 if (data) {
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003879 if (test_bit(HCI_SC_ENABLED, &hdev->dev_flags)) {
3880 struct hci_cp_remote_oob_ext_data_reply cp;
Szymon Janc2763eda2011-03-22 13:12:22 +01003881
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003882 bacpy(&cp.bdaddr, &ev->bdaddr);
3883 memcpy(cp.hash192, data->hash192, sizeof(cp.hash192));
3884 memcpy(cp.randomizer192, data->randomizer192,
3885 sizeof(cp.randomizer192));
3886 memcpy(cp.hash256, data->hash256, sizeof(cp.hash256));
3887 memcpy(cp.randomizer256, data->randomizer256,
3888 sizeof(cp.randomizer256));
Szymon Janc2763eda2011-03-22 13:12:22 +01003889
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003890 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_EXT_DATA_REPLY,
3891 sizeof(cp), &cp);
3892 } else {
3893 struct hci_cp_remote_oob_data_reply cp;
3894
3895 bacpy(&cp.bdaddr, &ev->bdaddr);
3896 memcpy(cp.hash, data->hash192, sizeof(cp.hash));
3897 memcpy(cp.randomizer, data->randomizer192,
3898 sizeof(cp.randomizer));
3899
3900 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_REPLY,
3901 sizeof(cp), &cp);
3902 }
Szymon Janc2763eda2011-03-22 13:12:22 +01003903 } else {
3904 struct hci_cp_remote_oob_data_neg_reply cp;
3905
3906 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003907 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_NEG_REPLY,
3908 sizeof(cp), &cp);
Szymon Janc2763eda2011-03-22 13:12:22 +01003909 }
3910
Szymon Jance1ba1f12011-04-06 13:01:59 +02003911unlock:
Szymon Janc2763eda2011-03-22 13:12:22 +01003912 hci_dev_unlock(hdev);
3913}
3914
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003915static void hci_phy_link_complete_evt(struct hci_dev *hdev,
3916 struct sk_buff *skb)
3917{
3918 struct hci_ev_phy_link_complete *ev = (void *) skb->data;
3919 struct hci_conn *hcon, *bredr_hcon;
3920
3921 BT_DBG("%s handle 0x%2.2x status 0x%2.2x", hdev->name, ev->phy_handle,
3922 ev->status);
3923
3924 hci_dev_lock(hdev);
3925
3926 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
3927 if (!hcon) {
3928 hci_dev_unlock(hdev);
3929 return;
3930 }
3931
3932 if (ev->status) {
3933 hci_conn_del(hcon);
3934 hci_dev_unlock(hdev);
3935 return;
3936 }
3937
3938 bredr_hcon = hcon->amp_mgr->l2cap_conn->hcon;
3939
3940 hcon->state = BT_CONNECTED;
3941 bacpy(&hcon->dst, &bredr_hcon->dst);
3942
3943 hci_conn_hold(hcon);
3944 hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003945 hci_conn_drop(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003946
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003947 hci_conn_add_sysfs(hcon);
3948
Andrei Emeltchenkocf70ff22012-10-31 15:46:36 +02003949 amp_physical_cfm(bredr_hcon, hcon);
3950
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003951 hci_dev_unlock(hdev);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003952}
3953
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03003954static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
3955{
3956 struct hci_ev_logical_link_complete *ev = (void *) skb->data;
3957 struct hci_conn *hcon;
3958 struct hci_chan *hchan;
3959 struct amp_mgr *mgr;
3960
3961 BT_DBG("%s log_handle 0x%4.4x phy_handle 0x%2.2x status 0x%2.2x",
3962 hdev->name, le16_to_cpu(ev->handle), ev->phy_handle,
3963 ev->status);
3964
3965 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
3966 if (!hcon)
3967 return;
3968
3969 /* Create AMP hchan */
3970 hchan = hci_chan_create(hcon);
3971 if (!hchan)
3972 return;
3973
3974 hchan->handle = le16_to_cpu(ev->handle);
3975
3976 BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
3977
3978 mgr = hcon->amp_mgr;
3979 if (mgr && mgr->bredr_chan) {
3980 struct l2cap_chan *bredr_chan = mgr->bredr_chan;
3981
3982 l2cap_chan_lock(bredr_chan);
3983
3984 bredr_chan->conn->mtu = hdev->block_mtu;
3985 l2cap_logical_cfm(bredr_chan, hchan, 0);
3986 hci_conn_hold(hcon);
3987
3988 l2cap_chan_unlock(bredr_chan);
3989 }
3990}
3991
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02003992static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
3993 struct sk_buff *skb)
3994{
3995 struct hci_ev_disconn_logical_link_complete *ev = (void *) skb->data;
3996 struct hci_chan *hchan;
3997
3998 BT_DBG("%s log handle 0x%4.4x status 0x%2.2x", hdev->name,
3999 le16_to_cpu(ev->handle), ev->status);
4000
4001 if (ev->status)
4002 return;
4003
4004 hci_dev_lock(hdev);
4005
4006 hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
4007 if (!hchan)
4008 goto unlock;
4009
4010 amp_destroy_logical_link(hchan, ev->reason);
4011
4012unlock:
4013 hci_dev_unlock(hdev);
4014}
4015
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004016static void hci_disconn_phylink_complete_evt(struct hci_dev *hdev,
4017 struct sk_buff *skb)
4018{
4019 struct hci_ev_disconn_phy_link_complete *ev = (void *) skb->data;
4020 struct hci_conn *hcon;
4021
4022 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4023
4024 if (ev->status)
4025 return;
4026
4027 hci_dev_lock(hdev);
4028
4029 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4030 if (hcon) {
4031 hcon->state = BT_CLOSED;
4032 hci_conn_del(hcon);
4033 }
4034
4035 hci_dev_unlock(hdev);
4036}
4037
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004038static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004039{
4040 struct hci_ev_le_conn_complete *ev = (void *) skb->data;
Johan Hedberg912b42ef2014-07-03 19:33:49 +03004041 struct hci_conn_params *params;
Ville Tervofcd89c02011-02-10 22:38:47 -03004042 struct hci_conn *conn;
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004043 struct smp_irk *irk;
Johan Hedberg837d5022014-07-02 09:36:22 +03004044 u8 addr_type;
Ville Tervofcd89c02011-02-10 22:38:47 -03004045
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004046 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Ville Tervofcd89c02011-02-10 22:38:47 -03004047
4048 hci_dev_lock(hdev);
4049
Andre Guedesb47a09b2012-07-27 15:10:15 -03004050 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
Ville Tervob62f3282011-02-10 22:38:50 -03004051 if (!conn) {
4052 conn = hci_conn_add(hdev, LE_LINK, &ev->bdaddr);
4053 if (!conn) {
4054 BT_ERR("No memory for new connection");
Andre Guedes230fd162012-07-27 15:10:10 -03004055 goto unlock;
Ville Tervob62f3282011-02-10 22:38:50 -03004056 }
Andre Guedes29b79882011-05-31 14:20:54 -03004057
4058 conn->dst_type = ev->bdaddr_type;
Andre Guedesb9b343d2012-07-27 15:10:11 -03004059
4060 if (ev->role == LE_CONN_ROLE_MASTER) {
4061 conn->out = true;
Johan Hedberg4dae2792014-06-24 17:03:50 +03004062 set_bit(HCI_CONN_MASTER, &conn->flags);
Andre Guedesb9b343d2012-07-27 15:10:11 -03004063 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004064
4065 /* If we didn't have a hci_conn object previously
4066 * but we're in master role this must be something
4067 * initiated using a white list. Since white list based
4068 * connections are not "first class citizens" we don't
4069 * have full tracking of them. Therefore, we go ahead
4070 * with a "best effort" approach of determining the
4071 * initiator address based on the HCI_PRIVACY flag.
4072 */
4073 if (conn->out) {
4074 conn->resp_addr_type = ev->bdaddr_type;
4075 bacpy(&conn->resp_addr, &ev->bdaddr);
4076 if (test_bit(HCI_PRIVACY, &hdev->dev_flags)) {
4077 conn->init_addr_type = ADDR_LE_DEV_RANDOM;
4078 bacpy(&conn->init_addr, &hdev->rpa);
4079 } else {
4080 hci_copy_identity_address(hdev,
4081 &conn->init_addr,
4082 &conn->init_addr_type);
4083 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004084 }
Johan Hedberg9489eca2014-02-28 17:45:46 +02004085 } else {
4086 cancel_delayed_work(&conn->le_conn_timeout);
Ville Tervob62f3282011-02-10 22:38:50 -03004087 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004088
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004089 if (!conn->out) {
4090 /* Set the responder (our side) address type based on
4091 * the advertising address type.
4092 */
4093 conn->resp_addr_type = hdev->adv_addr_type;
4094 if (hdev->adv_addr_type == ADDR_LE_DEV_RANDOM)
4095 bacpy(&conn->resp_addr, &hdev->random_addr);
4096 else
4097 bacpy(&conn->resp_addr, &hdev->bdaddr);
4098
4099 conn->init_addr_type = ev->bdaddr_type;
4100 bacpy(&conn->init_addr, &ev->bdaddr);
Marcel Holtmanna720d732014-06-23 12:14:51 +02004101
4102 /* For incoming connections, set the default minimum
4103 * and maximum connection interval. They will be used
4104 * to check if the parameters are in range and if not
4105 * trigger the connection update procedure.
4106 */
4107 conn->le_conn_min_interval = hdev->le_conn_min_interval;
4108 conn->le_conn_max_interval = hdev->le_conn_max_interval;
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004109 }
Johan Hedberg7be2edb2014-02-23 19:42:17 +02004110
Marcel Holtmannedb4b462014-02-18 15:13:43 -08004111 /* Lookup the identity address from the stored connection
4112 * address and address type.
4113 *
4114 * When establishing connections to an identity address, the
4115 * connection procedure will store the resolvable random
4116 * address first. Now if it can be converted back into the
4117 * identity address, start using the identity address from
4118 * now on.
4119 */
4120 irk = hci_get_irk(hdev, &conn->dst, conn->dst_type);
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004121 if (irk) {
4122 bacpy(&conn->dst, &irk->bdaddr);
4123 conn->dst_type = irk->addr_type;
4124 }
4125
Johan Hedberg837d5022014-07-02 09:36:22 +03004126 if (conn->dst_type == ADDR_LE_DEV_PUBLIC)
4127 addr_type = BDADDR_LE_PUBLIC;
4128 else
4129 addr_type = BDADDR_LE_RANDOM;
4130
4131 /* Drop the connection if he device is blocked */
4132 if (hci_blacklist_lookup(hdev, &conn->dst, addr_type)) {
4133 hci_conn_drop(conn);
4134 goto unlock;
4135 }
4136
Andre Guedescd17dec2012-07-27 15:10:16 -03004137 if (ev->status) {
Andre Guedes06c053f2014-02-26 20:21:41 -03004138 hci_le_conn_failed(conn, ev->status);
Andre Guedescd17dec2012-07-27 15:10:16 -03004139 goto unlock;
4140 }
4141
Johan Hedbergb644ba32012-01-17 21:48:47 +02004142 if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Marcel Holtmann01fdb0f2014-02-18 14:22:19 -08004143 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03004144 conn->dst_type, 0, NULL, 0, NULL);
Vinicius Costa Gomes83bc71b2011-05-06 18:41:43 -03004145
Vinicius Costa Gomes7b5c0d52011-06-09 18:50:50 -03004146 conn->sec_level = BT_SECURITY_LOW;
Ville Tervofcd89c02011-02-10 22:38:47 -03004147 conn->handle = __le16_to_cpu(ev->handle);
4148 conn->state = BT_CONNECTED;
4149
Marcel Holtmanne04fde62014-06-23 11:40:04 +02004150 conn->le_conn_interval = le16_to_cpu(ev->interval);
4151 conn->le_conn_latency = le16_to_cpu(ev->latency);
4152 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4153
Ville Tervofcd89c02011-02-10 22:38:47 -03004154 hci_conn_add_sysfs(conn);
4155
4156 hci_proto_connect_cfm(conn, ev->status);
4157
Johan Hedberg912b42ef2014-07-03 19:33:49 +03004158 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
Johan Hedberg95305ba2014-07-04 12:37:21 +03004159 if (params) {
4160 list_del_init(&params->action);
4161 hci_update_background_scan(hdev);
4162 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004163
Ville Tervofcd89c02011-02-10 22:38:47 -03004164unlock:
4165 hci_dev_unlock(hdev);
4166}
4167
Marcel Holtmann1855d922014-06-23 11:40:05 +02004168static void hci_le_conn_update_complete_evt(struct hci_dev *hdev,
4169 struct sk_buff *skb)
4170{
4171 struct hci_ev_le_conn_update_complete *ev = (void *) skb->data;
4172 struct hci_conn *conn;
4173
4174 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4175
4176 if (ev->status)
4177 return;
4178
4179 hci_dev_lock(hdev);
4180
4181 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
4182 if (conn) {
4183 conn->le_conn_interval = le16_to_cpu(ev->interval);
4184 conn->le_conn_latency = le16_to_cpu(ev->latency);
4185 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4186 }
4187
4188 hci_dev_unlock(hdev);
4189}
4190
Andre Guedesa4790db2014-02-26 20:21:47 -03004191/* This function requires the caller holds hdev->lock */
Johan Hedbergbb5ce4d2014-07-03 19:33:50 +03004192static bool check_pending_le_conn(struct hci_dev *hdev, bdaddr_t *addr,
Andre Guedesa4790db2014-02-26 20:21:47 -03004193 u8 addr_type)
4194{
4195 struct hci_conn *conn;
4196
4197 if (!hci_pend_le_conn_lookup(hdev, addr, addr_type))
Johan Hedbergbb5ce4d2014-07-03 19:33:50 +03004198 return false;
Andre Guedesa4790db2014-02-26 20:21:47 -03004199
4200 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
4201 HCI_AT_NO_BONDING);
4202 if (!IS_ERR(conn))
Johan Hedbergbb5ce4d2014-07-03 19:33:50 +03004203 return true;
Andre Guedesa4790db2014-02-26 20:21:47 -03004204
4205 switch (PTR_ERR(conn)) {
4206 case -EBUSY:
4207 /* If hci_connect() returns -EBUSY it means there is already
4208 * an LE connection attempt going on. Since controllers don't
4209 * support more than one connection attempt at the time, we
4210 * don't consider this an error case.
4211 */
4212 break;
4213 default:
4214 BT_DBG("Failed to connect: err %ld", PTR_ERR(conn));
4215 }
Johan Hedbergbb5ce4d2014-07-03 19:33:50 +03004216
4217 return true;
Andre Guedesa4790db2014-02-26 20:21:47 -03004218}
4219
Johan Hedberg4af605d2014-03-24 10:48:00 +02004220static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
4221 u8 bdaddr_type, s8 rssi, u8 *data, u8 len)
4222{
Johan Hedbergb9a63282014-03-25 10:51:52 +02004223 struct discovery_state *d = &hdev->discovery;
Johan Hedberg474ee062014-03-25 14:34:59 +02004224 bool match;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004225 u32 flags;
Johan Hedbergb9a63282014-03-25 10:51:52 +02004226
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004227 /* Passive scanning shouldn't trigger any device found events,
4228 * except for devices marked as CONN_REPORT for which we do send
4229 * device found events.
4230 */
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004231 if (hdev->le_scan_type == LE_SCAN_PASSIVE) {
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004232 struct hci_conn_params *param;
Johan Hedberg079446c2014-07-02 23:09:24 +03004233 struct smp_irk *irk;
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004234
Johan Hedberg435a13d2014-07-03 19:33:48 +03004235 /* Check if we need to convert to identity address */
4236 irk = hci_get_irk(hdev, bdaddr, bdaddr_type);
4237 if (irk) {
4238 bdaddr = &irk->bdaddr;
4239 bdaddr_type = irk->addr_type;
4240 }
4241
Johan Hedbergbb5ce4d2014-07-03 19:33:50 +03004242 if (type == LE_ADV_IND || type == LE_ADV_DIRECT_IND) {
4243 if (check_pending_le_conn(hdev, bdaddr, bdaddr_type))
4244 return;
4245 }
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004246
Johan Hedberg66f84552014-07-04 12:37:18 +03004247 if (list_empty(&hdev->pend_le_reports))
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004248 return;
4249
4250 if (type == LE_ADV_DIRECT_IND)
4251 return;
4252
4253 param = hci_conn_params_lookup(hdev, bdaddr, bdaddr_type);
4254 if (!param || param->auto_connect != HCI_AUTO_CONN_REPORT)
4255 return;
4256
4257 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND)
4258 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4259 else
4260 flags = 0;
4261 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
4262 rssi, flags, data, len, NULL, 0);
Johan Hedberg97bf2e92014-07-04 12:37:16 +03004263 return;
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004264 }
Johan Hedberg4af605d2014-03-24 10:48:00 +02004265
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004266 /* When receiving non-connectable or scannable undirected
4267 * advertising reports, this means that the remote device is
4268 * not connectable and then clearly indicate this in the
4269 * device found event.
4270 *
4271 * When receiving a scan response, then there is no way to
4272 * know if the remote device is connectable or not. However
4273 * since scan responses are merged with a previously seen
4274 * advertising report, the flags field from that report
4275 * will be used.
4276 *
4277 * In the really unlikely case that a controller get confused
4278 * and just sends a scan response event, then it is marked as
4279 * not connectable as well.
4280 */
4281 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND ||
4282 type == LE_ADV_SCAN_RSP)
4283 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4284 else
4285 flags = 0;
4286
Johan Hedbergb9a63282014-03-25 10:51:52 +02004287 /* If there's nothing pending either store the data from this
4288 * event or send an immediate device found event if the data
4289 * should not be stored for later.
4290 */
4291 if (!has_pending_adv_report(hdev)) {
4292 /* If the report will trigger a SCAN_REQ store it for
4293 * later merging.
4294 */
4295 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4296 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004297 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004298 return;
4299 }
4300
4301 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004302 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004303 return;
4304 }
4305
Johan Hedberg474ee062014-03-25 14:34:59 +02004306 /* Check if the pending report is for the same device as the new one */
4307 match = (!bacmp(bdaddr, &d->last_adv_addr) &&
4308 bdaddr_type == d->last_adv_addr_type);
4309
Johan Hedbergb9a63282014-03-25 10:51:52 +02004310 /* If the pending data doesn't match this report or this isn't a
4311 * scan response (e.g. we got a duplicate ADV_IND) then force
4312 * sending of the pending data.
4313 */
Johan Hedberg474ee062014-03-25 14:34:59 +02004314 if (type != LE_ADV_SCAN_RSP || !match) {
4315 /* Send out whatever is in the cache, but skip duplicates */
4316 if (!match)
4317 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004318 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004319 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004320 d->last_adv_data,
Johan Hedberg474ee062014-03-25 14:34:59 +02004321 d->last_adv_data_len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004322
4323 /* If the new report will trigger a SCAN_REQ store it for
4324 * later merging.
4325 */
4326 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4327 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004328 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004329 return;
4330 }
4331
4332 /* The advertising reports cannot be merged, so clear
4333 * the pending report and send out a device found event.
4334 */
4335 clear_pending_adv_report(hdev);
Johan Hedberg5c5b93e2014-03-29 08:39:53 +02004336 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004337 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004338 return;
4339 }
4340
4341 /* If we get here we've got a pending ADV_IND or ADV_SCAN_IND and
4342 * the new event is a SCAN_RSP. We can therefore proceed with
4343 * sending a merged device found event.
4344 */
4345 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004346 d->last_adv_addr_type, NULL, rssi, d->last_adv_flags,
Marcel Holtmann42bd6a52014-07-01 14:11:19 +02004347 d->last_adv_data, d->last_adv_data_len, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004348 clear_pending_adv_report(hdev);
Johan Hedberg4af605d2014-03-24 10:48:00 +02004349}
4350
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004351static void hci_le_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andre Guedes9aa04c92011-05-26 16:23:51 -03004352{
Andre Guedese95beb42011-09-26 20:48:35 -03004353 u8 num_reports = skb->data[0];
4354 void *ptr = &skb->data[1];
Andre Guedes9aa04c92011-05-26 16:23:51 -03004355
Andre Guedesa4790db2014-02-26 20:21:47 -03004356 hci_dev_lock(hdev);
4357
Andre Guedese95beb42011-09-26 20:48:35 -03004358 while (num_reports--) {
4359 struct hci_ev_le_advertising_info *ev = ptr;
Johan Hedberg4af605d2014-03-24 10:48:00 +02004360 s8 rssi;
Andre Guedesa4790db2014-02-26 20:21:47 -03004361
Andre Guedes3c9e9192012-01-10 18:20:50 -03004362 rssi = ev->data[ev->length];
Johan Hedberg4af605d2014-03-24 10:48:00 +02004363 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
4364 ev->bdaddr_type, rssi, ev->data, ev->length);
Andre Guedes3c9e9192012-01-10 18:20:50 -03004365
Andre Guedese95beb42011-09-26 20:48:35 -03004366 ptr += sizeof(*ev) + ev->length + 1;
Andre Guedes9aa04c92011-05-26 16:23:51 -03004367 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004368
4369 hci_dev_unlock(hdev);
Andre Guedes9aa04c92011-05-26 16:23:51 -03004370}
4371
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004372static void hci_le_ltk_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004373{
4374 struct hci_ev_le_ltk_req *ev = (void *) skb->data;
4375 struct hci_cp_le_ltk_reply cp;
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004376 struct hci_cp_le_ltk_neg_reply neg;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004377 struct hci_conn *conn;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004378 struct smp_ltk *ltk;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004379
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004380 BT_DBG("%s handle 0x%4.4x", hdev->name, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004381
4382 hci_dev_lock(hdev);
4383
4384 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004385 if (conn == NULL)
4386 goto not_found;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004387
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08004388 ltk = hci_find_ltk(hdev, ev->ediv, ev->rand, conn->out);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004389 if (ltk == NULL)
4390 goto not_found;
4391
4392 memcpy(cp.ltk, ltk->val, sizeof(ltk->val));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004393 cp.handle = cpu_to_le16(conn->handle);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004394
4395 if (ltk->authenticated)
Andre Guedesf8776212013-07-31 16:25:28 -03004396 conn->pending_sec_level = BT_SECURITY_HIGH;
4397 else
4398 conn->pending_sec_level = BT_SECURITY_MEDIUM;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004399
Andre Guedes89cbb4d2013-07-31 16:25:29 -03004400 conn->enc_key_size = ltk->enc_size;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004401
4402 hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp);
4403
Claudio Takahasi5981a882013-07-25 16:34:24 -03004404 /* Ref. Bluetooth Core SPEC pages 1975 and 2004. STK is a
4405 * temporary key used to encrypt a connection following
4406 * pairing. It is used during the Encrypted Session Setup to
4407 * distribute the keys. Later, security can be re-established
4408 * using a distributed LTK.
4409 */
Johan Hedberg2ceba532014-06-16 19:25:16 +03004410 if (ltk->type == SMP_STK) {
Johan Hedbergfe59a052014-07-01 19:14:12 +03004411 set_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004412 list_del(&ltk->list);
4413 kfree(ltk);
Johan Hedbergfe59a052014-07-01 19:14:12 +03004414 } else {
4415 clear_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004416 }
4417
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004418 hci_dev_unlock(hdev);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004419
4420 return;
4421
4422not_found:
4423 neg.handle = ev->handle;
4424 hci_send_cmd(hdev, HCI_OP_LE_LTK_NEG_REPLY, sizeof(neg), &neg);
4425 hci_dev_unlock(hdev);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004426}
4427
Andre Guedes8e75b462014-07-01 18:10:08 -03004428static void send_conn_param_neg_reply(struct hci_dev *hdev, u16 handle,
4429 u8 reason)
4430{
4431 struct hci_cp_le_conn_param_req_neg_reply cp;
4432
4433 cp.handle = cpu_to_le16(handle);
4434 cp.reason = reason;
4435
4436 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_NEG_REPLY, sizeof(cp),
4437 &cp);
4438}
4439
4440static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev,
4441 struct sk_buff *skb)
4442{
4443 struct hci_ev_le_remote_conn_param_req *ev = (void *) skb->data;
4444 struct hci_cp_le_conn_param_req_reply cp;
4445 struct hci_conn *hcon;
4446 u16 handle, min, max, latency, timeout;
4447
4448 handle = le16_to_cpu(ev->handle);
4449 min = le16_to_cpu(ev->interval_min);
4450 max = le16_to_cpu(ev->interval_max);
4451 latency = le16_to_cpu(ev->latency);
4452 timeout = le16_to_cpu(ev->timeout);
4453
4454 hcon = hci_conn_hash_lookup_handle(hdev, handle);
4455 if (!hcon || hcon->state != BT_CONNECTED)
4456 return send_conn_param_neg_reply(hdev, handle,
4457 HCI_ERROR_UNKNOWN_CONN_ID);
4458
4459 if (hci_check_conn_params(min, max, latency, timeout))
4460 return send_conn_param_neg_reply(hdev, handle,
4461 HCI_ERROR_INVALID_LL_PARAMS);
4462
Johan Hedberg348d50b2014-07-02 17:37:30 +03004463 if (test_bit(HCI_CONN_MASTER, &hcon->flags)) {
4464 struct hci_conn_params *params;
Johan Hedbergf4869e22014-07-02 17:37:32 +03004465 u8 store_hint;
Johan Hedberg348d50b2014-07-02 17:37:30 +03004466
4467 hci_dev_lock(hdev);
4468
4469 params = hci_conn_params_lookup(hdev, &hcon->dst,
4470 hcon->dst_type);
4471 if (params) {
4472 params->conn_min_interval = min;
4473 params->conn_max_interval = max;
4474 params->conn_latency = latency;
4475 params->supervision_timeout = timeout;
Johan Hedbergf4869e22014-07-02 17:37:32 +03004476 store_hint = 0x01;
4477 } else{
4478 store_hint = 0x00;
Johan Hedberg348d50b2014-07-02 17:37:30 +03004479 }
4480
4481 hci_dev_unlock(hdev);
4482
Johan Hedbergf4869e22014-07-02 17:37:32 +03004483 mgmt_new_conn_param(hdev, &hcon->dst, hcon->dst_type,
4484 store_hint, min, max, latency, timeout);
Johan Hedberg348d50b2014-07-02 17:37:30 +03004485 }
Andre Guedesffb5a8272014-07-01 18:10:11 -03004486
Andre Guedes8e75b462014-07-01 18:10:08 -03004487 cp.handle = ev->handle;
4488 cp.interval_min = ev->interval_min;
4489 cp.interval_max = ev->interval_max;
4490 cp.latency = ev->latency;
4491 cp.timeout = ev->timeout;
4492 cp.min_ce_len = 0;
4493 cp.max_ce_len = 0;
4494
4495 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_REPLY, sizeof(cp), &cp);
4496}
4497
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004498static void hci_le_meta_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004499{
4500 struct hci_ev_le_meta *le_ev = (void *) skb->data;
4501
4502 skb_pull(skb, sizeof(*le_ev));
4503
4504 switch (le_ev->subevent) {
4505 case HCI_EV_LE_CONN_COMPLETE:
4506 hci_le_conn_complete_evt(hdev, skb);
4507 break;
4508
Marcel Holtmann1855d922014-06-23 11:40:05 +02004509 case HCI_EV_LE_CONN_UPDATE_COMPLETE:
4510 hci_le_conn_update_complete_evt(hdev, skb);
4511 break;
4512
Andre Guedes9aa04c92011-05-26 16:23:51 -03004513 case HCI_EV_LE_ADVERTISING_REPORT:
4514 hci_le_adv_report_evt(hdev, skb);
4515 break;
4516
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004517 case HCI_EV_LE_LTK_REQ:
4518 hci_le_ltk_request_evt(hdev, skb);
4519 break;
4520
Andre Guedes8e75b462014-07-01 18:10:08 -03004521 case HCI_EV_LE_REMOTE_CONN_PARAM_REQ:
4522 hci_le_remote_conn_param_req_evt(hdev, skb);
4523 break;
4524
Ville Tervofcd89c02011-02-10 22:38:47 -03004525 default:
4526 break;
4527 }
4528}
4529
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03004530static void hci_chan_selected_evt(struct hci_dev *hdev, struct sk_buff *skb)
4531{
4532 struct hci_ev_channel_selected *ev = (void *) skb->data;
4533 struct hci_conn *hcon;
4534
4535 BT_DBG("%s handle 0x%2.2x", hdev->name, ev->phy_handle);
4536
4537 skb_pull(skb, sizeof(*ev));
4538
4539 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4540 if (!hcon)
4541 return;
4542
4543 amp_read_loc_assoc_final_data(hdev, hcon);
4544}
4545
Linus Torvalds1da177e2005-04-16 15:20:36 -07004546void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
4547{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004548 struct hci_event_hdr *hdr = (void *) skb->data;
4549 __u8 event = hdr->evt;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004550
Johan Hedbergb6ddb632013-04-02 13:34:31 +03004551 hci_dev_lock(hdev);
4552
4553 /* Received events are (currently) only needed when a request is
4554 * ongoing so avoid unnecessary memory allocation.
4555 */
4556 if (hdev->req_status == HCI_REQ_PEND) {
4557 kfree_skb(hdev->recv_evt);
4558 hdev->recv_evt = skb_clone(skb, GFP_KERNEL);
4559 }
4560
4561 hci_dev_unlock(hdev);
4562
Linus Torvalds1da177e2005-04-16 15:20:36 -07004563 skb_pull(skb, HCI_EVENT_HDR_SIZE);
4564
Johan Hedberg02350a72013-04-03 21:50:29 +03004565 if (hdev->sent_cmd && bt_cb(hdev->sent_cmd)->req.event == event) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02004566 struct hci_command_hdr *cmd_hdr = (void *) hdev->sent_cmd->data;
4567 u16 opcode = __le16_to_cpu(cmd_hdr->opcode);
Johan Hedberg02350a72013-04-03 21:50:29 +03004568
4569 hci_req_cmd_complete(hdev, opcode, 0);
4570 }
4571
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004572 switch (event) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004573 case HCI_EV_INQUIRY_COMPLETE:
4574 hci_inquiry_complete_evt(hdev, skb);
4575 break;
4576
4577 case HCI_EV_INQUIRY_RESULT:
4578 hci_inquiry_result_evt(hdev, skb);
4579 break;
4580
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004581 case HCI_EV_CONN_COMPLETE:
4582 hci_conn_complete_evt(hdev, skb);
Marcel Holtmann21d9e302005-09-13 01:32:25 +02004583 break;
4584
Linus Torvalds1da177e2005-04-16 15:20:36 -07004585 case HCI_EV_CONN_REQUEST:
4586 hci_conn_request_evt(hdev, skb);
4587 break;
4588
Linus Torvalds1da177e2005-04-16 15:20:36 -07004589 case HCI_EV_DISCONN_COMPLETE:
4590 hci_disconn_complete_evt(hdev, skb);
4591 break;
4592
Linus Torvalds1da177e2005-04-16 15:20:36 -07004593 case HCI_EV_AUTH_COMPLETE:
4594 hci_auth_complete_evt(hdev, skb);
4595 break;
4596
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004597 case HCI_EV_REMOTE_NAME:
4598 hci_remote_name_evt(hdev, skb);
4599 break;
4600
Linus Torvalds1da177e2005-04-16 15:20:36 -07004601 case HCI_EV_ENCRYPT_CHANGE:
4602 hci_encrypt_change_evt(hdev, skb);
4603 break;
4604
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004605 case HCI_EV_CHANGE_LINK_KEY_COMPLETE:
4606 hci_change_link_key_complete_evt(hdev, skb);
4607 break;
4608
4609 case HCI_EV_REMOTE_FEATURES:
4610 hci_remote_features_evt(hdev, skb);
4611 break;
4612
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004613 case HCI_EV_CMD_COMPLETE:
4614 hci_cmd_complete_evt(hdev, skb);
4615 break;
4616
4617 case HCI_EV_CMD_STATUS:
4618 hci_cmd_status_evt(hdev, skb);
4619 break;
4620
4621 case HCI_EV_ROLE_CHANGE:
4622 hci_role_change_evt(hdev, skb);
4623 break;
4624
4625 case HCI_EV_NUM_COMP_PKTS:
4626 hci_num_comp_pkts_evt(hdev, skb);
4627 break;
4628
4629 case HCI_EV_MODE_CHANGE:
4630 hci_mode_change_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004631 break;
4632
4633 case HCI_EV_PIN_CODE_REQ:
4634 hci_pin_code_request_evt(hdev, skb);
4635 break;
4636
4637 case HCI_EV_LINK_KEY_REQ:
4638 hci_link_key_request_evt(hdev, skb);
4639 break;
4640
4641 case HCI_EV_LINK_KEY_NOTIFY:
4642 hci_link_key_notify_evt(hdev, skb);
4643 break;
4644
4645 case HCI_EV_CLOCK_OFFSET:
4646 hci_clock_offset_evt(hdev, skb);
4647 break;
4648
Marcel Holtmanna8746412008-07-14 20:13:46 +02004649 case HCI_EV_PKT_TYPE_CHANGE:
4650 hci_pkt_type_change_evt(hdev, skb);
4651 break;
4652
Marcel Holtmann85a1e932005-08-09 20:28:02 -07004653 case HCI_EV_PSCAN_REP_MODE:
4654 hci_pscan_rep_mode_evt(hdev, skb);
4655 break;
4656
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004657 case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
4658 hci_inquiry_result_with_rssi_evt(hdev, skb);
4659 break;
4660
4661 case HCI_EV_REMOTE_EXT_FEATURES:
4662 hci_remote_ext_features_evt(hdev, skb);
4663 break;
4664
4665 case HCI_EV_SYNC_CONN_COMPLETE:
4666 hci_sync_conn_complete_evt(hdev, skb);
4667 break;
4668
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004669 case HCI_EV_EXTENDED_INQUIRY_RESULT:
4670 hci_extended_inquiry_result_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004671 break;
4672
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004673 case HCI_EV_KEY_REFRESH_COMPLETE:
4674 hci_key_refresh_complete_evt(hdev, skb);
4675 break;
4676
Marcel Holtmann04936842008-07-14 20:13:48 +02004677 case HCI_EV_IO_CAPA_REQUEST:
4678 hci_io_capa_request_evt(hdev, skb);
4679 break;
4680
Johan Hedberg03b555e2011-01-04 15:40:05 +02004681 case HCI_EV_IO_CAPA_REPLY:
4682 hci_io_capa_reply_evt(hdev, skb);
4683 break;
4684
Johan Hedberga5c29682011-02-19 12:05:57 -03004685 case HCI_EV_USER_CONFIRM_REQUEST:
4686 hci_user_confirm_request_evt(hdev, skb);
4687 break;
4688
Brian Gix1143d452011-11-23 08:28:34 -08004689 case HCI_EV_USER_PASSKEY_REQUEST:
4690 hci_user_passkey_request_evt(hdev, skb);
4691 break;
4692
Johan Hedberg92a25252012-09-06 18:39:26 +03004693 case HCI_EV_USER_PASSKEY_NOTIFY:
4694 hci_user_passkey_notify_evt(hdev, skb);
4695 break;
4696
4697 case HCI_EV_KEYPRESS_NOTIFY:
4698 hci_keypress_notify_evt(hdev, skb);
4699 break;
4700
Marcel Holtmann04936842008-07-14 20:13:48 +02004701 case HCI_EV_SIMPLE_PAIR_COMPLETE:
4702 hci_simple_pair_complete_evt(hdev, skb);
4703 break;
4704
Marcel Holtmann41a96212008-07-14 20:13:48 +02004705 case HCI_EV_REMOTE_HOST_FEATURES:
4706 hci_remote_host_features_evt(hdev, skb);
4707 break;
4708
Ville Tervofcd89c02011-02-10 22:38:47 -03004709 case HCI_EV_LE_META:
4710 hci_le_meta_evt(hdev, skb);
4711 break;
4712
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03004713 case HCI_EV_CHANNEL_SELECTED:
4714 hci_chan_selected_evt(hdev, skb);
4715 break;
4716
Szymon Janc2763eda2011-03-22 13:12:22 +01004717 case HCI_EV_REMOTE_OOB_DATA_REQUEST:
4718 hci_remote_oob_data_request_evt(hdev, skb);
4719 break;
4720
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004721 case HCI_EV_PHY_LINK_COMPLETE:
4722 hci_phy_link_complete_evt(hdev, skb);
4723 break;
4724
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004725 case HCI_EV_LOGICAL_LINK_COMPLETE:
4726 hci_loglink_complete_evt(hdev, skb);
4727 break;
4728
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02004729 case HCI_EV_DISCONN_LOGICAL_LINK_COMPLETE:
4730 hci_disconn_loglink_complete_evt(hdev, skb);
4731 break;
4732
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004733 case HCI_EV_DISCONN_PHY_LINK_COMPLETE:
4734 hci_disconn_phylink_complete_evt(hdev, skb);
4735 break;
4736
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02004737 case HCI_EV_NUM_COMP_BLOCKS:
4738 hci_num_comp_blocks_evt(hdev, skb);
4739 break;
4740
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004741 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004742 BT_DBG("%s event 0x%2.2x", hdev->name, event);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004743 break;
4744 }
4745
4746 kfree_skb(skb);
4747 hdev->stat.evt_rx++;
4748}