blob: ea155183c1d65d887f26489c2c47089784afe596 [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,
Johan Hedbergff5cd292014-03-25 14:40:52 +02001092 u8 bdaddr_type, s8 rssi, u8 *data, u8 len)
Johan Hedbergb9a63282014-03-25 10:51:52 +02001093{
1094 struct discovery_state *d = &hdev->discovery;
1095
1096 bacpy(&d->last_adv_addr, bdaddr);
1097 d->last_adv_addr_type = bdaddr_type;
Johan Hedbergff5cd292014-03-25 14:40:52 +02001098 d->last_adv_rssi = rssi;
Johan Hedbergb9a63282014-03-25 10:51:52 +02001099 memcpy(d->last_adv_data, data, len);
1100 d->last_adv_data_len = len;
1101}
1102
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001103static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001104 struct sk_buff *skb)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001105{
1106 struct hci_cp_le_set_scan_enable *cp;
1107 __u8 status = *((__u8 *) skb->data);
1108
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001109 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001110
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001111 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_ENABLE);
1112 if (!cp)
1113 return;
1114
Andre Guedes3fd319b2013-04-30 15:29:36 -03001115 if (status)
1116 return;
1117
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001118 switch (cp->enable) {
Andre Guedes76a388b2013-04-04 20:21:02 -03001119 case LE_SCAN_ENABLE:
Andre Guedesd23264a2011-11-25 20:53:38 -03001120 set_bit(HCI_LE_SCAN, &hdev->dev_flags);
Johan Hedbergb9a63282014-03-25 10:51:52 +02001121 if (hdev->le_scan_type == LE_SCAN_ACTIVE)
1122 clear_pending_adv_report(hdev);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001123 break;
1124
Andre Guedes76a388b2013-04-04 20:21:02 -03001125 case LE_SCAN_DISABLE:
Johan Hedbergb9a63282014-03-25 10:51:52 +02001126 /* We do this here instead of when setting DISCOVERY_STOPPED
1127 * since the latter would potentially require waiting for
1128 * inquiry to stop too.
1129 */
1130 if (has_pending_adv_report(hdev)) {
1131 struct discovery_state *d = &hdev->discovery;
1132
1133 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001134 d->last_adv_addr_type, NULL,
1135 d->last_adv_rssi, 0, 1,
1136 d->last_adv_data,
Johan Hedbergb9a63282014-03-25 10:51:52 +02001137 d->last_adv_data_len, NULL, 0);
1138 }
1139
Johan Hedberg317ac8c2014-02-28 20:26:12 +02001140 /* Cancel this timer so that we don't try to disable scanning
1141 * when it's already disabled.
1142 */
1143 cancel_delayed_work(&hdev->le_scan_disable);
1144
Andre Guedesd23264a2011-11-25 20:53:38 -03001145 clear_bit(HCI_LE_SCAN, &hdev->dev_flags);
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001146 /* The HCI_LE_SCAN_INTERRUPTED flag indicates that we
1147 * interrupted scanning due to a connect request. Mark
1148 * therefore discovery as stopped.
1149 */
1150 if (test_and_clear_bit(HCI_LE_SCAN_INTERRUPTED,
1151 &hdev->dev_flags))
1152 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001153 break;
1154
1155 default:
1156 BT_ERR("Used reserved LE_Scan_Enable param %d", cp->enable);
1157 break;
Andre Guedes35815082011-05-26 16:23:53 -03001158 }
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001159}
1160
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001161static void hci_cc_le_read_white_list_size(struct hci_dev *hdev,
1162 struct sk_buff *skb)
1163{
1164 struct hci_rp_le_read_white_list_size *rp = (void *) skb->data;
1165
1166 BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size);
1167
1168 if (!rp->status)
1169 hdev->le_white_list_size = rp->size;
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001170}
1171
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001172static void hci_cc_le_clear_white_list(struct hci_dev *hdev,
1173 struct sk_buff *skb)
1174{
1175 __u8 status = *((__u8 *) skb->data);
1176
1177 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1178
1179 if (!status)
1180 hci_white_list_clear(hdev);
1181}
1182
1183static void hci_cc_le_add_to_white_list(struct hci_dev *hdev,
1184 struct sk_buff *skb)
1185{
1186 struct hci_cp_le_add_to_white_list *sent;
1187 __u8 status = *((__u8 *) skb->data);
1188
1189 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1190
1191 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_ADD_TO_WHITE_LIST);
1192 if (!sent)
1193 return;
1194
1195 if (!status)
1196 hci_white_list_add(hdev, &sent->bdaddr, sent->bdaddr_type);
1197}
1198
1199static void hci_cc_le_del_from_white_list(struct hci_dev *hdev,
1200 struct sk_buff *skb)
1201{
1202 struct hci_cp_le_del_from_white_list *sent;
1203 __u8 status = *((__u8 *) skb->data);
1204
1205 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1206
1207 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_DEL_FROM_WHITE_LIST);
1208 if (!sent)
1209 return;
1210
1211 if (!status)
1212 hci_white_list_del(hdev, &sent->bdaddr, sent->bdaddr_type);
1213}
1214
Johan Hedberg9b008c02013-01-22 14:02:01 +02001215static void hci_cc_le_read_supported_states(struct hci_dev *hdev,
1216 struct sk_buff *skb)
1217{
1218 struct hci_rp_le_read_supported_states *rp = (void *) skb->data;
1219
1220 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1221
1222 if (!rp->status)
1223 memcpy(hdev->le_states, rp->le_states, 8);
Johan Hedberg9b008c02013-01-22 14:02:01 +02001224}
1225
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001226static void hci_cc_write_le_host_supported(struct hci_dev *hdev,
1227 struct sk_buff *skb)
Andre Guedesf9b49302011-06-30 19:20:53 -03001228{
Johan Hedberg06199cf2012-02-22 16:37:11 +02001229 struct hci_cp_write_le_host_supported *sent;
Andre Guedesf9b49302011-06-30 19:20:53 -03001230 __u8 status = *((__u8 *) skb->data);
1231
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001232 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesf9b49302011-06-30 19:20:53 -03001233
Johan Hedberg06199cf2012-02-22 16:37:11 +02001234 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001235 if (!sent)
Andre Guedesf9b49302011-06-30 19:20:53 -03001236 return;
1237
Johan Hedberg8f984df2012-02-28 01:07:22 +02001238 if (!status) {
Johan Hedberg416a4ae2013-09-25 13:26:08 +03001239 if (sent->le) {
Johan Hedbergcad718e2013-04-17 15:00:51 +03001240 hdev->features[1][0] |= LMP_HOST_LE;
Johan Hedberg416a4ae2013-09-25 13:26:08 +03001241 set_bit(HCI_LE_ENABLED, &hdev->dev_flags);
1242 } else {
Johan Hedbergcad718e2013-04-17 15:00:51 +03001243 hdev->features[1][0] &= ~LMP_HOST_LE;
Johan Hedberg416a4ae2013-09-25 13:26:08 +03001244 clear_bit(HCI_LE_ENABLED, &hdev->dev_flags);
Johan Hedbergf3d3444a2013-10-05 12:01:04 +02001245 clear_bit(HCI_ADVERTISING, &hdev->dev_flags);
Johan Hedberg416a4ae2013-09-25 13:26:08 +03001246 }
Johan Hedberg53b2caa2012-10-24 21:11:59 +03001247
1248 if (sent->simul)
Johan Hedbergcad718e2013-04-17 15:00:51 +03001249 hdev->features[1][0] |= LMP_HOST_LE_BREDR;
Johan Hedberg53b2caa2012-10-24 21:11:59 +03001250 else
Johan Hedbergcad718e2013-04-17 15:00:51 +03001251 hdev->features[1][0] &= ~LMP_HOST_LE_BREDR;
Johan Hedberg8f984df2012-02-28 01:07:22 +02001252 }
Andre Guedesf9b49302011-06-30 19:20:53 -03001253}
1254
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02001255static void hci_cc_set_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
1256{
1257 struct hci_cp_le_set_adv_param *cp;
1258 u8 status = *((u8 *) skb->data);
1259
1260 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1261
1262 if (status)
1263 return;
1264
1265 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_PARAM);
1266 if (!cp)
1267 return;
1268
1269 hci_dev_lock(hdev);
1270 hdev->adv_addr_type = cp->own_address_type;
1271 hci_dev_unlock(hdev);
1272}
1273
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001274static void hci_cc_write_remote_amp_assoc(struct hci_dev *hdev,
1275 struct sk_buff *skb)
1276{
1277 struct hci_rp_write_remote_amp_assoc *rp = (void *) skb->data;
1278
1279 BT_DBG("%s status 0x%2.2x phy_handle 0x%2.2x",
1280 hdev->name, rp->status, rp->phy_handle);
1281
1282 if (rp->status)
1283 return;
1284
1285 amp_write_rem_assoc_continue(hdev, rp->phy_handle);
1286}
1287
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02001288static void hci_cc_read_rssi(struct hci_dev *hdev, struct sk_buff *skb)
1289{
1290 struct hci_rp_read_rssi *rp = (void *) skb->data;
1291 struct hci_conn *conn;
1292
1293 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1294
1295 if (rp->status)
1296 return;
1297
1298 hci_dev_lock(hdev);
1299
1300 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
1301 if (conn)
1302 conn->rssi = rp->rssi;
1303
1304 hci_dev_unlock(hdev);
1305}
1306
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001307static void hci_cc_read_tx_power(struct hci_dev *hdev, struct sk_buff *skb)
1308{
1309 struct hci_cp_read_tx_power *sent;
1310 struct hci_rp_read_tx_power *rp = (void *) skb->data;
1311 struct hci_conn *conn;
1312
1313 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1314
1315 if (rp->status)
1316 return;
1317
1318 sent = hci_sent_cmd_data(hdev, HCI_OP_READ_TX_POWER);
1319 if (!sent)
1320 return;
1321
1322 hci_dev_lock(hdev);
1323
1324 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001325 if (!conn)
1326 goto unlock;
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001327
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001328 switch (sent->type) {
1329 case 0x00:
1330 conn->tx_power = rp->tx_power;
1331 break;
1332 case 0x01:
1333 conn->max_tx_power = rp->tx_power;
1334 break;
1335 }
1336
1337unlock:
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001338 hci_dev_unlock(hdev);
1339}
1340
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001341static void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001342{
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001343 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001344
1345 if (status) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001346 hci_conn_check_pending(hdev);
Johan Hedberg314b2382011-04-27 10:29:57 -04001347 return;
1348 }
1349
Andre Guedes89352e72011-11-04 14:16:53 -03001350 set_bit(HCI_INQUIRY, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001351}
1352
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001353static void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001354{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001355 struct hci_cp_create_conn *cp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001356 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001357
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001358 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001359
1360 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_CONN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001361 if (!cp)
1362 return;
1363
1364 hci_dev_lock(hdev);
1365
1366 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1367
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001368 BT_DBG("%s bdaddr %pMR hcon %p", hdev->name, &cp->bdaddr, conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001369
1370 if (status) {
1371 if (conn && conn->state == BT_CONNECT) {
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001372 if (status != 0x0c || conn->attempt > 2) {
1373 conn->state = BT_CLOSED;
1374 hci_proto_connect_cfm(conn, status);
1375 hci_conn_del(conn);
1376 } else
1377 conn->state = BT_CONNECT2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001378 }
1379 } else {
1380 if (!conn) {
1381 conn = hci_conn_add(hdev, ACL_LINK, &cp->bdaddr);
1382 if (conn) {
Johan Hedberga0c808b2012-01-16 09:49:58 +02001383 conn->out = true;
Johan Hedberg4dae2792014-06-24 17:03:50 +03001384 set_bit(HCI_CONN_MASTER, &conn->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001385 } else
Gustavo F. Padovan893ef972010-07-18 15:13:37 -03001386 BT_ERR("No memory for new connection");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001387 }
1388 }
1389
1390 hci_dev_unlock(hdev);
1391}
1392
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001393static void hci_cs_add_sco(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001394{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001395 struct hci_cp_add_sco *cp;
1396 struct hci_conn *acl, *sco;
1397 __u16 handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001398
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001399 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001400
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001401 if (!status)
1402 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001403
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001404 cp = hci_sent_cmd_data(hdev, HCI_OP_ADD_SCO);
1405 if (!cp)
1406 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001407
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001408 handle = __le16_to_cpu(cp->handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001409
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001410 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001411
1412 hci_dev_lock(hdev);
1413
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001414 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001415 if (acl) {
1416 sco = acl->link;
1417 if (sco) {
1418 sco->state = BT_CLOSED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001419
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001420 hci_proto_connect_cfm(sco, status);
1421 hci_conn_del(sco);
1422 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001423 }
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001424
1425 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001426}
1427
Marcel Holtmannf8558552008-07-14 20:13:49 +02001428static void hci_cs_auth_requested(struct hci_dev *hdev, __u8 status)
1429{
1430 struct hci_cp_auth_requested *cp;
1431 struct hci_conn *conn;
1432
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001433 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001434
1435 if (!status)
1436 return;
1437
1438 cp = hci_sent_cmd_data(hdev, HCI_OP_AUTH_REQUESTED);
1439 if (!cp)
1440 return;
1441
1442 hci_dev_lock(hdev);
1443
1444 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1445 if (conn) {
1446 if (conn->state == BT_CONFIG) {
1447 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001448 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001449 }
1450 }
1451
1452 hci_dev_unlock(hdev);
1453}
1454
1455static void hci_cs_set_conn_encrypt(struct hci_dev *hdev, __u8 status)
1456{
1457 struct hci_cp_set_conn_encrypt *cp;
1458 struct hci_conn *conn;
1459
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001460 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001461
1462 if (!status)
1463 return;
1464
1465 cp = hci_sent_cmd_data(hdev, HCI_OP_SET_CONN_ENCRYPT);
1466 if (!cp)
1467 return;
1468
1469 hci_dev_lock(hdev);
1470
1471 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1472 if (conn) {
1473 if (conn->state == BT_CONFIG) {
1474 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001475 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001476 }
1477 }
1478
1479 hci_dev_unlock(hdev);
1480}
1481
Johan Hedberg127178d2010-11-18 22:22:29 +02001482static int hci_outgoing_auth_needed(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001483 struct hci_conn *conn)
Johan Hedberg392599b2010-11-18 22:22:28 +02001484{
Johan Hedberg392599b2010-11-18 22:22:28 +02001485 if (conn->state != BT_CONFIG || !conn->out)
1486 return 0;
1487
Johan Hedberg765c2a92011-01-19 12:06:52 +05301488 if (conn->pending_sec_level == BT_SECURITY_SDP)
Johan Hedberg392599b2010-11-18 22:22:28 +02001489 return 0;
1490
1491 /* Only request authentication for SSP connections or non-SSP
Johan Hedberg264b8b42014-01-08 16:40:39 +02001492 * devices with sec_level MEDIUM or HIGH or if MITM protection
1493 * is requested.
1494 */
Gustavo Padovan807deac2012-05-17 00:36:24 -03001495 if (!hci_conn_ssp_enabled(conn) && !(conn->auth_type & 0x01) &&
Johan Hedberg7e3691e2014-05-30 14:45:19 +03001496 conn->pending_sec_level != BT_SECURITY_FIPS &&
Johan Hedberg264b8b42014-01-08 16:40:39 +02001497 conn->pending_sec_level != BT_SECURITY_HIGH &&
1498 conn->pending_sec_level != BT_SECURITY_MEDIUM)
Johan Hedberg392599b2010-11-18 22:22:28 +02001499 return 0;
1500
Johan Hedberg392599b2010-11-18 22:22:28 +02001501 return 1;
1502}
1503
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001504static int hci_resolve_name(struct hci_dev *hdev,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001505 struct inquiry_entry *e)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001506{
1507 struct hci_cp_remote_name_req cp;
1508
1509 memset(&cp, 0, sizeof(cp));
1510
1511 bacpy(&cp.bdaddr, &e->data.bdaddr);
1512 cp.pscan_rep_mode = e->data.pscan_rep_mode;
1513 cp.pscan_mode = e->data.pscan_mode;
1514 cp.clock_offset = e->data.clock_offset;
1515
1516 return hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
1517}
1518
Johan Hedbergb644ba32012-01-17 21:48:47 +02001519static bool hci_resolve_next_name(struct hci_dev *hdev)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001520{
1521 struct discovery_state *discov = &hdev->discovery;
1522 struct inquiry_entry *e;
1523
Johan Hedbergb644ba32012-01-17 21:48:47 +02001524 if (list_empty(&discov->resolve))
1525 return false;
1526
1527 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
Ram Malovanyc8100892012-07-19 10:26:09 +03001528 if (!e)
1529 return false;
1530
Johan Hedbergb644ba32012-01-17 21:48:47 +02001531 if (hci_resolve_name(hdev, e) == 0) {
1532 e->name_state = NAME_PENDING;
1533 return true;
1534 }
1535
1536 return false;
1537}
1538
1539static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001540 bdaddr_t *bdaddr, u8 *name, u8 name_len)
Johan Hedbergb644ba32012-01-17 21:48:47 +02001541{
1542 struct discovery_state *discov = &hdev->discovery;
1543 struct inquiry_entry *e;
1544
1545 if (conn && !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001546 mgmt_device_connected(hdev, bdaddr, ACL_LINK, 0x00, 0, name,
1547 name_len, conn->dev_class);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001548
1549 if (discov->state == DISCOVERY_STOPPED)
1550 return;
1551
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001552 if (discov->state == DISCOVERY_STOPPING)
1553 goto discov_complete;
1554
1555 if (discov->state != DISCOVERY_RESOLVING)
1556 return;
1557
1558 e = hci_inquiry_cache_lookup_resolve(hdev, bdaddr, NAME_PENDING);
Ram Malovany7cc83802012-07-19 10:26:10 +03001559 /* If the device was not found in a list of found devices names of which
1560 * are pending. there is no need to continue resolving a next name as it
1561 * will be done upon receiving another Remote Name Request Complete
1562 * Event */
1563 if (!e)
1564 return;
1565
1566 list_del(&e->list);
1567 if (name) {
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001568 e->name_state = NAME_KNOWN;
Ram Malovany7cc83802012-07-19 10:26:10 +03001569 mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00,
1570 e->data.rssi, name, name_len);
Ram Malovanyc3e7c0d2012-07-19 10:26:11 +03001571 } else {
1572 e->name_state = NAME_NOT_KNOWN;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001573 }
1574
Johan Hedbergb644ba32012-01-17 21:48:47 +02001575 if (hci_resolve_next_name(hdev))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001576 return;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001577
1578discov_complete:
1579 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1580}
1581
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001582static void hci_cs_remote_name_req(struct hci_dev *hdev, __u8 status)
1583{
Johan Hedberg127178d2010-11-18 22:22:29 +02001584 struct hci_cp_remote_name_req *cp;
1585 struct hci_conn *conn;
1586
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001587 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Johan Hedberg127178d2010-11-18 22:22:29 +02001588
1589 /* If successful wait for the name req complete event before
1590 * checking for the need to do authentication */
1591 if (!status)
1592 return;
1593
1594 cp = hci_sent_cmd_data(hdev, HCI_OP_REMOTE_NAME_REQ);
1595 if (!cp)
1596 return;
1597
1598 hci_dev_lock(hdev);
1599
1600 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001601
1602 if (test_bit(HCI_MGMT, &hdev->dev_flags))
1603 hci_check_pending_name(hdev, conn, &cp->bdaddr, NULL, 0);
1604
Johan Hedberg79c6c702011-04-28 11:28:55 -07001605 if (!conn)
1606 goto unlock;
1607
1608 if (!hci_outgoing_auth_needed(hdev, conn))
1609 goto unlock;
1610
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001611 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02001612 struct hci_cp_auth_requested auth_cp;
1613
1614 auth_cp.handle = __cpu_to_le16(conn->handle);
1615 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED,
1616 sizeof(auth_cp), &auth_cp);
Johan Hedberg127178d2010-11-18 22:22:29 +02001617 }
1618
Johan Hedberg79c6c702011-04-28 11:28:55 -07001619unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02001620 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001621}
1622
Marcel Holtmann769be972008-07-14 20:13:49 +02001623static void hci_cs_read_remote_features(struct hci_dev *hdev, __u8 status)
1624{
1625 struct hci_cp_read_remote_features *cp;
1626 struct hci_conn *conn;
1627
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001628 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001629
1630 if (!status)
1631 return;
1632
1633 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_FEATURES);
1634 if (!cp)
1635 return;
1636
1637 hci_dev_lock(hdev);
1638
1639 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1640 if (conn) {
1641 if (conn->state == BT_CONFIG) {
Marcel Holtmann769be972008-07-14 20:13:49 +02001642 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001643 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001644 }
1645 }
1646
1647 hci_dev_unlock(hdev);
1648}
1649
1650static void hci_cs_read_remote_ext_features(struct hci_dev *hdev, __u8 status)
1651{
1652 struct hci_cp_read_remote_ext_features *cp;
1653 struct hci_conn *conn;
1654
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001655 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001656
1657 if (!status)
1658 return;
1659
1660 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES);
1661 if (!cp)
1662 return;
1663
1664 hci_dev_lock(hdev);
1665
1666 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1667 if (conn) {
1668 if (conn->state == BT_CONFIG) {
Marcel Holtmann769be972008-07-14 20:13:49 +02001669 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001670 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001671 }
1672 }
1673
1674 hci_dev_unlock(hdev);
1675}
1676
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001677static void hci_cs_setup_sync_conn(struct hci_dev *hdev, __u8 status)
1678{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001679 struct hci_cp_setup_sync_conn *cp;
1680 struct hci_conn *acl, *sco;
1681 __u16 handle;
1682
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001683 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001684
1685 if (!status)
1686 return;
1687
1688 cp = hci_sent_cmd_data(hdev, HCI_OP_SETUP_SYNC_CONN);
1689 if (!cp)
1690 return;
1691
1692 handle = __le16_to_cpu(cp->handle);
1693
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001694 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001695
1696 hci_dev_lock(hdev);
1697
1698 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001699 if (acl) {
1700 sco = acl->link;
1701 if (sco) {
1702 sco->state = BT_CLOSED;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001703
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001704 hci_proto_connect_cfm(sco, status);
1705 hci_conn_del(sco);
1706 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001707 }
1708
1709 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001710}
1711
1712static void hci_cs_sniff_mode(struct hci_dev *hdev, __u8 status)
1713{
1714 struct hci_cp_sniff_mode *cp;
1715 struct hci_conn *conn;
1716
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001717 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001718
1719 if (!status)
1720 return;
1721
1722 cp = hci_sent_cmd_data(hdev, HCI_OP_SNIFF_MODE);
1723 if (!cp)
1724 return;
1725
1726 hci_dev_lock(hdev);
1727
1728 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001729 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001730 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001731
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001732 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001733 hci_sco_setup(conn, status);
1734 }
1735
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001736 hci_dev_unlock(hdev);
1737}
1738
1739static void hci_cs_exit_sniff_mode(struct hci_dev *hdev, __u8 status)
1740{
1741 struct hci_cp_exit_sniff_mode *cp;
1742 struct hci_conn *conn;
1743
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001744 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001745
1746 if (!status)
1747 return;
1748
1749 cp = hci_sent_cmd_data(hdev, HCI_OP_EXIT_SNIFF_MODE);
1750 if (!cp)
1751 return;
1752
1753 hci_dev_lock(hdev);
1754
1755 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001756 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001757 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001758
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001759 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001760 hci_sco_setup(conn, status);
1761 }
1762
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001763 hci_dev_unlock(hdev);
1764}
1765
Johan Hedberg88c3df12012-02-09 14:27:38 +02001766static void hci_cs_disconnect(struct hci_dev *hdev, u8 status)
1767{
1768 struct hci_cp_disconnect *cp;
1769 struct hci_conn *conn;
1770
1771 if (!status)
1772 return;
1773
1774 cp = hci_sent_cmd_data(hdev, HCI_OP_DISCONNECT);
1775 if (!cp)
1776 return;
1777
1778 hci_dev_lock(hdev);
1779
1780 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1781 if (conn)
1782 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001783 conn->dst_type, status);
Johan Hedberg88c3df12012-02-09 14:27:38 +02001784
1785 hci_dev_unlock(hdev);
1786}
1787
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001788static void hci_cs_create_phylink(struct hci_dev *hdev, u8 status)
1789{
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001790 struct hci_cp_create_phy_link *cp;
1791
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001792 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001793
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001794 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_PHY_LINK);
1795 if (!cp)
1796 return;
1797
Andrei Emeltchenkoe58917b2012-10-31 15:46:33 +02001798 hci_dev_lock(hdev);
1799
1800 if (status) {
1801 struct hci_conn *hcon;
1802
1803 hcon = hci_conn_hash_lookup_handle(hdev, cp->phy_handle);
1804 if (hcon)
1805 hci_conn_del(hcon);
1806 } else {
1807 amp_write_remote_assoc(hdev, cp->phy_handle);
1808 }
1809
1810 hci_dev_unlock(hdev);
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001811}
1812
Andrei Emeltchenko0b26ab92012-09-27 17:26:24 +03001813static void hci_cs_accept_phylink(struct hci_dev *hdev, u8 status)
1814{
1815 struct hci_cp_accept_phy_link *cp;
1816
1817 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1818
1819 if (status)
1820 return;
1821
1822 cp = hci_sent_cmd_data(hdev, HCI_OP_ACCEPT_PHY_LINK);
1823 if (!cp)
1824 return;
1825
1826 amp_write_remote_assoc(hdev, cp->phy_handle);
1827}
1828
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001829static void hci_cs_le_create_conn(struct hci_dev *hdev, u8 status)
1830{
1831 struct hci_cp_le_create_conn *cp;
1832 struct hci_conn *conn;
1833
1834 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1835
1836 /* All connection failure handling is taken care of by the
1837 * hci_le_conn_failed function which is triggered by the HCI
1838 * request completion callbacks used for connecting.
1839 */
1840 if (status)
1841 return;
1842
1843 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_CREATE_CONN);
1844 if (!cp)
1845 return;
1846
1847 hci_dev_lock(hdev);
1848
1849 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->peer_addr);
1850 if (!conn)
1851 goto unlock;
1852
1853 /* Store the initiator and responder address information which
1854 * is needed for SMP. These values will not change during the
1855 * lifetime of the connection.
1856 */
1857 conn->init_addr_type = cp->own_address_type;
1858 if (cp->own_address_type == ADDR_LE_DEV_RANDOM)
1859 bacpy(&conn->init_addr, &hdev->random_addr);
1860 else
1861 bacpy(&conn->init_addr, &hdev->bdaddr);
1862
1863 conn->resp_addr_type = cp->peer_addr_type;
1864 bacpy(&conn->resp_addr, &cp->peer_addr);
1865
Johan Hedberg9489eca2014-02-28 17:45:46 +02001866 /* We don't want the connection attempt to stick around
1867 * indefinitely since LE doesn't have a page timeout concept
1868 * like BR/EDR. Set a timer for any connection that doesn't use
1869 * the white list for connecting.
1870 */
1871 if (cp->filter_policy == HCI_LE_USE_PEER_ADDR)
1872 queue_delayed_work(conn->hdev->workqueue,
1873 &conn->le_conn_timeout,
1874 HCI_LE_CONN_TIMEOUT);
1875
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001876unlock:
1877 hci_dev_unlock(hdev);
1878}
1879
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02001880static void hci_cs_le_start_enc(struct hci_dev *hdev, u8 status)
1881{
1882 struct hci_cp_le_start_enc *cp;
1883 struct hci_conn *conn;
1884
1885 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1886
1887 if (!status)
1888 return;
1889
1890 hci_dev_lock(hdev);
1891
1892 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_START_ENC);
1893 if (!cp)
1894 goto unlock;
1895
1896 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1897 if (!conn)
1898 goto unlock;
1899
1900 if (conn->state != BT_CONNECTED)
1901 goto unlock;
1902
1903 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
1904 hci_conn_drop(conn);
1905
1906unlock:
1907 hci_dev_unlock(hdev);
1908}
1909
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001910static void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001911{
1912 __u8 status = *((__u8 *) skb->data);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001913 struct discovery_state *discov = &hdev->discovery;
1914 struct inquiry_entry *e;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001915
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001916 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001917
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001918 hci_conn_check_pending(hdev);
Andre Guedes89352e72011-11-04 14:16:53 -03001919
1920 if (!test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
1921 return;
1922
Peter Zijlstra4e857c52014-03-17 18:06:10 +01001923 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -03001924 wake_up_bit(&hdev->flags, HCI_INQUIRY);
1925
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02001926 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001927 return;
1928
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001929 hci_dev_lock(hdev);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001930
Andre Guedes343f9352012-02-17 20:39:37 -03001931 if (discov->state != DISCOVERY_FINDING)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001932 goto unlock;
1933
1934 if (list_empty(&discov->resolve)) {
1935 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1936 goto unlock;
1937 }
1938
1939 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
1940 if (e && hci_resolve_name(hdev, e) == 0) {
1941 e->name_state = NAME_PENDING;
1942 hci_discovery_set_state(hdev, DISCOVERY_RESOLVING);
1943 } else {
1944 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1945 }
1946
1947unlock:
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001948 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001949}
1950
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001951static void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001952{
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001953 struct inquiry_data data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001954 struct inquiry_info *info = (void *) (skb->data + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001955 int num_rsp = *((__u8 *) skb->data);
1956
1957 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
1958
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001959 if (!num_rsp)
1960 return;
1961
Andre Guedes1519cc12012-03-21 00:03:38 -03001962 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
1963 return;
1964
Linus Torvalds1da177e2005-04-16 15:20:36 -07001965 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001966
Johan Hedberge17acd42011-03-30 23:57:16 +03001967 for (; num_rsp; num_rsp--, info++) {
Johan Hedberg388fc8f2012-02-23 00:38:59 +02001968 bool name_known, ssp;
Johan Hedberg31754052012-01-04 13:39:52 +02001969
Linus Torvalds1da177e2005-04-16 15:20:36 -07001970 bacpy(&data.bdaddr, &info->bdaddr);
1971 data.pscan_rep_mode = info->pscan_rep_mode;
1972 data.pscan_period_mode = info->pscan_period_mode;
1973 data.pscan_mode = info->pscan_mode;
1974 memcpy(data.dev_class, info->dev_class, 3);
1975 data.clock_offset = info->clock_offset;
1976 data.rssi = 0x00;
Marcel Holtmann41a96212008-07-14 20:13:48 +02001977 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02001978
Johan Hedberg388fc8f2012-02-23 00:38:59 +02001979 name_known = hci_inquiry_cache_update(hdev, &data, false, &ssp);
Johan Hedberg48264f02011-11-09 13:58:58 +02001980 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001981 info->dev_class, 0, !name_known, ssp, NULL,
Johan Hedberg5d2e9fa2014-03-25 10:30:47 +02001982 0, NULL, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001983 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001984
Linus Torvalds1da177e2005-04-16 15:20:36 -07001985 hci_dev_unlock(hdev);
1986}
1987
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001988static void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001989{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001990 struct hci_ev_conn_complete *ev = (void *) skb->data;
1991 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001992
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001993 BT_DBG("%s", hdev->name);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001994
Linus Torvalds1da177e2005-04-16 15:20:36 -07001995 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001996
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001997 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann94992372009-04-19 19:30:03 +02001998 if (!conn) {
1999 if (ev->link_type != SCO_LINK)
2000 goto unlock;
2001
2002 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
2003 if (!conn)
2004 goto unlock;
2005
2006 conn->type = SCO_LINK;
2007 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002008
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002009 if (!ev->status) {
2010 conn->handle = __le16_to_cpu(ev->handle);
Marcel Holtmann769be972008-07-14 20:13:49 +02002011
2012 if (conn->type == ACL_LINK) {
2013 conn->state = BT_CONFIG;
2014 hci_conn_hold(conn);
Szymon Janca9ea3ed2012-07-19 14:46:08 +02002015
2016 if (!conn->out && !hci_conn_ssp_enabled(conn) &&
2017 !hci_find_link_key(hdev, &ev->bdaddr))
2018 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
2019 else
2020 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Marcel Holtmann769be972008-07-14 20:13:49 +02002021 } else
2022 conn->state = BT_CONNECTED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002023
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002024 hci_conn_add_sysfs(conn);
2025
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002026 if (test_bit(HCI_AUTH, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002027 set_bit(HCI_CONN_AUTH, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002028
2029 if (test_bit(HCI_ENCRYPT, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002030 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002031
2032 /* Get remote features */
2033 if (conn->type == ACL_LINK) {
2034 struct hci_cp_read_remote_features cp;
2035 cp.handle = ev->handle;
Marcel Holtmann769be972008-07-14 20:13:49 +02002036 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_FEATURES,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002037 sizeof(cp), &cp);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002038 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002039
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002040 /* Set packet type for incoming connection */
Andrei Emeltchenkod095c1e2011-12-01 14:33:27 +02002041 if (!conn->out && hdev->hci_ver < BLUETOOTH_VER_2_0) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002042 struct hci_cp_change_conn_ptype cp;
2043 cp.handle = ev->handle;
Marcel Holtmanna8746412008-07-14 20:13:46 +02002044 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002045 hci_send_cmd(hdev, HCI_OP_CHANGE_CONN_PTYPE, sizeof(cp),
2046 &cp);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002047 }
Johan Hedberg17d5c042011-01-22 06:09:08 +02002048 } else {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002049 conn->state = BT_CLOSED;
Johan Hedberg17d5c042011-01-22 06:09:08 +02002050 if (conn->type == ACL_LINK)
Marcel Holtmann64c7b772014-02-18 14:22:20 -08002051 mgmt_connect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002052 conn->dst_type, ev->status);
Johan Hedberg17d5c042011-01-22 06:09:08 +02002053 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002054
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002055 if (conn->type == ACL_LINK)
2056 hci_sco_setup(conn, ev->status);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002057
Marcel Holtmann769be972008-07-14 20:13:49 +02002058 if (ev->status) {
2059 hci_proto_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002060 hci_conn_del(conn);
Marcel Holtmannc89b6e62009-01-15 21:57:03 +01002061 } else if (ev->link_type != ACL_LINK)
2062 hci_proto_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002063
2064unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002065 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002066
2067 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002068}
2069
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002070static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002071{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002072 struct hci_ev_conn_request *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002073 int mask = hdev->link_mode;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002074 __u8 flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002075
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03002076 BT_DBG("%s bdaddr %pMR type 0x%x", hdev->name, &ev->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002077 ev->link_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002078
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002079 mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type,
2080 &flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002081
Szymon Janc138d22e2011-02-17 16:44:23 +01002082 if ((mask & HCI_LM_ACCEPT) &&
Marcel Holtmannb9ee0a72013-10-17 17:24:13 -07002083 !hci_blacklist_lookup(hdev, &ev->bdaddr, BDADDR_BREDR)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002084 /* Connection accepted */
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02002085 struct inquiry_entry *ie;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002086 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002087
2088 hci_dev_lock(hdev);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002089
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02002090 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
2091 if (ie)
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02002092 memcpy(ie->data.dev_class, ev->dev_class, 3);
2093
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03002094 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type,
2095 &ev->bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002096 if (!conn) {
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02002097 conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr);
2098 if (!conn) {
Gustavo F. Padovan893ef972010-07-18 15:13:37 -03002099 BT_ERR("No memory for new connection");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002100 hci_dev_unlock(hdev);
2101 return;
2102 }
2103 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002104
Linus Torvalds1da177e2005-04-16 15:20:36 -07002105 memcpy(conn->dev_class, ev->dev_class, 3);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002106
Linus Torvalds1da177e2005-04-16 15:20:36 -07002107 hci_dev_unlock(hdev);
2108
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002109 if (ev->link_type == ACL_LINK ||
2110 (!(flags & HCI_PROTO_DEFER) && !lmp_esco_capable(hdev))) {
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002111 struct hci_cp_accept_conn_req cp;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002112 conn->state = BT_CONNECT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002113
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002114 bacpy(&cp.bdaddr, &ev->bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002115
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002116 if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER))
2117 cp.role = 0x00; /* Become master */
2118 else
2119 cp.role = 0x01; /* Remain slave */
2120
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002121 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp),
2122 &cp);
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002123 } else if (!(flags & HCI_PROTO_DEFER)) {
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002124 struct hci_cp_accept_sync_conn_req cp;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002125 conn->state = BT_CONNECT;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002126
2127 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmanna8746412008-07-14 20:13:46 +02002128 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002129
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002130 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
2131 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
2132 cp.max_latency = cpu_to_le16(0xffff);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002133 cp.content_format = cpu_to_le16(hdev->voice_setting);
2134 cp.retrans_effort = 0xff;
2135
2136 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002137 sizeof(cp), &cp);
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002138 } else {
2139 conn->state = BT_CONNECT2;
2140 hci_proto_connect_cfm(conn, 0);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002141 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002142 } else {
2143 /* Connection rejected */
2144 struct hci_cp_reject_conn_req cp;
2145
2146 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02002147 cp.reason = HCI_ERROR_REJ_BAD_ADDR;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002148 hci_send_cmd(hdev, HCI_OP_REJECT_CONN_REQ, sizeof(cp), &cp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002149 }
2150}
2151
Mikel Astizf0d6a0e2012-08-09 09:52:30 +02002152static u8 hci_to_mgmt_reason(u8 err)
2153{
2154 switch (err) {
2155 case HCI_ERROR_CONNECTION_TIMEOUT:
2156 return MGMT_DEV_DISCONN_TIMEOUT;
2157 case HCI_ERROR_REMOTE_USER_TERM:
2158 case HCI_ERROR_REMOTE_LOW_RESOURCES:
2159 case HCI_ERROR_REMOTE_POWER_OFF:
2160 return MGMT_DEV_DISCONN_REMOTE;
2161 case HCI_ERROR_LOCAL_HOST_TERM:
2162 return MGMT_DEV_DISCONN_LOCAL_HOST;
2163 default:
2164 return MGMT_DEV_DISCONN_UNKNOWN;
2165 }
2166}
2167
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002168static void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002169{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002170 struct hci_ev_disconn_complete *ev = (void *) skb->data;
Andre Guedesabf54a52013-11-07 17:36:09 -03002171 u8 reason = hci_to_mgmt_reason(ev->reason);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002172 struct hci_conn_params *params;
Marcel Holtmann04837f62006-07-03 10:02:33 +02002173 struct hci_conn *conn;
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002174 bool mgmt_connected;
Andre Guedes38462202013-11-07 17:36:10 -03002175 u8 type;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002176
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002177 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002178
Linus Torvalds1da177e2005-04-16 15:20:36 -07002179 hci_dev_lock(hdev);
2180
Marcel Holtmann04837f62006-07-03 10:02:33 +02002181 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergf7520542011-01-20 12:34:39 +02002182 if (!conn)
2183 goto unlock;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002184
Andre Guedesabf54a52013-11-07 17:36:09 -03002185 if (ev->status) {
2186 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
2187 conn->dst_type, ev->status);
2188 goto unlock;
Johan Hedberg37d9ef72011-11-10 15:54:39 +02002189 }
Johan Hedbergf7520542011-01-20 12:34:39 +02002190
Andre Guedes38462202013-11-07 17:36:10 -03002191 conn->state = BT_CLOSED;
2192
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002193 mgmt_connected = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags);
2194 mgmt_device_disconnected(hdev, &conn->dst, conn->type, conn->dst_type,
2195 reason, mgmt_connected);
Andre Guedesabf54a52013-11-07 17:36:09 -03002196
Johan Hedbergaf6a9c32014-06-24 13:15:53 +03002197 if (conn->type == ACL_LINK &&
2198 test_bit(HCI_CONN_FLUSH_KEY, &conn->flags))
Andre Guedes38462202013-11-07 17:36:10 -03002199 hci_remove_link_key(hdev, &conn->dst);
Johan Hedberg22102462013-10-05 12:01:06 +02002200
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002201 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
2202 if (params) {
2203 switch (params->auto_connect) {
2204 case HCI_AUTO_CONN_LINK_LOSS:
2205 if (ev->reason != HCI_ERROR_CONNECTION_TIMEOUT)
2206 break;
2207 /* Fall through */
2208
2209 case HCI_AUTO_CONN_ALWAYS:
2210 hci_pend_le_conn_add(hdev, &conn->dst, conn->dst_type);
2211 break;
2212
2213 default:
2214 break;
2215 }
2216 }
2217
Andre Guedes38462202013-11-07 17:36:10 -03002218 type = conn->type;
Johan Hedberg22102462013-10-05 12:01:06 +02002219
Andre Guedes38462202013-11-07 17:36:10 -03002220 hci_proto_disconn_cfm(conn, ev->reason);
2221 hci_conn_del(conn);
2222
2223 /* Re-enable advertising if necessary, since it might
2224 * have been disabled by the connection. From the
2225 * HCI_LE_Set_Advertise_Enable command description in
2226 * the core specification (v4.0):
2227 * "The Controller shall continue advertising until the Host
2228 * issues an LE_Set_Advertise_Enable command with
2229 * Advertising_Enable set to 0x00 (Advertising is disabled)
2230 * or until a connection is created or until the Advertising
2231 * is timed out due to Directed Advertising."
2232 */
2233 if (type == LE_LINK)
2234 mgmt_reenable_advertising(hdev);
Johan Hedbergf7520542011-01-20 12:34:39 +02002235
2236unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002237 hci_dev_unlock(hdev);
2238}
2239
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002240static void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002241{
2242 struct hci_ev_auth_complete *ev = (void *) skb->data;
2243 struct hci_conn *conn;
2244
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002245 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002246
2247 hci_dev_lock(hdev);
2248
2249 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002250 if (!conn)
2251 goto unlock;
2252
2253 if (!ev->status) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002254 if (!hci_conn_ssp_enabled(conn) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03002255 test_bit(HCI_CONN_REAUTH_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002256 BT_INFO("re-auth of legacy device is not possible.");
Johan Hedberg2a611692011-02-19 12:06:00 -03002257 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002258 set_bit(HCI_CONN_AUTH, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002259 conn->sec_level = conn->pending_sec_level;
Johan Hedberg2a611692011-02-19 12:06:00 -03002260 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002261 } else {
Johan Hedbergbab73cb2012-02-09 16:07:29 +02002262 mgmt_auth_failed(hdev, &conn->dst, conn->type, conn->dst_type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002263 ev->status);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002264 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002265
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002266 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
2267 clear_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002268
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002269 if (conn->state == BT_CONFIG) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002270 if (!ev->status && hci_conn_ssp_enabled(conn)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002271 struct hci_cp_set_conn_encrypt cp;
2272 cp.handle = ev->handle;
2273 cp.encrypt = 0x01;
2274 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002275 &cp);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002276 } else {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002277 conn->state = BT_CONNECTED;
2278 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002279 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002280 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002281 } else {
2282 hci_auth_cfm(conn, ev->status);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002283
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002284 hci_conn_hold(conn);
2285 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02002286 hci_conn_drop(conn);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002287 }
2288
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002289 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002290 if (!ev->status) {
2291 struct hci_cp_set_conn_encrypt cp;
2292 cp.handle = ev->handle;
2293 cp.encrypt = 0x01;
2294 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002295 &cp);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002296 } else {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002297 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002298 hci_encrypt_cfm(conn, ev->status, 0x00);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002299 }
2300 }
2301
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002302unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002303 hci_dev_unlock(hdev);
2304}
2305
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002306static void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002307{
Johan Hedberg127178d2010-11-18 22:22:29 +02002308 struct hci_ev_remote_name *ev = (void *) skb->data;
2309 struct hci_conn *conn;
2310
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002311 BT_DBG("%s", hdev->name);
2312
2313 hci_conn_check_pending(hdev);
Johan Hedberg127178d2010-11-18 22:22:29 +02002314
2315 hci_dev_lock(hdev);
2316
2317 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002318
2319 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
2320 goto check_auth;
2321
2322 if (ev->status == 0)
2323 hci_check_pending_name(hdev, conn, &ev->bdaddr, ev->name,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002324 strnlen(ev->name, HCI_MAX_NAME_LENGTH));
Johan Hedbergb644ba32012-01-17 21:48:47 +02002325 else
2326 hci_check_pending_name(hdev, conn, &ev->bdaddr, NULL, 0);
2327
2328check_auth:
Johan Hedberg79c6c702011-04-28 11:28:55 -07002329 if (!conn)
2330 goto unlock;
2331
2332 if (!hci_outgoing_auth_needed(hdev, conn))
2333 goto unlock;
2334
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002335 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002336 struct hci_cp_auth_requested cp;
2337 cp.handle = __cpu_to_le16(conn->handle);
2338 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp);
2339 }
2340
Johan Hedberg79c6c702011-04-28 11:28:55 -07002341unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02002342 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002343}
2344
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002345static void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002346{
2347 struct hci_ev_encrypt_change *ev = (void *) skb->data;
2348 struct hci_conn *conn;
2349
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002350 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002351
2352 hci_dev_lock(hdev);
2353
2354 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002355 if (!conn)
2356 goto unlock;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002357
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002358 if (!ev->status) {
2359 if (ev->encrypt) {
2360 /* Encryption implies authentication */
Johan Hedberg4dae2792014-06-24 17:03:50 +03002361 set_bit(HCI_CONN_AUTH, &conn->flags);
2362 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002363 conn->sec_level = conn->pending_sec_level;
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002364
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002365 /* P-256 authentication key implies FIPS */
2366 if (conn->key_type == HCI_LK_AUTH_COMBINATION_P256)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002367 set_bit(HCI_CONN_FIPS, &conn->flags);
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002368
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002369 if ((conn->type == ACL_LINK && ev->encrypt == 0x02) ||
2370 conn->type == LE_LINK)
2371 set_bit(HCI_CONN_AES_CCM, &conn->flags);
2372 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002373 clear_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002374 clear_bit(HCI_CONN_AES_CCM, &conn->flags);
2375 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002376 }
2377
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002378 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
2379
2380 if (ev->status && conn->state == BT_CONNECTED) {
2381 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2382 hci_conn_drop(conn);
2383 goto unlock;
2384 }
2385
2386 if (conn->state == BT_CONFIG) {
2387 if (!ev->status)
2388 conn->state = BT_CONNECTED;
2389
Marcel Holtmann40b552a2014-03-19 14:10:25 -07002390 /* In Secure Connections Only mode, do not allow any
2391 * connections that are not encrypted with AES-CCM
2392 * using a P-256 authenticated combination key.
2393 */
2394 if (test_bit(HCI_SC_ONLY, &hdev->dev_flags) &&
2395 (!test_bit(HCI_CONN_AES_CCM, &conn->flags) ||
2396 conn->key_type != HCI_LK_AUTH_COMBINATION_P256)) {
2397 hci_proto_connect_cfm(conn, HCI_ERROR_AUTH_FAILURE);
2398 hci_conn_drop(conn);
2399 goto unlock;
2400 }
2401
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002402 hci_proto_connect_cfm(conn, ev->status);
2403 hci_conn_drop(conn);
2404 } else
2405 hci_encrypt_cfm(conn, ev->status, ev->encrypt);
2406
Gustavo Padovana7d77232012-05-13 03:20:07 -03002407unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002408 hci_dev_unlock(hdev);
2409}
2410
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002411static void hci_change_link_key_complete_evt(struct hci_dev *hdev,
2412 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002413{
2414 struct hci_ev_change_link_key_complete *ev = (void *) skb->data;
2415 struct hci_conn *conn;
2416
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002417 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002418
2419 hci_dev_lock(hdev);
2420
2421 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
2422 if (conn) {
2423 if (!ev->status)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002424 set_bit(HCI_CONN_SECURE, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002425
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002426 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002427
2428 hci_key_change_cfm(conn, ev->status);
2429 }
2430
2431 hci_dev_unlock(hdev);
2432}
2433
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002434static void hci_remote_features_evt(struct hci_dev *hdev,
2435 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002436{
2437 struct hci_ev_remote_features *ev = (void *) skb->data;
2438 struct hci_conn *conn;
2439
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002440 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002441
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002442 hci_dev_lock(hdev);
2443
2444 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02002445 if (!conn)
2446 goto unlock;
Marcel Holtmann769be972008-07-14 20:13:49 +02002447
Johan Hedbergccd556f2010-11-10 17:11:51 +02002448 if (!ev->status)
Johan Hedbergcad718e2013-04-17 15:00:51 +03002449 memcpy(conn->features[0], ev->features, 8);
Johan Hedbergccd556f2010-11-10 17:11:51 +02002450
2451 if (conn->state != BT_CONFIG)
2452 goto unlock;
2453
2454 if (!ev->status && lmp_ssp_capable(hdev) && lmp_ssp_capable(conn)) {
2455 struct hci_cp_read_remote_ext_features cp;
2456 cp.handle = ev->handle;
2457 cp.page = 0x01;
2458 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002459 sizeof(cp), &cp);
Johan Hedberg392599b2010-11-18 22:22:28 +02002460 goto unlock;
2461 }
2462
Johan Hedberg671267b2012-05-12 16:11:50 -03002463 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002464 struct hci_cp_remote_name_req cp;
2465 memset(&cp, 0, sizeof(cp));
2466 bacpy(&cp.bdaddr, &conn->dst);
2467 cp.pscan_rep_mode = 0x02;
2468 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002469 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
2470 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002471 conn->dst_type, 0, NULL, 0,
2472 conn->dev_class);
Johan Hedberg392599b2010-11-18 22:22:28 +02002473
Johan Hedberg127178d2010-11-18 22:22:29 +02002474 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002475 conn->state = BT_CONNECTED;
2476 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002477 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02002478 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002479
Johan Hedbergccd556f2010-11-10 17:11:51 +02002480unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002481 hci_dev_unlock(hdev);
2482}
2483
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002484static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002485{
2486 struct hci_ev_cmd_complete *ev = (void *) skb->data;
Johan Hedberg9238f362013-03-05 20:37:48 +02002487 u8 status = skb->data[sizeof(*ev)];
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002488 __u16 opcode;
2489
2490 skb_pull(skb, sizeof(*ev));
2491
2492 opcode = __le16_to_cpu(ev->opcode);
2493
2494 switch (opcode) {
2495 case HCI_OP_INQUIRY_CANCEL:
2496 hci_cc_inquiry_cancel(hdev, skb);
2497 break;
2498
Andre Guedes4d934832012-03-21 00:03:35 -03002499 case HCI_OP_PERIODIC_INQ:
2500 hci_cc_periodic_inq(hdev, skb);
2501 break;
2502
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002503 case HCI_OP_EXIT_PERIODIC_INQ:
2504 hci_cc_exit_periodic_inq(hdev, skb);
2505 break;
2506
2507 case HCI_OP_REMOTE_NAME_REQ_CANCEL:
2508 hci_cc_remote_name_req_cancel(hdev, skb);
2509 break;
2510
2511 case HCI_OP_ROLE_DISCOVERY:
2512 hci_cc_role_discovery(hdev, skb);
2513 break;
2514
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002515 case HCI_OP_READ_LINK_POLICY:
2516 hci_cc_read_link_policy(hdev, skb);
2517 break;
2518
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002519 case HCI_OP_WRITE_LINK_POLICY:
2520 hci_cc_write_link_policy(hdev, skb);
2521 break;
2522
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002523 case HCI_OP_READ_DEF_LINK_POLICY:
2524 hci_cc_read_def_link_policy(hdev, skb);
2525 break;
2526
2527 case HCI_OP_WRITE_DEF_LINK_POLICY:
2528 hci_cc_write_def_link_policy(hdev, skb);
2529 break;
2530
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002531 case HCI_OP_RESET:
2532 hci_cc_reset(hdev, skb);
2533 break;
2534
2535 case HCI_OP_WRITE_LOCAL_NAME:
2536 hci_cc_write_local_name(hdev, skb);
2537 break;
2538
2539 case HCI_OP_READ_LOCAL_NAME:
2540 hci_cc_read_local_name(hdev, skb);
2541 break;
2542
2543 case HCI_OP_WRITE_AUTH_ENABLE:
2544 hci_cc_write_auth_enable(hdev, skb);
2545 break;
2546
2547 case HCI_OP_WRITE_ENCRYPT_MODE:
2548 hci_cc_write_encrypt_mode(hdev, skb);
2549 break;
2550
2551 case HCI_OP_WRITE_SCAN_ENABLE:
2552 hci_cc_write_scan_enable(hdev, skb);
2553 break;
2554
2555 case HCI_OP_READ_CLASS_OF_DEV:
2556 hci_cc_read_class_of_dev(hdev, skb);
2557 break;
2558
2559 case HCI_OP_WRITE_CLASS_OF_DEV:
2560 hci_cc_write_class_of_dev(hdev, skb);
2561 break;
2562
2563 case HCI_OP_READ_VOICE_SETTING:
2564 hci_cc_read_voice_setting(hdev, skb);
2565 break;
2566
2567 case HCI_OP_WRITE_VOICE_SETTING:
2568 hci_cc_write_voice_setting(hdev, skb);
2569 break;
2570
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -07002571 case HCI_OP_READ_NUM_SUPPORTED_IAC:
2572 hci_cc_read_num_supported_iac(hdev, skb);
2573 break;
2574
Marcel Holtmann333140b2008-07-14 20:13:48 +02002575 case HCI_OP_WRITE_SSP_MODE:
2576 hci_cc_write_ssp_mode(hdev, skb);
2577 break;
2578
Marcel Holtmanneac83dc2014-01-10 02:07:23 -08002579 case HCI_OP_WRITE_SC_SUPPORT:
2580 hci_cc_write_sc_support(hdev, skb);
2581 break;
2582
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002583 case HCI_OP_READ_LOCAL_VERSION:
2584 hci_cc_read_local_version(hdev, skb);
2585 break;
2586
2587 case HCI_OP_READ_LOCAL_COMMANDS:
2588 hci_cc_read_local_commands(hdev, skb);
2589 break;
2590
2591 case HCI_OP_READ_LOCAL_FEATURES:
2592 hci_cc_read_local_features(hdev, skb);
2593 break;
2594
Andre Guedes971e3a42011-06-30 19:20:52 -03002595 case HCI_OP_READ_LOCAL_EXT_FEATURES:
2596 hci_cc_read_local_ext_features(hdev, skb);
2597 break;
2598
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002599 case HCI_OP_READ_BUFFER_SIZE:
2600 hci_cc_read_buffer_size(hdev, skb);
2601 break;
2602
2603 case HCI_OP_READ_BD_ADDR:
2604 hci_cc_read_bd_addr(hdev, skb);
2605 break;
2606
Johan Hedbergf332ec62013-03-15 17:07:11 -05002607 case HCI_OP_READ_PAGE_SCAN_ACTIVITY:
2608 hci_cc_read_page_scan_activity(hdev, skb);
2609 break;
2610
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002611 case HCI_OP_WRITE_PAGE_SCAN_ACTIVITY:
2612 hci_cc_write_page_scan_activity(hdev, skb);
2613 break;
2614
Johan Hedbergf332ec62013-03-15 17:07:11 -05002615 case HCI_OP_READ_PAGE_SCAN_TYPE:
2616 hci_cc_read_page_scan_type(hdev, skb);
2617 break;
2618
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002619 case HCI_OP_WRITE_PAGE_SCAN_TYPE:
2620 hci_cc_write_page_scan_type(hdev, skb);
2621 break;
2622
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +02002623 case HCI_OP_READ_DATA_BLOCK_SIZE:
2624 hci_cc_read_data_block_size(hdev, skb);
2625 break;
2626
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +02002627 case HCI_OP_READ_FLOW_CONTROL_MODE:
2628 hci_cc_read_flow_control_mode(hdev, skb);
2629 break;
2630
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +03002631 case HCI_OP_READ_LOCAL_AMP_INFO:
2632 hci_cc_read_local_amp_info(hdev, skb);
2633 break;
2634
Johan Hedberg33f35722014-06-28 17:54:06 +03002635 case HCI_OP_READ_CLOCK:
2636 hci_cc_read_clock(hdev, skb);
2637 break;
2638
Andrei Emeltchenko903e4542012-09-27 17:26:09 +03002639 case HCI_OP_READ_LOCAL_AMP_ASSOC:
2640 hci_cc_read_local_amp_assoc(hdev, skb);
2641 break;
2642
Johan Hedbergd5859e22011-01-25 01:19:58 +02002643 case HCI_OP_READ_INQ_RSP_TX_POWER:
2644 hci_cc_read_inq_rsp_tx_power(hdev, skb);
2645 break;
2646
Johan Hedberg980e1a52011-01-22 06:10:07 +02002647 case HCI_OP_PIN_CODE_REPLY:
2648 hci_cc_pin_code_reply(hdev, skb);
2649 break;
2650
2651 case HCI_OP_PIN_CODE_NEG_REPLY:
2652 hci_cc_pin_code_neg_reply(hdev, skb);
2653 break;
2654
Szymon Jancc35938b2011-03-22 13:12:21 +01002655 case HCI_OP_READ_LOCAL_OOB_DATA:
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08002656 hci_cc_read_local_oob_data(hdev, skb);
2657 break;
2658
2659 case HCI_OP_READ_LOCAL_OOB_EXT_DATA:
2660 hci_cc_read_local_oob_ext_data(hdev, skb);
Szymon Jancc35938b2011-03-22 13:12:21 +01002661 break;
2662
Ville Tervo6ed58ec2011-02-10 22:38:48 -03002663 case HCI_OP_LE_READ_BUFFER_SIZE:
2664 hci_cc_le_read_buffer_size(hdev, skb);
2665 break;
2666
Johan Hedberg60e77322013-01-22 14:01:59 +02002667 case HCI_OP_LE_READ_LOCAL_FEATURES:
2668 hci_cc_le_read_local_features(hdev, skb);
2669 break;
2670
Johan Hedberg8fa19092012-10-19 20:57:49 +03002671 case HCI_OP_LE_READ_ADV_TX_POWER:
2672 hci_cc_le_read_adv_tx_power(hdev, skb);
2673 break;
2674
Johan Hedberga5c29682011-02-19 12:05:57 -03002675 case HCI_OP_USER_CONFIRM_REPLY:
2676 hci_cc_user_confirm_reply(hdev, skb);
2677 break;
2678
2679 case HCI_OP_USER_CONFIRM_NEG_REPLY:
2680 hci_cc_user_confirm_neg_reply(hdev, skb);
2681 break;
2682
Brian Gix1143d452011-11-23 08:28:34 -08002683 case HCI_OP_USER_PASSKEY_REPLY:
2684 hci_cc_user_passkey_reply(hdev, skb);
2685 break;
2686
2687 case HCI_OP_USER_PASSKEY_NEG_REPLY:
2688 hci_cc_user_passkey_neg_reply(hdev, skb);
Szymon Janc16cde992012-04-13 12:32:42 +02002689 break;
Andre Guedes07f7fa52011-12-02 21:13:31 +09002690
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08002691 case HCI_OP_LE_SET_RANDOM_ADDR:
2692 hci_cc_le_set_random_addr(hdev, skb);
2693 break;
2694
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01002695 case HCI_OP_LE_SET_ADV_ENABLE:
2696 hci_cc_le_set_adv_enable(hdev, skb);
2697 break;
2698
Marcel Holtmann533553f2014-03-21 12:18:10 -07002699 case HCI_OP_LE_SET_SCAN_PARAM:
2700 hci_cc_le_set_scan_param(hdev, skb);
2701 break;
2702
Andre Guedeseb9d91f2011-05-26 16:23:52 -03002703 case HCI_OP_LE_SET_SCAN_ENABLE:
2704 hci_cc_le_set_scan_enable(hdev, skb);
2705 break;
2706
Johan Hedbergcf1d0812013-01-22 14:02:00 +02002707 case HCI_OP_LE_READ_WHITE_LIST_SIZE:
2708 hci_cc_le_read_white_list_size(hdev, skb);
2709 break;
2710
Marcel Holtmann0f36b582014-02-27 20:37:31 -08002711 case HCI_OP_LE_CLEAR_WHITE_LIST:
2712 hci_cc_le_clear_white_list(hdev, skb);
2713 break;
2714
2715 case HCI_OP_LE_ADD_TO_WHITE_LIST:
2716 hci_cc_le_add_to_white_list(hdev, skb);
2717 break;
2718
2719 case HCI_OP_LE_DEL_FROM_WHITE_LIST:
2720 hci_cc_le_del_from_white_list(hdev, skb);
2721 break;
2722
Johan Hedberg9b008c02013-01-22 14:02:01 +02002723 case HCI_OP_LE_READ_SUPPORTED_STATES:
2724 hci_cc_le_read_supported_states(hdev, skb);
2725 break;
2726
Andre Guedesf9b49302011-06-30 19:20:53 -03002727 case HCI_OP_WRITE_LE_HOST_SUPPORTED:
2728 hci_cc_write_le_host_supported(hdev, skb);
2729 break;
2730
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02002731 case HCI_OP_LE_SET_ADV_PARAM:
2732 hci_cc_set_adv_param(hdev, skb);
2733 break;
2734
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03002735 case HCI_OP_WRITE_REMOTE_AMP_ASSOC:
2736 hci_cc_write_remote_amp_assoc(hdev, skb);
2737 break;
2738
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02002739 case HCI_OP_READ_RSSI:
2740 hci_cc_read_rssi(hdev, skb);
2741 break;
2742
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02002743 case HCI_OP_READ_TX_POWER:
2744 hci_cc_read_tx_power(hdev, skb);
2745 break;
2746
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002747 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002748 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002749 break;
2750 }
2751
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002752 if (opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02002753 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02002754
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002755 hci_req_cmd_complete(hdev, opcode, status);
Johan Hedberg9238f362013-03-05 20:37:48 +02002756
Szymon Jancdbccd792012-12-11 08:51:19 +01002757 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002758 atomic_set(&hdev->cmd_cnt, 1);
2759 if (!skb_queue_empty(&hdev->cmd_q))
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02002760 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002761 }
2762}
2763
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002764static void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002765{
2766 struct hci_ev_cmd_status *ev = (void *) skb->data;
2767 __u16 opcode;
2768
2769 skb_pull(skb, sizeof(*ev));
2770
2771 opcode = __le16_to_cpu(ev->opcode);
2772
2773 switch (opcode) {
2774 case HCI_OP_INQUIRY:
2775 hci_cs_inquiry(hdev, ev->status);
2776 break;
2777
2778 case HCI_OP_CREATE_CONN:
2779 hci_cs_create_conn(hdev, ev->status);
2780 break;
2781
2782 case HCI_OP_ADD_SCO:
2783 hci_cs_add_sco(hdev, ev->status);
2784 break;
2785
Marcel Holtmannf8558552008-07-14 20:13:49 +02002786 case HCI_OP_AUTH_REQUESTED:
2787 hci_cs_auth_requested(hdev, ev->status);
2788 break;
2789
2790 case HCI_OP_SET_CONN_ENCRYPT:
2791 hci_cs_set_conn_encrypt(hdev, ev->status);
2792 break;
2793
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002794 case HCI_OP_REMOTE_NAME_REQ:
2795 hci_cs_remote_name_req(hdev, ev->status);
2796 break;
2797
Marcel Holtmann769be972008-07-14 20:13:49 +02002798 case HCI_OP_READ_REMOTE_FEATURES:
2799 hci_cs_read_remote_features(hdev, ev->status);
2800 break;
2801
2802 case HCI_OP_READ_REMOTE_EXT_FEATURES:
2803 hci_cs_read_remote_ext_features(hdev, ev->status);
2804 break;
2805
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002806 case HCI_OP_SETUP_SYNC_CONN:
2807 hci_cs_setup_sync_conn(hdev, ev->status);
2808 break;
2809
2810 case HCI_OP_SNIFF_MODE:
2811 hci_cs_sniff_mode(hdev, ev->status);
2812 break;
2813
2814 case HCI_OP_EXIT_SNIFF_MODE:
2815 hci_cs_exit_sniff_mode(hdev, ev->status);
2816 break;
2817
Johan Hedberg8962ee72011-01-20 12:40:27 +02002818 case HCI_OP_DISCONNECT:
Johan Hedberg88c3df12012-02-09 14:27:38 +02002819 hci_cs_disconnect(hdev, ev->status);
Johan Hedberg8962ee72011-01-20 12:40:27 +02002820 break;
2821
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03002822 case HCI_OP_CREATE_PHY_LINK:
2823 hci_cs_create_phylink(hdev, ev->status);
2824 break;
2825
Andrei Emeltchenko0b26ab92012-09-27 17:26:24 +03002826 case HCI_OP_ACCEPT_PHY_LINK:
2827 hci_cs_accept_phylink(hdev, ev->status);
2828 break;
2829
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002830 case HCI_OP_LE_CREATE_CONN:
2831 hci_cs_le_create_conn(hdev, ev->status);
2832 break;
2833
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02002834 case HCI_OP_LE_START_ENC:
2835 hci_cs_le_start_enc(hdev, ev->status);
2836 break;
2837
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002838 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002839 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002840 break;
2841 }
2842
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002843 if (opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02002844 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02002845
Johan Hedberg02350a72013-04-03 21:50:29 +03002846 if (ev->status ||
2847 (hdev->sent_cmd && !bt_cb(hdev->sent_cmd)->req.event))
2848 hci_req_cmd_complete(hdev, opcode, ev->status);
Johan Hedberg9238f362013-03-05 20:37:48 +02002849
Gustavo F. Padovan10572132011-03-16 15:36:29 -03002850 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002851 atomic_set(&hdev->cmd_cnt, 1);
2852 if (!skb_queue_empty(&hdev->cmd_q))
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02002853 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002854 }
2855}
2856
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002857static void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002858{
2859 struct hci_ev_role_change *ev = (void *) skb->data;
2860 struct hci_conn *conn;
2861
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002862 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002863
2864 hci_dev_lock(hdev);
2865
2866 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
2867 if (conn) {
2868 if (!ev->status) {
2869 if (ev->role)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002870 clear_bit(HCI_CONN_MASTER, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002871 else
Johan Hedberg4dae2792014-06-24 17:03:50 +03002872 set_bit(HCI_CONN_MASTER, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002873 }
2874
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002875 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002876
2877 hci_role_switch_cfm(conn, ev->status, ev->role);
2878 }
2879
2880 hci_dev_unlock(hdev);
2881}
2882
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002883static void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002884{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002885 struct hci_ev_num_comp_pkts *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002886 int i;
2887
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02002888 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_PACKET_BASED) {
2889 BT_ERR("Wrong event for mode %d", hdev->flow_ctl_mode);
2890 return;
2891 }
2892
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02002893 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03002894 ev->num_hndl * sizeof(struct hci_comp_pkts_info)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002895 BT_DBG("%s bad parameters", hdev->name);
2896 return;
2897 }
2898
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02002899 BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl);
2900
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02002901 for (i = 0; i < ev->num_hndl; i++) {
2902 struct hci_comp_pkts_info *info = &ev->handles[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002903 struct hci_conn *conn;
2904 __u16 handle, count;
2905
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02002906 handle = __le16_to_cpu(info->handle);
2907 count = __le16_to_cpu(info->count);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002908
2909 conn = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002910 if (!conn)
2911 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002912
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002913 conn->sent -= count;
2914
2915 switch (conn->type) {
2916 case ACL_LINK:
2917 hdev->acl_cnt += count;
2918 if (hdev->acl_cnt > hdev->acl_pkts)
2919 hdev->acl_cnt = hdev->acl_pkts;
2920 break;
2921
2922 case LE_LINK:
2923 if (hdev->le_pkts) {
2924 hdev->le_cnt += count;
2925 if (hdev->le_cnt > hdev->le_pkts)
2926 hdev->le_cnt = hdev->le_pkts;
2927 } else {
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02002928 hdev->acl_cnt += count;
2929 if (hdev->acl_cnt > hdev->acl_pkts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002930 hdev->acl_cnt = hdev->acl_pkts;
2931 }
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002932 break;
2933
2934 case SCO_LINK:
2935 hdev->sco_cnt += count;
2936 if (hdev->sco_cnt > hdev->sco_pkts)
2937 hdev->sco_cnt = hdev->sco_pkts;
2938 break;
2939
2940 default:
2941 BT_ERR("Unknown type %d conn %p", conn->type, conn);
2942 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002943 }
2944 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002945
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02002946 queue_work(hdev->workqueue, &hdev->tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002947}
2948
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03002949static struct hci_conn *__hci_conn_lookup_handle(struct hci_dev *hdev,
2950 __u16 handle)
2951{
2952 struct hci_chan *chan;
2953
2954 switch (hdev->dev_type) {
2955 case HCI_BREDR:
2956 return hci_conn_hash_lookup_handle(hdev, handle);
2957 case HCI_AMP:
2958 chan = hci_chan_lookup_handle(hdev, handle);
2959 if (chan)
2960 return chan->conn;
2961 break;
2962 default:
2963 BT_ERR("%s unknown dev_type %d", hdev->name, hdev->dev_type);
2964 break;
2965 }
2966
2967 return NULL;
2968}
2969
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002970static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002971{
2972 struct hci_ev_num_comp_blocks *ev = (void *) skb->data;
2973 int i;
2974
2975 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_BLOCK_BASED) {
2976 BT_ERR("Wrong event for mode %d", hdev->flow_ctl_mode);
2977 return;
2978 }
2979
2980 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03002981 ev->num_hndl * sizeof(struct hci_comp_blocks_info)) {
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002982 BT_DBG("%s bad parameters", hdev->name);
2983 return;
2984 }
2985
2986 BT_DBG("%s num_blocks %d num_hndl %d", hdev->name, ev->num_blocks,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002987 ev->num_hndl);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002988
2989 for (i = 0; i < ev->num_hndl; i++) {
2990 struct hci_comp_blocks_info *info = &ev->handles[i];
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03002991 struct hci_conn *conn = NULL;
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002992 __u16 handle, block_count;
2993
2994 handle = __le16_to_cpu(info->handle);
2995 block_count = __le16_to_cpu(info->blocks);
2996
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03002997 conn = __hci_conn_lookup_handle(hdev, handle);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002998 if (!conn)
2999 continue;
3000
3001 conn->sent -= block_count;
3002
3003 switch (conn->type) {
3004 case ACL_LINK:
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03003005 case AMP_LINK:
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003006 hdev->block_cnt += block_count;
3007 if (hdev->block_cnt > hdev->num_blocks)
3008 hdev->block_cnt = hdev->num_blocks;
3009 break;
3010
3011 default:
3012 BT_ERR("Unknown type %d conn %p", conn->type, conn);
3013 break;
3014 }
3015 }
3016
3017 queue_work(hdev->workqueue, &hdev->tx_work);
3018}
3019
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003020static void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003021{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003022 struct hci_ev_mode_change *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003023 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003024
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003025 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003026
3027 hci_dev_lock(hdev);
3028
Marcel Holtmann04837f62006-07-03 10:02:33 +02003029 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3030 if (conn) {
3031 conn->mode = ev->mode;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003032
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003033 if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND,
3034 &conn->flags)) {
Marcel Holtmann04837f62006-07-03 10:02:33 +02003035 if (conn->mode == HCI_CM_ACTIVE)
Johan Hedberg58a681e2012-01-16 06:47:28 +02003036 set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003037 else
Johan Hedberg58a681e2012-01-16 06:47:28 +02003038 clear_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003039 }
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003040
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003041 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003042 hci_sco_setup(conn, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003043 }
3044
3045 hci_dev_unlock(hdev);
3046}
3047
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003048static void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003049{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003050 struct hci_ev_pin_code_req *ev = (void *) skb->data;
3051 struct hci_conn *conn;
3052
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003053 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003054
3055 hci_dev_lock(hdev);
3056
3057 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003058 if (!conn)
3059 goto unlock;
3060
3061 if (conn->state == BT_CONNECTED) {
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003062 hci_conn_hold(conn);
3063 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003064 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003065 }
3066
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003067 if (!test_bit(HCI_PAIRABLE, &hdev->dev_flags))
Johan Hedberg03b555e2011-01-04 15:40:05 +02003068 hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003069 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003070 else if (test_bit(HCI_MGMT, &hdev->dev_flags)) {
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003071 u8 secure;
3072
3073 if (conn->pending_sec_level == BT_SECURITY_HIGH)
3074 secure = 1;
3075 else
3076 secure = 0;
3077
Johan Hedberg744cf192011-11-08 20:40:14 +02003078 mgmt_pin_code_request(hdev, &ev->bdaddr, secure);
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003079 }
Johan Hedberg980e1a52011-01-22 06:10:07 +02003080
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003081unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003082 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003083}
3084
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003085static void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003086{
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003087 struct hci_ev_link_key_req *ev = (void *) skb->data;
3088 struct hci_cp_link_key_reply cp;
3089 struct hci_conn *conn;
3090 struct link_key *key;
3091
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003092 BT_DBG("%s", hdev->name);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003093
Andrei Emeltchenko034cbea2013-05-14 11:44:16 +03003094 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003095 return;
3096
3097 hci_dev_lock(hdev);
3098
3099 key = hci_find_link_key(hdev, &ev->bdaddr);
3100 if (!key) {
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003101 BT_DBG("%s link key not found for %pMR", hdev->name,
3102 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003103 goto not_found;
3104 }
3105
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003106 BT_DBG("%s found key type %u for %pMR", hdev->name, key->type,
3107 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003108
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003109 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003110 if (conn) {
Marcel Holtmann66138ce2014-01-10 02:07:20 -08003111 if ((key->type == HCI_LK_UNAUTH_COMBINATION_P192 ||
3112 key->type == HCI_LK_UNAUTH_COMBINATION_P256) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03003113 conn->auth_type != 0xff && (conn->auth_type & 0x01)) {
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003114 BT_DBG("%s ignoring unauthenticated key", hdev->name);
3115 goto not_found;
3116 }
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003117
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003118 if (key->type == HCI_LK_COMBINATION && key->pin_len < 16 &&
Johan Hedbergf3fb0b52014-06-02 10:12:44 +03003119 (conn->pending_sec_level == BT_SECURITY_HIGH ||
3120 conn->pending_sec_level == BT_SECURITY_FIPS)) {
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003121 BT_DBG("%s ignoring key unauthenticated for high security",
3122 hdev->name);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003123 goto not_found;
3124 }
3125
3126 conn->key_type = key->type;
3127 conn->pin_length = key->pin_len;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003128 }
3129
3130 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9b3b4462012-05-23 11:31:20 +03003131 memcpy(cp.link_key, key->val, HCI_LINK_KEY_SIZE);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003132
3133 hci_send_cmd(hdev, HCI_OP_LINK_KEY_REPLY, sizeof(cp), &cp);
3134
3135 hci_dev_unlock(hdev);
3136
3137 return;
3138
3139not_found:
3140 hci_send_cmd(hdev, HCI_OP_LINK_KEY_NEG_REPLY, 6, &ev->bdaddr);
3141 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003142}
3143
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003144static void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003145{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003146 struct hci_ev_link_key_notify *ev = (void *) skb->data;
3147 struct hci_conn *conn;
Johan Hedberg7652ff62014-06-24 13:15:49 +03003148 struct link_key *key;
3149 bool persistent;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003150 u8 pin_len = 0;
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003151
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003152 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003153
3154 hci_dev_lock(hdev);
3155
3156 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3157 if (conn) {
3158 hci_conn_hold(conn);
3159 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Johan Hedberg980e1a52011-01-22 06:10:07 +02003160 pin_len = conn->pin_length;
Waldemar Rymarkiewicz13d39312011-04-28 12:07:55 +02003161
3162 if (ev->key_type != HCI_LK_CHANGED_COMBINATION)
3163 conn->key_type = ev->key_type;
3164
David Herrmann76a68ba2013-04-06 20:28:37 +02003165 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003166 }
3167
Johan Hedberg7652ff62014-06-24 13:15:49 +03003168 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
3169 goto unlock;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003170
Johan Hedberg7652ff62014-06-24 13:15:49 +03003171 key = hci_add_link_key(hdev, conn, &ev->bdaddr, ev->link_key,
3172 ev->key_type, pin_len, &persistent);
3173 if (!key)
3174 goto unlock;
3175
3176 mgmt_new_link_key(hdev, key, persistent);
3177
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003178 /* Keep debug keys around only if the HCI_KEEP_DEBUG_KEYS flag
3179 * is set. If it's not set simply remove the key from the kernel
3180 * list (we've still notified user space about it but with
3181 * store_hint being 0).
3182 */
3183 if (key->type == HCI_LK_DEBUG_COMBINATION &&
3184 !test_bit(HCI_KEEP_DEBUG_KEYS, &hdev->dev_flags)) {
3185 list_del(&key->list);
3186 kfree(key);
3187 } else if (conn) {
Johan Hedbergaf6a9c32014-06-24 13:15:53 +03003188 if (persistent)
3189 clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3190 else
3191 set_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003192 }
Johan Hedberg7652ff62014-06-24 13:15:49 +03003193
3194unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003195 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003196}
3197
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003198static void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04837f62006-07-03 10:02:33 +02003199{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003200 struct hci_ev_clock_offset *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003201 struct hci_conn *conn;
3202
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003203 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003204
3205 hci_dev_lock(hdev);
3206
3207 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003208 if (conn && !ev->status) {
3209 struct inquiry_entry *ie;
3210
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003211 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3212 if (ie) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003213 ie->data.clock_offset = ev->clock_offset;
3214 ie->timestamp = jiffies;
3215 }
3216 }
3217
3218 hci_dev_unlock(hdev);
3219}
3220
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003221static void hci_pkt_type_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna8746412008-07-14 20:13:46 +02003222{
3223 struct hci_ev_pkt_type_change *ev = (void *) skb->data;
3224 struct hci_conn *conn;
3225
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003226 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna8746412008-07-14 20:13:46 +02003227
3228 hci_dev_lock(hdev);
3229
3230 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3231 if (conn && !ev->status)
3232 conn->pkt_type = __le16_to_cpu(ev->pkt_type);
3233
3234 hci_dev_unlock(hdev);
3235}
3236
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003237static void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003238{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003239 struct hci_ev_pscan_rep_mode *ev = (void *) skb->data;
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003240 struct inquiry_entry *ie;
3241
3242 BT_DBG("%s", hdev->name);
3243
3244 hci_dev_lock(hdev);
3245
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003246 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3247 if (ie) {
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003248 ie->data.pscan_rep_mode = ev->pscan_rep_mode;
3249 ie->timestamp = jiffies;
3250 }
3251
3252 hci_dev_unlock(hdev);
3253}
3254
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003255static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
3256 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003257{
3258 struct inquiry_data data;
3259 int num_rsp = *((__u8 *) skb->data);
Johan Hedberg388fc8f2012-02-23 00:38:59 +02003260 bool name_known, ssp;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003261
3262 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3263
3264 if (!num_rsp)
3265 return;
3266
Andre Guedes1519cc12012-03-21 00:03:38 -03003267 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
3268 return;
3269
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003270 hci_dev_lock(hdev);
3271
3272 if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) {
Szymon Janc138d22e2011-02-17 16:44:23 +01003273 struct inquiry_info_with_rssi_and_pscan_mode *info;
3274 info = (void *) (skb->data + 1);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003275
Johan Hedberge17acd42011-03-30 23:57:16 +03003276 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003277 bacpy(&data.bdaddr, &info->bdaddr);
3278 data.pscan_rep_mode = info->pscan_rep_mode;
3279 data.pscan_period_mode = info->pscan_period_mode;
3280 data.pscan_mode = info->pscan_mode;
3281 memcpy(data.dev_class, info->dev_class, 3);
3282 data.clock_offset = info->clock_offset;
3283 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003284 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02003285
3286 name_known = hci_inquiry_cache_update(hdev, &data,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003287 false, &ssp);
Johan Hedberg48264f02011-11-09 13:58:58 +02003288 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003289 info->dev_class, info->rssi,
Johan Hedberg5d2e9fa2014-03-25 10:30:47 +02003290 !name_known, ssp, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003291 }
3292 } else {
3293 struct inquiry_info_with_rssi *info = (void *) (skb->data + 1);
3294
Johan Hedberge17acd42011-03-30 23:57:16 +03003295 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003296 bacpy(&data.bdaddr, &info->bdaddr);
3297 data.pscan_rep_mode = info->pscan_rep_mode;
3298 data.pscan_period_mode = info->pscan_period_mode;
3299 data.pscan_mode = 0x00;
3300 memcpy(data.dev_class, info->dev_class, 3);
3301 data.clock_offset = info->clock_offset;
3302 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003303 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02003304 name_known = hci_inquiry_cache_update(hdev, &data,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003305 false, &ssp);
Johan Hedberg48264f02011-11-09 13:58:58 +02003306 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003307 info->dev_class, info->rssi,
Johan Hedberg5d2e9fa2014-03-25 10:30:47 +02003308 !name_known, ssp, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003309 }
3310 }
3311
3312 hci_dev_unlock(hdev);
3313}
3314
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003315static void hci_remote_ext_features_evt(struct hci_dev *hdev,
3316 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003317{
Marcel Holtmann41a96212008-07-14 20:13:48 +02003318 struct hci_ev_remote_ext_features *ev = (void *) skb->data;
3319 struct hci_conn *conn;
3320
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003321 BT_DBG("%s", hdev->name);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003322
Marcel Holtmann41a96212008-07-14 20:13:48 +02003323 hci_dev_lock(hdev);
3324
3325 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02003326 if (!conn)
3327 goto unlock;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003328
Johan Hedbergcad718e2013-04-17 15:00:51 +03003329 if (ev->page < HCI_MAX_PAGES)
3330 memcpy(conn->features[ev->page], ev->features, 8);
3331
Johan Hedbergccd556f2010-11-10 17:11:51 +02003332 if (!ev->status && ev->page == 0x01) {
3333 struct inquiry_entry *ie;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003334
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003335 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3336 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003337 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann769be972008-07-14 20:13:49 +02003338
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303339 if (ev->features[0] & LMP_HOST_SSP) {
Johan Hedberg58a681e2012-01-16 06:47:28 +02003340 set_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303341 } else {
3342 /* It is mandatory by the Bluetooth specification that
3343 * Extended Inquiry Results are only used when Secure
3344 * Simple Pairing is enabled, but some devices violate
3345 * this.
3346 *
3347 * To make these devices work, the internal SSP
3348 * enabled flag needs to be cleared if the remote host
3349 * features do not indicate SSP support */
3350 clear_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
3351 }
Marcel Holtmanneb9a8f32014-01-15 22:37:38 -08003352
3353 if (ev->features[0] & LMP_HOST_SC)
3354 set_bit(HCI_CONN_SC_ENABLED, &conn->flags);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003355 }
3356
Johan Hedbergccd556f2010-11-10 17:11:51 +02003357 if (conn->state != BT_CONFIG)
3358 goto unlock;
3359
Johan Hedberg671267b2012-05-12 16:11:50 -03003360 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02003361 struct hci_cp_remote_name_req cp;
3362 memset(&cp, 0, sizeof(cp));
3363 bacpy(&cp.bdaddr, &conn->dst);
3364 cp.pscan_rep_mode = 0x02;
3365 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02003366 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
3367 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003368 conn->dst_type, 0, NULL, 0,
3369 conn->dev_class);
Johan Hedberg392599b2010-11-18 22:22:28 +02003370
Johan Hedberg127178d2010-11-18 22:22:29 +02003371 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02003372 conn->state = BT_CONNECTED;
3373 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003374 hci_conn_drop(conn);
Johan Hedbergccd556f2010-11-10 17:11:51 +02003375 }
3376
3377unlock:
Marcel Holtmann41a96212008-07-14 20:13:48 +02003378 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003379}
3380
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003381static void hci_sync_conn_complete_evt(struct hci_dev *hdev,
3382 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003383{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003384 struct hci_ev_sync_conn_complete *ev = (void *) skb->data;
3385 struct hci_conn *conn;
3386
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003387 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003388
3389 hci_dev_lock(hdev);
3390
3391 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003392 if (!conn) {
3393 if (ev->link_type == ESCO_LINK)
3394 goto unlock;
3395
3396 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
3397 if (!conn)
3398 goto unlock;
3399
3400 conn->type = SCO_LINK;
3401 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003402
Marcel Holtmann732547f2009-04-19 19:14:14 +02003403 switch (ev->status) {
3404 case 0x00:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003405 conn->handle = __le16_to_cpu(ev->handle);
3406 conn->state = BT_CONNECTED;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02003407
3408 hci_conn_add_sysfs(conn);
Marcel Holtmann732547f2009-04-19 19:14:14 +02003409 break;
3410
Nick Pelly81218d22014-06-30 11:25:01 +05303411 case 0x10: /* Connection Accept Timeout */
Frédéric Dalleau1a4c9582013-08-19 14:24:02 +02003412 case 0x0d: /* Connection Rejected due to Limited Resources */
Stephen Coe705e5712010-02-16 11:29:44 -05003413 case 0x11: /* Unsupported Feature or Parameter Value */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003414 case 0x1c: /* SCO interval rejected */
Nick Pelly1038a002010-02-03 11:42:26 -08003415 case 0x1a: /* Unsupported Remote Feature */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003416 case 0x1f: /* Unspecified error */
Andrew Earl27539bc2014-03-10 10:31:04 +00003417 case 0x20: /* Unsupported LMP Parameter value */
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003418 if (conn->out) {
Marcel Holtmann732547f2009-04-19 19:14:14 +02003419 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
3420 (hdev->esco_type & EDR_ESCO_MASK);
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003421 if (hci_setup_sync(conn, conn->link->handle))
3422 goto unlock;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003423 }
3424 /* fall through */
3425
3426 default:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003427 conn->state = BT_CLOSED;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003428 break;
3429 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003430
3431 hci_proto_connect_cfm(conn, ev->status);
3432 if (ev->status)
3433 hci_conn_del(conn);
3434
3435unlock:
3436 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003437}
3438
Marcel Holtmannefdcf8e2013-10-15 10:31:12 -07003439static inline size_t eir_get_length(u8 *eir, size_t eir_len)
3440{
3441 size_t parsed = 0;
3442
3443 while (parsed < eir_len) {
3444 u8 field_len = eir[0];
3445
3446 if (field_len == 0)
3447 return parsed;
3448
3449 parsed += field_len + 1;
3450 eir += field_len + 1;
3451 }
3452
3453 return eir_len;
3454}
3455
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003456static void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
3457 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003458{
3459 struct inquiry_data data;
3460 struct extended_inquiry_info *info = (void *) (skb->data + 1);
3461 int num_rsp = *((__u8 *) skb->data);
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303462 size_t eir_len;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003463
3464 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3465
3466 if (!num_rsp)
3467 return;
3468
Andre Guedes1519cc12012-03-21 00:03:38 -03003469 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
3470 return;
3471
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003472 hci_dev_lock(hdev);
3473
Johan Hedberge17acd42011-03-30 23:57:16 +03003474 for (; num_rsp; num_rsp--, info++) {
Johan Hedberg388fc8f2012-02-23 00:38:59 +02003475 bool name_known, ssp;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003476
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003477 bacpy(&data.bdaddr, &info->bdaddr);
Szymon Janc138d22e2011-02-17 16:44:23 +01003478 data.pscan_rep_mode = info->pscan_rep_mode;
3479 data.pscan_period_mode = info->pscan_period_mode;
3480 data.pscan_mode = 0x00;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003481 memcpy(data.dev_class, info->dev_class, 3);
Szymon Janc138d22e2011-02-17 16:44:23 +01003482 data.clock_offset = info->clock_offset;
3483 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003484 data.ssp_mode = 0x01;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003485
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003486 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg4ddb1932012-01-15 20:04:43 +02003487 name_known = eir_has_data_type(info->data,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003488 sizeof(info->data),
3489 EIR_NAME_COMPLETE);
Johan Hedberg561aafb2012-01-04 13:31:59 +02003490 else
3491 name_known = true;
3492
Johan Hedberg388fc8f2012-02-23 00:38:59 +02003493 name_known = hci_inquiry_cache_update(hdev, &data, name_known,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003494 &ssp);
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303495 eir_len = eir_get_length(info->data, sizeof(info->data));
Johan Hedberg48264f02011-11-09 13:58:58 +02003496 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003497 info->dev_class, info->rssi, !name_known,
Johan Hedberg5d2e9fa2014-03-25 10:30:47 +02003498 ssp, info->data, eir_len, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003499 }
3500
3501 hci_dev_unlock(hdev);
3502}
3503
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003504static void hci_key_refresh_complete_evt(struct hci_dev *hdev,
3505 struct sk_buff *skb)
3506{
3507 struct hci_ev_key_refresh_complete *ev = (void *) skb->data;
3508 struct hci_conn *conn;
3509
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003510 BT_DBG("%s status 0x%2.2x handle 0x%4.4x", hdev->name, ev->status,
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003511 __le16_to_cpu(ev->handle));
3512
3513 hci_dev_lock(hdev);
3514
3515 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3516 if (!conn)
3517 goto unlock;
3518
Johan Hedberg9eb1fbf2014-04-11 12:02:31 -07003519 /* For BR/EDR the necessary steps are taken through the
3520 * auth_complete event.
3521 */
3522 if (conn->type != LE_LINK)
3523 goto unlock;
3524
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003525 if (!ev->status)
3526 conn->sec_level = conn->pending_sec_level;
3527
3528 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
3529
3530 if (ev->status && conn->state == BT_CONNECTED) {
Andre Guedesbed71742013-01-30 11:50:56 -03003531 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
David Herrmann76a68ba2013-04-06 20:28:37 +02003532 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003533 goto unlock;
3534 }
3535
3536 if (conn->state == BT_CONFIG) {
3537 if (!ev->status)
3538 conn->state = BT_CONNECTED;
3539
3540 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003541 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003542 } else {
3543 hci_auth_cfm(conn, ev->status);
3544
3545 hci_conn_hold(conn);
3546 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003547 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003548 }
3549
3550unlock:
3551 hci_dev_unlock(hdev);
3552}
3553
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003554static u8 hci_get_auth_req(struct hci_conn *conn)
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003555{
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003556 /* If remote requests no-bonding follow that lead */
Mikel Astizacabae92013-06-28 10:56:28 +02003557 if (conn->remote_auth == HCI_AT_NO_BONDING ||
3558 conn->remote_auth == HCI_AT_NO_BONDING_MITM)
Waldemar Rymarkiewicz58797bf2011-04-28 12:07:58 +02003559 return conn->remote_auth | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003560
Mikel Astizb7f94c82014-04-08 14:21:31 +02003561 /* If both remote and local have enough IO capabilities, require
3562 * MITM protection
3563 */
3564 if (conn->remote_cap != HCI_IO_NO_INPUT_OUTPUT &&
3565 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT)
3566 return conn->remote_auth | 0x01;
3567
Timo Mueller7e741702014-04-08 14:21:33 +02003568 /* No MITM protection possible so ignore remote requirement */
3569 return (conn->remote_auth & ~0x01) | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003570}
3571
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003572static void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003573{
3574 struct hci_ev_io_capa_request *ev = (void *) skb->data;
3575 struct hci_conn *conn;
3576
3577 BT_DBG("%s", hdev->name);
3578
3579 hci_dev_lock(hdev);
3580
3581 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003582 if (!conn)
3583 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02003584
Johan Hedberg03b555e2011-01-04 15:40:05 +02003585 hci_conn_hold(conn);
3586
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003587 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg03b555e2011-01-04 15:40:05 +02003588 goto unlock;
3589
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003590 if (test_bit(HCI_PAIRABLE, &hdev->dev_flags) ||
Gustavo Padovan807deac2012-05-17 00:36:24 -03003591 (conn->remote_auth & ~0x01) == HCI_AT_NO_BONDING) {
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003592 struct hci_cp_io_capability_reply cp;
3593
3594 bacpy(&cp.bdaddr, &ev->bdaddr);
Hemant Gupta7a7f1e72012-01-16 13:34:29 +05303595 /* Change the IO capability from KeyboardDisplay
3596 * to DisplayYesNo as it is not supported by BT spec. */
3597 cp.capability = (conn->io_capability == 0x04) ?
Mikel Astiza7676312013-06-28 10:56:29 +02003598 HCI_IO_DISPLAY_YESNO : conn->io_capability;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003599
3600 /* If we are initiators, there is no remote information yet */
3601 if (conn->remote_auth == 0xff) {
3602 cp.authentication = conn->auth_type;
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003603
Mikel Astizb16c6602014-04-08 14:21:34 +02003604 /* Request MITM protection if our IO caps allow it
Johan Hedberg4ad51a72014-06-09 14:41:25 +03003605 * except for the no-bonding case.
3606 * conn->auth_type is not updated here since
3607 * that might cause the user confirmation to be
3608 * rejected in case the remote doesn't have the
3609 * IO capabilities for MITM.
Mikel Astizb16c6602014-04-08 14:21:34 +02003610 */
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003611 if (conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Mikel Astizb16c6602014-04-08 14:21:34 +02003612 cp.authentication != HCI_AT_NO_BONDING)
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003613 cp.authentication |= 0x01;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003614 } else {
3615 conn->auth_type = hci_get_auth_req(conn);
3616 cp.authentication = conn->auth_type;
3617 }
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003618
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003619 if (hci_find_remote_oob_data(hdev, &conn->dst) &&
3620 (conn->out || test_bit(HCI_CONN_REMOTE_OOB, &conn->flags)))
Szymon Jancce85ee12011-03-22 13:12:23 +01003621 cp.oob_data = 0x01;
3622 else
3623 cp.oob_data = 0x00;
3624
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003625 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003626 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003627 } else {
3628 struct hci_cp_io_capability_neg_reply cp;
3629
3630 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003631 cp.reason = HCI_ERROR_PAIRING_NOT_ALLOWED;
Johan Hedberg03b555e2011-01-04 15:40:05 +02003632
3633 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003634 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003635 }
3636
3637unlock:
3638 hci_dev_unlock(hdev);
3639}
3640
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003641static void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *skb)
Johan Hedberg03b555e2011-01-04 15:40:05 +02003642{
3643 struct hci_ev_io_capa_reply *ev = (void *) skb->data;
3644 struct hci_conn *conn;
3645
3646 BT_DBG("%s", hdev->name);
3647
3648 hci_dev_lock(hdev);
3649
3650 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3651 if (!conn)
3652 goto unlock;
3653
Johan Hedberg03b555e2011-01-04 15:40:05 +02003654 conn->remote_cap = ev->capability;
Johan Hedberg03b555e2011-01-04 15:40:05 +02003655 conn->remote_auth = ev->authentication;
Johan Hedberg58a681e2012-01-16 06:47:28 +02003656 if (ev->oob_data)
3657 set_bit(HCI_CONN_REMOTE_OOB, &conn->flags);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003658
3659unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02003660 hci_dev_unlock(hdev);
3661}
3662
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003663static void hci_user_confirm_request_evt(struct hci_dev *hdev,
3664 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -03003665{
3666 struct hci_ev_user_confirm_req *ev = (void *) skb->data;
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003667 int loc_mitm, rem_mitm, confirm_hint = 0;
Johan Hedberg7a828902011-04-28 11:28:53 -07003668 struct hci_conn *conn;
Johan Hedberga5c29682011-02-19 12:05:57 -03003669
3670 BT_DBG("%s", hdev->name);
3671
3672 hci_dev_lock(hdev);
3673
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003674 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg7a828902011-04-28 11:28:53 -07003675 goto unlock;
Johan Hedberga5c29682011-02-19 12:05:57 -03003676
Johan Hedberg7a828902011-04-28 11:28:53 -07003677 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3678 if (!conn)
3679 goto unlock;
3680
3681 loc_mitm = (conn->auth_type & 0x01);
3682 rem_mitm = (conn->remote_auth & 0x01);
3683
3684 /* If we require MITM but the remote device can't provide that
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003685 * (it has NoInputNoOutput) then reject the confirmation request
3686 */
3687 if (loc_mitm && conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) {
Johan Hedberg7a828902011-04-28 11:28:53 -07003688 BT_DBG("Rejecting request: remote device can't provide MITM");
3689 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003690 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07003691 goto unlock;
3692 }
3693
3694 /* If no side requires MITM protection; auto-accept */
Mikel Astiza7676312013-06-28 10:56:29 +02003695 if ((!loc_mitm || conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) &&
3696 (!rem_mitm || conn->io_capability == HCI_IO_NO_INPUT_OUTPUT)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003697
3698 /* If we're not the initiators request authorization to
3699 * proceed from user space (mgmt_user_confirm with
Johan Hedbergba15a582014-06-09 13:58:14 +03003700 * confirm_hint set to 1). The exception is if neither
3701 * side had MITM in which case we do auto-accept.
3702 */
3703 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) &&
3704 (loc_mitm || rem_mitm)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003705 BT_DBG("Confirming auto-accept as acceptor");
3706 confirm_hint = 1;
3707 goto confirm;
3708 }
3709
Johan Hedberg9f616562011-04-28 11:28:54 -07003710 BT_DBG("Auto-accept of user confirmation with %ums delay",
Gustavo Padovan807deac2012-05-17 00:36:24 -03003711 hdev->auto_accept_delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07003712
3713 if (hdev->auto_accept_delay > 0) {
3714 int delay = msecs_to_jiffies(hdev->auto_accept_delay);
Johan Hedberg7bc18d92013-10-16 18:11:39 +03003715 queue_delayed_work(conn->hdev->workqueue,
3716 &conn->auto_accept_work, delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07003717 goto unlock;
3718 }
3719
Johan Hedberg7a828902011-04-28 11:28:53 -07003720 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003721 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07003722 goto unlock;
3723 }
3724
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003725confirm:
Johan Hedberg39adbff2014-03-20 08:18:14 +02003726 mgmt_user_confirm_request(hdev, &ev->bdaddr, ACL_LINK, 0,
3727 le32_to_cpu(ev->passkey), confirm_hint);
Johan Hedberg7a828902011-04-28 11:28:53 -07003728
3729unlock:
Johan Hedberga5c29682011-02-19 12:05:57 -03003730 hci_dev_unlock(hdev);
3731}
3732
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003733static void hci_user_passkey_request_evt(struct hci_dev *hdev,
3734 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -08003735{
3736 struct hci_ev_user_passkey_req *ev = (void *) skb->data;
3737
3738 BT_DBG("%s", hdev->name);
3739
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003740 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg272d90d2012-02-09 15:26:12 +02003741 mgmt_user_passkey_request(hdev, &ev->bdaddr, ACL_LINK, 0);
Brian Gix1143d452011-11-23 08:28:34 -08003742}
3743
Johan Hedberg92a25252012-09-06 18:39:26 +03003744static void hci_user_passkey_notify_evt(struct hci_dev *hdev,
3745 struct sk_buff *skb)
3746{
3747 struct hci_ev_user_passkey_notify *ev = (void *) skb->data;
3748 struct hci_conn *conn;
3749
3750 BT_DBG("%s", hdev->name);
3751
3752 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3753 if (!conn)
3754 return;
3755
3756 conn->passkey_notify = __le32_to_cpu(ev->passkey);
3757 conn->passkey_entered = 0;
3758
3759 if (test_bit(HCI_MGMT, &hdev->dev_flags))
3760 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
3761 conn->dst_type, conn->passkey_notify,
3762 conn->passkey_entered);
3763}
3764
3765static void hci_keypress_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
3766{
3767 struct hci_ev_keypress_notify *ev = (void *) skb->data;
3768 struct hci_conn *conn;
3769
3770 BT_DBG("%s", hdev->name);
3771
3772 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3773 if (!conn)
3774 return;
3775
3776 switch (ev->type) {
3777 case HCI_KEYPRESS_STARTED:
3778 conn->passkey_entered = 0;
3779 return;
3780
3781 case HCI_KEYPRESS_ENTERED:
3782 conn->passkey_entered++;
3783 break;
3784
3785 case HCI_KEYPRESS_ERASED:
3786 conn->passkey_entered--;
3787 break;
3788
3789 case HCI_KEYPRESS_CLEARED:
3790 conn->passkey_entered = 0;
3791 break;
3792
3793 case HCI_KEYPRESS_COMPLETED:
3794 return;
3795 }
3796
3797 if (test_bit(HCI_MGMT, &hdev->dev_flags))
3798 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
3799 conn->dst_type, conn->passkey_notify,
3800 conn->passkey_entered);
3801}
3802
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003803static void hci_simple_pair_complete_evt(struct hci_dev *hdev,
3804 struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003805{
3806 struct hci_ev_simple_pair_complete *ev = (void *) skb->data;
3807 struct hci_conn *conn;
3808
3809 BT_DBG("%s", hdev->name);
3810
3811 hci_dev_lock(hdev);
3812
3813 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg2a611692011-02-19 12:06:00 -03003814 if (!conn)
3815 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02003816
Johan Hedberg2a611692011-02-19 12:06:00 -03003817 /* To avoid duplicate auth_failed events to user space we check
3818 * the HCI_CONN_AUTH_PEND flag which will be set if we
3819 * initiated the authentication. A traditional auth_complete
3820 * event gets always produced as initiator and is also mapped to
3821 * the mgmt_auth_failed event */
Mikel Astizfa1bd912012-08-09 09:52:29 +02003822 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) && ev->status)
Johan Hedbergbab73cb2012-02-09 16:07:29 +02003823 mgmt_auth_failed(hdev, &conn->dst, conn->type, conn->dst_type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003824 ev->status);
Johan Hedberg2a611692011-02-19 12:06:00 -03003825
David Herrmann76a68ba2013-04-06 20:28:37 +02003826 hci_conn_drop(conn);
Johan Hedberg2a611692011-02-19 12:06:00 -03003827
3828unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02003829 hci_dev_unlock(hdev);
3830}
3831
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003832static void hci_remote_host_features_evt(struct hci_dev *hdev,
3833 struct sk_buff *skb)
Marcel Holtmann41a96212008-07-14 20:13:48 +02003834{
3835 struct hci_ev_remote_host_features *ev = (void *) skb->data;
3836 struct inquiry_entry *ie;
Johan Hedbergcad718e2013-04-17 15:00:51 +03003837 struct hci_conn *conn;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003838
3839 BT_DBG("%s", hdev->name);
3840
3841 hci_dev_lock(hdev);
3842
Johan Hedbergcad718e2013-04-17 15:00:51 +03003843 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3844 if (conn)
3845 memcpy(conn->features[1], ev->features, 8);
3846
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003847 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3848 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003849 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003850
3851 hci_dev_unlock(hdev);
3852}
3853
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003854static void hci_remote_oob_data_request_evt(struct hci_dev *hdev,
3855 struct sk_buff *skb)
Szymon Janc2763eda2011-03-22 13:12:22 +01003856{
3857 struct hci_ev_remote_oob_data_request *ev = (void *) skb->data;
3858 struct oob_data *data;
3859
3860 BT_DBG("%s", hdev->name);
3861
3862 hci_dev_lock(hdev);
3863
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003864 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Szymon Jance1ba1f12011-04-06 13:01:59 +02003865 goto unlock;
3866
Szymon Janc2763eda2011-03-22 13:12:22 +01003867 data = hci_find_remote_oob_data(hdev, &ev->bdaddr);
3868 if (data) {
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003869 if (test_bit(HCI_SC_ENABLED, &hdev->dev_flags)) {
3870 struct hci_cp_remote_oob_ext_data_reply cp;
Szymon Janc2763eda2011-03-22 13:12:22 +01003871
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003872 bacpy(&cp.bdaddr, &ev->bdaddr);
3873 memcpy(cp.hash192, data->hash192, sizeof(cp.hash192));
3874 memcpy(cp.randomizer192, data->randomizer192,
3875 sizeof(cp.randomizer192));
3876 memcpy(cp.hash256, data->hash256, sizeof(cp.hash256));
3877 memcpy(cp.randomizer256, data->randomizer256,
3878 sizeof(cp.randomizer256));
Szymon Janc2763eda2011-03-22 13:12:22 +01003879
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003880 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_EXT_DATA_REPLY,
3881 sizeof(cp), &cp);
3882 } else {
3883 struct hci_cp_remote_oob_data_reply cp;
3884
3885 bacpy(&cp.bdaddr, &ev->bdaddr);
3886 memcpy(cp.hash, data->hash192, sizeof(cp.hash));
3887 memcpy(cp.randomizer, data->randomizer192,
3888 sizeof(cp.randomizer));
3889
3890 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_REPLY,
3891 sizeof(cp), &cp);
3892 }
Szymon Janc2763eda2011-03-22 13:12:22 +01003893 } else {
3894 struct hci_cp_remote_oob_data_neg_reply cp;
3895
3896 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003897 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_NEG_REPLY,
3898 sizeof(cp), &cp);
Szymon Janc2763eda2011-03-22 13:12:22 +01003899 }
3900
Szymon Jance1ba1f12011-04-06 13:01:59 +02003901unlock:
Szymon Janc2763eda2011-03-22 13:12:22 +01003902 hci_dev_unlock(hdev);
3903}
3904
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003905static void hci_phy_link_complete_evt(struct hci_dev *hdev,
3906 struct sk_buff *skb)
3907{
3908 struct hci_ev_phy_link_complete *ev = (void *) skb->data;
3909 struct hci_conn *hcon, *bredr_hcon;
3910
3911 BT_DBG("%s handle 0x%2.2x status 0x%2.2x", hdev->name, ev->phy_handle,
3912 ev->status);
3913
3914 hci_dev_lock(hdev);
3915
3916 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
3917 if (!hcon) {
3918 hci_dev_unlock(hdev);
3919 return;
3920 }
3921
3922 if (ev->status) {
3923 hci_conn_del(hcon);
3924 hci_dev_unlock(hdev);
3925 return;
3926 }
3927
3928 bredr_hcon = hcon->amp_mgr->l2cap_conn->hcon;
3929
3930 hcon->state = BT_CONNECTED;
3931 bacpy(&hcon->dst, &bredr_hcon->dst);
3932
3933 hci_conn_hold(hcon);
3934 hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003935 hci_conn_drop(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003936
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003937 hci_conn_add_sysfs(hcon);
3938
Andrei Emeltchenkocf70ff22012-10-31 15:46:36 +02003939 amp_physical_cfm(bredr_hcon, hcon);
3940
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003941 hci_dev_unlock(hdev);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003942}
3943
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03003944static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
3945{
3946 struct hci_ev_logical_link_complete *ev = (void *) skb->data;
3947 struct hci_conn *hcon;
3948 struct hci_chan *hchan;
3949 struct amp_mgr *mgr;
3950
3951 BT_DBG("%s log_handle 0x%4.4x phy_handle 0x%2.2x status 0x%2.2x",
3952 hdev->name, le16_to_cpu(ev->handle), ev->phy_handle,
3953 ev->status);
3954
3955 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
3956 if (!hcon)
3957 return;
3958
3959 /* Create AMP hchan */
3960 hchan = hci_chan_create(hcon);
3961 if (!hchan)
3962 return;
3963
3964 hchan->handle = le16_to_cpu(ev->handle);
3965
3966 BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
3967
3968 mgr = hcon->amp_mgr;
3969 if (mgr && mgr->bredr_chan) {
3970 struct l2cap_chan *bredr_chan = mgr->bredr_chan;
3971
3972 l2cap_chan_lock(bredr_chan);
3973
3974 bredr_chan->conn->mtu = hdev->block_mtu;
3975 l2cap_logical_cfm(bredr_chan, hchan, 0);
3976 hci_conn_hold(hcon);
3977
3978 l2cap_chan_unlock(bredr_chan);
3979 }
3980}
3981
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02003982static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
3983 struct sk_buff *skb)
3984{
3985 struct hci_ev_disconn_logical_link_complete *ev = (void *) skb->data;
3986 struct hci_chan *hchan;
3987
3988 BT_DBG("%s log handle 0x%4.4x status 0x%2.2x", hdev->name,
3989 le16_to_cpu(ev->handle), ev->status);
3990
3991 if (ev->status)
3992 return;
3993
3994 hci_dev_lock(hdev);
3995
3996 hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
3997 if (!hchan)
3998 goto unlock;
3999
4000 amp_destroy_logical_link(hchan, ev->reason);
4001
4002unlock:
4003 hci_dev_unlock(hdev);
4004}
4005
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004006static void hci_disconn_phylink_complete_evt(struct hci_dev *hdev,
4007 struct sk_buff *skb)
4008{
4009 struct hci_ev_disconn_phy_link_complete *ev = (void *) skb->data;
4010 struct hci_conn *hcon;
4011
4012 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4013
4014 if (ev->status)
4015 return;
4016
4017 hci_dev_lock(hdev);
4018
4019 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4020 if (hcon) {
4021 hcon->state = BT_CLOSED;
4022 hci_conn_del(hcon);
4023 }
4024
4025 hci_dev_unlock(hdev);
4026}
4027
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004028static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004029{
4030 struct hci_ev_le_conn_complete *ev = (void *) skb->data;
4031 struct hci_conn *conn;
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004032 struct smp_irk *irk;
Ville Tervofcd89c02011-02-10 22:38:47 -03004033
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004034 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Ville Tervofcd89c02011-02-10 22:38:47 -03004035
4036 hci_dev_lock(hdev);
4037
Andre Guedesb47a09b2012-07-27 15:10:15 -03004038 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
Ville Tervob62f3282011-02-10 22:38:50 -03004039 if (!conn) {
4040 conn = hci_conn_add(hdev, LE_LINK, &ev->bdaddr);
4041 if (!conn) {
4042 BT_ERR("No memory for new connection");
Andre Guedes230fd162012-07-27 15:10:10 -03004043 goto unlock;
Ville Tervob62f3282011-02-10 22:38:50 -03004044 }
Andre Guedes29b79882011-05-31 14:20:54 -03004045
4046 conn->dst_type = ev->bdaddr_type;
Andre Guedesb9b343d2012-07-27 15:10:11 -03004047
4048 if (ev->role == LE_CONN_ROLE_MASTER) {
4049 conn->out = true;
Johan Hedberg4dae2792014-06-24 17:03:50 +03004050 set_bit(HCI_CONN_MASTER, &conn->flags);
Andre Guedesb9b343d2012-07-27 15:10:11 -03004051 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004052
4053 /* If we didn't have a hci_conn object previously
4054 * but we're in master role this must be something
4055 * initiated using a white list. Since white list based
4056 * connections are not "first class citizens" we don't
4057 * have full tracking of them. Therefore, we go ahead
4058 * with a "best effort" approach of determining the
4059 * initiator address based on the HCI_PRIVACY flag.
4060 */
4061 if (conn->out) {
4062 conn->resp_addr_type = ev->bdaddr_type;
4063 bacpy(&conn->resp_addr, &ev->bdaddr);
4064 if (test_bit(HCI_PRIVACY, &hdev->dev_flags)) {
4065 conn->init_addr_type = ADDR_LE_DEV_RANDOM;
4066 bacpy(&conn->init_addr, &hdev->rpa);
4067 } else {
4068 hci_copy_identity_address(hdev,
4069 &conn->init_addr,
4070 &conn->init_addr_type);
4071 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004072 }
Johan Hedberg9489eca2014-02-28 17:45:46 +02004073 } else {
4074 cancel_delayed_work(&conn->le_conn_timeout);
Ville Tervob62f3282011-02-10 22:38:50 -03004075 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004076
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004077 if (!conn->out) {
4078 /* Set the responder (our side) address type based on
4079 * the advertising address type.
4080 */
4081 conn->resp_addr_type = hdev->adv_addr_type;
4082 if (hdev->adv_addr_type == ADDR_LE_DEV_RANDOM)
4083 bacpy(&conn->resp_addr, &hdev->random_addr);
4084 else
4085 bacpy(&conn->resp_addr, &hdev->bdaddr);
4086
4087 conn->init_addr_type = ev->bdaddr_type;
4088 bacpy(&conn->init_addr, &ev->bdaddr);
Marcel Holtmanna720d732014-06-23 12:14:51 +02004089
4090 /* For incoming connections, set the default minimum
4091 * and maximum connection interval. They will be used
4092 * to check if the parameters are in range and if not
4093 * trigger the connection update procedure.
4094 */
4095 conn->le_conn_min_interval = hdev->le_conn_min_interval;
4096 conn->le_conn_max_interval = hdev->le_conn_max_interval;
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004097 }
Johan Hedberg7be2edb2014-02-23 19:42:17 +02004098
Marcel Holtmannedb4b462014-02-18 15:13:43 -08004099 /* Lookup the identity address from the stored connection
4100 * address and address type.
4101 *
4102 * When establishing connections to an identity address, the
4103 * connection procedure will store the resolvable random
4104 * address first. Now if it can be converted back into the
4105 * identity address, start using the identity address from
4106 * now on.
4107 */
4108 irk = hci_get_irk(hdev, &conn->dst, conn->dst_type);
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004109 if (irk) {
4110 bacpy(&conn->dst, &irk->bdaddr);
4111 conn->dst_type = irk->addr_type;
4112 }
4113
Andre Guedescd17dec2012-07-27 15:10:16 -03004114 if (ev->status) {
Andre Guedes06c053f2014-02-26 20:21:41 -03004115 hci_le_conn_failed(conn, ev->status);
Andre Guedescd17dec2012-07-27 15:10:16 -03004116 goto unlock;
4117 }
4118
Johan Hedbergb644ba32012-01-17 21:48:47 +02004119 if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Marcel Holtmann01fdb0f2014-02-18 14:22:19 -08004120 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03004121 conn->dst_type, 0, NULL, 0, NULL);
Vinicius Costa Gomes83bc71b2011-05-06 18:41:43 -03004122
Vinicius Costa Gomes7b5c0d52011-06-09 18:50:50 -03004123 conn->sec_level = BT_SECURITY_LOW;
Ville Tervofcd89c02011-02-10 22:38:47 -03004124 conn->handle = __le16_to_cpu(ev->handle);
4125 conn->state = BT_CONNECTED;
4126
Marcel Holtmanne04fde62014-06-23 11:40:04 +02004127 conn->le_conn_interval = le16_to_cpu(ev->interval);
4128 conn->le_conn_latency = le16_to_cpu(ev->latency);
4129 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4130
Ville Tervofcd89c02011-02-10 22:38:47 -03004131 hci_conn_add_sysfs(conn);
4132
4133 hci_proto_connect_cfm(conn, ev->status);
4134
Andre Guedesa4790db2014-02-26 20:21:47 -03004135 hci_pend_le_conn_del(hdev, &conn->dst, conn->dst_type);
4136
Ville Tervofcd89c02011-02-10 22:38:47 -03004137unlock:
4138 hci_dev_unlock(hdev);
4139}
4140
Marcel Holtmann1855d922014-06-23 11:40:05 +02004141static void hci_le_conn_update_complete_evt(struct hci_dev *hdev,
4142 struct sk_buff *skb)
4143{
4144 struct hci_ev_le_conn_update_complete *ev = (void *) skb->data;
4145 struct hci_conn *conn;
4146
4147 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4148
4149 if (ev->status)
4150 return;
4151
4152 hci_dev_lock(hdev);
4153
4154 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
4155 if (conn) {
4156 conn->le_conn_interval = le16_to_cpu(ev->interval);
4157 conn->le_conn_latency = le16_to_cpu(ev->latency);
4158 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4159 }
4160
4161 hci_dev_unlock(hdev);
4162}
4163
Andre Guedesa4790db2014-02-26 20:21:47 -03004164/* This function requires the caller holds hdev->lock */
4165static void check_pending_le_conn(struct hci_dev *hdev, bdaddr_t *addr,
4166 u8 addr_type)
4167{
4168 struct hci_conn *conn;
Andre Guedes5b906a82014-02-26 20:21:53 -03004169 struct smp_irk *irk;
4170
4171 /* If this is a resolvable address, we should resolve it and then
4172 * update address and address type variables.
4173 */
4174 irk = hci_get_irk(hdev, addr, addr_type);
4175 if (irk) {
4176 addr = &irk->bdaddr;
4177 addr_type = irk->addr_type;
4178 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004179
4180 if (!hci_pend_le_conn_lookup(hdev, addr, addr_type))
4181 return;
4182
4183 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
4184 HCI_AT_NO_BONDING);
4185 if (!IS_ERR(conn))
4186 return;
4187
4188 switch (PTR_ERR(conn)) {
4189 case -EBUSY:
4190 /* If hci_connect() returns -EBUSY it means there is already
4191 * an LE connection attempt going on. Since controllers don't
4192 * support more than one connection attempt at the time, we
4193 * don't consider this an error case.
4194 */
4195 break;
4196 default:
4197 BT_DBG("Failed to connect: err %ld", PTR_ERR(conn));
4198 }
4199}
4200
Johan Hedberg4af605d2014-03-24 10:48:00 +02004201static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
4202 u8 bdaddr_type, s8 rssi, u8 *data, u8 len)
4203{
Johan Hedbergb9a63282014-03-25 10:51:52 +02004204 struct discovery_state *d = &hdev->discovery;
Johan Hedberg474ee062014-03-25 14:34:59 +02004205 bool match;
Johan Hedbergb9a63282014-03-25 10:51:52 +02004206
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004207 /* Passive scanning shouldn't trigger any device found events */
4208 if (hdev->le_scan_type == LE_SCAN_PASSIVE) {
4209 if (type == LE_ADV_IND || type == LE_ADV_DIRECT_IND)
4210 check_pending_le_conn(hdev, bdaddr, bdaddr_type);
4211 return;
4212 }
Johan Hedberg4af605d2014-03-24 10:48:00 +02004213
Johan Hedbergb9a63282014-03-25 10:51:52 +02004214 /* If there's nothing pending either store the data from this
4215 * event or send an immediate device found event if the data
4216 * should not be stored for later.
4217 */
4218 if (!has_pending_adv_report(hdev)) {
4219 /* If the report will trigger a SCAN_REQ store it for
4220 * later merging.
4221 */
4222 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4223 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004224 rssi, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004225 return;
4226 }
4227
4228 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
4229 rssi, 0, 1, data, len, NULL, 0);
4230 return;
4231 }
4232
Johan Hedberg474ee062014-03-25 14:34:59 +02004233 /* Check if the pending report is for the same device as the new one */
4234 match = (!bacmp(bdaddr, &d->last_adv_addr) &&
4235 bdaddr_type == d->last_adv_addr_type);
4236
Johan Hedbergb9a63282014-03-25 10:51:52 +02004237 /* If the pending data doesn't match this report or this isn't a
4238 * scan response (e.g. we got a duplicate ADV_IND) then force
4239 * sending of the pending data.
4240 */
Johan Hedberg474ee062014-03-25 14:34:59 +02004241 if (type != LE_ADV_SCAN_RSP || !match) {
4242 /* Send out whatever is in the cache, but skip duplicates */
4243 if (!match)
4244 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004245 d->last_adv_addr_type, NULL,
4246 d->last_adv_rssi, 0, 1,
4247 d->last_adv_data,
Johan Hedberg474ee062014-03-25 14:34:59 +02004248 d->last_adv_data_len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004249
4250 /* If the new report will trigger a SCAN_REQ store it for
4251 * later merging.
4252 */
4253 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4254 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004255 rssi, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004256 return;
4257 }
4258
4259 /* The advertising reports cannot be merged, so clear
4260 * the pending report and send out a device found event.
4261 */
4262 clear_pending_adv_report(hdev);
Johan Hedberg5c5b93e2014-03-29 08:39:53 +02004263 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
4264 rssi, 0, 1, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004265 return;
4266 }
4267
4268 /* If we get here we've got a pending ADV_IND or ADV_SCAN_IND and
4269 * the new event is a SCAN_RSP. We can therefore proceed with
4270 * sending a merged device found event.
4271 */
4272 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Marcel Holtmann42bd6a52014-07-01 14:11:19 +02004273 d->last_adv_addr_type, NULL, rssi, 0, 1,
4274 d->last_adv_data, d->last_adv_data_len, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004275 clear_pending_adv_report(hdev);
Johan Hedberg4af605d2014-03-24 10:48:00 +02004276}
4277
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004278static void hci_le_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andre Guedes9aa04c92011-05-26 16:23:51 -03004279{
Andre Guedese95beb42011-09-26 20:48:35 -03004280 u8 num_reports = skb->data[0];
4281 void *ptr = &skb->data[1];
Andre Guedes9aa04c92011-05-26 16:23:51 -03004282
Andre Guedesa4790db2014-02-26 20:21:47 -03004283 hci_dev_lock(hdev);
4284
Andre Guedese95beb42011-09-26 20:48:35 -03004285 while (num_reports--) {
4286 struct hci_ev_le_advertising_info *ev = ptr;
Johan Hedberg4af605d2014-03-24 10:48:00 +02004287 s8 rssi;
Andre Guedesa4790db2014-02-26 20:21:47 -03004288
Andre Guedes3c9e9192012-01-10 18:20:50 -03004289 rssi = ev->data[ev->length];
Johan Hedberg4af605d2014-03-24 10:48:00 +02004290 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
4291 ev->bdaddr_type, rssi, ev->data, ev->length);
Andre Guedes3c9e9192012-01-10 18:20:50 -03004292
Andre Guedese95beb42011-09-26 20:48:35 -03004293 ptr += sizeof(*ev) + ev->length + 1;
Andre Guedes9aa04c92011-05-26 16:23:51 -03004294 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004295
4296 hci_dev_unlock(hdev);
Andre Guedes9aa04c92011-05-26 16:23:51 -03004297}
4298
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004299static void hci_le_ltk_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004300{
4301 struct hci_ev_le_ltk_req *ev = (void *) skb->data;
4302 struct hci_cp_le_ltk_reply cp;
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004303 struct hci_cp_le_ltk_neg_reply neg;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004304 struct hci_conn *conn;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004305 struct smp_ltk *ltk;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004306
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004307 BT_DBG("%s handle 0x%4.4x", hdev->name, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004308
4309 hci_dev_lock(hdev);
4310
4311 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004312 if (conn == NULL)
4313 goto not_found;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004314
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08004315 ltk = hci_find_ltk(hdev, ev->ediv, ev->rand, conn->out);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004316 if (ltk == NULL)
4317 goto not_found;
4318
4319 memcpy(cp.ltk, ltk->val, sizeof(ltk->val));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004320 cp.handle = cpu_to_le16(conn->handle);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004321
4322 if (ltk->authenticated)
Andre Guedesf8776212013-07-31 16:25:28 -03004323 conn->pending_sec_level = BT_SECURITY_HIGH;
4324 else
4325 conn->pending_sec_level = BT_SECURITY_MEDIUM;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004326
Andre Guedes89cbb4d2013-07-31 16:25:29 -03004327 conn->enc_key_size = ltk->enc_size;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004328
4329 hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp);
4330
Claudio Takahasi5981a882013-07-25 16:34:24 -03004331 /* Ref. Bluetooth Core SPEC pages 1975 and 2004. STK is a
4332 * temporary key used to encrypt a connection following
4333 * pairing. It is used during the Encrypted Session Setup to
4334 * distribute the keys. Later, security can be re-established
4335 * using a distributed LTK.
4336 */
Johan Hedberg2ceba532014-06-16 19:25:16 +03004337 if (ltk->type == SMP_STK) {
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004338 list_del(&ltk->list);
4339 kfree(ltk);
4340 }
4341
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004342 hci_dev_unlock(hdev);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004343
4344 return;
4345
4346not_found:
4347 neg.handle = ev->handle;
4348 hci_send_cmd(hdev, HCI_OP_LE_LTK_NEG_REPLY, sizeof(neg), &neg);
4349 hci_dev_unlock(hdev);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004350}
4351
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004352static void hci_le_meta_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004353{
4354 struct hci_ev_le_meta *le_ev = (void *) skb->data;
4355
4356 skb_pull(skb, sizeof(*le_ev));
4357
4358 switch (le_ev->subevent) {
4359 case HCI_EV_LE_CONN_COMPLETE:
4360 hci_le_conn_complete_evt(hdev, skb);
4361 break;
4362
Marcel Holtmann1855d922014-06-23 11:40:05 +02004363 case HCI_EV_LE_CONN_UPDATE_COMPLETE:
4364 hci_le_conn_update_complete_evt(hdev, skb);
4365 break;
4366
Andre Guedes9aa04c92011-05-26 16:23:51 -03004367 case HCI_EV_LE_ADVERTISING_REPORT:
4368 hci_le_adv_report_evt(hdev, skb);
4369 break;
4370
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004371 case HCI_EV_LE_LTK_REQ:
4372 hci_le_ltk_request_evt(hdev, skb);
4373 break;
4374
Ville Tervofcd89c02011-02-10 22:38:47 -03004375 default:
4376 break;
4377 }
4378}
4379
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03004380static void hci_chan_selected_evt(struct hci_dev *hdev, struct sk_buff *skb)
4381{
4382 struct hci_ev_channel_selected *ev = (void *) skb->data;
4383 struct hci_conn *hcon;
4384
4385 BT_DBG("%s handle 0x%2.2x", hdev->name, ev->phy_handle);
4386
4387 skb_pull(skb, sizeof(*ev));
4388
4389 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4390 if (!hcon)
4391 return;
4392
4393 amp_read_loc_assoc_final_data(hdev, hcon);
4394}
4395
Linus Torvalds1da177e2005-04-16 15:20:36 -07004396void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
4397{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004398 struct hci_event_hdr *hdr = (void *) skb->data;
4399 __u8 event = hdr->evt;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004400
Johan Hedbergb6ddb632013-04-02 13:34:31 +03004401 hci_dev_lock(hdev);
4402
4403 /* Received events are (currently) only needed when a request is
4404 * ongoing so avoid unnecessary memory allocation.
4405 */
4406 if (hdev->req_status == HCI_REQ_PEND) {
4407 kfree_skb(hdev->recv_evt);
4408 hdev->recv_evt = skb_clone(skb, GFP_KERNEL);
4409 }
4410
4411 hci_dev_unlock(hdev);
4412
Linus Torvalds1da177e2005-04-16 15:20:36 -07004413 skb_pull(skb, HCI_EVENT_HDR_SIZE);
4414
Johan Hedberg02350a72013-04-03 21:50:29 +03004415 if (hdev->sent_cmd && bt_cb(hdev->sent_cmd)->req.event == event) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02004416 struct hci_command_hdr *cmd_hdr = (void *) hdev->sent_cmd->data;
4417 u16 opcode = __le16_to_cpu(cmd_hdr->opcode);
Johan Hedberg02350a72013-04-03 21:50:29 +03004418
4419 hci_req_cmd_complete(hdev, opcode, 0);
4420 }
4421
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004422 switch (event) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004423 case HCI_EV_INQUIRY_COMPLETE:
4424 hci_inquiry_complete_evt(hdev, skb);
4425 break;
4426
4427 case HCI_EV_INQUIRY_RESULT:
4428 hci_inquiry_result_evt(hdev, skb);
4429 break;
4430
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004431 case HCI_EV_CONN_COMPLETE:
4432 hci_conn_complete_evt(hdev, skb);
Marcel Holtmann21d9e302005-09-13 01:32:25 +02004433 break;
4434
Linus Torvalds1da177e2005-04-16 15:20:36 -07004435 case HCI_EV_CONN_REQUEST:
4436 hci_conn_request_evt(hdev, skb);
4437 break;
4438
Linus Torvalds1da177e2005-04-16 15:20:36 -07004439 case HCI_EV_DISCONN_COMPLETE:
4440 hci_disconn_complete_evt(hdev, skb);
4441 break;
4442
Linus Torvalds1da177e2005-04-16 15:20:36 -07004443 case HCI_EV_AUTH_COMPLETE:
4444 hci_auth_complete_evt(hdev, skb);
4445 break;
4446
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004447 case HCI_EV_REMOTE_NAME:
4448 hci_remote_name_evt(hdev, skb);
4449 break;
4450
Linus Torvalds1da177e2005-04-16 15:20:36 -07004451 case HCI_EV_ENCRYPT_CHANGE:
4452 hci_encrypt_change_evt(hdev, skb);
4453 break;
4454
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004455 case HCI_EV_CHANGE_LINK_KEY_COMPLETE:
4456 hci_change_link_key_complete_evt(hdev, skb);
4457 break;
4458
4459 case HCI_EV_REMOTE_FEATURES:
4460 hci_remote_features_evt(hdev, skb);
4461 break;
4462
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004463 case HCI_EV_CMD_COMPLETE:
4464 hci_cmd_complete_evt(hdev, skb);
4465 break;
4466
4467 case HCI_EV_CMD_STATUS:
4468 hci_cmd_status_evt(hdev, skb);
4469 break;
4470
4471 case HCI_EV_ROLE_CHANGE:
4472 hci_role_change_evt(hdev, skb);
4473 break;
4474
4475 case HCI_EV_NUM_COMP_PKTS:
4476 hci_num_comp_pkts_evt(hdev, skb);
4477 break;
4478
4479 case HCI_EV_MODE_CHANGE:
4480 hci_mode_change_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004481 break;
4482
4483 case HCI_EV_PIN_CODE_REQ:
4484 hci_pin_code_request_evt(hdev, skb);
4485 break;
4486
4487 case HCI_EV_LINK_KEY_REQ:
4488 hci_link_key_request_evt(hdev, skb);
4489 break;
4490
4491 case HCI_EV_LINK_KEY_NOTIFY:
4492 hci_link_key_notify_evt(hdev, skb);
4493 break;
4494
4495 case HCI_EV_CLOCK_OFFSET:
4496 hci_clock_offset_evt(hdev, skb);
4497 break;
4498
Marcel Holtmanna8746412008-07-14 20:13:46 +02004499 case HCI_EV_PKT_TYPE_CHANGE:
4500 hci_pkt_type_change_evt(hdev, skb);
4501 break;
4502
Marcel Holtmann85a1e932005-08-09 20:28:02 -07004503 case HCI_EV_PSCAN_REP_MODE:
4504 hci_pscan_rep_mode_evt(hdev, skb);
4505 break;
4506
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004507 case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
4508 hci_inquiry_result_with_rssi_evt(hdev, skb);
4509 break;
4510
4511 case HCI_EV_REMOTE_EXT_FEATURES:
4512 hci_remote_ext_features_evt(hdev, skb);
4513 break;
4514
4515 case HCI_EV_SYNC_CONN_COMPLETE:
4516 hci_sync_conn_complete_evt(hdev, skb);
4517 break;
4518
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004519 case HCI_EV_EXTENDED_INQUIRY_RESULT:
4520 hci_extended_inquiry_result_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004521 break;
4522
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004523 case HCI_EV_KEY_REFRESH_COMPLETE:
4524 hci_key_refresh_complete_evt(hdev, skb);
4525 break;
4526
Marcel Holtmann04936842008-07-14 20:13:48 +02004527 case HCI_EV_IO_CAPA_REQUEST:
4528 hci_io_capa_request_evt(hdev, skb);
4529 break;
4530
Johan Hedberg03b555e2011-01-04 15:40:05 +02004531 case HCI_EV_IO_CAPA_REPLY:
4532 hci_io_capa_reply_evt(hdev, skb);
4533 break;
4534
Johan Hedberga5c29682011-02-19 12:05:57 -03004535 case HCI_EV_USER_CONFIRM_REQUEST:
4536 hci_user_confirm_request_evt(hdev, skb);
4537 break;
4538
Brian Gix1143d452011-11-23 08:28:34 -08004539 case HCI_EV_USER_PASSKEY_REQUEST:
4540 hci_user_passkey_request_evt(hdev, skb);
4541 break;
4542
Johan Hedberg92a25252012-09-06 18:39:26 +03004543 case HCI_EV_USER_PASSKEY_NOTIFY:
4544 hci_user_passkey_notify_evt(hdev, skb);
4545 break;
4546
4547 case HCI_EV_KEYPRESS_NOTIFY:
4548 hci_keypress_notify_evt(hdev, skb);
4549 break;
4550
Marcel Holtmann04936842008-07-14 20:13:48 +02004551 case HCI_EV_SIMPLE_PAIR_COMPLETE:
4552 hci_simple_pair_complete_evt(hdev, skb);
4553 break;
4554
Marcel Holtmann41a96212008-07-14 20:13:48 +02004555 case HCI_EV_REMOTE_HOST_FEATURES:
4556 hci_remote_host_features_evt(hdev, skb);
4557 break;
4558
Ville Tervofcd89c02011-02-10 22:38:47 -03004559 case HCI_EV_LE_META:
4560 hci_le_meta_evt(hdev, skb);
4561 break;
4562
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03004563 case HCI_EV_CHANNEL_SELECTED:
4564 hci_chan_selected_evt(hdev, skb);
4565 break;
4566
Szymon Janc2763eda2011-03-22 13:12:22 +01004567 case HCI_EV_REMOTE_OOB_DATA_REQUEST:
4568 hci_remote_oob_data_request_evt(hdev, skb);
4569 break;
4570
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004571 case HCI_EV_PHY_LINK_COMPLETE:
4572 hci_phy_link_complete_evt(hdev, skb);
4573 break;
4574
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004575 case HCI_EV_LOGICAL_LINK_COMPLETE:
4576 hci_loglink_complete_evt(hdev, skb);
4577 break;
4578
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02004579 case HCI_EV_DISCONN_LOGICAL_LINK_COMPLETE:
4580 hci_disconn_loglink_complete_evt(hdev, skb);
4581 break;
4582
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004583 case HCI_EV_DISCONN_PHY_LINK_COMPLETE:
4584 hci_disconn_phylink_complete_evt(hdev, skb);
4585 break;
4586
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02004587 case HCI_EV_NUM_COMP_BLOCKS:
4588 hci_num_comp_blocks_evt(hdev, skb);
4589 break;
4590
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004591 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004592 BT_DBG("%s event 0x%2.2x", hdev->name, event);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004593 break;
4594 }
4595
4596 kfree_skb(skb);
4597 hdev->stat.evt_rx++;
4598}