blob: 643c5a8d40505eab337f34432729597d22ff481a [file] [log] [blame]
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 BlueZ - Bluetooth protocol stack for Linux
Ron Shaffer2d0a0342010-05-28 11:53:46 -04003 Copyright (c) 2000-2001, 2010, Code Aurora Forum. All rights reserved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
10
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090015 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Linus Torvalds1da177e2005-04-16 15:20:36 -070018 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090020 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 SOFTWARE IS DISCLAIMED.
23*/
24
25/* Bluetooth HCI event handling. */
26
Linus Torvalds1da177e2005-04-16 15:20:36 -070027#include <asm/unaligned.h>
28
29#include <net/bluetooth/bluetooth.h>
30#include <net/bluetooth/hci_core.h>
Mikel Astizf0d6a0e2012-08-09 09:52:30 +020031#include <net/bluetooth/mgmt.h>
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070032
Marcel Holtmann70247282013-10-10 14:54:15 -070033#include "a2mp.h"
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070034#include "amp.h"
Johan Hedberg2ceba532014-06-16 19:25:16 +030035#include "smp.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070036
Linus Torvalds1da177e2005-04-16 15:20:36 -070037/* Handle HCI Event packets */
38
Marcel Holtmanna9de9242007-10-20 13:33:56 +020039static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070040{
Marcel Holtmanna9de9242007-10-20 13:33:56 +020041 __u8 status = *((__u8 *) skb->data);
Linus Torvalds1da177e2005-04-16 15:20:36 -070042
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030043 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -070044
Andre Guedes82f47852013-04-30 15:29:34 -030045 if (status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +020046 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -070047
Andre Guedes89352e72011-11-04 14:16:53 -030048 clear_bit(HCI_INQUIRY, &hdev->flags);
Peter Zijlstra4e857c52014-03-17 18:06:10 +010049 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -030050 wake_up_bit(&hdev->flags, HCI_INQUIRY);
Andre Guedes89352e72011-11-04 14:16:53 -030051
Johan Hedberg50143a42014-06-10 14:05:57 +030052 hci_dev_lock(hdev);
53 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
54 hci_dev_unlock(hdev);
55
Marcel Holtmanna9de9242007-10-20 13:33:56 +020056 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -070057}
58
Andre Guedes4d934832012-03-21 00:03:35 -030059static void hci_cc_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
60{
61 __u8 status = *((__u8 *) skb->data);
62
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030063 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesae854a72012-03-21 00:03:36 -030064
65 if (status)
66 return;
67
68 set_bit(HCI_PERIODIC_INQ, &hdev->dev_flags);
Andre Guedes4d934832012-03-21 00:03:35 -030069}
70
Marcel Holtmanna9de9242007-10-20 13:33:56 +020071static void hci_cc_exit_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070072{
Marcel Holtmanna9de9242007-10-20 13:33:56 +020073 __u8 status = *((__u8 *) skb->data);
74
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030075 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +020076
77 if (status)
78 return;
79
Andre Guedesae854a72012-03-21 00:03:36 -030080 clear_bit(HCI_PERIODIC_INQ, &hdev->dev_flags);
81
Marcel Holtmanna9de9242007-10-20 13:33:56 +020082 hci_conn_check_pending(hdev);
83}
84
Gustavo Padovan807deac2012-05-17 00:36:24 -030085static void hci_cc_remote_name_req_cancel(struct hci_dev *hdev,
86 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +020087{
88 BT_DBG("%s", hdev->name);
89}
90
91static void hci_cc_role_discovery(struct hci_dev *hdev, struct sk_buff *skb)
92{
93 struct hci_rp_role_discovery *rp = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -070094 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -070095
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030096 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -070097
Marcel Holtmanna9de9242007-10-20 13:33:56 +020098 if (rp->status)
99 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700100
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200101 hci_dev_lock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200103 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
104 if (conn) {
105 if (rp->role)
Johan Hedberg4dae2792014-06-24 17:03:50 +0300106 clear_bit(HCI_CONN_MASTER, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200107 else
Johan Hedberg4dae2792014-06-24 17:03:50 +0300108 set_bit(HCI_CONN_MASTER, &conn->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700109 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200110
111 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112}
113
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200114static void hci_cc_read_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
115{
116 struct hci_rp_read_link_policy *rp = (void *) skb->data;
117 struct hci_conn *conn;
118
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300119 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200120
121 if (rp->status)
122 return;
123
124 hci_dev_lock(hdev);
125
126 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
127 if (conn)
128 conn->link_policy = __le16_to_cpu(rp->policy);
129
130 hci_dev_unlock(hdev);
131}
132
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200133static void hci_cc_write_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700134{
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200135 struct hci_rp_write_link_policy *rp = (void *) skb->data;
136 struct hci_conn *conn;
137 void *sent;
138
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300139 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200140
141 if (rp->status)
142 return;
143
144 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LINK_POLICY);
145 if (!sent)
146 return;
147
148 hci_dev_lock(hdev);
149
150 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200151 if (conn)
Harvey Harrison83985312008-05-02 16:25:46 -0700152 conn->link_policy = get_unaligned_le16(sent + 2);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200153
154 hci_dev_unlock(hdev);
155}
156
Gustavo Padovan807deac2012-05-17 00:36:24 -0300157static void hci_cc_read_def_link_policy(struct hci_dev *hdev,
158 struct sk_buff *skb)
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200159{
160 struct hci_rp_read_def_link_policy *rp = (void *) skb->data;
161
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300162 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200163
164 if (rp->status)
165 return;
166
167 hdev->link_policy = __le16_to_cpu(rp->policy);
168}
169
Gustavo Padovan807deac2012-05-17 00:36:24 -0300170static void hci_cc_write_def_link_policy(struct hci_dev *hdev,
171 struct sk_buff *skb)
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200172{
173 __u8 status = *((__u8 *) skb->data);
174 void *sent;
175
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300176 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200177
178 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_DEF_LINK_POLICY);
179 if (!sent)
180 return;
181
182 if (!status)
183 hdev->link_policy = get_unaligned_le16(sent);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200184}
185
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200186static void hci_cc_reset(struct hci_dev *hdev, struct sk_buff *skb)
187{
188 __u8 status = *((__u8 *) skb->data);
189
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300190 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200191
Gustavo F. Padovan10572132011-03-16 15:36:29 -0300192 clear_bit(HCI_RESET, &hdev->flags);
193
Johan Hedberga297e972012-02-21 17:55:47 +0200194 /* Reset all non-persistent flags */
Johan Hedberg2cc6fb02013-03-15 17:06:57 -0500195 hdev->dev_flags &= ~HCI_PERSISTENT_MASK;
Andre Guedes69775ff2012-02-23 16:50:05 +0200196
197 hdev->discovery.state = DISCOVERY_STOPPED;
Johan Hedbergbbaf4442012-11-08 01:22:59 +0100198 hdev->inq_tx_power = HCI_TX_POWER_INVALID;
199 hdev->adv_tx_power = HCI_TX_POWER_INVALID;
Johan Hedberg3f0f5242012-11-08 01:23:00 +0100200
201 memset(hdev->adv_data, 0, sizeof(hdev->adv_data));
202 hdev->adv_data_len = 0;
Marcel Holtmannf8e808b2013-10-16 00:16:47 -0700203
204 memset(hdev->scan_rsp_data, 0, sizeof(hdev->scan_rsp_data));
205 hdev->scan_rsp_data_len = 0;
Marcel Holtmann06f5b772013-10-19 07:09:11 -0700206
Marcel Holtmann533553f2014-03-21 12:18:10 -0700207 hdev->le_scan_type = LE_SCAN_PASSIVE;
208
Marcel Holtmann06f5b772013-10-19 07:09:11 -0700209 hdev->ssp_debug_mode = 0;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200210}
211
212static void hci_cc_write_local_name(struct hci_dev *hdev, struct sk_buff *skb)
213{
214 __u8 status = *((__u8 *) skb->data);
215 void *sent;
216
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300217 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200218
219 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LOCAL_NAME);
220 if (!sent)
221 return;
222
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200223 hci_dev_lock(hdev);
224
Johan Hedbergf51d5b22012-02-22 18:17:32 +0200225 if (test_bit(HCI_MGMT, &hdev->dev_flags))
226 mgmt_set_local_name_complete(hdev, sent, status);
Johan Hedberg28cc7bd2012-02-22 21:06:55 +0200227 else if (!status)
228 memcpy(hdev->dev_name, sent, HCI_MAX_NAME_LENGTH);
Johan Hedbergf51d5b22012-02-22 18:17:32 +0200229
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200230 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200231}
232
233static void hci_cc_read_local_name(struct hci_dev *hdev, struct sk_buff *skb)
234{
235 struct hci_rp_read_local_name *rp = (void *) skb->data;
236
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300237 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200238
239 if (rp->status)
240 return;
241
Johan Hedbergdb99b5f2012-02-22 20:14:22 +0200242 if (test_bit(HCI_SETUP, &hdev->dev_flags))
243 memcpy(hdev->dev_name, rp->name, HCI_MAX_NAME_LENGTH);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200244}
245
246static void hci_cc_write_auth_enable(struct hci_dev *hdev, struct sk_buff *skb)
247{
248 __u8 status = *((__u8 *) skb->data);
249 void *sent;
250
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300251 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200252
253 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_AUTH_ENABLE);
254 if (!sent)
255 return;
256
257 if (!status) {
258 __u8 param = *((__u8 *) sent);
259
260 if (param == AUTH_ENABLED)
261 set_bit(HCI_AUTH, &hdev->flags);
262 else
263 clear_bit(HCI_AUTH, &hdev->flags);
264 }
265
Johan Hedberg33ef95e2012-02-16 23:56:27 +0200266 if (test_bit(HCI_MGMT, &hdev->dev_flags))
267 mgmt_auth_enable_complete(hdev, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200268}
269
270static void hci_cc_write_encrypt_mode(struct hci_dev *hdev, struct sk_buff *skb)
271{
272 __u8 status = *((__u8 *) skb->data);
273 void *sent;
274
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300275 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200276
277 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_ENCRYPT_MODE);
278 if (!sent)
279 return;
280
281 if (!status) {
282 __u8 param = *((__u8 *) sent);
283
284 if (param)
285 set_bit(HCI_ENCRYPT, &hdev->flags);
286 else
287 clear_bit(HCI_ENCRYPT, &hdev->flags);
288 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200289}
290
291static void hci_cc_write_scan_enable(struct hci_dev *hdev, struct sk_buff *skb)
292{
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200293 __u8 param, status = *((__u8 *) skb->data);
294 int old_pscan, old_iscan;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200295 void *sent;
296
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300297 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200298
299 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SCAN_ENABLE);
300 if (!sent)
301 return;
302
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200303 param = *((__u8 *) sent);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200304
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200305 hci_dev_lock(hdev);
306
Mikel Astizfa1bd912012-08-09 09:52:29 +0200307 if (status) {
Johan Hedberg744cf192011-11-08 20:40:14 +0200308 mgmt_write_scan_failed(hdev, param, status);
Johan Hedberg2d7cee52011-11-07 22:16:03 +0200309 hdev->discov_timeout = 0;
310 goto done;
311 }
312
Johan Hedberg0663ca22013-10-02 13:43:14 +0300313 /* We need to ensure that we set this back on if someone changed
314 * the scan mode through a raw HCI socket.
315 */
316 set_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);
317
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200318 old_pscan = test_and_clear_bit(HCI_PSCAN, &hdev->flags);
319 old_iscan = test_and_clear_bit(HCI_ISCAN, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200320
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200321 if (param & SCAN_INQUIRY) {
322 set_bit(HCI_ISCAN, &hdev->flags);
323 if (!old_iscan)
Johan Hedberg744cf192011-11-08 20:40:14 +0200324 mgmt_discoverable(hdev, 1);
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200325 } else if (old_iscan)
Johan Hedberg744cf192011-11-08 20:40:14 +0200326 mgmt_discoverable(hdev, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200327
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200328 if (param & SCAN_PAGE) {
329 set_bit(HCI_PSCAN, &hdev->flags);
330 if (!old_pscan)
Johan Hedberg744cf192011-11-08 20:40:14 +0200331 mgmt_connectable(hdev, 1);
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200332 } else if (old_pscan)
Johan Hedberg744cf192011-11-08 20:40:14 +0200333 mgmt_connectable(hdev, 0);
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200334
335done:
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200336 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200337}
338
339static void hci_cc_read_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
340{
341 struct hci_rp_read_class_of_dev *rp = (void *) skb->data;
342
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300343 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200344
345 if (rp->status)
346 return;
347
348 memcpy(hdev->dev_class, rp->dev_class, 3);
349
350 BT_DBG("%s class 0x%.2x%.2x%.2x", hdev->name,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300351 hdev->dev_class[2], hdev->dev_class[1], hdev->dev_class[0]);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200352}
353
354static void hci_cc_write_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
355{
356 __u8 status = *((__u8 *) skb->data);
357 void *sent;
358
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300359 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200360
361 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_CLASS_OF_DEV);
362 if (!sent)
363 return;
364
Marcel Holtmann7f9a9032012-02-22 18:38:01 +0100365 hci_dev_lock(hdev);
366
367 if (status == 0)
368 memcpy(hdev->dev_class, sent, 3);
369
370 if (test_bit(HCI_MGMT, &hdev->dev_flags))
371 mgmt_set_class_of_dev_complete(hdev, sent, status);
372
373 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200374}
375
376static void hci_cc_read_voice_setting(struct hci_dev *hdev, struct sk_buff *skb)
377{
378 struct hci_rp_read_voice_setting *rp = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700379 __u16 setting;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200380
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300381 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200382
383 if (rp->status)
384 return;
385
386 setting = __le16_to_cpu(rp->voice_setting);
387
Marcel Holtmannf383f272008-07-14 20:13:47 +0200388 if (hdev->voice_setting == setting)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200389 return;
390
391 hdev->voice_setting = setting;
392
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300393 BT_DBG("%s voice setting 0x%4.4x", hdev->name, setting);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200394
Gustavo F. Padovan3c547112011-12-14 22:58:44 -0200395 if (hdev->notify)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200396 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200397}
398
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300399static void hci_cc_write_voice_setting(struct hci_dev *hdev,
400 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200401{
402 __u8 status = *((__u8 *) skb->data);
Marcel Holtmannf383f272008-07-14 20:13:47 +0200403 __u16 setting;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700404 void *sent;
405
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300406 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700407
Marcel Holtmannf383f272008-07-14 20:13:47 +0200408 if (status)
409 return;
410
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200411 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_VOICE_SETTING);
412 if (!sent)
413 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700414
Marcel Holtmannf383f272008-07-14 20:13:47 +0200415 setting = get_unaligned_le16(sent);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416
Marcel Holtmannf383f272008-07-14 20:13:47 +0200417 if (hdev->voice_setting == setting)
418 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700419
Marcel Holtmannf383f272008-07-14 20:13:47 +0200420 hdev->voice_setting = setting;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700421
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300422 BT_DBG("%s voice setting 0x%4.4x", hdev->name, setting);
Marcel Holtmannf383f272008-07-14 20:13:47 +0200423
Gustavo F. Padovan3c547112011-12-14 22:58:44 -0200424 if (hdev->notify)
Marcel Holtmannf383f272008-07-14 20:13:47 +0200425 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700426}
427
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -0700428static void hci_cc_read_num_supported_iac(struct hci_dev *hdev,
429 struct sk_buff *skb)
430{
431 struct hci_rp_read_num_supported_iac *rp = (void *) skb->data;
432
433 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
434
435 if (rp->status)
436 return;
437
438 hdev->num_iac = rp->num_iac;
439
440 BT_DBG("%s num iac %d", hdev->name, hdev->num_iac);
441}
442
Marcel Holtmann333140b2008-07-14 20:13:48 +0200443static void hci_cc_write_ssp_mode(struct hci_dev *hdev, struct sk_buff *skb)
444{
445 __u8 status = *((__u8 *) skb->data);
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300446 struct hci_cp_write_ssp_mode *sent;
Marcel Holtmann333140b2008-07-14 20:13:48 +0200447
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300448 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann333140b2008-07-14 20:13:48 +0200449
Marcel Holtmann333140b2008-07-14 20:13:48 +0200450 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SSP_MODE);
451 if (!sent)
452 return;
453
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300454 if (!status) {
455 if (sent->mode)
Johan Hedbergcad718e2013-04-17 15:00:51 +0300456 hdev->features[1][0] |= LMP_HOST_SSP;
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300457 else
Johan Hedbergcad718e2013-04-17 15:00:51 +0300458 hdev->features[1][0] &= ~LMP_HOST_SSP;
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300459 }
460
Johan Hedberged2c4ee2012-02-17 00:56:28 +0200461 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300462 mgmt_ssp_enable_complete(hdev, sent->mode, status);
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200463 else if (!status) {
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300464 if (sent->mode)
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200465 set_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
466 else
467 clear_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
468 }
Marcel Holtmann333140b2008-07-14 20:13:48 +0200469}
470
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800471static void hci_cc_write_sc_support(struct hci_dev *hdev, struct sk_buff *skb)
472{
473 u8 status = *((u8 *) skb->data);
474 struct hci_cp_write_sc_support *sent;
475
476 BT_DBG("%s status 0x%2.2x", hdev->name, status);
477
478 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SC_SUPPORT);
479 if (!sent)
480 return;
481
482 if (!status) {
483 if (sent->support)
484 hdev->features[1][0] |= LMP_HOST_SC;
485 else
486 hdev->features[1][0] &= ~LMP_HOST_SC;
487 }
488
489 if (test_bit(HCI_MGMT, &hdev->dev_flags))
490 mgmt_sc_enable_complete(hdev, sent->support, status);
491 else if (!status) {
492 if (sent->support)
493 set_bit(HCI_SC_ENABLED, &hdev->dev_flags);
494 else
495 clear_bit(HCI_SC_ENABLED, &hdev->dev_flags);
496 }
497}
498
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200499static void hci_cc_read_local_version(struct hci_dev *hdev, struct sk_buff *skb)
500{
501 struct hci_rp_read_local_version *rp = (void *) skb->data;
502
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300503 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200504
505 if (rp->status)
Johan Hedberg42c6b122013-03-05 20:37:49 +0200506 return;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200507
Marcel Holtmann0d5551f2013-10-18 12:04:50 -0700508 if (test_bit(HCI_SETUP, &hdev->dev_flags)) {
509 hdev->hci_ver = rp->hci_ver;
510 hdev->hci_rev = __le16_to_cpu(rp->hci_rev);
511 hdev->lmp_ver = rp->lmp_ver;
512 hdev->manufacturer = __le16_to_cpu(rp->manufacturer);
513 hdev->lmp_subver = __le16_to_cpu(rp->lmp_subver);
514 }
Johan Hedbergd5859e22011-01-25 01:19:58 +0200515}
516
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300517static void hci_cc_read_local_commands(struct hci_dev *hdev,
518 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200519{
520 struct hci_rp_read_local_commands *rp = (void *) skb->data;
521
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300522 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200523
Marcel Holtmann6a070e62013-10-31 04:54:33 -0700524 if (rp->status)
525 return;
526
527 if (test_bit(HCI_SETUP, &hdev->dev_flags))
Johan Hedberg2177bab2013-03-05 20:37:43 +0200528 memcpy(hdev->commands, rp->commands, sizeof(hdev->commands));
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200529}
530
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300531static void hci_cc_read_local_features(struct hci_dev *hdev,
532 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200533{
534 struct hci_rp_read_local_features *rp = (void *) skb->data;
535
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300536 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200537
538 if (rp->status)
539 return;
540
541 memcpy(hdev->features, rp->features, 8);
542
543 /* Adjust default settings according to features
544 * supported by device. */
545
Johan Hedbergcad718e2013-04-17 15:00:51 +0300546 if (hdev->features[0][0] & LMP_3SLOT)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200547 hdev->pkt_type |= (HCI_DM3 | HCI_DH3);
548
Johan Hedbergcad718e2013-04-17 15:00:51 +0300549 if (hdev->features[0][0] & LMP_5SLOT)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200550 hdev->pkt_type |= (HCI_DM5 | HCI_DH5);
551
Johan Hedbergcad718e2013-04-17 15:00:51 +0300552 if (hdev->features[0][1] & LMP_HV2) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200553 hdev->pkt_type |= (HCI_HV2);
554 hdev->esco_type |= (ESCO_HV2);
555 }
556
Johan Hedbergcad718e2013-04-17 15:00:51 +0300557 if (hdev->features[0][1] & LMP_HV3) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200558 hdev->pkt_type |= (HCI_HV3);
559 hdev->esco_type |= (ESCO_HV3);
560 }
561
Andre Guedes45db810f2012-07-24 15:03:49 -0300562 if (lmp_esco_capable(hdev))
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200563 hdev->esco_type |= (ESCO_EV3);
564
Johan Hedbergcad718e2013-04-17 15:00:51 +0300565 if (hdev->features[0][4] & LMP_EV4)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200566 hdev->esco_type |= (ESCO_EV4);
567
Johan Hedbergcad718e2013-04-17 15:00:51 +0300568 if (hdev->features[0][4] & LMP_EV5)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200569 hdev->esco_type |= (ESCO_EV5);
570
Johan Hedbergcad718e2013-04-17 15:00:51 +0300571 if (hdev->features[0][5] & LMP_EDR_ESCO_2M)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100572 hdev->esco_type |= (ESCO_2EV3);
573
Johan Hedbergcad718e2013-04-17 15:00:51 +0300574 if (hdev->features[0][5] & LMP_EDR_ESCO_3M)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100575 hdev->esco_type |= (ESCO_3EV3);
576
Johan Hedbergcad718e2013-04-17 15:00:51 +0300577 if (hdev->features[0][5] & LMP_EDR_3S_ESCO)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100578 hdev->esco_type |= (ESCO_2EV5 | ESCO_3EV5);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200579}
580
Andre Guedes971e3a42011-06-30 19:20:52 -0300581static void hci_cc_read_local_ext_features(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300582 struct sk_buff *skb)
Andre Guedes971e3a42011-06-30 19:20:52 -0300583{
584 struct hci_rp_read_local_ext_features *rp = (void *) skb->data;
585
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300586 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andre Guedes971e3a42011-06-30 19:20:52 -0300587
588 if (rp->status)
Johan Hedberg42c6b122013-03-05 20:37:49 +0200589 return;
Andre Guedes971e3a42011-06-30 19:20:52 -0300590
Marcel Holtmann57af75a2013-10-18 12:04:47 -0700591 if (hdev->max_page < rp->max_page)
592 hdev->max_page = rp->max_page;
Johan Hedbergd2c5d772013-04-17 15:00:52 +0300593
Johan Hedbergcad718e2013-04-17 15:00:51 +0300594 if (rp->page < HCI_MAX_PAGES)
595 memcpy(hdev->features[rp->page], rp->features, 8);
Andre Guedes971e3a42011-06-30 19:20:52 -0300596}
597
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200598static void hci_cc_read_flow_control_mode(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300599 struct sk_buff *skb)
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200600{
601 struct hci_rp_read_flow_control_mode *rp = (void *) skb->data;
602
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300603 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200604
Johan Hedberg42c6b122013-03-05 20:37:49 +0200605 if (!rp->status)
606 hdev->flow_ctl_mode = rp->mode;
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200607}
608
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200609static void hci_cc_read_buffer_size(struct hci_dev *hdev, struct sk_buff *skb)
610{
611 struct hci_rp_read_buffer_size *rp = (void *) skb->data;
612
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300613 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200614
615 if (rp->status)
616 return;
617
618 hdev->acl_mtu = __le16_to_cpu(rp->acl_mtu);
619 hdev->sco_mtu = rp->sco_mtu;
620 hdev->acl_pkts = __le16_to_cpu(rp->acl_max_pkt);
621 hdev->sco_pkts = __le16_to_cpu(rp->sco_max_pkt);
622
623 if (test_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks)) {
624 hdev->sco_mtu = 64;
625 hdev->sco_pkts = 8;
626 }
627
628 hdev->acl_cnt = hdev->acl_pkts;
629 hdev->sco_cnt = hdev->sco_pkts;
630
Gustavo Padovan807deac2012-05-17 00:36:24 -0300631 BT_DBG("%s acl mtu %d:%d sco mtu %d:%d", hdev->name, hdev->acl_mtu,
632 hdev->acl_pkts, hdev->sco_mtu, hdev->sco_pkts);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200633}
634
635static void hci_cc_read_bd_addr(struct hci_dev *hdev, struct sk_buff *skb)
636{
637 struct hci_rp_read_bd_addr *rp = (void *) skb->data;
638
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300639 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200640
641 if (!rp->status)
642 bacpy(&hdev->bdaddr, &rp->bdaddr);
Johan Hedberg23bb5762010-12-21 23:01:27 +0200643}
644
Johan Hedbergf332ec62013-03-15 17:07:11 -0500645static void hci_cc_read_page_scan_activity(struct hci_dev *hdev,
646 struct sk_buff *skb)
647{
648 struct hci_rp_read_page_scan_activity *rp = (void *) skb->data;
649
650 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
651
652 if (test_bit(HCI_INIT, &hdev->flags) && !rp->status) {
653 hdev->page_scan_interval = __le16_to_cpu(rp->interval);
654 hdev->page_scan_window = __le16_to_cpu(rp->window);
655 }
656}
657
Johan Hedberg4a3ee762013-03-15 17:07:12 -0500658static void hci_cc_write_page_scan_activity(struct hci_dev *hdev,
659 struct sk_buff *skb)
660{
661 u8 status = *((u8 *) skb->data);
662 struct hci_cp_write_page_scan_activity *sent;
663
664 BT_DBG("%s status 0x%2.2x", hdev->name, status);
665
666 if (status)
667 return;
668
669 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY);
670 if (!sent)
671 return;
672
673 hdev->page_scan_interval = __le16_to_cpu(sent->interval);
674 hdev->page_scan_window = __le16_to_cpu(sent->window);
675}
676
Johan Hedbergf332ec62013-03-15 17:07:11 -0500677static void hci_cc_read_page_scan_type(struct hci_dev *hdev,
678 struct sk_buff *skb)
679{
680 struct hci_rp_read_page_scan_type *rp = (void *) skb->data;
681
682 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
683
684 if (test_bit(HCI_INIT, &hdev->flags) && !rp->status)
685 hdev->page_scan_type = rp->type;
686}
687
Johan Hedberg4a3ee762013-03-15 17:07:12 -0500688static void hci_cc_write_page_scan_type(struct hci_dev *hdev,
689 struct sk_buff *skb)
690{
691 u8 status = *((u8 *) skb->data);
692 u8 *type;
693
694 BT_DBG("%s status 0x%2.2x", hdev->name, status);
695
696 if (status)
697 return;
698
699 type = hci_sent_cmd_data(hdev, HCI_OP_WRITE_PAGE_SCAN_TYPE);
700 if (type)
701 hdev->page_scan_type = *type;
702}
703
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200704static void hci_cc_read_data_block_size(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300705 struct sk_buff *skb)
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200706{
707 struct hci_rp_read_data_block_size *rp = (void *) skb->data;
708
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300709 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200710
711 if (rp->status)
712 return;
713
714 hdev->block_mtu = __le16_to_cpu(rp->max_acl_len);
715 hdev->block_len = __le16_to_cpu(rp->block_len);
716 hdev->num_blocks = __le16_to_cpu(rp->num_blocks);
717
718 hdev->block_cnt = hdev->num_blocks;
719
720 BT_DBG("%s blk mtu %d cnt %d len %d", hdev->name, hdev->block_mtu,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300721 hdev->block_cnt, hdev->block_len);
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200722}
723
Johan Hedberg33f35722014-06-28 17:54:06 +0300724static void hci_cc_read_clock(struct hci_dev *hdev, struct sk_buff *skb)
725{
726 struct hci_rp_read_clock *rp = (void *) skb->data;
727 struct hci_cp_read_clock *cp;
728 struct hci_conn *conn;
729
730 BT_DBG("%s", hdev->name);
731
732 if (skb->len < sizeof(*rp))
733 return;
734
735 if (rp->status)
736 return;
737
738 hci_dev_lock(hdev);
739
740 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_CLOCK);
741 if (!cp)
742 goto unlock;
743
744 if (cp->which == 0x00) {
745 hdev->clock = le32_to_cpu(rp->clock);
746 goto unlock;
747 }
748
749 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
750 if (conn) {
751 conn->clock = le32_to_cpu(rp->clock);
752 conn->clock_accuracy = le16_to_cpu(rp->accuracy);
753 }
754
755unlock:
756 hci_dev_unlock(hdev);
757}
758
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300759static void hci_cc_read_local_amp_info(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300760 struct sk_buff *skb)
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300761{
762 struct hci_rp_read_local_amp_info *rp = (void *) skb->data;
763
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300764 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300765
766 if (rp->status)
Andrei Emeltchenko8e2a0d92012-09-27 17:26:08 +0300767 goto a2mp_rsp;
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300768
769 hdev->amp_status = rp->amp_status;
770 hdev->amp_total_bw = __le32_to_cpu(rp->total_bw);
771 hdev->amp_max_bw = __le32_to_cpu(rp->max_bw);
772 hdev->amp_min_latency = __le32_to_cpu(rp->min_latency);
773 hdev->amp_max_pdu = __le32_to_cpu(rp->max_pdu);
774 hdev->amp_type = rp->amp_type;
775 hdev->amp_pal_cap = __le16_to_cpu(rp->pal_cap);
776 hdev->amp_assoc_size = __le16_to_cpu(rp->max_assoc_size);
777 hdev->amp_be_flush_to = __le32_to_cpu(rp->be_flush_to);
778 hdev->amp_max_flush_to = __le32_to_cpu(rp->max_flush_to);
779
Andrei Emeltchenko8e2a0d92012-09-27 17:26:08 +0300780a2mp_rsp:
781 a2mp_send_getinfo_rsp(hdev);
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300782}
783
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300784static void hci_cc_read_local_amp_assoc(struct hci_dev *hdev,
785 struct sk_buff *skb)
786{
787 struct hci_rp_read_local_amp_assoc *rp = (void *) skb->data;
788 struct amp_assoc *assoc = &hdev->loc_assoc;
789 size_t rem_len, frag_len;
790
791 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
792
793 if (rp->status)
794 goto a2mp_rsp;
795
796 frag_len = skb->len - sizeof(*rp);
797 rem_len = __le16_to_cpu(rp->rem_len);
798
799 if (rem_len > frag_len) {
Andrei Emeltchenko2e430be32012-09-28 14:44:23 +0300800 BT_DBG("frag_len %zu rem_len %zu", frag_len, rem_len);
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300801
802 memcpy(assoc->data + assoc->offset, rp->frag, frag_len);
803 assoc->offset += frag_len;
804
805 /* Read other fragments */
806 amp_read_loc_assoc_frag(hdev, rp->phy_handle);
807
808 return;
809 }
810
811 memcpy(assoc->data + assoc->offset, rp->frag, rem_len);
812 assoc->len = assoc->offset + rem_len;
813 assoc->offset = 0;
814
815a2mp_rsp:
816 /* Send A2MP Rsp when all fragments are received */
817 a2mp_send_getampassoc_rsp(hdev, rp->status);
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +0300818 a2mp_send_create_phy_link_req(hdev, rp->status);
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300819}
820
Johan Hedbergd5859e22011-01-25 01:19:58 +0200821static void hci_cc_read_inq_rsp_tx_power(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300822 struct sk_buff *skb)
Johan Hedbergd5859e22011-01-25 01:19:58 +0200823{
Marcel Holtmann91c4e9b2012-03-11 19:27:21 -0700824 struct hci_rp_read_inq_rsp_tx_power *rp = (void *) skb->data;
Johan Hedbergd5859e22011-01-25 01:19:58 +0200825
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300826 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedbergd5859e22011-01-25 01:19:58 +0200827
Marcel Holtmann91c4e9b2012-03-11 19:27:21 -0700828 if (!rp->status)
829 hdev->inq_tx_power = rp->tx_power;
Johan Hedbergd5859e22011-01-25 01:19:58 +0200830}
831
Johan Hedberg980e1a52011-01-22 06:10:07 +0200832static void hci_cc_pin_code_reply(struct hci_dev *hdev, struct sk_buff *skb)
833{
834 struct hci_rp_pin_code_reply *rp = (void *) skb->data;
835 struct hci_cp_pin_code_reply *cp;
836 struct hci_conn *conn;
837
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300838 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200839
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200840 hci_dev_lock(hdev);
841
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200842 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg744cf192011-11-08 20:40:14 +0200843 mgmt_pin_code_reply_complete(hdev, &rp->bdaddr, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200844
Mikel Astizfa1bd912012-08-09 09:52:29 +0200845 if (rp->status)
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200846 goto unlock;
Johan Hedberg980e1a52011-01-22 06:10:07 +0200847
848 cp = hci_sent_cmd_data(hdev, HCI_OP_PIN_CODE_REPLY);
849 if (!cp)
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200850 goto unlock;
Johan Hedberg980e1a52011-01-22 06:10:07 +0200851
852 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
853 if (conn)
854 conn->pin_length = cp->pin_len;
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200855
856unlock:
857 hci_dev_unlock(hdev);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200858}
859
860static void hci_cc_pin_code_neg_reply(struct hci_dev *hdev, struct sk_buff *skb)
861{
862 struct hci_rp_pin_code_neg_reply *rp = (void *) skb->data;
863
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300864 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200865
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200866 hci_dev_lock(hdev);
867
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200868 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg744cf192011-11-08 20:40:14 +0200869 mgmt_pin_code_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300870 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200871
872 hci_dev_unlock(hdev);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200873}
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200874
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300875static void hci_cc_le_read_buffer_size(struct hci_dev *hdev,
876 struct sk_buff *skb)
877{
878 struct hci_rp_le_read_buffer_size *rp = (void *) skb->data;
879
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300880 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300881
882 if (rp->status)
883 return;
884
885 hdev->le_mtu = __le16_to_cpu(rp->le_mtu);
886 hdev->le_pkts = rp->le_max_pkt;
887
888 hdev->le_cnt = hdev->le_pkts;
889
890 BT_DBG("%s le mtu %d:%d", hdev->name, hdev->le_mtu, hdev->le_pkts);
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300891}
Johan Hedberg980e1a52011-01-22 06:10:07 +0200892
Johan Hedberg60e77322013-01-22 14:01:59 +0200893static void hci_cc_le_read_local_features(struct hci_dev *hdev,
894 struct sk_buff *skb)
895{
896 struct hci_rp_le_read_local_features *rp = (void *) skb->data;
897
898 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
899
900 if (!rp->status)
901 memcpy(hdev->le_features, rp->features, 8);
Johan Hedberg60e77322013-01-22 14:01:59 +0200902}
903
Johan Hedberg8fa19092012-10-19 20:57:49 +0300904static void hci_cc_le_read_adv_tx_power(struct hci_dev *hdev,
905 struct sk_buff *skb)
906{
907 struct hci_rp_le_read_adv_tx_power *rp = (void *) skb->data;
908
909 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
910
Johan Hedberg04b4edc2013-03-15 17:07:01 -0500911 if (!rp->status)
Johan Hedberg8fa19092012-10-19 20:57:49 +0300912 hdev->adv_tx_power = rp->tx_power;
Johan Hedberg8fa19092012-10-19 20:57:49 +0300913}
914
Johan Hedberga5c29682011-02-19 12:05:57 -0300915static void hci_cc_user_confirm_reply(struct hci_dev *hdev, struct sk_buff *skb)
916{
917 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
918
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300919 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberga5c29682011-02-19 12:05:57 -0300920
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200921 hci_dev_lock(hdev);
922
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200923 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300924 mgmt_user_confirm_reply_complete(hdev, &rp->bdaddr, ACL_LINK, 0,
925 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200926
927 hci_dev_unlock(hdev);
Johan Hedberga5c29682011-02-19 12:05:57 -0300928}
929
930static void hci_cc_user_confirm_neg_reply(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300931 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -0300932{
933 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
934
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300935 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberga5c29682011-02-19 12:05:57 -0300936
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200937 hci_dev_lock(hdev);
938
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200939 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg744cf192011-11-08 20:40:14 +0200940 mgmt_user_confirm_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300941 ACL_LINK, 0, rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200942
943 hci_dev_unlock(hdev);
Johan Hedberga5c29682011-02-19 12:05:57 -0300944}
945
Brian Gix1143d452011-11-23 08:28:34 -0800946static void hci_cc_user_passkey_reply(struct hci_dev *hdev, struct sk_buff *skb)
947{
948 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
949
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300950 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800951
952 hci_dev_lock(hdev);
953
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200954 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg272d90d2012-02-09 15:26:12 +0200955 mgmt_user_passkey_reply_complete(hdev, &rp->bdaddr, ACL_LINK,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300956 0, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800957
958 hci_dev_unlock(hdev);
959}
960
961static void hci_cc_user_passkey_neg_reply(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300962 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -0800963{
964 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
965
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300966 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800967
968 hci_dev_lock(hdev);
969
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200970 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Brian Gix1143d452011-11-23 08:28:34 -0800971 mgmt_user_passkey_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300972 ACL_LINK, 0, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800973
974 hci_dev_unlock(hdev);
975}
976
Marcel Holtmann4d2d2792014-01-10 02:07:26 -0800977static void hci_cc_read_local_oob_data(struct hci_dev *hdev,
978 struct sk_buff *skb)
Szymon Jancc35938b2011-03-22 13:12:21 +0100979{
980 struct hci_rp_read_local_oob_data *rp = (void *) skb->data;
981
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300982 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Szymon Jancc35938b2011-03-22 13:12:21 +0100983
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200984 hci_dev_lock(hdev);
Marcel Holtmann4d2d2792014-01-10 02:07:26 -0800985 mgmt_read_local_oob_data_complete(hdev, rp->hash, rp->randomizer,
986 NULL, NULL, rp->status);
987 hci_dev_unlock(hdev);
988}
989
990static void hci_cc_read_local_oob_ext_data(struct hci_dev *hdev,
991 struct sk_buff *skb)
992{
993 struct hci_rp_read_local_oob_ext_data *rp = (void *) skb->data;
994
995 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
996
997 hci_dev_lock(hdev);
998 mgmt_read_local_oob_data_complete(hdev, rp->hash192, rp->randomizer192,
999 rp->hash256, rp->randomizer256,
1000 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001001 hci_dev_unlock(hdev);
Szymon Jancc35938b2011-03-22 13:12:21 +01001002}
1003
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001004
1005static void hci_cc_le_set_random_addr(struct hci_dev *hdev, struct sk_buff *skb)
1006{
1007 __u8 status = *((__u8 *) skb->data);
1008 bdaddr_t *sent;
1009
1010 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1011
1012 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_RANDOM_ADDR);
1013 if (!sent)
1014 return;
1015
1016 hci_dev_lock(hdev);
1017
1018 if (!status)
1019 bacpy(&hdev->random_addr, sent);
1020
1021 hci_dev_unlock(hdev);
1022}
1023
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001024static void hci_cc_le_set_adv_enable(struct hci_dev *hdev, struct sk_buff *skb)
1025{
1026 __u8 *sent, status = *((__u8 *) skb->data);
1027
1028 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1029
1030 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_ENABLE);
1031 if (!sent)
1032 return;
1033
Johan Hedberg3c857752014-03-25 10:30:49 +02001034 if (status)
1035 return;
1036
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001037 hci_dev_lock(hdev);
1038
Johan Hedberg3c857752014-03-25 10:30:49 +02001039 /* If we're doing connection initation as peripheral. Set a
1040 * timeout in case something goes wrong.
1041 */
1042 if (*sent) {
1043 struct hci_conn *conn;
1044
1045 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
1046 if (conn)
1047 queue_delayed_work(hdev->workqueue,
1048 &conn->le_conn_timeout,
1049 HCI_LE_CONN_TIMEOUT);
1050 }
1051
1052 mgmt_advertising(hdev, *sent);
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001053
Johan Hedberg04b4edc2013-03-15 17:07:01 -05001054 hci_dev_unlock(hdev);
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001055}
1056
Marcel Holtmann533553f2014-03-21 12:18:10 -07001057static void hci_cc_le_set_scan_param(struct hci_dev *hdev, struct sk_buff *skb)
1058{
1059 struct hci_cp_le_set_scan_param *cp;
1060 __u8 status = *((__u8 *) skb->data);
1061
1062 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1063
1064 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_PARAM);
1065 if (!cp)
1066 return;
1067
1068 hci_dev_lock(hdev);
1069
1070 if (!status)
1071 hdev->le_scan_type = cp->type;
1072
1073 hci_dev_unlock(hdev);
1074}
1075
Johan Hedbergb9a63282014-03-25 10:51:52 +02001076static bool has_pending_adv_report(struct hci_dev *hdev)
1077{
1078 struct discovery_state *d = &hdev->discovery;
1079
1080 return bacmp(&d->last_adv_addr, BDADDR_ANY);
1081}
1082
1083static void clear_pending_adv_report(struct hci_dev *hdev)
1084{
1085 struct discovery_state *d = &hdev->discovery;
1086
1087 bacpy(&d->last_adv_addr, BDADDR_ANY);
1088 d->last_adv_data_len = 0;
1089}
1090
1091static void store_pending_adv_report(struct hci_dev *hdev, bdaddr_t *bdaddr,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001092 u8 bdaddr_type, s8 rssi, u32 flags,
1093 u8 *data, u8 len)
Johan Hedbergb9a63282014-03-25 10:51:52 +02001094{
1095 struct discovery_state *d = &hdev->discovery;
1096
1097 bacpy(&d->last_adv_addr, bdaddr);
1098 d->last_adv_addr_type = bdaddr_type;
Johan Hedbergff5cd292014-03-25 14:40:52 +02001099 d->last_adv_rssi = rssi;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001100 d->last_adv_flags = flags;
Johan Hedbergb9a63282014-03-25 10:51:52 +02001101 memcpy(d->last_adv_data, data, len);
1102 d->last_adv_data_len = len;
1103}
1104
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001105static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001106 struct sk_buff *skb)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001107{
1108 struct hci_cp_le_set_scan_enable *cp;
1109 __u8 status = *((__u8 *) skb->data);
1110
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001111 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001112
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001113 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_ENABLE);
1114 if (!cp)
1115 return;
1116
Andre Guedes3fd319b2013-04-30 15:29:36 -03001117 if (status)
1118 return;
1119
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001120 switch (cp->enable) {
Andre Guedes76a388b2013-04-04 20:21:02 -03001121 case LE_SCAN_ENABLE:
Andre Guedesd23264a2011-11-25 20:53:38 -03001122 set_bit(HCI_LE_SCAN, &hdev->dev_flags);
Johan Hedbergb9a63282014-03-25 10:51:52 +02001123 if (hdev->le_scan_type == LE_SCAN_ACTIVE)
1124 clear_pending_adv_report(hdev);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001125 break;
1126
Andre Guedes76a388b2013-04-04 20:21:02 -03001127 case LE_SCAN_DISABLE:
Johan Hedbergb9a63282014-03-25 10:51:52 +02001128 /* We do this here instead of when setting DISCOVERY_STOPPED
1129 * since the latter would potentially require waiting for
1130 * inquiry to stop too.
1131 */
1132 if (has_pending_adv_report(hdev)) {
1133 struct discovery_state *d = &hdev->discovery;
1134
1135 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001136 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001137 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001138 d->last_adv_data,
Johan Hedbergb9a63282014-03-25 10:51:52 +02001139 d->last_adv_data_len, NULL, 0);
1140 }
1141
Johan Hedberg317ac8c2014-02-28 20:26:12 +02001142 /* Cancel this timer so that we don't try to disable scanning
1143 * when it's already disabled.
1144 */
1145 cancel_delayed_work(&hdev->le_scan_disable);
1146
Andre Guedesd23264a2011-11-25 20:53:38 -03001147 clear_bit(HCI_LE_SCAN, &hdev->dev_flags);
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001148 /* The HCI_LE_SCAN_INTERRUPTED flag indicates that we
1149 * interrupted scanning due to a connect request. Mark
1150 * therefore discovery as stopped.
1151 */
1152 if (test_and_clear_bit(HCI_LE_SCAN_INTERRUPTED,
1153 &hdev->dev_flags))
1154 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001155 break;
1156
1157 default:
1158 BT_ERR("Used reserved LE_Scan_Enable param %d", cp->enable);
1159 break;
Andre Guedes35815082011-05-26 16:23:53 -03001160 }
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001161}
1162
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001163static void hci_cc_le_read_white_list_size(struct hci_dev *hdev,
1164 struct sk_buff *skb)
1165{
1166 struct hci_rp_le_read_white_list_size *rp = (void *) skb->data;
1167
1168 BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size);
1169
1170 if (!rp->status)
1171 hdev->le_white_list_size = rp->size;
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001172}
1173
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001174static void hci_cc_le_clear_white_list(struct hci_dev *hdev,
1175 struct sk_buff *skb)
1176{
1177 __u8 status = *((__u8 *) skb->data);
1178
1179 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1180
1181 if (!status)
1182 hci_white_list_clear(hdev);
1183}
1184
1185static void hci_cc_le_add_to_white_list(struct hci_dev *hdev,
1186 struct sk_buff *skb)
1187{
1188 struct hci_cp_le_add_to_white_list *sent;
1189 __u8 status = *((__u8 *) skb->data);
1190
1191 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1192
1193 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_ADD_TO_WHITE_LIST);
1194 if (!sent)
1195 return;
1196
1197 if (!status)
1198 hci_white_list_add(hdev, &sent->bdaddr, sent->bdaddr_type);
1199}
1200
1201static void hci_cc_le_del_from_white_list(struct hci_dev *hdev,
1202 struct sk_buff *skb)
1203{
1204 struct hci_cp_le_del_from_white_list *sent;
1205 __u8 status = *((__u8 *) skb->data);
1206
1207 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1208
1209 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_DEL_FROM_WHITE_LIST);
1210 if (!sent)
1211 return;
1212
1213 if (!status)
1214 hci_white_list_del(hdev, &sent->bdaddr, sent->bdaddr_type);
1215}
1216
Johan Hedberg9b008c02013-01-22 14:02:01 +02001217static void hci_cc_le_read_supported_states(struct hci_dev *hdev,
1218 struct sk_buff *skb)
1219{
1220 struct hci_rp_le_read_supported_states *rp = (void *) skb->data;
1221
1222 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1223
1224 if (!rp->status)
1225 memcpy(hdev->le_states, rp->le_states, 8);
Johan Hedberg9b008c02013-01-22 14:02:01 +02001226}
1227
Gustavo Padovan6039aa732012-05-23 04:04:18 -03001228static void hci_cc_write_le_host_supported(struct hci_dev *hdev,
1229 struct sk_buff *skb)
Andre Guedesf9b49302011-06-30 19:20:53 -03001230{
Johan Hedberg06199cf2012-02-22 16:37:11 +02001231 struct hci_cp_write_le_host_supported *sent;
Andre Guedesf9b49302011-06-30 19:20:53 -03001232 __u8 status = *((__u8 *) skb->data);
1233
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001234 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesf9b49302011-06-30 19:20:53 -03001235
Johan Hedberg06199cf2012-02-22 16:37:11 +02001236 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001237 if (!sent)
Andre Guedesf9b49302011-06-30 19:20:53 -03001238 return;
1239
Johan Hedberg8f984df2012-02-28 01:07:22 +02001240 if (!status) {
Johan Hedberg416a4ae2013-09-25 13:26:08 +03001241 if (sent->le) {
Johan Hedbergcad718e2013-04-17 15:00:51 +03001242 hdev->features[1][0] |= LMP_HOST_LE;
Johan Hedberg416a4ae2013-09-25 13:26:08 +03001243 set_bit(HCI_LE_ENABLED, &hdev->dev_flags);
1244 } else {
Johan Hedbergcad718e2013-04-17 15:00:51 +03001245 hdev->features[1][0] &= ~LMP_HOST_LE;
Johan Hedberg416a4ae2013-09-25 13:26:08 +03001246 clear_bit(HCI_LE_ENABLED, &hdev->dev_flags);
Johan Hedbergf3d3444a2013-10-05 12:01:04 +02001247 clear_bit(HCI_ADVERTISING, &hdev->dev_flags);
Johan Hedberg416a4ae2013-09-25 13:26:08 +03001248 }
Johan Hedberg53b2caa2012-10-24 21:11:59 +03001249
1250 if (sent->simul)
Johan Hedbergcad718e2013-04-17 15:00:51 +03001251 hdev->features[1][0] |= LMP_HOST_LE_BREDR;
Johan Hedberg53b2caa2012-10-24 21:11:59 +03001252 else
Johan Hedbergcad718e2013-04-17 15:00:51 +03001253 hdev->features[1][0] &= ~LMP_HOST_LE_BREDR;
Johan Hedberg8f984df2012-02-28 01:07:22 +02001254 }
Andre Guedesf9b49302011-06-30 19:20:53 -03001255}
1256
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02001257static void hci_cc_set_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
1258{
1259 struct hci_cp_le_set_adv_param *cp;
1260 u8 status = *((u8 *) skb->data);
1261
1262 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1263
1264 if (status)
1265 return;
1266
1267 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_PARAM);
1268 if (!cp)
1269 return;
1270
1271 hci_dev_lock(hdev);
1272 hdev->adv_addr_type = cp->own_address_type;
1273 hci_dev_unlock(hdev);
1274}
1275
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001276static void hci_cc_write_remote_amp_assoc(struct hci_dev *hdev,
1277 struct sk_buff *skb)
1278{
1279 struct hci_rp_write_remote_amp_assoc *rp = (void *) skb->data;
1280
1281 BT_DBG("%s status 0x%2.2x phy_handle 0x%2.2x",
1282 hdev->name, rp->status, rp->phy_handle);
1283
1284 if (rp->status)
1285 return;
1286
1287 amp_write_rem_assoc_continue(hdev, rp->phy_handle);
1288}
1289
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02001290static void hci_cc_read_rssi(struct hci_dev *hdev, struct sk_buff *skb)
1291{
1292 struct hci_rp_read_rssi *rp = (void *) skb->data;
1293 struct hci_conn *conn;
1294
1295 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1296
1297 if (rp->status)
1298 return;
1299
1300 hci_dev_lock(hdev);
1301
1302 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
1303 if (conn)
1304 conn->rssi = rp->rssi;
1305
1306 hci_dev_unlock(hdev);
1307}
1308
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001309static void hci_cc_read_tx_power(struct hci_dev *hdev, struct sk_buff *skb)
1310{
1311 struct hci_cp_read_tx_power *sent;
1312 struct hci_rp_read_tx_power *rp = (void *) skb->data;
1313 struct hci_conn *conn;
1314
1315 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1316
1317 if (rp->status)
1318 return;
1319
1320 sent = hci_sent_cmd_data(hdev, HCI_OP_READ_TX_POWER);
1321 if (!sent)
1322 return;
1323
1324 hci_dev_lock(hdev);
1325
1326 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001327 if (!conn)
1328 goto unlock;
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001329
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001330 switch (sent->type) {
1331 case 0x00:
1332 conn->tx_power = rp->tx_power;
1333 break;
1334 case 0x01:
1335 conn->max_tx_power = rp->tx_power;
1336 break;
1337 }
1338
1339unlock:
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001340 hci_dev_unlock(hdev);
1341}
1342
Gustavo Padovan6039aa732012-05-23 04:04:18 -03001343static void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001344{
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001345 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001346
1347 if (status) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001348 hci_conn_check_pending(hdev);
Johan Hedberg314b2382011-04-27 10:29:57 -04001349 return;
1350 }
1351
Andre Guedes89352e72011-11-04 14:16:53 -03001352 set_bit(HCI_INQUIRY, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001353}
1354
Gustavo Padovan6039aa732012-05-23 04:04:18 -03001355static void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001356{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001357 struct hci_cp_create_conn *cp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001358 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001359
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001360 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001361
1362 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_CONN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001363 if (!cp)
1364 return;
1365
1366 hci_dev_lock(hdev);
1367
1368 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1369
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001370 BT_DBG("%s bdaddr %pMR hcon %p", hdev->name, &cp->bdaddr, conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001371
1372 if (status) {
1373 if (conn && conn->state == BT_CONNECT) {
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001374 if (status != 0x0c || conn->attempt > 2) {
1375 conn->state = BT_CLOSED;
1376 hci_proto_connect_cfm(conn, status);
1377 hci_conn_del(conn);
1378 } else
1379 conn->state = BT_CONNECT2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001380 }
1381 } else {
1382 if (!conn) {
1383 conn = hci_conn_add(hdev, ACL_LINK, &cp->bdaddr);
1384 if (conn) {
Johan Hedberga0c808b2012-01-16 09:49:58 +02001385 conn->out = true;
Johan Hedberg4dae2792014-06-24 17:03:50 +03001386 set_bit(HCI_CONN_MASTER, &conn->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001387 } else
Gustavo F. Padovan893ef972010-07-18 15:13:37 -03001388 BT_ERR("No memory for new connection");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001389 }
1390 }
1391
1392 hci_dev_unlock(hdev);
1393}
1394
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001395static void hci_cs_add_sco(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001396{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001397 struct hci_cp_add_sco *cp;
1398 struct hci_conn *acl, *sco;
1399 __u16 handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001400
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001401 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001402
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001403 if (!status)
1404 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001405
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001406 cp = hci_sent_cmd_data(hdev, HCI_OP_ADD_SCO);
1407 if (!cp)
1408 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001409
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001410 handle = __le16_to_cpu(cp->handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001411
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001412 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001413
1414 hci_dev_lock(hdev);
1415
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001416 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001417 if (acl) {
1418 sco = acl->link;
1419 if (sco) {
1420 sco->state = BT_CLOSED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001421
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001422 hci_proto_connect_cfm(sco, status);
1423 hci_conn_del(sco);
1424 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001425 }
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001426
1427 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001428}
1429
Marcel Holtmannf8558552008-07-14 20:13:49 +02001430static void hci_cs_auth_requested(struct hci_dev *hdev, __u8 status)
1431{
1432 struct hci_cp_auth_requested *cp;
1433 struct hci_conn *conn;
1434
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001435 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001436
1437 if (!status)
1438 return;
1439
1440 cp = hci_sent_cmd_data(hdev, HCI_OP_AUTH_REQUESTED);
1441 if (!cp)
1442 return;
1443
1444 hci_dev_lock(hdev);
1445
1446 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1447 if (conn) {
1448 if (conn->state == BT_CONFIG) {
1449 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001450 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001451 }
1452 }
1453
1454 hci_dev_unlock(hdev);
1455}
1456
1457static void hci_cs_set_conn_encrypt(struct hci_dev *hdev, __u8 status)
1458{
1459 struct hci_cp_set_conn_encrypt *cp;
1460 struct hci_conn *conn;
1461
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001462 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001463
1464 if (!status)
1465 return;
1466
1467 cp = hci_sent_cmd_data(hdev, HCI_OP_SET_CONN_ENCRYPT);
1468 if (!cp)
1469 return;
1470
1471 hci_dev_lock(hdev);
1472
1473 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1474 if (conn) {
1475 if (conn->state == BT_CONFIG) {
1476 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001477 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001478 }
1479 }
1480
1481 hci_dev_unlock(hdev);
1482}
1483
Johan Hedberg127178d2010-11-18 22:22:29 +02001484static int hci_outgoing_auth_needed(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001485 struct hci_conn *conn)
Johan Hedberg392599b2010-11-18 22:22:28 +02001486{
Johan Hedberg392599b2010-11-18 22:22:28 +02001487 if (conn->state != BT_CONFIG || !conn->out)
1488 return 0;
1489
Johan Hedberg765c2a92011-01-19 12:06:52 +05301490 if (conn->pending_sec_level == BT_SECURITY_SDP)
Johan Hedberg392599b2010-11-18 22:22:28 +02001491 return 0;
1492
1493 /* Only request authentication for SSP connections or non-SSP
Johan Hedberg264b8b42014-01-08 16:40:39 +02001494 * devices with sec_level MEDIUM or HIGH or if MITM protection
1495 * is requested.
1496 */
Gustavo Padovan807deac2012-05-17 00:36:24 -03001497 if (!hci_conn_ssp_enabled(conn) && !(conn->auth_type & 0x01) &&
Johan Hedberg7e3691e2014-05-30 14:45:19 +03001498 conn->pending_sec_level != BT_SECURITY_FIPS &&
Johan Hedberg264b8b42014-01-08 16:40:39 +02001499 conn->pending_sec_level != BT_SECURITY_HIGH &&
1500 conn->pending_sec_level != BT_SECURITY_MEDIUM)
Johan Hedberg392599b2010-11-18 22:22:28 +02001501 return 0;
1502
Johan Hedberg392599b2010-11-18 22:22:28 +02001503 return 1;
1504}
1505
Gustavo Padovan6039aa732012-05-23 04:04:18 -03001506static int hci_resolve_name(struct hci_dev *hdev,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001507 struct inquiry_entry *e)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001508{
1509 struct hci_cp_remote_name_req cp;
1510
1511 memset(&cp, 0, sizeof(cp));
1512
1513 bacpy(&cp.bdaddr, &e->data.bdaddr);
1514 cp.pscan_rep_mode = e->data.pscan_rep_mode;
1515 cp.pscan_mode = e->data.pscan_mode;
1516 cp.clock_offset = e->data.clock_offset;
1517
1518 return hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
1519}
1520
Johan Hedbergb644ba32012-01-17 21:48:47 +02001521static bool hci_resolve_next_name(struct hci_dev *hdev)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001522{
1523 struct discovery_state *discov = &hdev->discovery;
1524 struct inquiry_entry *e;
1525
Johan Hedbergb644ba32012-01-17 21:48:47 +02001526 if (list_empty(&discov->resolve))
1527 return false;
1528
1529 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
Ram Malovanyc8100892012-07-19 10:26:09 +03001530 if (!e)
1531 return false;
1532
Johan Hedbergb644ba32012-01-17 21:48:47 +02001533 if (hci_resolve_name(hdev, e) == 0) {
1534 e->name_state = NAME_PENDING;
1535 return true;
1536 }
1537
1538 return false;
1539}
1540
1541static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001542 bdaddr_t *bdaddr, u8 *name, u8 name_len)
Johan Hedbergb644ba32012-01-17 21:48:47 +02001543{
1544 struct discovery_state *discov = &hdev->discovery;
1545 struct inquiry_entry *e;
1546
1547 if (conn && !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001548 mgmt_device_connected(hdev, bdaddr, ACL_LINK, 0x00, 0, name,
1549 name_len, conn->dev_class);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001550
1551 if (discov->state == DISCOVERY_STOPPED)
1552 return;
1553
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001554 if (discov->state == DISCOVERY_STOPPING)
1555 goto discov_complete;
1556
1557 if (discov->state != DISCOVERY_RESOLVING)
1558 return;
1559
1560 e = hci_inquiry_cache_lookup_resolve(hdev, bdaddr, NAME_PENDING);
Ram Malovany7cc83802012-07-19 10:26:10 +03001561 /* If the device was not found in a list of found devices names of which
1562 * are pending. there is no need to continue resolving a next name as it
1563 * will be done upon receiving another Remote Name Request Complete
1564 * Event */
1565 if (!e)
1566 return;
1567
1568 list_del(&e->list);
1569 if (name) {
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001570 e->name_state = NAME_KNOWN;
Ram Malovany7cc83802012-07-19 10:26:10 +03001571 mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00,
1572 e->data.rssi, name, name_len);
Ram Malovanyc3e7c0d2012-07-19 10:26:11 +03001573 } else {
1574 e->name_state = NAME_NOT_KNOWN;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001575 }
1576
Johan Hedbergb644ba32012-01-17 21:48:47 +02001577 if (hci_resolve_next_name(hdev))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001578 return;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001579
1580discov_complete:
1581 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1582}
1583
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001584static void hci_cs_remote_name_req(struct hci_dev *hdev, __u8 status)
1585{
Johan Hedberg127178d2010-11-18 22:22:29 +02001586 struct hci_cp_remote_name_req *cp;
1587 struct hci_conn *conn;
1588
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001589 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Johan Hedberg127178d2010-11-18 22:22:29 +02001590
1591 /* If successful wait for the name req complete event before
1592 * checking for the need to do authentication */
1593 if (!status)
1594 return;
1595
1596 cp = hci_sent_cmd_data(hdev, HCI_OP_REMOTE_NAME_REQ);
1597 if (!cp)
1598 return;
1599
1600 hci_dev_lock(hdev);
1601
1602 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001603
1604 if (test_bit(HCI_MGMT, &hdev->dev_flags))
1605 hci_check_pending_name(hdev, conn, &cp->bdaddr, NULL, 0);
1606
Johan Hedberg79c6c702011-04-28 11:28:55 -07001607 if (!conn)
1608 goto unlock;
1609
1610 if (!hci_outgoing_auth_needed(hdev, conn))
1611 goto unlock;
1612
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001613 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02001614 struct hci_cp_auth_requested auth_cp;
1615
1616 auth_cp.handle = __cpu_to_le16(conn->handle);
1617 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED,
1618 sizeof(auth_cp), &auth_cp);
Johan Hedberg127178d2010-11-18 22:22:29 +02001619 }
1620
Johan Hedberg79c6c702011-04-28 11:28:55 -07001621unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02001622 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001623}
1624
Marcel Holtmann769be972008-07-14 20:13:49 +02001625static void hci_cs_read_remote_features(struct hci_dev *hdev, __u8 status)
1626{
1627 struct hci_cp_read_remote_features *cp;
1628 struct hci_conn *conn;
1629
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001630 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001631
1632 if (!status)
1633 return;
1634
1635 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_FEATURES);
1636 if (!cp)
1637 return;
1638
1639 hci_dev_lock(hdev);
1640
1641 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1642 if (conn) {
1643 if (conn->state == BT_CONFIG) {
Marcel Holtmann769be972008-07-14 20:13:49 +02001644 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001645 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001646 }
1647 }
1648
1649 hci_dev_unlock(hdev);
1650}
1651
1652static void hci_cs_read_remote_ext_features(struct hci_dev *hdev, __u8 status)
1653{
1654 struct hci_cp_read_remote_ext_features *cp;
1655 struct hci_conn *conn;
1656
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001657 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001658
1659 if (!status)
1660 return;
1661
1662 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES);
1663 if (!cp)
1664 return;
1665
1666 hci_dev_lock(hdev);
1667
1668 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1669 if (conn) {
1670 if (conn->state == BT_CONFIG) {
Marcel Holtmann769be972008-07-14 20:13:49 +02001671 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001672 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001673 }
1674 }
1675
1676 hci_dev_unlock(hdev);
1677}
1678
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001679static void hci_cs_setup_sync_conn(struct hci_dev *hdev, __u8 status)
1680{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001681 struct hci_cp_setup_sync_conn *cp;
1682 struct hci_conn *acl, *sco;
1683 __u16 handle;
1684
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001685 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001686
1687 if (!status)
1688 return;
1689
1690 cp = hci_sent_cmd_data(hdev, HCI_OP_SETUP_SYNC_CONN);
1691 if (!cp)
1692 return;
1693
1694 handle = __le16_to_cpu(cp->handle);
1695
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001696 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001697
1698 hci_dev_lock(hdev);
1699
1700 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001701 if (acl) {
1702 sco = acl->link;
1703 if (sco) {
1704 sco->state = BT_CLOSED;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001705
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001706 hci_proto_connect_cfm(sco, status);
1707 hci_conn_del(sco);
1708 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001709 }
1710
1711 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001712}
1713
1714static void hci_cs_sniff_mode(struct hci_dev *hdev, __u8 status)
1715{
1716 struct hci_cp_sniff_mode *cp;
1717 struct hci_conn *conn;
1718
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001719 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001720
1721 if (!status)
1722 return;
1723
1724 cp = hci_sent_cmd_data(hdev, HCI_OP_SNIFF_MODE);
1725 if (!cp)
1726 return;
1727
1728 hci_dev_lock(hdev);
1729
1730 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001731 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001732 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001733
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001734 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001735 hci_sco_setup(conn, status);
1736 }
1737
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001738 hci_dev_unlock(hdev);
1739}
1740
1741static void hci_cs_exit_sniff_mode(struct hci_dev *hdev, __u8 status)
1742{
1743 struct hci_cp_exit_sniff_mode *cp;
1744 struct hci_conn *conn;
1745
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001746 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001747
1748 if (!status)
1749 return;
1750
1751 cp = hci_sent_cmd_data(hdev, HCI_OP_EXIT_SNIFF_MODE);
1752 if (!cp)
1753 return;
1754
1755 hci_dev_lock(hdev);
1756
1757 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001758 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001759 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001760
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001761 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001762 hci_sco_setup(conn, status);
1763 }
1764
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001765 hci_dev_unlock(hdev);
1766}
1767
Johan Hedberg88c3df12012-02-09 14:27:38 +02001768static void hci_cs_disconnect(struct hci_dev *hdev, u8 status)
1769{
1770 struct hci_cp_disconnect *cp;
1771 struct hci_conn *conn;
1772
1773 if (!status)
1774 return;
1775
1776 cp = hci_sent_cmd_data(hdev, HCI_OP_DISCONNECT);
1777 if (!cp)
1778 return;
1779
1780 hci_dev_lock(hdev);
1781
1782 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1783 if (conn)
1784 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001785 conn->dst_type, status);
Johan Hedberg88c3df12012-02-09 14:27:38 +02001786
1787 hci_dev_unlock(hdev);
1788}
1789
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001790static void hci_cs_create_phylink(struct hci_dev *hdev, u8 status)
1791{
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001792 struct hci_cp_create_phy_link *cp;
1793
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001794 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001795
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001796 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_PHY_LINK);
1797 if (!cp)
1798 return;
1799
Andrei Emeltchenkoe58917b2012-10-31 15:46:33 +02001800 hci_dev_lock(hdev);
1801
1802 if (status) {
1803 struct hci_conn *hcon;
1804
1805 hcon = hci_conn_hash_lookup_handle(hdev, cp->phy_handle);
1806 if (hcon)
1807 hci_conn_del(hcon);
1808 } else {
1809 amp_write_remote_assoc(hdev, cp->phy_handle);
1810 }
1811
1812 hci_dev_unlock(hdev);
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001813}
1814
Andrei Emeltchenko0b26ab92012-09-27 17:26:24 +03001815static void hci_cs_accept_phylink(struct hci_dev *hdev, u8 status)
1816{
1817 struct hci_cp_accept_phy_link *cp;
1818
1819 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1820
1821 if (status)
1822 return;
1823
1824 cp = hci_sent_cmd_data(hdev, HCI_OP_ACCEPT_PHY_LINK);
1825 if (!cp)
1826 return;
1827
1828 amp_write_remote_assoc(hdev, cp->phy_handle);
1829}
1830
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001831static void hci_cs_le_create_conn(struct hci_dev *hdev, u8 status)
1832{
1833 struct hci_cp_le_create_conn *cp;
1834 struct hci_conn *conn;
1835
1836 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1837
1838 /* All connection failure handling is taken care of by the
1839 * hci_le_conn_failed function which is triggered by the HCI
1840 * request completion callbacks used for connecting.
1841 */
1842 if (status)
1843 return;
1844
1845 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_CREATE_CONN);
1846 if (!cp)
1847 return;
1848
1849 hci_dev_lock(hdev);
1850
1851 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->peer_addr);
1852 if (!conn)
1853 goto unlock;
1854
1855 /* Store the initiator and responder address information which
1856 * is needed for SMP. These values will not change during the
1857 * lifetime of the connection.
1858 */
1859 conn->init_addr_type = cp->own_address_type;
1860 if (cp->own_address_type == ADDR_LE_DEV_RANDOM)
1861 bacpy(&conn->init_addr, &hdev->random_addr);
1862 else
1863 bacpy(&conn->init_addr, &hdev->bdaddr);
1864
1865 conn->resp_addr_type = cp->peer_addr_type;
1866 bacpy(&conn->resp_addr, &cp->peer_addr);
1867
Johan Hedberg9489eca2014-02-28 17:45:46 +02001868 /* We don't want the connection attempt to stick around
1869 * indefinitely since LE doesn't have a page timeout concept
1870 * like BR/EDR. Set a timer for any connection that doesn't use
1871 * the white list for connecting.
1872 */
1873 if (cp->filter_policy == HCI_LE_USE_PEER_ADDR)
1874 queue_delayed_work(conn->hdev->workqueue,
1875 &conn->le_conn_timeout,
1876 HCI_LE_CONN_TIMEOUT);
1877
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001878unlock:
1879 hci_dev_unlock(hdev);
1880}
1881
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02001882static void hci_cs_le_start_enc(struct hci_dev *hdev, u8 status)
1883{
1884 struct hci_cp_le_start_enc *cp;
1885 struct hci_conn *conn;
1886
1887 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1888
1889 if (!status)
1890 return;
1891
1892 hci_dev_lock(hdev);
1893
1894 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_START_ENC);
1895 if (!cp)
1896 goto unlock;
1897
1898 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1899 if (!conn)
1900 goto unlock;
1901
1902 if (conn->state != BT_CONNECTED)
1903 goto unlock;
1904
1905 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
1906 hci_conn_drop(conn);
1907
1908unlock:
1909 hci_dev_unlock(hdev);
1910}
1911
Gustavo Padovan6039aa732012-05-23 04:04:18 -03001912static void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001913{
1914 __u8 status = *((__u8 *) skb->data);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001915 struct discovery_state *discov = &hdev->discovery;
1916 struct inquiry_entry *e;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001917
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001918 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001919
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001920 hci_conn_check_pending(hdev);
Andre Guedes89352e72011-11-04 14:16:53 -03001921
1922 if (!test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
1923 return;
1924
Peter Zijlstra4e857c52014-03-17 18:06:10 +01001925 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -03001926 wake_up_bit(&hdev->flags, HCI_INQUIRY);
1927
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02001928 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001929 return;
1930
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001931 hci_dev_lock(hdev);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001932
Andre Guedes343f9352012-02-17 20:39:37 -03001933 if (discov->state != DISCOVERY_FINDING)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001934 goto unlock;
1935
1936 if (list_empty(&discov->resolve)) {
1937 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1938 goto unlock;
1939 }
1940
1941 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
1942 if (e && hci_resolve_name(hdev, e) == 0) {
1943 e->name_state = NAME_PENDING;
1944 hci_discovery_set_state(hdev, DISCOVERY_RESOLVING);
1945 } else {
1946 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1947 }
1948
1949unlock:
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001950 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001951}
1952
Gustavo Padovan6039aa732012-05-23 04:04:18 -03001953static void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001954{
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001955 struct inquiry_data data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001956 struct inquiry_info *info = (void *) (skb->data + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001957 int num_rsp = *((__u8 *) skb->data);
1958
1959 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
1960
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001961 if (!num_rsp)
1962 return;
1963
Andre Guedes1519cc12012-03-21 00:03:38 -03001964 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
1965 return;
1966
Linus Torvalds1da177e2005-04-16 15:20:36 -07001967 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001968
Johan Hedberge17acd42011-03-30 23:57:16 +03001969 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02001970 u32 flags;
Johan Hedberg31754052012-01-04 13:39:52 +02001971
Linus Torvalds1da177e2005-04-16 15:20:36 -07001972 bacpy(&data.bdaddr, &info->bdaddr);
1973 data.pscan_rep_mode = info->pscan_rep_mode;
1974 data.pscan_period_mode = info->pscan_period_mode;
1975 data.pscan_mode = info->pscan_mode;
1976 memcpy(data.dev_class, info->dev_class, 3);
1977 data.clock_offset = info->clock_offset;
1978 data.rssi = 0x00;
Marcel Holtmann41a96212008-07-14 20:13:48 +02001979 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02001980
Marcel Holtmannaf589252014-07-01 14:11:20 +02001981 flags = hci_inquiry_cache_update(hdev, &data, false);
1982
Johan Hedberg48264f02011-11-09 13:58:58 +02001983 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannaf589252014-07-01 14:11:20 +02001984 info->dev_class, 0, flags, NULL, 0, NULL, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001985 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001986
Linus Torvalds1da177e2005-04-16 15:20:36 -07001987 hci_dev_unlock(hdev);
1988}
1989
Gustavo Padovan6039aa732012-05-23 04:04:18 -03001990static void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001991{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001992 struct hci_ev_conn_complete *ev = (void *) skb->data;
1993 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001994
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001995 BT_DBG("%s", hdev->name);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001996
Linus Torvalds1da177e2005-04-16 15:20:36 -07001997 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001998
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001999 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann94992372009-04-19 19:30:03 +02002000 if (!conn) {
2001 if (ev->link_type != SCO_LINK)
2002 goto unlock;
2003
2004 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
2005 if (!conn)
2006 goto unlock;
2007
2008 conn->type = SCO_LINK;
2009 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002010
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002011 if (!ev->status) {
2012 conn->handle = __le16_to_cpu(ev->handle);
Marcel Holtmann769be972008-07-14 20:13:49 +02002013
2014 if (conn->type == ACL_LINK) {
2015 conn->state = BT_CONFIG;
2016 hci_conn_hold(conn);
Szymon Janca9ea3ed2012-07-19 14:46:08 +02002017
2018 if (!conn->out && !hci_conn_ssp_enabled(conn) &&
2019 !hci_find_link_key(hdev, &ev->bdaddr))
2020 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
2021 else
2022 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Marcel Holtmann769be972008-07-14 20:13:49 +02002023 } else
2024 conn->state = BT_CONNECTED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002025
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002026 hci_conn_add_sysfs(conn);
2027
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002028 if (test_bit(HCI_AUTH, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002029 set_bit(HCI_CONN_AUTH, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002030
2031 if (test_bit(HCI_ENCRYPT, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002032 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002033
2034 /* Get remote features */
2035 if (conn->type == ACL_LINK) {
2036 struct hci_cp_read_remote_features cp;
2037 cp.handle = ev->handle;
Marcel Holtmann769be972008-07-14 20:13:49 +02002038 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_FEATURES,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002039 sizeof(cp), &cp);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002040 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002041
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002042 /* Set packet type for incoming connection */
Andrei Emeltchenkod095c1e2011-12-01 14:33:27 +02002043 if (!conn->out && hdev->hci_ver < BLUETOOTH_VER_2_0) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002044 struct hci_cp_change_conn_ptype cp;
2045 cp.handle = ev->handle;
Marcel Holtmanna8746412008-07-14 20:13:46 +02002046 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002047 hci_send_cmd(hdev, HCI_OP_CHANGE_CONN_PTYPE, sizeof(cp),
2048 &cp);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002049 }
Johan Hedberg17d5c042011-01-22 06:09:08 +02002050 } else {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002051 conn->state = BT_CLOSED;
Johan Hedberg17d5c042011-01-22 06:09:08 +02002052 if (conn->type == ACL_LINK)
Marcel Holtmann64c7b772014-02-18 14:22:20 -08002053 mgmt_connect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002054 conn->dst_type, ev->status);
Johan Hedberg17d5c042011-01-22 06:09:08 +02002055 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002056
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002057 if (conn->type == ACL_LINK)
2058 hci_sco_setup(conn, ev->status);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002059
Marcel Holtmann769be972008-07-14 20:13:49 +02002060 if (ev->status) {
2061 hci_proto_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002062 hci_conn_del(conn);
Marcel Holtmannc89b6e62009-01-15 21:57:03 +01002063 } else if (ev->link_type != ACL_LINK)
2064 hci_proto_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002065
2066unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002067 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002068
2069 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002070}
2071
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002072static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002073{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002074 struct hci_ev_conn_request *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002075 int mask = hdev->link_mode;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002076 __u8 flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002077
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03002078 BT_DBG("%s bdaddr %pMR type 0x%x", hdev->name, &ev->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002079 ev->link_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002080
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002081 mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type,
2082 &flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002083
Szymon Janc138d22e2011-02-17 16:44:23 +01002084 if ((mask & HCI_LM_ACCEPT) &&
Marcel Holtmannb9ee0a72013-10-17 17:24:13 -07002085 !hci_blacklist_lookup(hdev, &ev->bdaddr, BDADDR_BREDR)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002086 /* Connection accepted */
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02002087 struct inquiry_entry *ie;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002088 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002089
2090 hci_dev_lock(hdev);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002091
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02002092 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
2093 if (ie)
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02002094 memcpy(ie->data.dev_class, ev->dev_class, 3);
2095
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03002096 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type,
2097 &ev->bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002098 if (!conn) {
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02002099 conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr);
2100 if (!conn) {
Gustavo F. Padovan893ef972010-07-18 15:13:37 -03002101 BT_ERR("No memory for new connection");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002102 hci_dev_unlock(hdev);
2103 return;
2104 }
2105 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002106
Linus Torvalds1da177e2005-04-16 15:20:36 -07002107 memcpy(conn->dev_class, ev->dev_class, 3);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002108
Linus Torvalds1da177e2005-04-16 15:20:36 -07002109 hci_dev_unlock(hdev);
2110
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002111 if (ev->link_type == ACL_LINK ||
2112 (!(flags & HCI_PROTO_DEFER) && !lmp_esco_capable(hdev))) {
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002113 struct hci_cp_accept_conn_req cp;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002114 conn->state = BT_CONNECT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002115
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002116 bacpy(&cp.bdaddr, &ev->bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002117
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002118 if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER))
2119 cp.role = 0x00; /* Become master */
2120 else
2121 cp.role = 0x01; /* Remain slave */
2122
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002123 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp),
2124 &cp);
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002125 } else if (!(flags & HCI_PROTO_DEFER)) {
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002126 struct hci_cp_accept_sync_conn_req cp;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002127 conn->state = BT_CONNECT;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002128
2129 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmanna8746412008-07-14 20:13:46 +02002130 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002131
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002132 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
2133 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
2134 cp.max_latency = cpu_to_le16(0xffff);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002135 cp.content_format = cpu_to_le16(hdev->voice_setting);
2136 cp.retrans_effort = 0xff;
2137
2138 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002139 sizeof(cp), &cp);
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002140 } else {
2141 conn->state = BT_CONNECT2;
2142 hci_proto_connect_cfm(conn, 0);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002143 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002144 } else {
2145 /* Connection rejected */
2146 struct hci_cp_reject_conn_req cp;
2147
2148 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02002149 cp.reason = HCI_ERROR_REJ_BAD_ADDR;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002150 hci_send_cmd(hdev, HCI_OP_REJECT_CONN_REQ, sizeof(cp), &cp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002151 }
2152}
2153
Mikel Astizf0d6a0e2012-08-09 09:52:30 +02002154static u8 hci_to_mgmt_reason(u8 err)
2155{
2156 switch (err) {
2157 case HCI_ERROR_CONNECTION_TIMEOUT:
2158 return MGMT_DEV_DISCONN_TIMEOUT;
2159 case HCI_ERROR_REMOTE_USER_TERM:
2160 case HCI_ERROR_REMOTE_LOW_RESOURCES:
2161 case HCI_ERROR_REMOTE_POWER_OFF:
2162 return MGMT_DEV_DISCONN_REMOTE;
2163 case HCI_ERROR_LOCAL_HOST_TERM:
2164 return MGMT_DEV_DISCONN_LOCAL_HOST;
2165 default:
2166 return MGMT_DEV_DISCONN_UNKNOWN;
2167 }
2168}
2169
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002170static void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002171{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002172 struct hci_ev_disconn_complete *ev = (void *) skb->data;
Andre Guedesabf54a52013-11-07 17:36:09 -03002173 u8 reason = hci_to_mgmt_reason(ev->reason);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002174 struct hci_conn_params *params;
Marcel Holtmann04837f62006-07-03 10:02:33 +02002175 struct hci_conn *conn;
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002176 bool mgmt_connected;
Andre Guedes38462202013-11-07 17:36:10 -03002177 u8 type;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002178
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002179 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002180
Linus Torvalds1da177e2005-04-16 15:20:36 -07002181 hci_dev_lock(hdev);
2182
Marcel Holtmann04837f62006-07-03 10:02:33 +02002183 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergf7520542011-01-20 12:34:39 +02002184 if (!conn)
2185 goto unlock;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002186
Andre Guedesabf54a52013-11-07 17:36:09 -03002187 if (ev->status) {
2188 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
2189 conn->dst_type, ev->status);
2190 goto unlock;
Johan Hedberg37d9ef72011-11-10 15:54:39 +02002191 }
Johan Hedbergf7520542011-01-20 12:34:39 +02002192
Andre Guedes38462202013-11-07 17:36:10 -03002193 conn->state = BT_CLOSED;
2194
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002195 mgmt_connected = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags);
2196 mgmt_device_disconnected(hdev, &conn->dst, conn->type, conn->dst_type,
2197 reason, mgmt_connected);
Andre Guedesabf54a52013-11-07 17:36:09 -03002198
Johan Hedbergaf6a9c32014-06-24 13:15:53 +03002199 if (conn->type == ACL_LINK &&
2200 test_bit(HCI_CONN_FLUSH_KEY, &conn->flags))
Andre Guedes38462202013-11-07 17:36:10 -03002201 hci_remove_link_key(hdev, &conn->dst);
Johan Hedberg22102462013-10-05 12:01:06 +02002202
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002203 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
2204 if (params) {
2205 switch (params->auto_connect) {
2206 case HCI_AUTO_CONN_LINK_LOSS:
2207 if (ev->reason != HCI_ERROR_CONNECTION_TIMEOUT)
2208 break;
2209 /* Fall through */
2210
2211 case HCI_AUTO_CONN_ALWAYS:
2212 hci_pend_le_conn_add(hdev, &conn->dst, conn->dst_type);
2213 break;
2214
2215 default:
2216 break;
2217 }
2218 }
2219
Andre Guedes38462202013-11-07 17:36:10 -03002220 type = conn->type;
Johan Hedberg22102462013-10-05 12:01:06 +02002221
Andre Guedes38462202013-11-07 17:36:10 -03002222 hci_proto_disconn_cfm(conn, ev->reason);
2223 hci_conn_del(conn);
2224
2225 /* Re-enable advertising if necessary, since it might
2226 * have been disabled by the connection. From the
2227 * HCI_LE_Set_Advertise_Enable command description in
2228 * the core specification (v4.0):
2229 * "The Controller shall continue advertising until the Host
2230 * issues an LE_Set_Advertise_Enable command with
2231 * Advertising_Enable set to 0x00 (Advertising is disabled)
2232 * or until a connection is created or until the Advertising
2233 * is timed out due to Directed Advertising."
2234 */
2235 if (type == LE_LINK)
2236 mgmt_reenable_advertising(hdev);
Johan Hedbergf7520542011-01-20 12:34:39 +02002237
2238unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002239 hci_dev_unlock(hdev);
2240}
2241
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002242static void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002243{
2244 struct hci_ev_auth_complete *ev = (void *) skb->data;
2245 struct hci_conn *conn;
2246
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002247 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002248
2249 hci_dev_lock(hdev);
2250
2251 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002252 if (!conn)
2253 goto unlock;
2254
2255 if (!ev->status) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002256 if (!hci_conn_ssp_enabled(conn) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03002257 test_bit(HCI_CONN_REAUTH_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002258 BT_INFO("re-auth of legacy device is not possible.");
Johan Hedberg2a611692011-02-19 12:06:00 -03002259 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002260 set_bit(HCI_CONN_AUTH, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002261 conn->sec_level = conn->pending_sec_level;
Johan Hedberg2a611692011-02-19 12:06:00 -03002262 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002263 } else {
Johan Hedbergbab73cb2012-02-09 16:07:29 +02002264 mgmt_auth_failed(hdev, &conn->dst, conn->type, conn->dst_type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002265 ev->status);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002266 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002267
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002268 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
2269 clear_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002270
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002271 if (conn->state == BT_CONFIG) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002272 if (!ev->status && hci_conn_ssp_enabled(conn)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002273 struct hci_cp_set_conn_encrypt cp;
2274 cp.handle = ev->handle;
2275 cp.encrypt = 0x01;
2276 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002277 &cp);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002278 } else {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002279 conn->state = BT_CONNECTED;
2280 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002281 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002282 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002283 } else {
2284 hci_auth_cfm(conn, ev->status);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002285
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002286 hci_conn_hold(conn);
2287 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02002288 hci_conn_drop(conn);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002289 }
2290
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002291 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002292 if (!ev->status) {
2293 struct hci_cp_set_conn_encrypt cp;
2294 cp.handle = ev->handle;
2295 cp.encrypt = 0x01;
2296 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002297 &cp);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002298 } else {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002299 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002300 hci_encrypt_cfm(conn, ev->status, 0x00);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002301 }
2302 }
2303
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002304unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002305 hci_dev_unlock(hdev);
2306}
2307
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002308static void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002309{
Johan Hedberg127178d2010-11-18 22:22:29 +02002310 struct hci_ev_remote_name *ev = (void *) skb->data;
2311 struct hci_conn *conn;
2312
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002313 BT_DBG("%s", hdev->name);
2314
2315 hci_conn_check_pending(hdev);
Johan Hedberg127178d2010-11-18 22:22:29 +02002316
2317 hci_dev_lock(hdev);
2318
2319 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002320
2321 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
2322 goto check_auth;
2323
2324 if (ev->status == 0)
2325 hci_check_pending_name(hdev, conn, &ev->bdaddr, ev->name,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002326 strnlen(ev->name, HCI_MAX_NAME_LENGTH));
Johan Hedbergb644ba32012-01-17 21:48:47 +02002327 else
2328 hci_check_pending_name(hdev, conn, &ev->bdaddr, NULL, 0);
2329
2330check_auth:
Johan Hedberg79c6c702011-04-28 11:28:55 -07002331 if (!conn)
2332 goto unlock;
2333
2334 if (!hci_outgoing_auth_needed(hdev, conn))
2335 goto unlock;
2336
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002337 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002338 struct hci_cp_auth_requested cp;
2339 cp.handle = __cpu_to_le16(conn->handle);
2340 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp);
2341 }
2342
Johan Hedberg79c6c702011-04-28 11:28:55 -07002343unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02002344 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002345}
2346
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002347static void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002348{
2349 struct hci_ev_encrypt_change *ev = (void *) skb->data;
2350 struct hci_conn *conn;
2351
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002352 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002353
2354 hci_dev_lock(hdev);
2355
2356 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002357 if (!conn)
2358 goto unlock;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002359
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002360 if (!ev->status) {
2361 if (ev->encrypt) {
2362 /* Encryption implies authentication */
Johan Hedberg4dae2792014-06-24 17:03:50 +03002363 set_bit(HCI_CONN_AUTH, &conn->flags);
2364 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002365 conn->sec_level = conn->pending_sec_level;
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002366
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002367 /* P-256 authentication key implies FIPS */
2368 if (conn->key_type == HCI_LK_AUTH_COMBINATION_P256)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002369 set_bit(HCI_CONN_FIPS, &conn->flags);
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002370
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002371 if ((conn->type == ACL_LINK && ev->encrypt == 0x02) ||
2372 conn->type == LE_LINK)
2373 set_bit(HCI_CONN_AES_CCM, &conn->flags);
2374 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002375 clear_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002376 clear_bit(HCI_CONN_AES_CCM, &conn->flags);
2377 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002378 }
2379
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002380 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
2381
2382 if (ev->status && conn->state == BT_CONNECTED) {
2383 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2384 hci_conn_drop(conn);
2385 goto unlock;
2386 }
2387
2388 if (conn->state == BT_CONFIG) {
2389 if (!ev->status)
2390 conn->state = BT_CONNECTED;
2391
Marcel Holtmann40b552a2014-03-19 14:10:25 -07002392 /* In Secure Connections Only mode, do not allow any
2393 * connections that are not encrypted with AES-CCM
2394 * using a P-256 authenticated combination key.
2395 */
2396 if (test_bit(HCI_SC_ONLY, &hdev->dev_flags) &&
2397 (!test_bit(HCI_CONN_AES_CCM, &conn->flags) ||
2398 conn->key_type != HCI_LK_AUTH_COMBINATION_P256)) {
2399 hci_proto_connect_cfm(conn, HCI_ERROR_AUTH_FAILURE);
2400 hci_conn_drop(conn);
2401 goto unlock;
2402 }
2403
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002404 hci_proto_connect_cfm(conn, ev->status);
2405 hci_conn_drop(conn);
2406 } else
2407 hci_encrypt_cfm(conn, ev->status, ev->encrypt);
2408
Gustavo Padovana7d77232012-05-13 03:20:07 -03002409unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002410 hci_dev_unlock(hdev);
2411}
2412
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002413static void hci_change_link_key_complete_evt(struct hci_dev *hdev,
2414 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002415{
2416 struct hci_ev_change_link_key_complete *ev = (void *) skb->data;
2417 struct hci_conn *conn;
2418
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002419 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002420
2421 hci_dev_lock(hdev);
2422
2423 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
2424 if (conn) {
2425 if (!ev->status)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002426 set_bit(HCI_CONN_SECURE, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002427
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002428 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002429
2430 hci_key_change_cfm(conn, ev->status);
2431 }
2432
2433 hci_dev_unlock(hdev);
2434}
2435
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002436static void hci_remote_features_evt(struct hci_dev *hdev,
2437 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002438{
2439 struct hci_ev_remote_features *ev = (void *) skb->data;
2440 struct hci_conn *conn;
2441
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002442 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002443
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002444 hci_dev_lock(hdev);
2445
2446 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02002447 if (!conn)
2448 goto unlock;
Marcel Holtmann769be972008-07-14 20:13:49 +02002449
Johan Hedbergccd556f2010-11-10 17:11:51 +02002450 if (!ev->status)
Johan Hedbergcad718e2013-04-17 15:00:51 +03002451 memcpy(conn->features[0], ev->features, 8);
Johan Hedbergccd556f2010-11-10 17:11:51 +02002452
2453 if (conn->state != BT_CONFIG)
2454 goto unlock;
2455
2456 if (!ev->status && lmp_ssp_capable(hdev) && lmp_ssp_capable(conn)) {
2457 struct hci_cp_read_remote_ext_features cp;
2458 cp.handle = ev->handle;
2459 cp.page = 0x01;
2460 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002461 sizeof(cp), &cp);
Johan Hedberg392599b2010-11-18 22:22:28 +02002462 goto unlock;
2463 }
2464
Johan Hedberg671267b2012-05-12 16:11:50 -03002465 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002466 struct hci_cp_remote_name_req cp;
2467 memset(&cp, 0, sizeof(cp));
2468 bacpy(&cp.bdaddr, &conn->dst);
2469 cp.pscan_rep_mode = 0x02;
2470 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002471 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
2472 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002473 conn->dst_type, 0, NULL, 0,
2474 conn->dev_class);
Johan Hedberg392599b2010-11-18 22:22:28 +02002475
Johan Hedberg127178d2010-11-18 22:22:29 +02002476 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002477 conn->state = BT_CONNECTED;
2478 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002479 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02002480 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002481
Johan Hedbergccd556f2010-11-10 17:11:51 +02002482unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002483 hci_dev_unlock(hdev);
2484}
2485
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002486static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002487{
2488 struct hci_ev_cmd_complete *ev = (void *) skb->data;
Johan Hedberg9238f362013-03-05 20:37:48 +02002489 u8 status = skb->data[sizeof(*ev)];
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002490 __u16 opcode;
2491
2492 skb_pull(skb, sizeof(*ev));
2493
2494 opcode = __le16_to_cpu(ev->opcode);
2495
2496 switch (opcode) {
2497 case HCI_OP_INQUIRY_CANCEL:
2498 hci_cc_inquiry_cancel(hdev, skb);
2499 break;
2500
Andre Guedes4d934832012-03-21 00:03:35 -03002501 case HCI_OP_PERIODIC_INQ:
2502 hci_cc_periodic_inq(hdev, skb);
2503 break;
2504
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002505 case HCI_OP_EXIT_PERIODIC_INQ:
2506 hci_cc_exit_periodic_inq(hdev, skb);
2507 break;
2508
2509 case HCI_OP_REMOTE_NAME_REQ_CANCEL:
2510 hci_cc_remote_name_req_cancel(hdev, skb);
2511 break;
2512
2513 case HCI_OP_ROLE_DISCOVERY:
2514 hci_cc_role_discovery(hdev, skb);
2515 break;
2516
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002517 case HCI_OP_READ_LINK_POLICY:
2518 hci_cc_read_link_policy(hdev, skb);
2519 break;
2520
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002521 case HCI_OP_WRITE_LINK_POLICY:
2522 hci_cc_write_link_policy(hdev, skb);
2523 break;
2524
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002525 case HCI_OP_READ_DEF_LINK_POLICY:
2526 hci_cc_read_def_link_policy(hdev, skb);
2527 break;
2528
2529 case HCI_OP_WRITE_DEF_LINK_POLICY:
2530 hci_cc_write_def_link_policy(hdev, skb);
2531 break;
2532
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002533 case HCI_OP_RESET:
2534 hci_cc_reset(hdev, skb);
2535 break;
2536
2537 case HCI_OP_WRITE_LOCAL_NAME:
2538 hci_cc_write_local_name(hdev, skb);
2539 break;
2540
2541 case HCI_OP_READ_LOCAL_NAME:
2542 hci_cc_read_local_name(hdev, skb);
2543 break;
2544
2545 case HCI_OP_WRITE_AUTH_ENABLE:
2546 hci_cc_write_auth_enable(hdev, skb);
2547 break;
2548
2549 case HCI_OP_WRITE_ENCRYPT_MODE:
2550 hci_cc_write_encrypt_mode(hdev, skb);
2551 break;
2552
2553 case HCI_OP_WRITE_SCAN_ENABLE:
2554 hci_cc_write_scan_enable(hdev, skb);
2555 break;
2556
2557 case HCI_OP_READ_CLASS_OF_DEV:
2558 hci_cc_read_class_of_dev(hdev, skb);
2559 break;
2560
2561 case HCI_OP_WRITE_CLASS_OF_DEV:
2562 hci_cc_write_class_of_dev(hdev, skb);
2563 break;
2564
2565 case HCI_OP_READ_VOICE_SETTING:
2566 hci_cc_read_voice_setting(hdev, skb);
2567 break;
2568
2569 case HCI_OP_WRITE_VOICE_SETTING:
2570 hci_cc_write_voice_setting(hdev, skb);
2571 break;
2572
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -07002573 case HCI_OP_READ_NUM_SUPPORTED_IAC:
2574 hci_cc_read_num_supported_iac(hdev, skb);
2575 break;
2576
Marcel Holtmann333140b2008-07-14 20:13:48 +02002577 case HCI_OP_WRITE_SSP_MODE:
2578 hci_cc_write_ssp_mode(hdev, skb);
2579 break;
2580
Marcel Holtmanneac83dc2014-01-10 02:07:23 -08002581 case HCI_OP_WRITE_SC_SUPPORT:
2582 hci_cc_write_sc_support(hdev, skb);
2583 break;
2584
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002585 case HCI_OP_READ_LOCAL_VERSION:
2586 hci_cc_read_local_version(hdev, skb);
2587 break;
2588
2589 case HCI_OP_READ_LOCAL_COMMANDS:
2590 hci_cc_read_local_commands(hdev, skb);
2591 break;
2592
2593 case HCI_OP_READ_LOCAL_FEATURES:
2594 hci_cc_read_local_features(hdev, skb);
2595 break;
2596
Andre Guedes971e3a42011-06-30 19:20:52 -03002597 case HCI_OP_READ_LOCAL_EXT_FEATURES:
2598 hci_cc_read_local_ext_features(hdev, skb);
2599 break;
2600
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002601 case HCI_OP_READ_BUFFER_SIZE:
2602 hci_cc_read_buffer_size(hdev, skb);
2603 break;
2604
2605 case HCI_OP_READ_BD_ADDR:
2606 hci_cc_read_bd_addr(hdev, skb);
2607 break;
2608
Johan Hedbergf332ec62013-03-15 17:07:11 -05002609 case HCI_OP_READ_PAGE_SCAN_ACTIVITY:
2610 hci_cc_read_page_scan_activity(hdev, skb);
2611 break;
2612
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002613 case HCI_OP_WRITE_PAGE_SCAN_ACTIVITY:
2614 hci_cc_write_page_scan_activity(hdev, skb);
2615 break;
2616
Johan Hedbergf332ec62013-03-15 17:07:11 -05002617 case HCI_OP_READ_PAGE_SCAN_TYPE:
2618 hci_cc_read_page_scan_type(hdev, skb);
2619 break;
2620
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002621 case HCI_OP_WRITE_PAGE_SCAN_TYPE:
2622 hci_cc_write_page_scan_type(hdev, skb);
2623 break;
2624
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +02002625 case HCI_OP_READ_DATA_BLOCK_SIZE:
2626 hci_cc_read_data_block_size(hdev, skb);
2627 break;
2628
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +02002629 case HCI_OP_READ_FLOW_CONTROL_MODE:
2630 hci_cc_read_flow_control_mode(hdev, skb);
2631 break;
2632
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +03002633 case HCI_OP_READ_LOCAL_AMP_INFO:
2634 hci_cc_read_local_amp_info(hdev, skb);
2635 break;
2636
Johan Hedberg33f35722014-06-28 17:54:06 +03002637 case HCI_OP_READ_CLOCK:
2638 hci_cc_read_clock(hdev, skb);
2639 break;
2640
Andrei Emeltchenko903e4542012-09-27 17:26:09 +03002641 case HCI_OP_READ_LOCAL_AMP_ASSOC:
2642 hci_cc_read_local_amp_assoc(hdev, skb);
2643 break;
2644
Johan Hedbergd5859e22011-01-25 01:19:58 +02002645 case HCI_OP_READ_INQ_RSP_TX_POWER:
2646 hci_cc_read_inq_rsp_tx_power(hdev, skb);
2647 break;
2648
Johan Hedberg980e1a52011-01-22 06:10:07 +02002649 case HCI_OP_PIN_CODE_REPLY:
2650 hci_cc_pin_code_reply(hdev, skb);
2651 break;
2652
2653 case HCI_OP_PIN_CODE_NEG_REPLY:
2654 hci_cc_pin_code_neg_reply(hdev, skb);
2655 break;
2656
Szymon Jancc35938b2011-03-22 13:12:21 +01002657 case HCI_OP_READ_LOCAL_OOB_DATA:
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08002658 hci_cc_read_local_oob_data(hdev, skb);
2659 break;
2660
2661 case HCI_OP_READ_LOCAL_OOB_EXT_DATA:
2662 hci_cc_read_local_oob_ext_data(hdev, skb);
Szymon Jancc35938b2011-03-22 13:12:21 +01002663 break;
2664
Ville Tervo6ed58ec2011-02-10 22:38:48 -03002665 case HCI_OP_LE_READ_BUFFER_SIZE:
2666 hci_cc_le_read_buffer_size(hdev, skb);
2667 break;
2668
Johan Hedberg60e77322013-01-22 14:01:59 +02002669 case HCI_OP_LE_READ_LOCAL_FEATURES:
2670 hci_cc_le_read_local_features(hdev, skb);
2671 break;
2672
Johan Hedberg8fa19092012-10-19 20:57:49 +03002673 case HCI_OP_LE_READ_ADV_TX_POWER:
2674 hci_cc_le_read_adv_tx_power(hdev, skb);
2675 break;
2676
Johan Hedberga5c29682011-02-19 12:05:57 -03002677 case HCI_OP_USER_CONFIRM_REPLY:
2678 hci_cc_user_confirm_reply(hdev, skb);
2679 break;
2680
2681 case HCI_OP_USER_CONFIRM_NEG_REPLY:
2682 hci_cc_user_confirm_neg_reply(hdev, skb);
2683 break;
2684
Brian Gix1143d452011-11-23 08:28:34 -08002685 case HCI_OP_USER_PASSKEY_REPLY:
2686 hci_cc_user_passkey_reply(hdev, skb);
2687 break;
2688
2689 case HCI_OP_USER_PASSKEY_NEG_REPLY:
2690 hci_cc_user_passkey_neg_reply(hdev, skb);
Szymon Janc16cde992012-04-13 12:32:42 +02002691 break;
Andre Guedes07f7fa52011-12-02 21:13:31 +09002692
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08002693 case HCI_OP_LE_SET_RANDOM_ADDR:
2694 hci_cc_le_set_random_addr(hdev, skb);
2695 break;
2696
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01002697 case HCI_OP_LE_SET_ADV_ENABLE:
2698 hci_cc_le_set_adv_enable(hdev, skb);
2699 break;
2700
Marcel Holtmann533553f2014-03-21 12:18:10 -07002701 case HCI_OP_LE_SET_SCAN_PARAM:
2702 hci_cc_le_set_scan_param(hdev, skb);
2703 break;
2704
Andre Guedeseb9d91f2011-05-26 16:23:52 -03002705 case HCI_OP_LE_SET_SCAN_ENABLE:
2706 hci_cc_le_set_scan_enable(hdev, skb);
2707 break;
2708
Johan Hedbergcf1d0812013-01-22 14:02:00 +02002709 case HCI_OP_LE_READ_WHITE_LIST_SIZE:
2710 hci_cc_le_read_white_list_size(hdev, skb);
2711 break;
2712
Marcel Holtmann0f36b582014-02-27 20:37:31 -08002713 case HCI_OP_LE_CLEAR_WHITE_LIST:
2714 hci_cc_le_clear_white_list(hdev, skb);
2715 break;
2716
2717 case HCI_OP_LE_ADD_TO_WHITE_LIST:
2718 hci_cc_le_add_to_white_list(hdev, skb);
2719 break;
2720
2721 case HCI_OP_LE_DEL_FROM_WHITE_LIST:
2722 hci_cc_le_del_from_white_list(hdev, skb);
2723 break;
2724
Johan Hedberg9b008c02013-01-22 14:02:01 +02002725 case HCI_OP_LE_READ_SUPPORTED_STATES:
2726 hci_cc_le_read_supported_states(hdev, skb);
2727 break;
2728
Andre Guedesf9b49302011-06-30 19:20:53 -03002729 case HCI_OP_WRITE_LE_HOST_SUPPORTED:
2730 hci_cc_write_le_host_supported(hdev, skb);
2731 break;
2732
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02002733 case HCI_OP_LE_SET_ADV_PARAM:
2734 hci_cc_set_adv_param(hdev, skb);
2735 break;
2736
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03002737 case HCI_OP_WRITE_REMOTE_AMP_ASSOC:
2738 hci_cc_write_remote_amp_assoc(hdev, skb);
2739 break;
2740
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02002741 case HCI_OP_READ_RSSI:
2742 hci_cc_read_rssi(hdev, skb);
2743 break;
2744
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02002745 case HCI_OP_READ_TX_POWER:
2746 hci_cc_read_tx_power(hdev, skb);
2747 break;
2748
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002749 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002750 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002751 break;
2752 }
2753
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002754 if (opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02002755 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02002756
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002757 hci_req_cmd_complete(hdev, opcode, status);
Johan Hedberg9238f362013-03-05 20:37:48 +02002758
Szymon Jancdbccd792012-12-11 08:51:19 +01002759 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002760 atomic_set(&hdev->cmd_cnt, 1);
2761 if (!skb_queue_empty(&hdev->cmd_q))
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02002762 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002763 }
2764}
2765
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002766static void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002767{
2768 struct hci_ev_cmd_status *ev = (void *) skb->data;
2769 __u16 opcode;
2770
2771 skb_pull(skb, sizeof(*ev));
2772
2773 opcode = __le16_to_cpu(ev->opcode);
2774
2775 switch (opcode) {
2776 case HCI_OP_INQUIRY:
2777 hci_cs_inquiry(hdev, ev->status);
2778 break;
2779
2780 case HCI_OP_CREATE_CONN:
2781 hci_cs_create_conn(hdev, ev->status);
2782 break;
2783
2784 case HCI_OP_ADD_SCO:
2785 hci_cs_add_sco(hdev, ev->status);
2786 break;
2787
Marcel Holtmannf8558552008-07-14 20:13:49 +02002788 case HCI_OP_AUTH_REQUESTED:
2789 hci_cs_auth_requested(hdev, ev->status);
2790 break;
2791
2792 case HCI_OP_SET_CONN_ENCRYPT:
2793 hci_cs_set_conn_encrypt(hdev, ev->status);
2794 break;
2795
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002796 case HCI_OP_REMOTE_NAME_REQ:
2797 hci_cs_remote_name_req(hdev, ev->status);
2798 break;
2799
Marcel Holtmann769be972008-07-14 20:13:49 +02002800 case HCI_OP_READ_REMOTE_FEATURES:
2801 hci_cs_read_remote_features(hdev, ev->status);
2802 break;
2803
2804 case HCI_OP_READ_REMOTE_EXT_FEATURES:
2805 hci_cs_read_remote_ext_features(hdev, ev->status);
2806 break;
2807
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002808 case HCI_OP_SETUP_SYNC_CONN:
2809 hci_cs_setup_sync_conn(hdev, ev->status);
2810 break;
2811
2812 case HCI_OP_SNIFF_MODE:
2813 hci_cs_sniff_mode(hdev, ev->status);
2814 break;
2815
2816 case HCI_OP_EXIT_SNIFF_MODE:
2817 hci_cs_exit_sniff_mode(hdev, ev->status);
2818 break;
2819
Johan Hedberg8962ee72011-01-20 12:40:27 +02002820 case HCI_OP_DISCONNECT:
Johan Hedberg88c3df12012-02-09 14:27:38 +02002821 hci_cs_disconnect(hdev, ev->status);
Johan Hedberg8962ee72011-01-20 12:40:27 +02002822 break;
2823
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03002824 case HCI_OP_CREATE_PHY_LINK:
2825 hci_cs_create_phylink(hdev, ev->status);
2826 break;
2827
Andrei Emeltchenko0b26ab92012-09-27 17:26:24 +03002828 case HCI_OP_ACCEPT_PHY_LINK:
2829 hci_cs_accept_phylink(hdev, ev->status);
2830 break;
2831
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002832 case HCI_OP_LE_CREATE_CONN:
2833 hci_cs_le_create_conn(hdev, ev->status);
2834 break;
2835
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02002836 case HCI_OP_LE_START_ENC:
2837 hci_cs_le_start_enc(hdev, ev->status);
2838 break;
2839
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002840 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002841 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002842 break;
2843 }
2844
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002845 if (opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02002846 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02002847
Johan Hedberg02350a72013-04-03 21:50:29 +03002848 if (ev->status ||
2849 (hdev->sent_cmd && !bt_cb(hdev->sent_cmd)->req.event))
2850 hci_req_cmd_complete(hdev, opcode, ev->status);
Johan Hedberg9238f362013-03-05 20:37:48 +02002851
Gustavo F. Padovan10572132011-03-16 15:36:29 -03002852 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002853 atomic_set(&hdev->cmd_cnt, 1);
2854 if (!skb_queue_empty(&hdev->cmd_q))
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02002855 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002856 }
2857}
2858
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002859static void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002860{
2861 struct hci_ev_role_change *ev = (void *) skb->data;
2862 struct hci_conn *conn;
2863
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002864 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002865
2866 hci_dev_lock(hdev);
2867
2868 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
2869 if (conn) {
2870 if (!ev->status) {
2871 if (ev->role)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002872 clear_bit(HCI_CONN_MASTER, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002873 else
Johan Hedberg4dae2792014-06-24 17:03:50 +03002874 set_bit(HCI_CONN_MASTER, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002875 }
2876
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002877 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002878
2879 hci_role_switch_cfm(conn, ev->status, ev->role);
2880 }
2881
2882 hci_dev_unlock(hdev);
2883}
2884
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002885static void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002886{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002887 struct hci_ev_num_comp_pkts *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002888 int i;
2889
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02002890 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_PACKET_BASED) {
2891 BT_ERR("Wrong event for mode %d", hdev->flow_ctl_mode);
2892 return;
2893 }
2894
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02002895 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03002896 ev->num_hndl * sizeof(struct hci_comp_pkts_info)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002897 BT_DBG("%s bad parameters", hdev->name);
2898 return;
2899 }
2900
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02002901 BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl);
2902
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02002903 for (i = 0; i < ev->num_hndl; i++) {
2904 struct hci_comp_pkts_info *info = &ev->handles[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002905 struct hci_conn *conn;
2906 __u16 handle, count;
2907
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02002908 handle = __le16_to_cpu(info->handle);
2909 count = __le16_to_cpu(info->count);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002910
2911 conn = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002912 if (!conn)
2913 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002914
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002915 conn->sent -= count;
2916
2917 switch (conn->type) {
2918 case ACL_LINK:
2919 hdev->acl_cnt += count;
2920 if (hdev->acl_cnt > hdev->acl_pkts)
2921 hdev->acl_cnt = hdev->acl_pkts;
2922 break;
2923
2924 case LE_LINK:
2925 if (hdev->le_pkts) {
2926 hdev->le_cnt += count;
2927 if (hdev->le_cnt > hdev->le_pkts)
2928 hdev->le_cnt = hdev->le_pkts;
2929 } else {
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02002930 hdev->acl_cnt += count;
2931 if (hdev->acl_cnt > hdev->acl_pkts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002932 hdev->acl_cnt = hdev->acl_pkts;
2933 }
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002934 break;
2935
2936 case SCO_LINK:
2937 hdev->sco_cnt += count;
2938 if (hdev->sco_cnt > hdev->sco_pkts)
2939 hdev->sco_cnt = hdev->sco_pkts;
2940 break;
2941
2942 default:
2943 BT_ERR("Unknown type %d conn %p", conn->type, conn);
2944 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002945 }
2946 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002947
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02002948 queue_work(hdev->workqueue, &hdev->tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002949}
2950
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03002951static struct hci_conn *__hci_conn_lookup_handle(struct hci_dev *hdev,
2952 __u16 handle)
2953{
2954 struct hci_chan *chan;
2955
2956 switch (hdev->dev_type) {
2957 case HCI_BREDR:
2958 return hci_conn_hash_lookup_handle(hdev, handle);
2959 case HCI_AMP:
2960 chan = hci_chan_lookup_handle(hdev, handle);
2961 if (chan)
2962 return chan->conn;
2963 break;
2964 default:
2965 BT_ERR("%s unknown dev_type %d", hdev->name, hdev->dev_type);
2966 break;
2967 }
2968
2969 return NULL;
2970}
2971
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002972static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002973{
2974 struct hci_ev_num_comp_blocks *ev = (void *) skb->data;
2975 int i;
2976
2977 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_BLOCK_BASED) {
2978 BT_ERR("Wrong event for mode %d", hdev->flow_ctl_mode);
2979 return;
2980 }
2981
2982 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03002983 ev->num_hndl * sizeof(struct hci_comp_blocks_info)) {
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002984 BT_DBG("%s bad parameters", hdev->name);
2985 return;
2986 }
2987
2988 BT_DBG("%s num_blocks %d num_hndl %d", hdev->name, ev->num_blocks,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002989 ev->num_hndl);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002990
2991 for (i = 0; i < ev->num_hndl; i++) {
2992 struct hci_comp_blocks_info *info = &ev->handles[i];
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03002993 struct hci_conn *conn = NULL;
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002994 __u16 handle, block_count;
2995
2996 handle = __le16_to_cpu(info->handle);
2997 block_count = __le16_to_cpu(info->blocks);
2998
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03002999 conn = __hci_conn_lookup_handle(hdev, handle);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003000 if (!conn)
3001 continue;
3002
3003 conn->sent -= block_count;
3004
3005 switch (conn->type) {
3006 case ACL_LINK:
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03003007 case AMP_LINK:
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003008 hdev->block_cnt += block_count;
3009 if (hdev->block_cnt > hdev->num_blocks)
3010 hdev->block_cnt = hdev->num_blocks;
3011 break;
3012
3013 default:
3014 BT_ERR("Unknown type %d conn %p", conn->type, conn);
3015 break;
3016 }
3017 }
3018
3019 queue_work(hdev->workqueue, &hdev->tx_work);
3020}
3021
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003022static void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003023{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003024 struct hci_ev_mode_change *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003025 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003026
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003027 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003028
3029 hci_dev_lock(hdev);
3030
Marcel Holtmann04837f62006-07-03 10:02:33 +02003031 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3032 if (conn) {
3033 conn->mode = ev->mode;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003034
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003035 if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND,
3036 &conn->flags)) {
Marcel Holtmann04837f62006-07-03 10:02:33 +02003037 if (conn->mode == HCI_CM_ACTIVE)
Johan Hedberg58a681e2012-01-16 06:47:28 +02003038 set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003039 else
Johan Hedberg58a681e2012-01-16 06:47:28 +02003040 clear_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003041 }
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003042
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003043 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003044 hci_sco_setup(conn, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003045 }
3046
3047 hci_dev_unlock(hdev);
3048}
3049
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003050static void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003051{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003052 struct hci_ev_pin_code_req *ev = (void *) skb->data;
3053 struct hci_conn *conn;
3054
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003055 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003056
3057 hci_dev_lock(hdev);
3058
3059 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003060 if (!conn)
3061 goto unlock;
3062
3063 if (conn->state == BT_CONNECTED) {
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003064 hci_conn_hold(conn);
3065 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003066 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003067 }
3068
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003069 if (!test_bit(HCI_PAIRABLE, &hdev->dev_flags))
Johan Hedberg03b555e2011-01-04 15:40:05 +02003070 hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003071 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003072 else if (test_bit(HCI_MGMT, &hdev->dev_flags)) {
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003073 u8 secure;
3074
3075 if (conn->pending_sec_level == BT_SECURITY_HIGH)
3076 secure = 1;
3077 else
3078 secure = 0;
3079
Johan Hedberg744cf192011-11-08 20:40:14 +02003080 mgmt_pin_code_request(hdev, &ev->bdaddr, secure);
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003081 }
Johan Hedberg980e1a52011-01-22 06:10:07 +02003082
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003083unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003084 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003085}
3086
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003087static void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003088{
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003089 struct hci_ev_link_key_req *ev = (void *) skb->data;
3090 struct hci_cp_link_key_reply cp;
3091 struct hci_conn *conn;
3092 struct link_key *key;
3093
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003094 BT_DBG("%s", hdev->name);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003095
Andrei Emeltchenko034cbea2013-05-14 11:44:16 +03003096 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003097 return;
3098
3099 hci_dev_lock(hdev);
3100
3101 key = hci_find_link_key(hdev, &ev->bdaddr);
3102 if (!key) {
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003103 BT_DBG("%s link key not found for %pMR", hdev->name,
3104 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003105 goto not_found;
3106 }
3107
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003108 BT_DBG("%s found key type %u for %pMR", hdev->name, key->type,
3109 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003110
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003111 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003112 if (conn) {
Marcel Holtmann66138ce2014-01-10 02:07:20 -08003113 if ((key->type == HCI_LK_UNAUTH_COMBINATION_P192 ||
3114 key->type == HCI_LK_UNAUTH_COMBINATION_P256) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03003115 conn->auth_type != 0xff && (conn->auth_type & 0x01)) {
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003116 BT_DBG("%s ignoring unauthenticated key", hdev->name);
3117 goto not_found;
3118 }
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003119
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003120 if (key->type == HCI_LK_COMBINATION && key->pin_len < 16 &&
Johan Hedbergf3fb0b52014-06-02 10:12:44 +03003121 (conn->pending_sec_level == BT_SECURITY_HIGH ||
3122 conn->pending_sec_level == BT_SECURITY_FIPS)) {
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003123 BT_DBG("%s ignoring key unauthenticated for high security",
3124 hdev->name);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003125 goto not_found;
3126 }
3127
3128 conn->key_type = key->type;
3129 conn->pin_length = key->pin_len;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003130 }
3131
3132 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9b3b4462012-05-23 11:31:20 +03003133 memcpy(cp.link_key, key->val, HCI_LINK_KEY_SIZE);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003134
3135 hci_send_cmd(hdev, HCI_OP_LINK_KEY_REPLY, sizeof(cp), &cp);
3136
3137 hci_dev_unlock(hdev);
3138
3139 return;
3140
3141not_found:
3142 hci_send_cmd(hdev, HCI_OP_LINK_KEY_NEG_REPLY, 6, &ev->bdaddr);
3143 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003144}
3145
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003146static void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003147{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003148 struct hci_ev_link_key_notify *ev = (void *) skb->data;
3149 struct hci_conn *conn;
Johan Hedberg7652ff62014-06-24 13:15:49 +03003150 struct link_key *key;
3151 bool persistent;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003152 u8 pin_len = 0;
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003153
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003154 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003155
3156 hci_dev_lock(hdev);
3157
3158 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3159 if (conn) {
3160 hci_conn_hold(conn);
3161 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Johan Hedberg980e1a52011-01-22 06:10:07 +02003162 pin_len = conn->pin_length;
Waldemar Rymarkiewicz13d39312011-04-28 12:07:55 +02003163
3164 if (ev->key_type != HCI_LK_CHANGED_COMBINATION)
3165 conn->key_type = ev->key_type;
3166
David Herrmann76a68ba2013-04-06 20:28:37 +02003167 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003168 }
3169
Johan Hedberg7652ff62014-06-24 13:15:49 +03003170 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
3171 goto unlock;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003172
Johan Hedberg7652ff62014-06-24 13:15:49 +03003173 key = hci_add_link_key(hdev, conn, &ev->bdaddr, ev->link_key,
3174 ev->key_type, pin_len, &persistent);
3175 if (!key)
3176 goto unlock;
3177
3178 mgmt_new_link_key(hdev, key, persistent);
3179
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003180 /* Keep debug keys around only if the HCI_KEEP_DEBUG_KEYS flag
3181 * is set. If it's not set simply remove the key from the kernel
3182 * list (we've still notified user space about it but with
3183 * store_hint being 0).
3184 */
3185 if (key->type == HCI_LK_DEBUG_COMBINATION &&
3186 !test_bit(HCI_KEEP_DEBUG_KEYS, &hdev->dev_flags)) {
3187 list_del(&key->list);
3188 kfree(key);
3189 } else if (conn) {
Johan Hedbergaf6a9c32014-06-24 13:15:53 +03003190 if (persistent)
3191 clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3192 else
3193 set_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003194 }
Johan Hedberg7652ff62014-06-24 13:15:49 +03003195
3196unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003197 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003198}
3199
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003200static void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04837f62006-07-03 10:02:33 +02003201{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003202 struct hci_ev_clock_offset *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003203 struct hci_conn *conn;
3204
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003205 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003206
3207 hci_dev_lock(hdev);
3208
3209 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003210 if (conn && !ev->status) {
3211 struct inquiry_entry *ie;
3212
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003213 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3214 if (ie) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003215 ie->data.clock_offset = ev->clock_offset;
3216 ie->timestamp = jiffies;
3217 }
3218 }
3219
3220 hci_dev_unlock(hdev);
3221}
3222
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003223static void hci_pkt_type_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna8746412008-07-14 20:13:46 +02003224{
3225 struct hci_ev_pkt_type_change *ev = (void *) skb->data;
3226 struct hci_conn *conn;
3227
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003228 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna8746412008-07-14 20:13:46 +02003229
3230 hci_dev_lock(hdev);
3231
3232 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3233 if (conn && !ev->status)
3234 conn->pkt_type = __le16_to_cpu(ev->pkt_type);
3235
3236 hci_dev_unlock(hdev);
3237}
3238
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003239static void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003240{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003241 struct hci_ev_pscan_rep_mode *ev = (void *) skb->data;
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003242 struct inquiry_entry *ie;
3243
3244 BT_DBG("%s", hdev->name);
3245
3246 hci_dev_lock(hdev);
3247
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003248 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3249 if (ie) {
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003250 ie->data.pscan_rep_mode = ev->pscan_rep_mode;
3251 ie->timestamp = jiffies;
3252 }
3253
3254 hci_dev_unlock(hdev);
3255}
3256
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003257static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
3258 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003259{
3260 struct inquiry_data data;
3261 int num_rsp = *((__u8 *) skb->data);
3262
3263 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3264
3265 if (!num_rsp)
3266 return;
3267
Andre Guedes1519cc12012-03-21 00:03:38 -03003268 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
3269 return;
3270
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003271 hci_dev_lock(hdev);
3272
3273 if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) {
Szymon Janc138d22e2011-02-17 16:44:23 +01003274 struct inquiry_info_with_rssi_and_pscan_mode *info;
3275 info = (void *) (skb->data + 1);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003276
Johan Hedberge17acd42011-03-30 23:57:16 +03003277 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003278 u32 flags;
3279
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003280 bacpy(&data.bdaddr, &info->bdaddr);
3281 data.pscan_rep_mode = info->pscan_rep_mode;
3282 data.pscan_period_mode = info->pscan_period_mode;
3283 data.pscan_mode = info->pscan_mode;
3284 memcpy(data.dev_class, info->dev_class, 3);
3285 data.clock_offset = info->clock_offset;
3286 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003287 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02003288
Marcel Holtmannaf589252014-07-01 14:11:20 +02003289 flags = hci_inquiry_cache_update(hdev, &data, false);
3290
Johan Hedberg48264f02011-11-09 13:58:58 +02003291 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003292 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003293 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003294 }
3295 } else {
3296 struct inquiry_info_with_rssi *info = (void *) (skb->data + 1);
3297
Johan Hedberge17acd42011-03-30 23:57:16 +03003298 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003299 u32 flags;
3300
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003301 bacpy(&data.bdaddr, &info->bdaddr);
3302 data.pscan_rep_mode = info->pscan_rep_mode;
3303 data.pscan_period_mode = info->pscan_period_mode;
3304 data.pscan_mode = 0x00;
3305 memcpy(data.dev_class, info->dev_class, 3);
3306 data.clock_offset = info->clock_offset;
3307 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003308 data.ssp_mode = 0x00;
Marcel Holtmannaf589252014-07-01 14:11:20 +02003309
3310 flags = hci_inquiry_cache_update(hdev, &data, false);
3311
Johan Hedberg48264f02011-11-09 13:58:58 +02003312 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003313 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003314 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003315 }
3316 }
3317
3318 hci_dev_unlock(hdev);
3319}
3320
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003321static void hci_remote_ext_features_evt(struct hci_dev *hdev,
3322 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003323{
Marcel Holtmann41a96212008-07-14 20:13:48 +02003324 struct hci_ev_remote_ext_features *ev = (void *) skb->data;
3325 struct hci_conn *conn;
3326
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003327 BT_DBG("%s", hdev->name);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003328
Marcel Holtmann41a96212008-07-14 20:13:48 +02003329 hci_dev_lock(hdev);
3330
3331 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02003332 if (!conn)
3333 goto unlock;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003334
Johan Hedbergcad718e2013-04-17 15:00:51 +03003335 if (ev->page < HCI_MAX_PAGES)
3336 memcpy(conn->features[ev->page], ev->features, 8);
3337
Johan Hedbergccd556f2010-11-10 17:11:51 +02003338 if (!ev->status && ev->page == 0x01) {
3339 struct inquiry_entry *ie;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003340
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003341 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3342 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003343 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann769be972008-07-14 20:13:49 +02003344
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303345 if (ev->features[0] & LMP_HOST_SSP) {
Johan Hedberg58a681e2012-01-16 06:47:28 +02003346 set_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303347 } else {
3348 /* It is mandatory by the Bluetooth specification that
3349 * Extended Inquiry Results are only used when Secure
3350 * Simple Pairing is enabled, but some devices violate
3351 * this.
3352 *
3353 * To make these devices work, the internal SSP
3354 * enabled flag needs to be cleared if the remote host
3355 * features do not indicate SSP support */
3356 clear_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
3357 }
Marcel Holtmanneb9a8f32014-01-15 22:37:38 -08003358
3359 if (ev->features[0] & LMP_HOST_SC)
3360 set_bit(HCI_CONN_SC_ENABLED, &conn->flags);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003361 }
3362
Johan Hedbergccd556f2010-11-10 17:11:51 +02003363 if (conn->state != BT_CONFIG)
3364 goto unlock;
3365
Johan Hedberg671267b2012-05-12 16:11:50 -03003366 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02003367 struct hci_cp_remote_name_req cp;
3368 memset(&cp, 0, sizeof(cp));
3369 bacpy(&cp.bdaddr, &conn->dst);
3370 cp.pscan_rep_mode = 0x02;
3371 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02003372 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
3373 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003374 conn->dst_type, 0, NULL, 0,
3375 conn->dev_class);
Johan Hedberg392599b2010-11-18 22:22:28 +02003376
Johan Hedberg127178d2010-11-18 22:22:29 +02003377 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02003378 conn->state = BT_CONNECTED;
3379 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003380 hci_conn_drop(conn);
Johan Hedbergccd556f2010-11-10 17:11:51 +02003381 }
3382
3383unlock:
Marcel Holtmann41a96212008-07-14 20:13:48 +02003384 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003385}
3386
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003387static void hci_sync_conn_complete_evt(struct hci_dev *hdev,
3388 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003389{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003390 struct hci_ev_sync_conn_complete *ev = (void *) skb->data;
3391 struct hci_conn *conn;
3392
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003393 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003394
3395 hci_dev_lock(hdev);
3396
3397 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003398 if (!conn) {
3399 if (ev->link_type == ESCO_LINK)
3400 goto unlock;
3401
3402 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
3403 if (!conn)
3404 goto unlock;
3405
3406 conn->type = SCO_LINK;
3407 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003408
Marcel Holtmann732547f2009-04-19 19:14:14 +02003409 switch (ev->status) {
3410 case 0x00:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003411 conn->handle = __le16_to_cpu(ev->handle);
3412 conn->state = BT_CONNECTED;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02003413
3414 hci_conn_add_sysfs(conn);
Marcel Holtmann732547f2009-04-19 19:14:14 +02003415 break;
3416
Nick Pelly81218d22014-06-30 11:25:01 +05303417 case 0x10: /* Connection Accept Timeout */
Frédéric Dalleau1a4c9582013-08-19 14:24:02 +02003418 case 0x0d: /* Connection Rejected due to Limited Resources */
Stephen Coe705e5712010-02-16 11:29:44 -05003419 case 0x11: /* Unsupported Feature or Parameter Value */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003420 case 0x1c: /* SCO interval rejected */
Nick Pelly1038a002010-02-03 11:42:26 -08003421 case 0x1a: /* Unsupported Remote Feature */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003422 case 0x1f: /* Unspecified error */
Andrew Earl27539bc2014-03-10 10:31:04 +00003423 case 0x20: /* Unsupported LMP Parameter value */
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003424 if (conn->out) {
Marcel Holtmann732547f2009-04-19 19:14:14 +02003425 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
3426 (hdev->esco_type & EDR_ESCO_MASK);
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003427 if (hci_setup_sync(conn, conn->link->handle))
3428 goto unlock;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003429 }
3430 /* fall through */
3431
3432 default:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003433 conn->state = BT_CLOSED;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003434 break;
3435 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003436
3437 hci_proto_connect_cfm(conn, ev->status);
3438 if (ev->status)
3439 hci_conn_del(conn);
3440
3441unlock:
3442 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003443}
3444
Marcel Holtmannefdcf8e2013-10-15 10:31:12 -07003445static inline size_t eir_get_length(u8 *eir, size_t eir_len)
3446{
3447 size_t parsed = 0;
3448
3449 while (parsed < eir_len) {
3450 u8 field_len = eir[0];
3451
3452 if (field_len == 0)
3453 return parsed;
3454
3455 parsed += field_len + 1;
3456 eir += field_len + 1;
3457 }
3458
3459 return eir_len;
3460}
3461
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003462static void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
3463 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003464{
3465 struct inquiry_data data;
3466 struct extended_inquiry_info *info = (void *) (skb->data + 1);
3467 int num_rsp = *((__u8 *) skb->data);
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303468 size_t eir_len;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003469
3470 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3471
3472 if (!num_rsp)
3473 return;
3474
Andre Guedes1519cc12012-03-21 00:03:38 -03003475 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
3476 return;
3477
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003478 hci_dev_lock(hdev);
3479
Johan Hedberge17acd42011-03-30 23:57:16 +03003480 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003481 u32 flags;
3482 bool name_known;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003483
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003484 bacpy(&data.bdaddr, &info->bdaddr);
Szymon Janc138d22e2011-02-17 16:44:23 +01003485 data.pscan_rep_mode = info->pscan_rep_mode;
3486 data.pscan_period_mode = info->pscan_period_mode;
3487 data.pscan_mode = 0x00;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003488 memcpy(data.dev_class, info->dev_class, 3);
Szymon Janc138d22e2011-02-17 16:44:23 +01003489 data.clock_offset = info->clock_offset;
3490 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003491 data.ssp_mode = 0x01;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003492
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003493 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg4ddb1932012-01-15 20:04:43 +02003494 name_known = eir_has_data_type(info->data,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003495 sizeof(info->data),
3496 EIR_NAME_COMPLETE);
Johan Hedberg561aafb2012-01-04 13:31:59 +02003497 else
3498 name_known = true;
3499
Marcel Holtmannaf589252014-07-01 14:11:20 +02003500 flags = hci_inquiry_cache_update(hdev, &data, name_known);
3501
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303502 eir_len = eir_get_length(info->data, sizeof(info->data));
Marcel Holtmannaf589252014-07-01 14:11:20 +02003503
Johan Hedberg48264f02011-11-09 13:58:58 +02003504 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003505 info->dev_class, info->rssi,
3506 flags, info->data, eir_len, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003507 }
3508
3509 hci_dev_unlock(hdev);
3510}
3511
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003512static void hci_key_refresh_complete_evt(struct hci_dev *hdev,
3513 struct sk_buff *skb)
3514{
3515 struct hci_ev_key_refresh_complete *ev = (void *) skb->data;
3516 struct hci_conn *conn;
3517
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003518 BT_DBG("%s status 0x%2.2x handle 0x%4.4x", hdev->name, ev->status,
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003519 __le16_to_cpu(ev->handle));
3520
3521 hci_dev_lock(hdev);
3522
3523 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3524 if (!conn)
3525 goto unlock;
3526
Johan Hedberg9eb1fbf2014-04-11 12:02:31 -07003527 /* For BR/EDR the necessary steps are taken through the
3528 * auth_complete event.
3529 */
3530 if (conn->type != LE_LINK)
3531 goto unlock;
3532
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003533 if (!ev->status)
3534 conn->sec_level = conn->pending_sec_level;
3535
3536 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
3537
3538 if (ev->status && conn->state == BT_CONNECTED) {
Andre Guedesbed71742013-01-30 11:50:56 -03003539 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
David Herrmann76a68ba2013-04-06 20:28:37 +02003540 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003541 goto unlock;
3542 }
3543
3544 if (conn->state == BT_CONFIG) {
3545 if (!ev->status)
3546 conn->state = BT_CONNECTED;
3547
3548 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003549 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003550 } else {
3551 hci_auth_cfm(conn, ev->status);
3552
3553 hci_conn_hold(conn);
3554 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003555 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003556 }
3557
3558unlock:
3559 hci_dev_unlock(hdev);
3560}
3561
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003562static u8 hci_get_auth_req(struct hci_conn *conn)
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003563{
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003564 /* If remote requests no-bonding follow that lead */
Mikel Astizacabae92013-06-28 10:56:28 +02003565 if (conn->remote_auth == HCI_AT_NO_BONDING ||
3566 conn->remote_auth == HCI_AT_NO_BONDING_MITM)
Waldemar Rymarkiewicz58797bf2011-04-28 12:07:58 +02003567 return conn->remote_auth | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003568
Mikel Astizb7f94c82014-04-08 14:21:31 +02003569 /* If both remote and local have enough IO capabilities, require
3570 * MITM protection
3571 */
3572 if (conn->remote_cap != HCI_IO_NO_INPUT_OUTPUT &&
3573 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT)
3574 return conn->remote_auth | 0x01;
3575
Timo Mueller7e741702014-04-08 14:21:33 +02003576 /* No MITM protection possible so ignore remote requirement */
3577 return (conn->remote_auth & ~0x01) | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003578}
3579
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003580static void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003581{
3582 struct hci_ev_io_capa_request *ev = (void *) skb->data;
3583 struct hci_conn *conn;
3584
3585 BT_DBG("%s", hdev->name);
3586
3587 hci_dev_lock(hdev);
3588
3589 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003590 if (!conn)
3591 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02003592
Johan Hedberg03b555e2011-01-04 15:40:05 +02003593 hci_conn_hold(conn);
3594
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003595 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg03b555e2011-01-04 15:40:05 +02003596 goto unlock;
3597
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003598 if (test_bit(HCI_PAIRABLE, &hdev->dev_flags) ||
Gustavo Padovan807deac2012-05-17 00:36:24 -03003599 (conn->remote_auth & ~0x01) == HCI_AT_NO_BONDING) {
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003600 struct hci_cp_io_capability_reply cp;
3601
3602 bacpy(&cp.bdaddr, &ev->bdaddr);
Hemant Gupta7a7f1e72012-01-16 13:34:29 +05303603 /* Change the IO capability from KeyboardDisplay
3604 * to DisplayYesNo as it is not supported by BT spec. */
3605 cp.capability = (conn->io_capability == 0x04) ?
Mikel Astiza7676312013-06-28 10:56:29 +02003606 HCI_IO_DISPLAY_YESNO : conn->io_capability;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003607
3608 /* If we are initiators, there is no remote information yet */
3609 if (conn->remote_auth == 0xff) {
3610 cp.authentication = conn->auth_type;
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003611
Mikel Astizb16c6602014-04-08 14:21:34 +02003612 /* Request MITM protection if our IO caps allow it
Johan Hedberg4ad51a72014-06-09 14:41:25 +03003613 * except for the no-bonding case.
3614 * conn->auth_type is not updated here since
3615 * that might cause the user confirmation to be
3616 * rejected in case the remote doesn't have the
3617 * IO capabilities for MITM.
Mikel Astizb16c6602014-04-08 14:21:34 +02003618 */
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003619 if (conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Mikel Astizb16c6602014-04-08 14:21:34 +02003620 cp.authentication != HCI_AT_NO_BONDING)
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003621 cp.authentication |= 0x01;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003622 } else {
3623 conn->auth_type = hci_get_auth_req(conn);
3624 cp.authentication = conn->auth_type;
3625 }
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003626
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003627 if (hci_find_remote_oob_data(hdev, &conn->dst) &&
3628 (conn->out || test_bit(HCI_CONN_REMOTE_OOB, &conn->flags)))
Szymon Jancce85ee12011-03-22 13:12:23 +01003629 cp.oob_data = 0x01;
3630 else
3631 cp.oob_data = 0x00;
3632
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003633 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003634 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003635 } else {
3636 struct hci_cp_io_capability_neg_reply cp;
3637
3638 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003639 cp.reason = HCI_ERROR_PAIRING_NOT_ALLOWED;
Johan Hedberg03b555e2011-01-04 15:40:05 +02003640
3641 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003642 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003643 }
3644
3645unlock:
3646 hci_dev_unlock(hdev);
3647}
3648
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003649static void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *skb)
Johan Hedberg03b555e2011-01-04 15:40:05 +02003650{
3651 struct hci_ev_io_capa_reply *ev = (void *) skb->data;
3652 struct hci_conn *conn;
3653
3654 BT_DBG("%s", hdev->name);
3655
3656 hci_dev_lock(hdev);
3657
3658 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3659 if (!conn)
3660 goto unlock;
3661
Johan Hedberg03b555e2011-01-04 15:40:05 +02003662 conn->remote_cap = ev->capability;
Johan Hedberg03b555e2011-01-04 15:40:05 +02003663 conn->remote_auth = ev->authentication;
Johan Hedberg58a681e2012-01-16 06:47:28 +02003664 if (ev->oob_data)
3665 set_bit(HCI_CONN_REMOTE_OOB, &conn->flags);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003666
3667unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02003668 hci_dev_unlock(hdev);
3669}
3670
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003671static void hci_user_confirm_request_evt(struct hci_dev *hdev,
3672 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -03003673{
3674 struct hci_ev_user_confirm_req *ev = (void *) skb->data;
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003675 int loc_mitm, rem_mitm, confirm_hint = 0;
Johan Hedberg7a828902011-04-28 11:28:53 -07003676 struct hci_conn *conn;
Johan Hedberga5c29682011-02-19 12:05:57 -03003677
3678 BT_DBG("%s", hdev->name);
3679
3680 hci_dev_lock(hdev);
3681
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003682 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg7a828902011-04-28 11:28:53 -07003683 goto unlock;
Johan Hedberga5c29682011-02-19 12:05:57 -03003684
Johan Hedberg7a828902011-04-28 11:28:53 -07003685 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3686 if (!conn)
3687 goto unlock;
3688
3689 loc_mitm = (conn->auth_type & 0x01);
3690 rem_mitm = (conn->remote_auth & 0x01);
3691
3692 /* If we require MITM but the remote device can't provide that
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003693 * (it has NoInputNoOutput) then reject the confirmation request
3694 */
3695 if (loc_mitm && conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) {
Johan Hedberg7a828902011-04-28 11:28:53 -07003696 BT_DBG("Rejecting request: remote device can't provide MITM");
3697 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003698 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07003699 goto unlock;
3700 }
3701
3702 /* If no side requires MITM protection; auto-accept */
Mikel Astiza7676312013-06-28 10:56:29 +02003703 if ((!loc_mitm || conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) &&
3704 (!rem_mitm || conn->io_capability == HCI_IO_NO_INPUT_OUTPUT)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003705
3706 /* If we're not the initiators request authorization to
3707 * proceed from user space (mgmt_user_confirm with
Johan Hedbergba15a582014-06-09 13:58:14 +03003708 * confirm_hint set to 1). The exception is if neither
3709 * side had MITM in which case we do auto-accept.
3710 */
3711 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) &&
3712 (loc_mitm || rem_mitm)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003713 BT_DBG("Confirming auto-accept as acceptor");
3714 confirm_hint = 1;
3715 goto confirm;
3716 }
3717
Johan Hedberg9f616562011-04-28 11:28:54 -07003718 BT_DBG("Auto-accept of user confirmation with %ums delay",
Gustavo Padovan807deac2012-05-17 00:36:24 -03003719 hdev->auto_accept_delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07003720
3721 if (hdev->auto_accept_delay > 0) {
3722 int delay = msecs_to_jiffies(hdev->auto_accept_delay);
Johan Hedberg7bc18d92013-10-16 18:11:39 +03003723 queue_delayed_work(conn->hdev->workqueue,
3724 &conn->auto_accept_work, delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07003725 goto unlock;
3726 }
3727
Johan Hedberg7a828902011-04-28 11:28:53 -07003728 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003729 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07003730 goto unlock;
3731 }
3732
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003733confirm:
Johan Hedberg39adbff2014-03-20 08:18:14 +02003734 mgmt_user_confirm_request(hdev, &ev->bdaddr, ACL_LINK, 0,
3735 le32_to_cpu(ev->passkey), confirm_hint);
Johan Hedberg7a828902011-04-28 11:28:53 -07003736
3737unlock:
Johan Hedberga5c29682011-02-19 12:05:57 -03003738 hci_dev_unlock(hdev);
3739}
3740
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003741static void hci_user_passkey_request_evt(struct hci_dev *hdev,
3742 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -08003743{
3744 struct hci_ev_user_passkey_req *ev = (void *) skb->data;
3745
3746 BT_DBG("%s", hdev->name);
3747
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003748 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg272d90d2012-02-09 15:26:12 +02003749 mgmt_user_passkey_request(hdev, &ev->bdaddr, ACL_LINK, 0);
Brian Gix1143d452011-11-23 08:28:34 -08003750}
3751
Johan Hedberg92a25252012-09-06 18:39:26 +03003752static void hci_user_passkey_notify_evt(struct hci_dev *hdev,
3753 struct sk_buff *skb)
3754{
3755 struct hci_ev_user_passkey_notify *ev = (void *) skb->data;
3756 struct hci_conn *conn;
3757
3758 BT_DBG("%s", hdev->name);
3759
3760 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3761 if (!conn)
3762 return;
3763
3764 conn->passkey_notify = __le32_to_cpu(ev->passkey);
3765 conn->passkey_entered = 0;
3766
3767 if (test_bit(HCI_MGMT, &hdev->dev_flags))
3768 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
3769 conn->dst_type, conn->passkey_notify,
3770 conn->passkey_entered);
3771}
3772
3773static void hci_keypress_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
3774{
3775 struct hci_ev_keypress_notify *ev = (void *) skb->data;
3776 struct hci_conn *conn;
3777
3778 BT_DBG("%s", hdev->name);
3779
3780 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3781 if (!conn)
3782 return;
3783
3784 switch (ev->type) {
3785 case HCI_KEYPRESS_STARTED:
3786 conn->passkey_entered = 0;
3787 return;
3788
3789 case HCI_KEYPRESS_ENTERED:
3790 conn->passkey_entered++;
3791 break;
3792
3793 case HCI_KEYPRESS_ERASED:
3794 conn->passkey_entered--;
3795 break;
3796
3797 case HCI_KEYPRESS_CLEARED:
3798 conn->passkey_entered = 0;
3799 break;
3800
3801 case HCI_KEYPRESS_COMPLETED:
3802 return;
3803 }
3804
3805 if (test_bit(HCI_MGMT, &hdev->dev_flags))
3806 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
3807 conn->dst_type, conn->passkey_notify,
3808 conn->passkey_entered);
3809}
3810
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003811static void hci_simple_pair_complete_evt(struct hci_dev *hdev,
3812 struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003813{
3814 struct hci_ev_simple_pair_complete *ev = (void *) skb->data;
3815 struct hci_conn *conn;
3816
3817 BT_DBG("%s", hdev->name);
3818
3819 hci_dev_lock(hdev);
3820
3821 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg2a611692011-02-19 12:06:00 -03003822 if (!conn)
3823 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02003824
Johan Hedberg2a611692011-02-19 12:06:00 -03003825 /* To avoid duplicate auth_failed events to user space we check
3826 * the HCI_CONN_AUTH_PEND flag which will be set if we
3827 * initiated the authentication. A traditional auth_complete
3828 * event gets always produced as initiator and is also mapped to
3829 * the mgmt_auth_failed event */
Mikel Astizfa1bd912012-08-09 09:52:29 +02003830 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) && ev->status)
Johan Hedbergbab73cb2012-02-09 16:07:29 +02003831 mgmt_auth_failed(hdev, &conn->dst, conn->type, conn->dst_type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003832 ev->status);
Johan Hedberg2a611692011-02-19 12:06:00 -03003833
David Herrmann76a68ba2013-04-06 20:28:37 +02003834 hci_conn_drop(conn);
Johan Hedberg2a611692011-02-19 12:06:00 -03003835
3836unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02003837 hci_dev_unlock(hdev);
3838}
3839
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003840static void hci_remote_host_features_evt(struct hci_dev *hdev,
3841 struct sk_buff *skb)
Marcel Holtmann41a96212008-07-14 20:13:48 +02003842{
3843 struct hci_ev_remote_host_features *ev = (void *) skb->data;
3844 struct inquiry_entry *ie;
Johan Hedbergcad718e2013-04-17 15:00:51 +03003845 struct hci_conn *conn;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003846
3847 BT_DBG("%s", hdev->name);
3848
3849 hci_dev_lock(hdev);
3850
Johan Hedbergcad718e2013-04-17 15:00:51 +03003851 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3852 if (conn)
3853 memcpy(conn->features[1], ev->features, 8);
3854
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003855 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3856 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003857 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003858
3859 hci_dev_unlock(hdev);
3860}
3861
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003862static void hci_remote_oob_data_request_evt(struct hci_dev *hdev,
3863 struct sk_buff *skb)
Szymon Janc2763eda2011-03-22 13:12:22 +01003864{
3865 struct hci_ev_remote_oob_data_request *ev = (void *) skb->data;
3866 struct oob_data *data;
3867
3868 BT_DBG("%s", hdev->name);
3869
3870 hci_dev_lock(hdev);
3871
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003872 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Szymon Jance1ba1f12011-04-06 13:01:59 +02003873 goto unlock;
3874
Szymon Janc2763eda2011-03-22 13:12:22 +01003875 data = hci_find_remote_oob_data(hdev, &ev->bdaddr);
3876 if (data) {
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003877 if (test_bit(HCI_SC_ENABLED, &hdev->dev_flags)) {
3878 struct hci_cp_remote_oob_ext_data_reply cp;
Szymon Janc2763eda2011-03-22 13:12:22 +01003879
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003880 bacpy(&cp.bdaddr, &ev->bdaddr);
3881 memcpy(cp.hash192, data->hash192, sizeof(cp.hash192));
3882 memcpy(cp.randomizer192, data->randomizer192,
3883 sizeof(cp.randomizer192));
3884 memcpy(cp.hash256, data->hash256, sizeof(cp.hash256));
3885 memcpy(cp.randomizer256, data->randomizer256,
3886 sizeof(cp.randomizer256));
Szymon Janc2763eda2011-03-22 13:12:22 +01003887
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003888 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_EXT_DATA_REPLY,
3889 sizeof(cp), &cp);
3890 } else {
3891 struct hci_cp_remote_oob_data_reply cp;
3892
3893 bacpy(&cp.bdaddr, &ev->bdaddr);
3894 memcpy(cp.hash, data->hash192, sizeof(cp.hash));
3895 memcpy(cp.randomizer, data->randomizer192,
3896 sizeof(cp.randomizer));
3897
3898 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_REPLY,
3899 sizeof(cp), &cp);
3900 }
Szymon Janc2763eda2011-03-22 13:12:22 +01003901 } else {
3902 struct hci_cp_remote_oob_data_neg_reply cp;
3903
3904 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003905 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_NEG_REPLY,
3906 sizeof(cp), &cp);
Szymon Janc2763eda2011-03-22 13:12:22 +01003907 }
3908
Szymon Jance1ba1f12011-04-06 13:01:59 +02003909unlock:
Szymon Janc2763eda2011-03-22 13:12:22 +01003910 hci_dev_unlock(hdev);
3911}
3912
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003913static void hci_phy_link_complete_evt(struct hci_dev *hdev,
3914 struct sk_buff *skb)
3915{
3916 struct hci_ev_phy_link_complete *ev = (void *) skb->data;
3917 struct hci_conn *hcon, *bredr_hcon;
3918
3919 BT_DBG("%s handle 0x%2.2x status 0x%2.2x", hdev->name, ev->phy_handle,
3920 ev->status);
3921
3922 hci_dev_lock(hdev);
3923
3924 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
3925 if (!hcon) {
3926 hci_dev_unlock(hdev);
3927 return;
3928 }
3929
3930 if (ev->status) {
3931 hci_conn_del(hcon);
3932 hci_dev_unlock(hdev);
3933 return;
3934 }
3935
3936 bredr_hcon = hcon->amp_mgr->l2cap_conn->hcon;
3937
3938 hcon->state = BT_CONNECTED;
3939 bacpy(&hcon->dst, &bredr_hcon->dst);
3940
3941 hci_conn_hold(hcon);
3942 hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003943 hci_conn_drop(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003944
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003945 hci_conn_add_sysfs(hcon);
3946
Andrei Emeltchenkocf70ff22012-10-31 15:46:36 +02003947 amp_physical_cfm(bredr_hcon, hcon);
3948
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003949 hci_dev_unlock(hdev);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003950}
3951
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03003952static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
3953{
3954 struct hci_ev_logical_link_complete *ev = (void *) skb->data;
3955 struct hci_conn *hcon;
3956 struct hci_chan *hchan;
3957 struct amp_mgr *mgr;
3958
3959 BT_DBG("%s log_handle 0x%4.4x phy_handle 0x%2.2x status 0x%2.2x",
3960 hdev->name, le16_to_cpu(ev->handle), ev->phy_handle,
3961 ev->status);
3962
3963 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
3964 if (!hcon)
3965 return;
3966
3967 /* Create AMP hchan */
3968 hchan = hci_chan_create(hcon);
3969 if (!hchan)
3970 return;
3971
3972 hchan->handle = le16_to_cpu(ev->handle);
3973
3974 BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
3975
3976 mgr = hcon->amp_mgr;
3977 if (mgr && mgr->bredr_chan) {
3978 struct l2cap_chan *bredr_chan = mgr->bredr_chan;
3979
3980 l2cap_chan_lock(bredr_chan);
3981
3982 bredr_chan->conn->mtu = hdev->block_mtu;
3983 l2cap_logical_cfm(bredr_chan, hchan, 0);
3984 hci_conn_hold(hcon);
3985
3986 l2cap_chan_unlock(bredr_chan);
3987 }
3988}
3989
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02003990static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
3991 struct sk_buff *skb)
3992{
3993 struct hci_ev_disconn_logical_link_complete *ev = (void *) skb->data;
3994 struct hci_chan *hchan;
3995
3996 BT_DBG("%s log handle 0x%4.4x status 0x%2.2x", hdev->name,
3997 le16_to_cpu(ev->handle), ev->status);
3998
3999 if (ev->status)
4000 return;
4001
4002 hci_dev_lock(hdev);
4003
4004 hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
4005 if (!hchan)
4006 goto unlock;
4007
4008 amp_destroy_logical_link(hchan, ev->reason);
4009
4010unlock:
4011 hci_dev_unlock(hdev);
4012}
4013
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004014static void hci_disconn_phylink_complete_evt(struct hci_dev *hdev,
4015 struct sk_buff *skb)
4016{
4017 struct hci_ev_disconn_phy_link_complete *ev = (void *) skb->data;
4018 struct hci_conn *hcon;
4019
4020 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4021
4022 if (ev->status)
4023 return;
4024
4025 hci_dev_lock(hdev);
4026
4027 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4028 if (hcon) {
4029 hcon->state = BT_CLOSED;
4030 hci_conn_del(hcon);
4031 }
4032
4033 hci_dev_unlock(hdev);
4034}
4035
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004036static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004037{
4038 struct hci_ev_le_conn_complete *ev = (void *) skb->data;
4039 struct hci_conn *conn;
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004040 struct smp_irk *irk;
Johan Hedberg837d5022014-07-02 09:36:22 +03004041 u8 addr_type;
Ville Tervofcd89c02011-02-10 22:38:47 -03004042
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004043 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Ville Tervofcd89c02011-02-10 22:38:47 -03004044
4045 hci_dev_lock(hdev);
4046
Andre Guedesb47a09b2012-07-27 15:10:15 -03004047 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
Ville Tervob62f3282011-02-10 22:38:50 -03004048 if (!conn) {
4049 conn = hci_conn_add(hdev, LE_LINK, &ev->bdaddr);
4050 if (!conn) {
4051 BT_ERR("No memory for new connection");
Andre Guedes230fd162012-07-27 15:10:10 -03004052 goto unlock;
Ville Tervob62f3282011-02-10 22:38:50 -03004053 }
Andre Guedes29b79882011-05-31 14:20:54 -03004054
4055 conn->dst_type = ev->bdaddr_type;
Andre Guedesb9b343d2012-07-27 15:10:11 -03004056
4057 if (ev->role == LE_CONN_ROLE_MASTER) {
4058 conn->out = true;
Johan Hedberg4dae2792014-06-24 17:03:50 +03004059 set_bit(HCI_CONN_MASTER, &conn->flags);
Andre Guedesb9b343d2012-07-27 15:10:11 -03004060 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004061
4062 /* If we didn't have a hci_conn object previously
4063 * but we're in master role this must be something
4064 * initiated using a white list. Since white list based
4065 * connections are not "first class citizens" we don't
4066 * have full tracking of them. Therefore, we go ahead
4067 * with a "best effort" approach of determining the
4068 * initiator address based on the HCI_PRIVACY flag.
4069 */
4070 if (conn->out) {
4071 conn->resp_addr_type = ev->bdaddr_type;
4072 bacpy(&conn->resp_addr, &ev->bdaddr);
4073 if (test_bit(HCI_PRIVACY, &hdev->dev_flags)) {
4074 conn->init_addr_type = ADDR_LE_DEV_RANDOM;
4075 bacpy(&conn->init_addr, &hdev->rpa);
4076 } else {
4077 hci_copy_identity_address(hdev,
4078 &conn->init_addr,
4079 &conn->init_addr_type);
4080 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004081 }
Johan Hedberg9489eca2014-02-28 17:45:46 +02004082 } else {
4083 cancel_delayed_work(&conn->le_conn_timeout);
Ville Tervob62f3282011-02-10 22:38:50 -03004084 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004085
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004086 if (!conn->out) {
4087 /* Set the responder (our side) address type based on
4088 * the advertising address type.
4089 */
4090 conn->resp_addr_type = hdev->adv_addr_type;
4091 if (hdev->adv_addr_type == ADDR_LE_DEV_RANDOM)
4092 bacpy(&conn->resp_addr, &hdev->random_addr);
4093 else
4094 bacpy(&conn->resp_addr, &hdev->bdaddr);
4095
4096 conn->init_addr_type = ev->bdaddr_type;
4097 bacpy(&conn->init_addr, &ev->bdaddr);
Marcel Holtmanna720d732014-06-23 12:14:51 +02004098
4099 /* For incoming connections, set the default minimum
4100 * and maximum connection interval. They will be used
4101 * to check if the parameters are in range and if not
4102 * trigger the connection update procedure.
4103 */
4104 conn->le_conn_min_interval = hdev->le_conn_min_interval;
4105 conn->le_conn_max_interval = hdev->le_conn_max_interval;
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004106 }
Johan Hedberg7be2edb2014-02-23 19:42:17 +02004107
Marcel Holtmannedb4b462014-02-18 15:13:43 -08004108 /* Lookup the identity address from the stored connection
4109 * address and address type.
4110 *
4111 * When establishing connections to an identity address, the
4112 * connection procedure will store the resolvable random
4113 * address first. Now if it can be converted back into the
4114 * identity address, start using the identity address from
4115 * now on.
4116 */
4117 irk = hci_get_irk(hdev, &conn->dst, conn->dst_type);
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004118 if (irk) {
4119 bacpy(&conn->dst, &irk->bdaddr);
4120 conn->dst_type = irk->addr_type;
4121 }
4122
Johan Hedberg837d5022014-07-02 09:36:22 +03004123 if (conn->dst_type == ADDR_LE_DEV_PUBLIC)
4124 addr_type = BDADDR_LE_PUBLIC;
4125 else
4126 addr_type = BDADDR_LE_RANDOM;
4127
4128 /* Drop the connection if he device is blocked */
4129 if (hci_blacklist_lookup(hdev, &conn->dst, addr_type)) {
4130 hci_conn_drop(conn);
4131 goto unlock;
4132 }
4133
Andre Guedescd17dec2012-07-27 15:10:16 -03004134 if (ev->status) {
Andre Guedes06c053f2014-02-26 20:21:41 -03004135 hci_le_conn_failed(conn, ev->status);
Andre Guedescd17dec2012-07-27 15:10:16 -03004136 goto unlock;
4137 }
4138
Johan Hedbergb644ba32012-01-17 21:48:47 +02004139 if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Marcel Holtmann01fdb0f2014-02-18 14:22:19 -08004140 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03004141 conn->dst_type, 0, NULL, 0, NULL);
Vinicius Costa Gomes83bc71b2011-05-06 18:41:43 -03004142
Vinicius Costa Gomes7b5c0d52011-06-09 18:50:50 -03004143 conn->sec_level = BT_SECURITY_LOW;
Ville Tervofcd89c02011-02-10 22:38:47 -03004144 conn->handle = __le16_to_cpu(ev->handle);
4145 conn->state = BT_CONNECTED;
4146
Marcel Holtmanne04fde62014-06-23 11:40:04 +02004147 conn->le_conn_interval = le16_to_cpu(ev->interval);
4148 conn->le_conn_latency = le16_to_cpu(ev->latency);
4149 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4150
Ville Tervofcd89c02011-02-10 22:38:47 -03004151 hci_conn_add_sysfs(conn);
4152
4153 hci_proto_connect_cfm(conn, ev->status);
4154
Andre Guedesa4790db2014-02-26 20:21:47 -03004155 hci_pend_le_conn_del(hdev, &conn->dst, conn->dst_type);
4156
Ville Tervofcd89c02011-02-10 22:38:47 -03004157unlock:
4158 hci_dev_unlock(hdev);
4159}
4160
Marcel Holtmann1855d922014-06-23 11:40:05 +02004161static void hci_le_conn_update_complete_evt(struct hci_dev *hdev,
4162 struct sk_buff *skb)
4163{
4164 struct hci_ev_le_conn_update_complete *ev = (void *) skb->data;
4165 struct hci_conn *conn;
4166
4167 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4168
4169 if (ev->status)
4170 return;
4171
4172 hci_dev_lock(hdev);
4173
4174 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
4175 if (conn) {
4176 conn->le_conn_interval = le16_to_cpu(ev->interval);
4177 conn->le_conn_latency = le16_to_cpu(ev->latency);
4178 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4179 }
4180
4181 hci_dev_unlock(hdev);
4182}
4183
Andre Guedesa4790db2014-02-26 20:21:47 -03004184/* This function requires the caller holds hdev->lock */
4185static void check_pending_le_conn(struct hci_dev *hdev, bdaddr_t *addr,
4186 u8 addr_type)
4187{
4188 struct hci_conn *conn;
4189
4190 if (!hci_pend_le_conn_lookup(hdev, addr, addr_type))
4191 return;
4192
4193 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
4194 HCI_AT_NO_BONDING);
4195 if (!IS_ERR(conn))
4196 return;
4197
4198 switch (PTR_ERR(conn)) {
4199 case -EBUSY:
4200 /* If hci_connect() returns -EBUSY it means there is already
4201 * an LE connection attempt going on. Since controllers don't
4202 * support more than one connection attempt at the time, we
4203 * don't consider this an error case.
4204 */
4205 break;
4206 default:
4207 BT_DBG("Failed to connect: err %ld", PTR_ERR(conn));
4208 }
4209}
4210
Johan Hedberg4af605d2014-03-24 10:48:00 +02004211static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
4212 u8 bdaddr_type, s8 rssi, u8 *data, u8 len)
4213{
Johan Hedbergb9a63282014-03-25 10:51:52 +02004214 struct discovery_state *d = &hdev->discovery;
Johan Hedberg474ee062014-03-25 14:34:59 +02004215 bool match;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004216 u32 flags;
Johan Hedbergb9a63282014-03-25 10:51:52 +02004217
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004218 /* Passive scanning shouldn't trigger any device found events,
4219 * except for devices marked as CONN_REPORT for which we do send
4220 * device found events.
4221 */
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004222 if (hdev->le_scan_type == LE_SCAN_PASSIVE) {
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004223 struct hci_conn_params *param;
Johan Hedberg079446c2014-07-02 23:09:24 +03004224 struct smp_irk *irk;
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004225
Johan Hedberg435a13d2014-07-03 19:33:48 +03004226 /* Check if we need to convert to identity address */
4227 irk = hci_get_irk(hdev, bdaddr, bdaddr_type);
4228 if (irk) {
4229 bdaddr = &irk->bdaddr;
4230 bdaddr_type = irk->addr_type;
4231 }
4232
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004233 if (type == LE_ADV_IND || type == LE_ADV_DIRECT_IND)
4234 check_pending_le_conn(hdev, bdaddr, bdaddr_type);
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004235
4236 if (!hdev->pend_le_reports)
4237 return;
4238
4239 if (type == LE_ADV_DIRECT_IND)
4240 return;
4241
Johan Hedberg079446c2014-07-02 23:09:24 +03004242 /* The conn params list only contains identity addresses */
4243 if (!hci_is_identity_address(bdaddr, bdaddr_type))
4244 return;
4245
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004246 param = hci_conn_params_lookup(hdev, bdaddr, bdaddr_type);
4247 if (!param || param->auto_connect != HCI_AUTO_CONN_REPORT)
4248 return;
4249
4250 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND)
4251 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4252 else
4253 flags = 0;
4254 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
4255 rssi, flags, data, len, NULL, 0);
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004256 }
Johan Hedberg4af605d2014-03-24 10:48:00 +02004257
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004258 /* When receiving non-connectable or scannable undirected
4259 * advertising reports, this means that the remote device is
4260 * not connectable and then clearly indicate this in the
4261 * device found event.
4262 *
4263 * When receiving a scan response, then there is no way to
4264 * know if the remote device is connectable or not. However
4265 * since scan responses are merged with a previously seen
4266 * advertising report, the flags field from that report
4267 * will be used.
4268 *
4269 * In the really unlikely case that a controller get confused
4270 * and just sends a scan response event, then it is marked as
4271 * not connectable as well.
4272 */
4273 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND ||
4274 type == LE_ADV_SCAN_RSP)
4275 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4276 else
4277 flags = 0;
4278
Johan Hedbergb9a63282014-03-25 10:51:52 +02004279 /* If there's nothing pending either store the data from this
4280 * event or send an immediate device found event if the data
4281 * should not be stored for later.
4282 */
4283 if (!has_pending_adv_report(hdev)) {
4284 /* If the report will trigger a SCAN_REQ store it for
4285 * later merging.
4286 */
4287 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4288 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004289 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004290 return;
4291 }
4292
4293 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004294 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004295 return;
4296 }
4297
Johan Hedberg474ee062014-03-25 14:34:59 +02004298 /* Check if the pending report is for the same device as the new one */
4299 match = (!bacmp(bdaddr, &d->last_adv_addr) &&
4300 bdaddr_type == d->last_adv_addr_type);
4301
Johan Hedbergb9a63282014-03-25 10:51:52 +02004302 /* If the pending data doesn't match this report or this isn't a
4303 * scan response (e.g. we got a duplicate ADV_IND) then force
4304 * sending of the pending data.
4305 */
Johan Hedberg474ee062014-03-25 14:34:59 +02004306 if (type != LE_ADV_SCAN_RSP || !match) {
4307 /* Send out whatever is in the cache, but skip duplicates */
4308 if (!match)
4309 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004310 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004311 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004312 d->last_adv_data,
Johan Hedberg474ee062014-03-25 14:34:59 +02004313 d->last_adv_data_len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004314
4315 /* If the new report will trigger a SCAN_REQ store it for
4316 * later merging.
4317 */
4318 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4319 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004320 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004321 return;
4322 }
4323
4324 /* The advertising reports cannot be merged, so clear
4325 * the pending report and send out a device found event.
4326 */
4327 clear_pending_adv_report(hdev);
Johan Hedberg5c5b93e2014-03-29 08:39:53 +02004328 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004329 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004330 return;
4331 }
4332
4333 /* If we get here we've got a pending ADV_IND or ADV_SCAN_IND and
4334 * the new event is a SCAN_RSP. We can therefore proceed with
4335 * sending a merged device found event.
4336 */
4337 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004338 d->last_adv_addr_type, NULL, rssi, d->last_adv_flags,
Marcel Holtmann42bd6a52014-07-01 14:11:19 +02004339 d->last_adv_data, d->last_adv_data_len, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004340 clear_pending_adv_report(hdev);
Johan Hedberg4af605d2014-03-24 10:48:00 +02004341}
4342
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004343static void hci_le_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andre Guedes9aa04c92011-05-26 16:23:51 -03004344{
Andre Guedese95beb42011-09-26 20:48:35 -03004345 u8 num_reports = skb->data[0];
4346 void *ptr = &skb->data[1];
Andre Guedes9aa04c92011-05-26 16:23:51 -03004347
Andre Guedesa4790db2014-02-26 20:21:47 -03004348 hci_dev_lock(hdev);
4349
Andre Guedese95beb42011-09-26 20:48:35 -03004350 while (num_reports--) {
4351 struct hci_ev_le_advertising_info *ev = ptr;
Johan Hedberg4af605d2014-03-24 10:48:00 +02004352 s8 rssi;
Andre Guedesa4790db2014-02-26 20:21:47 -03004353
Andre Guedes3c9e9192012-01-10 18:20:50 -03004354 rssi = ev->data[ev->length];
Johan Hedberg4af605d2014-03-24 10:48:00 +02004355 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
4356 ev->bdaddr_type, rssi, ev->data, ev->length);
Andre Guedes3c9e9192012-01-10 18:20:50 -03004357
Andre Guedese95beb42011-09-26 20:48:35 -03004358 ptr += sizeof(*ev) + ev->length + 1;
Andre Guedes9aa04c92011-05-26 16:23:51 -03004359 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004360
4361 hci_dev_unlock(hdev);
Andre Guedes9aa04c92011-05-26 16:23:51 -03004362}
4363
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004364static void hci_le_ltk_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004365{
4366 struct hci_ev_le_ltk_req *ev = (void *) skb->data;
4367 struct hci_cp_le_ltk_reply cp;
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004368 struct hci_cp_le_ltk_neg_reply neg;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004369 struct hci_conn *conn;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004370 struct smp_ltk *ltk;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004371
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004372 BT_DBG("%s handle 0x%4.4x", hdev->name, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004373
4374 hci_dev_lock(hdev);
4375
4376 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004377 if (conn == NULL)
4378 goto not_found;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004379
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08004380 ltk = hci_find_ltk(hdev, ev->ediv, ev->rand, conn->out);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004381 if (ltk == NULL)
4382 goto not_found;
4383
4384 memcpy(cp.ltk, ltk->val, sizeof(ltk->val));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004385 cp.handle = cpu_to_le16(conn->handle);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004386
4387 if (ltk->authenticated)
Andre Guedesf8776212013-07-31 16:25:28 -03004388 conn->pending_sec_level = BT_SECURITY_HIGH;
4389 else
4390 conn->pending_sec_level = BT_SECURITY_MEDIUM;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004391
Andre Guedes89cbb4d2013-07-31 16:25:29 -03004392 conn->enc_key_size = ltk->enc_size;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004393
4394 hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp);
4395
Claudio Takahasi5981a882013-07-25 16:34:24 -03004396 /* Ref. Bluetooth Core SPEC pages 1975 and 2004. STK is a
4397 * temporary key used to encrypt a connection following
4398 * pairing. It is used during the Encrypted Session Setup to
4399 * distribute the keys. Later, security can be re-established
4400 * using a distributed LTK.
4401 */
Johan Hedberg2ceba532014-06-16 19:25:16 +03004402 if (ltk->type == SMP_STK) {
Johan Hedbergfe59a052014-07-01 19:14:12 +03004403 set_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004404 list_del(&ltk->list);
4405 kfree(ltk);
Johan Hedbergfe59a052014-07-01 19:14:12 +03004406 } else {
4407 clear_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004408 }
4409
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004410 hci_dev_unlock(hdev);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004411
4412 return;
4413
4414not_found:
4415 neg.handle = ev->handle;
4416 hci_send_cmd(hdev, HCI_OP_LE_LTK_NEG_REPLY, sizeof(neg), &neg);
4417 hci_dev_unlock(hdev);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004418}
4419
Andre Guedes8e75b462014-07-01 18:10:08 -03004420static void send_conn_param_neg_reply(struct hci_dev *hdev, u16 handle,
4421 u8 reason)
4422{
4423 struct hci_cp_le_conn_param_req_neg_reply cp;
4424
4425 cp.handle = cpu_to_le16(handle);
4426 cp.reason = reason;
4427
4428 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_NEG_REPLY, sizeof(cp),
4429 &cp);
4430}
4431
4432static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev,
4433 struct sk_buff *skb)
4434{
4435 struct hci_ev_le_remote_conn_param_req *ev = (void *) skb->data;
4436 struct hci_cp_le_conn_param_req_reply cp;
4437 struct hci_conn *hcon;
4438 u16 handle, min, max, latency, timeout;
4439
4440 handle = le16_to_cpu(ev->handle);
4441 min = le16_to_cpu(ev->interval_min);
4442 max = le16_to_cpu(ev->interval_max);
4443 latency = le16_to_cpu(ev->latency);
4444 timeout = le16_to_cpu(ev->timeout);
4445
4446 hcon = hci_conn_hash_lookup_handle(hdev, handle);
4447 if (!hcon || hcon->state != BT_CONNECTED)
4448 return send_conn_param_neg_reply(hdev, handle,
4449 HCI_ERROR_UNKNOWN_CONN_ID);
4450
4451 if (hci_check_conn_params(min, max, latency, timeout))
4452 return send_conn_param_neg_reply(hdev, handle,
4453 HCI_ERROR_INVALID_LL_PARAMS);
4454
Johan Hedberg348d50b2014-07-02 17:37:30 +03004455 if (test_bit(HCI_CONN_MASTER, &hcon->flags)) {
4456 struct hci_conn_params *params;
Johan Hedbergf4869e22014-07-02 17:37:32 +03004457 u8 store_hint;
Johan Hedberg348d50b2014-07-02 17:37:30 +03004458
4459 hci_dev_lock(hdev);
4460
4461 params = hci_conn_params_lookup(hdev, &hcon->dst,
4462 hcon->dst_type);
4463 if (params) {
4464 params->conn_min_interval = min;
4465 params->conn_max_interval = max;
4466 params->conn_latency = latency;
4467 params->supervision_timeout = timeout;
Johan Hedbergf4869e22014-07-02 17:37:32 +03004468 store_hint = 0x01;
4469 } else{
4470 store_hint = 0x00;
Johan Hedberg348d50b2014-07-02 17:37:30 +03004471 }
4472
4473 hci_dev_unlock(hdev);
4474
Johan Hedbergf4869e22014-07-02 17:37:32 +03004475 mgmt_new_conn_param(hdev, &hcon->dst, hcon->dst_type,
4476 store_hint, min, max, latency, timeout);
Johan Hedberg348d50b2014-07-02 17:37:30 +03004477 }
Andre Guedesffb5a8272014-07-01 18:10:11 -03004478
Andre Guedes8e75b462014-07-01 18:10:08 -03004479 cp.handle = ev->handle;
4480 cp.interval_min = ev->interval_min;
4481 cp.interval_max = ev->interval_max;
4482 cp.latency = ev->latency;
4483 cp.timeout = ev->timeout;
4484 cp.min_ce_len = 0;
4485 cp.max_ce_len = 0;
4486
4487 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_REPLY, sizeof(cp), &cp);
4488}
4489
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004490static void hci_le_meta_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004491{
4492 struct hci_ev_le_meta *le_ev = (void *) skb->data;
4493
4494 skb_pull(skb, sizeof(*le_ev));
4495
4496 switch (le_ev->subevent) {
4497 case HCI_EV_LE_CONN_COMPLETE:
4498 hci_le_conn_complete_evt(hdev, skb);
4499 break;
4500
Marcel Holtmann1855d922014-06-23 11:40:05 +02004501 case HCI_EV_LE_CONN_UPDATE_COMPLETE:
4502 hci_le_conn_update_complete_evt(hdev, skb);
4503 break;
4504
Andre Guedes9aa04c92011-05-26 16:23:51 -03004505 case HCI_EV_LE_ADVERTISING_REPORT:
4506 hci_le_adv_report_evt(hdev, skb);
4507 break;
4508
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004509 case HCI_EV_LE_LTK_REQ:
4510 hci_le_ltk_request_evt(hdev, skb);
4511 break;
4512
Andre Guedes8e75b462014-07-01 18:10:08 -03004513 case HCI_EV_LE_REMOTE_CONN_PARAM_REQ:
4514 hci_le_remote_conn_param_req_evt(hdev, skb);
4515 break;
4516
Ville Tervofcd89c02011-02-10 22:38:47 -03004517 default:
4518 break;
4519 }
4520}
4521
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03004522static void hci_chan_selected_evt(struct hci_dev *hdev, struct sk_buff *skb)
4523{
4524 struct hci_ev_channel_selected *ev = (void *) skb->data;
4525 struct hci_conn *hcon;
4526
4527 BT_DBG("%s handle 0x%2.2x", hdev->name, ev->phy_handle);
4528
4529 skb_pull(skb, sizeof(*ev));
4530
4531 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4532 if (!hcon)
4533 return;
4534
4535 amp_read_loc_assoc_final_data(hdev, hcon);
4536}
4537
Linus Torvalds1da177e2005-04-16 15:20:36 -07004538void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
4539{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004540 struct hci_event_hdr *hdr = (void *) skb->data;
4541 __u8 event = hdr->evt;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004542
Johan Hedbergb6ddb632013-04-02 13:34:31 +03004543 hci_dev_lock(hdev);
4544
4545 /* Received events are (currently) only needed when a request is
4546 * ongoing so avoid unnecessary memory allocation.
4547 */
4548 if (hdev->req_status == HCI_REQ_PEND) {
4549 kfree_skb(hdev->recv_evt);
4550 hdev->recv_evt = skb_clone(skb, GFP_KERNEL);
4551 }
4552
4553 hci_dev_unlock(hdev);
4554
Linus Torvalds1da177e2005-04-16 15:20:36 -07004555 skb_pull(skb, HCI_EVENT_HDR_SIZE);
4556
Johan Hedberg02350a72013-04-03 21:50:29 +03004557 if (hdev->sent_cmd && bt_cb(hdev->sent_cmd)->req.event == event) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02004558 struct hci_command_hdr *cmd_hdr = (void *) hdev->sent_cmd->data;
4559 u16 opcode = __le16_to_cpu(cmd_hdr->opcode);
Johan Hedberg02350a72013-04-03 21:50:29 +03004560
4561 hci_req_cmd_complete(hdev, opcode, 0);
4562 }
4563
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004564 switch (event) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004565 case HCI_EV_INQUIRY_COMPLETE:
4566 hci_inquiry_complete_evt(hdev, skb);
4567 break;
4568
4569 case HCI_EV_INQUIRY_RESULT:
4570 hci_inquiry_result_evt(hdev, skb);
4571 break;
4572
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004573 case HCI_EV_CONN_COMPLETE:
4574 hci_conn_complete_evt(hdev, skb);
Marcel Holtmann21d9e302005-09-13 01:32:25 +02004575 break;
4576
Linus Torvalds1da177e2005-04-16 15:20:36 -07004577 case HCI_EV_CONN_REQUEST:
4578 hci_conn_request_evt(hdev, skb);
4579 break;
4580
Linus Torvalds1da177e2005-04-16 15:20:36 -07004581 case HCI_EV_DISCONN_COMPLETE:
4582 hci_disconn_complete_evt(hdev, skb);
4583 break;
4584
Linus Torvalds1da177e2005-04-16 15:20:36 -07004585 case HCI_EV_AUTH_COMPLETE:
4586 hci_auth_complete_evt(hdev, skb);
4587 break;
4588
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004589 case HCI_EV_REMOTE_NAME:
4590 hci_remote_name_evt(hdev, skb);
4591 break;
4592
Linus Torvalds1da177e2005-04-16 15:20:36 -07004593 case HCI_EV_ENCRYPT_CHANGE:
4594 hci_encrypt_change_evt(hdev, skb);
4595 break;
4596
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004597 case HCI_EV_CHANGE_LINK_KEY_COMPLETE:
4598 hci_change_link_key_complete_evt(hdev, skb);
4599 break;
4600
4601 case HCI_EV_REMOTE_FEATURES:
4602 hci_remote_features_evt(hdev, skb);
4603 break;
4604
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004605 case HCI_EV_CMD_COMPLETE:
4606 hci_cmd_complete_evt(hdev, skb);
4607 break;
4608
4609 case HCI_EV_CMD_STATUS:
4610 hci_cmd_status_evt(hdev, skb);
4611 break;
4612
4613 case HCI_EV_ROLE_CHANGE:
4614 hci_role_change_evt(hdev, skb);
4615 break;
4616
4617 case HCI_EV_NUM_COMP_PKTS:
4618 hci_num_comp_pkts_evt(hdev, skb);
4619 break;
4620
4621 case HCI_EV_MODE_CHANGE:
4622 hci_mode_change_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004623 break;
4624
4625 case HCI_EV_PIN_CODE_REQ:
4626 hci_pin_code_request_evt(hdev, skb);
4627 break;
4628
4629 case HCI_EV_LINK_KEY_REQ:
4630 hci_link_key_request_evt(hdev, skb);
4631 break;
4632
4633 case HCI_EV_LINK_KEY_NOTIFY:
4634 hci_link_key_notify_evt(hdev, skb);
4635 break;
4636
4637 case HCI_EV_CLOCK_OFFSET:
4638 hci_clock_offset_evt(hdev, skb);
4639 break;
4640
Marcel Holtmanna8746412008-07-14 20:13:46 +02004641 case HCI_EV_PKT_TYPE_CHANGE:
4642 hci_pkt_type_change_evt(hdev, skb);
4643 break;
4644
Marcel Holtmann85a1e932005-08-09 20:28:02 -07004645 case HCI_EV_PSCAN_REP_MODE:
4646 hci_pscan_rep_mode_evt(hdev, skb);
4647 break;
4648
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004649 case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
4650 hci_inquiry_result_with_rssi_evt(hdev, skb);
4651 break;
4652
4653 case HCI_EV_REMOTE_EXT_FEATURES:
4654 hci_remote_ext_features_evt(hdev, skb);
4655 break;
4656
4657 case HCI_EV_SYNC_CONN_COMPLETE:
4658 hci_sync_conn_complete_evt(hdev, skb);
4659 break;
4660
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004661 case HCI_EV_EXTENDED_INQUIRY_RESULT:
4662 hci_extended_inquiry_result_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004663 break;
4664
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004665 case HCI_EV_KEY_REFRESH_COMPLETE:
4666 hci_key_refresh_complete_evt(hdev, skb);
4667 break;
4668
Marcel Holtmann04936842008-07-14 20:13:48 +02004669 case HCI_EV_IO_CAPA_REQUEST:
4670 hci_io_capa_request_evt(hdev, skb);
4671 break;
4672
Johan Hedberg03b555e2011-01-04 15:40:05 +02004673 case HCI_EV_IO_CAPA_REPLY:
4674 hci_io_capa_reply_evt(hdev, skb);
4675 break;
4676
Johan Hedberga5c29682011-02-19 12:05:57 -03004677 case HCI_EV_USER_CONFIRM_REQUEST:
4678 hci_user_confirm_request_evt(hdev, skb);
4679 break;
4680
Brian Gix1143d452011-11-23 08:28:34 -08004681 case HCI_EV_USER_PASSKEY_REQUEST:
4682 hci_user_passkey_request_evt(hdev, skb);
4683 break;
4684
Johan Hedberg92a25252012-09-06 18:39:26 +03004685 case HCI_EV_USER_PASSKEY_NOTIFY:
4686 hci_user_passkey_notify_evt(hdev, skb);
4687 break;
4688
4689 case HCI_EV_KEYPRESS_NOTIFY:
4690 hci_keypress_notify_evt(hdev, skb);
4691 break;
4692
Marcel Holtmann04936842008-07-14 20:13:48 +02004693 case HCI_EV_SIMPLE_PAIR_COMPLETE:
4694 hci_simple_pair_complete_evt(hdev, skb);
4695 break;
4696
Marcel Holtmann41a96212008-07-14 20:13:48 +02004697 case HCI_EV_REMOTE_HOST_FEATURES:
4698 hci_remote_host_features_evt(hdev, skb);
4699 break;
4700
Ville Tervofcd89c02011-02-10 22:38:47 -03004701 case HCI_EV_LE_META:
4702 hci_le_meta_evt(hdev, skb);
4703 break;
4704
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03004705 case HCI_EV_CHANNEL_SELECTED:
4706 hci_chan_selected_evt(hdev, skb);
4707 break;
4708
Szymon Janc2763eda2011-03-22 13:12:22 +01004709 case HCI_EV_REMOTE_OOB_DATA_REQUEST:
4710 hci_remote_oob_data_request_evt(hdev, skb);
4711 break;
4712
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004713 case HCI_EV_PHY_LINK_COMPLETE:
4714 hci_phy_link_complete_evt(hdev, skb);
4715 break;
4716
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004717 case HCI_EV_LOGICAL_LINK_COMPLETE:
4718 hci_loglink_complete_evt(hdev, skb);
4719 break;
4720
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02004721 case HCI_EV_DISCONN_LOGICAL_LINK_COMPLETE:
4722 hci_disconn_loglink_complete_evt(hdev, skb);
4723 break;
4724
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004725 case HCI_EV_DISCONN_PHY_LINK_COMPLETE:
4726 hci_disconn_phylink_complete_evt(hdev, skb);
4727 break;
4728
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02004729 case HCI_EV_NUM_COMP_BLOCKS:
4730 hci_num_comp_blocks_evt(hdev, skb);
4731 break;
4732
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004733 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004734 BT_DBG("%s event 0x%2.2x", hdev->name, event);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004735 break;
4736 }
4737
4738 kfree_skb(skb);
4739 hdev->stat.evt_rx++;
4740}