blob: a4854a5d929863f837573dfc0cb77d878f9583ba [file] [log] [blame]
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 BlueZ - Bluetooth protocol stack for Linux
Ron Shaffer2d0a0342010-05-28 11:53:46 -04003 Copyright (c) 2000-2001, 2010, Code Aurora Forum. All rights reserved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
10
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090015 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Linus Torvalds1da177e2005-04-16 15:20:36 -070018 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090020 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 SOFTWARE IS DISCLAIMED.
23*/
24
25/* Bluetooth HCI event handling. */
26
Linus Torvalds1da177e2005-04-16 15:20:36 -070027#include <asm/unaligned.h>
28
29#include <net/bluetooth/bluetooth.h>
30#include <net/bluetooth/hci_core.h>
Mikel Astizf0d6a0e2012-08-09 09:52:30 +020031#include <net/bluetooth/mgmt.h>
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070032
Marcel Holtmann70247282013-10-10 14:54:15 -070033#include "a2mp.h"
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070034#include "amp.h"
Johan Hedberg2ceba532014-06-16 19:25:16 +030035#include "smp.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070036
Linus Torvalds1da177e2005-04-16 15:20:36 -070037/* Handle HCI Event packets */
38
Marcel Holtmanna9de9242007-10-20 13:33:56 +020039static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070040{
Marcel Holtmanna9de9242007-10-20 13:33:56 +020041 __u8 status = *((__u8 *) skb->data);
Linus Torvalds1da177e2005-04-16 15:20:36 -070042
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030043 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -070044
Andre Guedes82f47852013-04-30 15:29:34 -030045 if (status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +020046 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -070047
Andre Guedes89352e72011-11-04 14:16:53 -030048 clear_bit(HCI_INQUIRY, &hdev->flags);
Peter Zijlstra4e857c52014-03-17 18:06:10 +010049 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -030050 wake_up_bit(&hdev->flags, HCI_INQUIRY);
Andre Guedes89352e72011-11-04 14:16:53 -030051
Johan Hedberg50143a42014-06-10 14:05:57 +030052 hci_dev_lock(hdev);
53 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
54 hci_dev_unlock(hdev);
55
Marcel Holtmanna9de9242007-10-20 13:33:56 +020056 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -070057}
58
Andre Guedes4d934832012-03-21 00:03:35 -030059static void hci_cc_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
60{
61 __u8 status = *((__u8 *) skb->data);
62
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030063 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesae854a72012-03-21 00:03:36 -030064
65 if (status)
66 return;
67
68 set_bit(HCI_PERIODIC_INQ, &hdev->dev_flags);
Andre Guedes4d934832012-03-21 00:03:35 -030069}
70
Marcel Holtmanna9de9242007-10-20 13:33:56 +020071static void hci_cc_exit_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070072{
Marcel Holtmanna9de9242007-10-20 13:33:56 +020073 __u8 status = *((__u8 *) skb->data);
74
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030075 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +020076
77 if (status)
78 return;
79
Andre Guedesae854a72012-03-21 00:03:36 -030080 clear_bit(HCI_PERIODIC_INQ, &hdev->dev_flags);
81
Marcel Holtmanna9de9242007-10-20 13:33:56 +020082 hci_conn_check_pending(hdev);
83}
84
Gustavo Padovan807deac2012-05-17 00:36:24 -030085static void hci_cc_remote_name_req_cancel(struct hci_dev *hdev,
86 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +020087{
88 BT_DBG("%s", hdev->name);
89}
90
91static void hci_cc_role_discovery(struct hci_dev *hdev, struct sk_buff *skb)
92{
93 struct hci_rp_role_discovery *rp = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -070094 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -070095
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030096 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -070097
Marcel Holtmanna9de9242007-10-20 13:33:56 +020098 if (rp->status)
99 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700100
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200101 hci_dev_lock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200103 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
104 if (conn) {
105 if (rp->role)
Johan Hedberg4dae2792014-06-24 17:03:50 +0300106 clear_bit(HCI_CONN_MASTER, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200107 else
Johan Hedberg4dae2792014-06-24 17:03:50 +0300108 set_bit(HCI_CONN_MASTER, &conn->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700109 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200110
111 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112}
113
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200114static void hci_cc_read_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
115{
116 struct hci_rp_read_link_policy *rp = (void *) skb->data;
117 struct hci_conn *conn;
118
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300119 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200120
121 if (rp->status)
122 return;
123
124 hci_dev_lock(hdev);
125
126 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
127 if (conn)
128 conn->link_policy = __le16_to_cpu(rp->policy);
129
130 hci_dev_unlock(hdev);
131}
132
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200133static void hci_cc_write_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700134{
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200135 struct hci_rp_write_link_policy *rp = (void *) skb->data;
136 struct hci_conn *conn;
137 void *sent;
138
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300139 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200140
141 if (rp->status)
142 return;
143
144 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LINK_POLICY);
145 if (!sent)
146 return;
147
148 hci_dev_lock(hdev);
149
150 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200151 if (conn)
Harvey Harrison83985312008-05-02 16:25:46 -0700152 conn->link_policy = get_unaligned_le16(sent + 2);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200153
154 hci_dev_unlock(hdev);
155}
156
Gustavo Padovan807deac2012-05-17 00:36:24 -0300157static void hci_cc_read_def_link_policy(struct hci_dev *hdev,
158 struct sk_buff *skb)
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200159{
160 struct hci_rp_read_def_link_policy *rp = (void *) skb->data;
161
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300162 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200163
164 if (rp->status)
165 return;
166
167 hdev->link_policy = __le16_to_cpu(rp->policy);
168}
169
Gustavo Padovan807deac2012-05-17 00:36:24 -0300170static void hci_cc_write_def_link_policy(struct hci_dev *hdev,
171 struct sk_buff *skb)
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200172{
173 __u8 status = *((__u8 *) skb->data);
174 void *sent;
175
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300176 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200177
178 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_DEF_LINK_POLICY);
179 if (!sent)
180 return;
181
182 if (!status)
183 hdev->link_policy = get_unaligned_le16(sent);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200184}
185
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200186static void hci_cc_reset(struct hci_dev *hdev, struct sk_buff *skb)
187{
188 __u8 status = *((__u8 *) skb->data);
189
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300190 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200191
Gustavo F. Padovan10572132011-03-16 15:36:29 -0300192 clear_bit(HCI_RESET, &hdev->flags);
193
Johan Hedberga297e972012-02-21 17:55:47 +0200194 /* Reset all non-persistent flags */
Johan Hedberg2cc6fb02013-03-15 17:06:57 -0500195 hdev->dev_flags &= ~HCI_PERSISTENT_MASK;
Andre Guedes69775ff2012-02-23 16:50:05 +0200196
197 hdev->discovery.state = DISCOVERY_STOPPED;
Johan Hedbergbbaf4442012-11-08 01:22:59 +0100198 hdev->inq_tx_power = HCI_TX_POWER_INVALID;
199 hdev->adv_tx_power = HCI_TX_POWER_INVALID;
Johan Hedberg3f0f5242012-11-08 01:23:00 +0100200
201 memset(hdev->adv_data, 0, sizeof(hdev->adv_data));
202 hdev->adv_data_len = 0;
Marcel Holtmannf8e808b2013-10-16 00:16:47 -0700203
204 memset(hdev->scan_rsp_data, 0, sizeof(hdev->scan_rsp_data));
205 hdev->scan_rsp_data_len = 0;
Marcel Holtmann06f5b772013-10-19 07:09:11 -0700206
Marcel Holtmann533553f2014-03-21 12:18:10 -0700207 hdev->le_scan_type = LE_SCAN_PASSIVE;
208
Marcel Holtmann06f5b772013-10-19 07:09:11 -0700209 hdev->ssp_debug_mode = 0;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200210}
211
212static void hci_cc_write_local_name(struct hci_dev *hdev, struct sk_buff *skb)
213{
214 __u8 status = *((__u8 *) skb->data);
215 void *sent;
216
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300217 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200218
219 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LOCAL_NAME);
220 if (!sent)
221 return;
222
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200223 hci_dev_lock(hdev);
224
Johan Hedbergf51d5b22012-02-22 18:17:32 +0200225 if (test_bit(HCI_MGMT, &hdev->dev_flags))
226 mgmt_set_local_name_complete(hdev, sent, status);
Johan Hedberg28cc7bd2012-02-22 21:06:55 +0200227 else if (!status)
228 memcpy(hdev->dev_name, sent, HCI_MAX_NAME_LENGTH);
Johan Hedbergf51d5b22012-02-22 18:17:32 +0200229
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200230 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200231}
232
233static void hci_cc_read_local_name(struct hci_dev *hdev, struct sk_buff *skb)
234{
235 struct hci_rp_read_local_name *rp = (void *) skb->data;
236
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300237 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200238
239 if (rp->status)
240 return;
241
Johan Hedbergdb99b5f2012-02-22 20:14:22 +0200242 if (test_bit(HCI_SETUP, &hdev->dev_flags))
243 memcpy(hdev->dev_name, rp->name, HCI_MAX_NAME_LENGTH);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200244}
245
246static void hci_cc_write_auth_enable(struct hci_dev *hdev, struct sk_buff *skb)
247{
248 __u8 status = *((__u8 *) skb->data);
249 void *sent;
250
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300251 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200252
253 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_AUTH_ENABLE);
254 if (!sent)
255 return;
256
257 if (!status) {
258 __u8 param = *((__u8 *) sent);
259
260 if (param == AUTH_ENABLED)
261 set_bit(HCI_AUTH, &hdev->flags);
262 else
263 clear_bit(HCI_AUTH, &hdev->flags);
264 }
265
Johan Hedberg33ef95e2012-02-16 23:56:27 +0200266 if (test_bit(HCI_MGMT, &hdev->dev_flags))
267 mgmt_auth_enable_complete(hdev, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200268}
269
270static void hci_cc_write_encrypt_mode(struct hci_dev *hdev, struct sk_buff *skb)
271{
272 __u8 status = *((__u8 *) skb->data);
273 void *sent;
274
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300275 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200276
277 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_ENCRYPT_MODE);
278 if (!sent)
279 return;
280
281 if (!status) {
282 __u8 param = *((__u8 *) sent);
283
284 if (param)
285 set_bit(HCI_ENCRYPT, &hdev->flags);
286 else
287 clear_bit(HCI_ENCRYPT, &hdev->flags);
288 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200289}
290
291static void hci_cc_write_scan_enable(struct hci_dev *hdev, struct sk_buff *skb)
292{
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200293 __u8 param, status = *((__u8 *) skb->data);
294 int old_pscan, old_iscan;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200295 void *sent;
296
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300297 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200298
299 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SCAN_ENABLE);
300 if (!sent)
301 return;
302
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200303 param = *((__u8 *) sent);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200304
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200305 hci_dev_lock(hdev);
306
Mikel Astizfa1bd912012-08-09 09:52:29 +0200307 if (status) {
Johan Hedberg744cf192011-11-08 20:40:14 +0200308 mgmt_write_scan_failed(hdev, param, status);
Johan Hedberg2d7cee52011-11-07 22:16:03 +0200309 hdev->discov_timeout = 0;
310 goto done;
311 }
312
Johan Hedberg0663ca22013-10-02 13:43:14 +0300313 /* We need to ensure that we set this back on if someone changed
314 * the scan mode through a raw HCI socket.
315 */
316 set_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);
317
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200318 old_pscan = test_and_clear_bit(HCI_PSCAN, &hdev->flags);
319 old_iscan = test_and_clear_bit(HCI_ISCAN, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200320
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200321 if (param & SCAN_INQUIRY) {
322 set_bit(HCI_ISCAN, &hdev->flags);
323 if (!old_iscan)
Johan Hedberg744cf192011-11-08 20:40:14 +0200324 mgmt_discoverable(hdev, 1);
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200325 } else if (old_iscan)
Johan Hedberg744cf192011-11-08 20:40:14 +0200326 mgmt_discoverable(hdev, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200327
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200328 if (param & SCAN_PAGE) {
329 set_bit(HCI_PSCAN, &hdev->flags);
330 if (!old_pscan)
Johan Hedberg744cf192011-11-08 20:40:14 +0200331 mgmt_connectable(hdev, 1);
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200332 } else if (old_pscan)
Johan Hedberg744cf192011-11-08 20:40:14 +0200333 mgmt_connectable(hdev, 0);
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200334
335done:
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200336 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200337}
338
339static void hci_cc_read_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
340{
341 struct hci_rp_read_class_of_dev *rp = (void *) skb->data;
342
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300343 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200344
345 if (rp->status)
346 return;
347
348 memcpy(hdev->dev_class, rp->dev_class, 3);
349
350 BT_DBG("%s class 0x%.2x%.2x%.2x", hdev->name,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300351 hdev->dev_class[2], hdev->dev_class[1], hdev->dev_class[0]);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200352}
353
354static void hci_cc_write_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
355{
356 __u8 status = *((__u8 *) skb->data);
357 void *sent;
358
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300359 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200360
361 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_CLASS_OF_DEV);
362 if (!sent)
363 return;
364
Marcel Holtmann7f9a9032012-02-22 18:38:01 +0100365 hci_dev_lock(hdev);
366
367 if (status == 0)
368 memcpy(hdev->dev_class, sent, 3);
369
370 if (test_bit(HCI_MGMT, &hdev->dev_flags))
371 mgmt_set_class_of_dev_complete(hdev, sent, status);
372
373 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200374}
375
376static void hci_cc_read_voice_setting(struct hci_dev *hdev, struct sk_buff *skb)
377{
378 struct hci_rp_read_voice_setting *rp = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700379 __u16 setting;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200380
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300381 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200382
383 if (rp->status)
384 return;
385
386 setting = __le16_to_cpu(rp->voice_setting);
387
Marcel Holtmannf383f272008-07-14 20:13:47 +0200388 if (hdev->voice_setting == setting)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200389 return;
390
391 hdev->voice_setting = setting;
392
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300393 BT_DBG("%s voice setting 0x%4.4x", hdev->name, setting);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200394
Gustavo F. Padovan3c547112011-12-14 22:58:44 -0200395 if (hdev->notify)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200396 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200397}
398
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300399static void hci_cc_write_voice_setting(struct hci_dev *hdev,
400 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200401{
402 __u8 status = *((__u8 *) skb->data);
Marcel Holtmannf383f272008-07-14 20:13:47 +0200403 __u16 setting;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700404 void *sent;
405
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300406 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700407
Marcel Holtmannf383f272008-07-14 20:13:47 +0200408 if (status)
409 return;
410
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200411 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_VOICE_SETTING);
412 if (!sent)
413 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700414
Marcel Holtmannf383f272008-07-14 20:13:47 +0200415 setting = get_unaligned_le16(sent);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416
Marcel Holtmannf383f272008-07-14 20:13:47 +0200417 if (hdev->voice_setting == setting)
418 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700419
Marcel Holtmannf383f272008-07-14 20:13:47 +0200420 hdev->voice_setting = setting;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700421
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300422 BT_DBG("%s voice setting 0x%4.4x", hdev->name, setting);
Marcel Holtmannf383f272008-07-14 20:13:47 +0200423
Gustavo F. Padovan3c547112011-12-14 22:58:44 -0200424 if (hdev->notify)
Marcel Holtmannf383f272008-07-14 20:13:47 +0200425 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700426}
427
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -0700428static void hci_cc_read_num_supported_iac(struct hci_dev *hdev,
429 struct sk_buff *skb)
430{
431 struct hci_rp_read_num_supported_iac *rp = (void *) skb->data;
432
433 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
434
435 if (rp->status)
436 return;
437
438 hdev->num_iac = rp->num_iac;
439
440 BT_DBG("%s num iac %d", hdev->name, hdev->num_iac);
441}
442
Marcel Holtmann333140b2008-07-14 20:13:48 +0200443static void hci_cc_write_ssp_mode(struct hci_dev *hdev, struct sk_buff *skb)
444{
445 __u8 status = *((__u8 *) skb->data);
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300446 struct hci_cp_write_ssp_mode *sent;
Marcel Holtmann333140b2008-07-14 20:13:48 +0200447
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300448 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann333140b2008-07-14 20:13:48 +0200449
Marcel Holtmann333140b2008-07-14 20:13:48 +0200450 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SSP_MODE);
451 if (!sent)
452 return;
453
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300454 if (!status) {
455 if (sent->mode)
Johan Hedbergcad718e2013-04-17 15:00:51 +0300456 hdev->features[1][0] |= LMP_HOST_SSP;
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300457 else
Johan Hedbergcad718e2013-04-17 15:00:51 +0300458 hdev->features[1][0] &= ~LMP_HOST_SSP;
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300459 }
460
Johan Hedberged2c4ee2012-02-17 00:56:28 +0200461 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300462 mgmt_ssp_enable_complete(hdev, sent->mode, status);
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200463 else if (!status) {
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300464 if (sent->mode)
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200465 set_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
466 else
467 clear_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
468 }
Marcel Holtmann333140b2008-07-14 20:13:48 +0200469}
470
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800471static void hci_cc_write_sc_support(struct hci_dev *hdev, struct sk_buff *skb)
472{
473 u8 status = *((u8 *) skb->data);
474 struct hci_cp_write_sc_support *sent;
475
476 BT_DBG("%s status 0x%2.2x", hdev->name, status);
477
478 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SC_SUPPORT);
479 if (!sent)
480 return;
481
482 if (!status) {
483 if (sent->support)
484 hdev->features[1][0] |= LMP_HOST_SC;
485 else
486 hdev->features[1][0] &= ~LMP_HOST_SC;
487 }
488
489 if (test_bit(HCI_MGMT, &hdev->dev_flags))
490 mgmt_sc_enable_complete(hdev, sent->support, status);
491 else if (!status) {
492 if (sent->support)
493 set_bit(HCI_SC_ENABLED, &hdev->dev_flags);
494 else
495 clear_bit(HCI_SC_ENABLED, &hdev->dev_flags);
496 }
497}
498
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200499static void hci_cc_read_local_version(struct hci_dev *hdev, struct sk_buff *skb)
500{
501 struct hci_rp_read_local_version *rp = (void *) skb->data;
502
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300503 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200504
505 if (rp->status)
Johan Hedberg42c6b122013-03-05 20:37:49 +0200506 return;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200507
Marcel Holtmann0d5551f2013-10-18 12:04:50 -0700508 if (test_bit(HCI_SETUP, &hdev->dev_flags)) {
509 hdev->hci_ver = rp->hci_ver;
510 hdev->hci_rev = __le16_to_cpu(rp->hci_rev);
511 hdev->lmp_ver = rp->lmp_ver;
512 hdev->manufacturer = __le16_to_cpu(rp->manufacturer);
513 hdev->lmp_subver = __le16_to_cpu(rp->lmp_subver);
514 }
Johan Hedbergd5859e22011-01-25 01:19:58 +0200515}
516
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300517static void hci_cc_read_local_commands(struct hci_dev *hdev,
518 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200519{
520 struct hci_rp_read_local_commands *rp = (void *) skb->data;
521
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300522 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200523
Marcel Holtmann6a070e62013-10-31 04:54:33 -0700524 if (rp->status)
525 return;
526
527 if (test_bit(HCI_SETUP, &hdev->dev_flags))
Johan Hedberg2177bab2013-03-05 20:37:43 +0200528 memcpy(hdev->commands, rp->commands, sizeof(hdev->commands));
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200529}
530
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300531static void hci_cc_read_local_features(struct hci_dev *hdev,
532 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200533{
534 struct hci_rp_read_local_features *rp = (void *) skb->data;
535
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300536 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200537
538 if (rp->status)
539 return;
540
541 memcpy(hdev->features, rp->features, 8);
542
543 /* Adjust default settings according to features
544 * supported by device. */
545
Johan Hedbergcad718e2013-04-17 15:00:51 +0300546 if (hdev->features[0][0] & LMP_3SLOT)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200547 hdev->pkt_type |= (HCI_DM3 | HCI_DH3);
548
Johan Hedbergcad718e2013-04-17 15:00:51 +0300549 if (hdev->features[0][0] & LMP_5SLOT)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200550 hdev->pkt_type |= (HCI_DM5 | HCI_DH5);
551
Johan Hedbergcad718e2013-04-17 15:00:51 +0300552 if (hdev->features[0][1] & LMP_HV2) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200553 hdev->pkt_type |= (HCI_HV2);
554 hdev->esco_type |= (ESCO_HV2);
555 }
556
Johan Hedbergcad718e2013-04-17 15:00:51 +0300557 if (hdev->features[0][1] & LMP_HV3) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200558 hdev->pkt_type |= (HCI_HV3);
559 hdev->esco_type |= (ESCO_HV3);
560 }
561
Andre Guedes45db810f2012-07-24 15:03:49 -0300562 if (lmp_esco_capable(hdev))
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200563 hdev->esco_type |= (ESCO_EV3);
564
Johan Hedbergcad718e2013-04-17 15:00:51 +0300565 if (hdev->features[0][4] & LMP_EV4)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200566 hdev->esco_type |= (ESCO_EV4);
567
Johan Hedbergcad718e2013-04-17 15:00:51 +0300568 if (hdev->features[0][4] & LMP_EV5)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200569 hdev->esco_type |= (ESCO_EV5);
570
Johan Hedbergcad718e2013-04-17 15:00:51 +0300571 if (hdev->features[0][5] & LMP_EDR_ESCO_2M)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100572 hdev->esco_type |= (ESCO_2EV3);
573
Johan Hedbergcad718e2013-04-17 15:00:51 +0300574 if (hdev->features[0][5] & LMP_EDR_ESCO_3M)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100575 hdev->esco_type |= (ESCO_3EV3);
576
Johan Hedbergcad718e2013-04-17 15:00:51 +0300577 if (hdev->features[0][5] & LMP_EDR_3S_ESCO)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100578 hdev->esco_type |= (ESCO_2EV5 | ESCO_3EV5);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200579}
580
Andre Guedes971e3a42011-06-30 19:20:52 -0300581static void hci_cc_read_local_ext_features(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300582 struct sk_buff *skb)
Andre Guedes971e3a42011-06-30 19:20:52 -0300583{
584 struct hci_rp_read_local_ext_features *rp = (void *) skb->data;
585
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300586 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andre Guedes971e3a42011-06-30 19:20:52 -0300587
588 if (rp->status)
Johan Hedberg42c6b122013-03-05 20:37:49 +0200589 return;
Andre Guedes971e3a42011-06-30 19:20:52 -0300590
Marcel Holtmann57af75a2013-10-18 12:04:47 -0700591 if (hdev->max_page < rp->max_page)
592 hdev->max_page = rp->max_page;
Johan Hedbergd2c5d772013-04-17 15:00:52 +0300593
Johan Hedbergcad718e2013-04-17 15:00:51 +0300594 if (rp->page < HCI_MAX_PAGES)
595 memcpy(hdev->features[rp->page], rp->features, 8);
Andre Guedes971e3a42011-06-30 19:20:52 -0300596}
597
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200598static void hci_cc_read_flow_control_mode(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300599 struct sk_buff *skb)
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200600{
601 struct hci_rp_read_flow_control_mode *rp = (void *) skb->data;
602
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300603 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200604
Johan Hedberg42c6b122013-03-05 20:37:49 +0200605 if (!rp->status)
606 hdev->flow_ctl_mode = rp->mode;
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200607}
608
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200609static void hci_cc_read_buffer_size(struct hci_dev *hdev, struct sk_buff *skb)
610{
611 struct hci_rp_read_buffer_size *rp = (void *) skb->data;
612
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300613 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200614
615 if (rp->status)
616 return;
617
618 hdev->acl_mtu = __le16_to_cpu(rp->acl_mtu);
619 hdev->sco_mtu = rp->sco_mtu;
620 hdev->acl_pkts = __le16_to_cpu(rp->acl_max_pkt);
621 hdev->sco_pkts = __le16_to_cpu(rp->sco_max_pkt);
622
623 if (test_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks)) {
624 hdev->sco_mtu = 64;
625 hdev->sco_pkts = 8;
626 }
627
628 hdev->acl_cnt = hdev->acl_pkts;
629 hdev->sco_cnt = hdev->sco_pkts;
630
Gustavo Padovan807deac2012-05-17 00:36:24 -0300631 BT_DBG("%s acl mtu %d:%d sco mtu %d:%d", hdev->name, hdev->acl_mtu,
632 hdev->acl_pkts, hdev->sco_mtu, hdev->sco_pkts);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200633}
634
635static void hci_cc_read_bd_addr(struct hci_dev *hdev, struct sk_buff *skb)
636{
637 struct hci_rp_read_bd_addr *rp = (void *) skb->data;
638
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300639 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200640
641 if (!rp->status)
642 bacpy(&hdev->bdaddr, &rp->bdaddr);
Johan Hedberg23bb5762010-12-21 23:01:27 +0200643}
644
Johan Hedbergf332ec62013-03-15 17:07:11 -0500645static void hci_cc_read_page_scan_activity(struct hci_dev *hdev,
646 struct sk_buff *skb)
647{
648 struct hci_rp_read_page_scan_activity *rp = (void *) skb->data;
649
650 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
651
652 if (test_bit(HCI_INIT, &hdev->flags) && !rp->status) {
653 hdev->page_scan_interval = __le16_to_cpu(rp->interval);
654 hdev->page_scan_window = __le16_to_cpu(rp->window);
655 }
656}
657
Johan Hedberg4a3ee762013-03-15 17:07:12 -0500658static void hci_cc_write_page_scan_activity(struct hci_dev *hdev,
659 struct sk_buff *skb)
660{
661 u8 status = *((u8 *) skb->data);
662 struct hci_cp_write_page_scan_activity *sent;
663
664 BT_DBG("%s status 0x%2.2x", hdev->name, status);
665
666 if (status)
667 return;
668
669 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY);
670 if (!sent)
671 return;
672
673 hdev->page_scan_interval = __le16_to_cpu(sent->interval);
674 hdev->page_scan_window = __le16_to_cpu(sent->window);
675}
676
Johan Hedbergf332ec62013-03-15 17:07:11 -0500677static void hci_cc_read_page_scan_type(struct hci_dev *hdev,
678 struct sk_buff *skb)
679{
680 struct hci_rp_read_page_scan_type *rp = (void *) skb->data;
681
682 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
683
684 if (test_bit(HCI_INIT, &hdev->flags) && !rp->status)
685 hdev->page_scan_type = rp->type;
686}
687
Johan Hedberg4a3ee762013-03-15 17:07:12 -0500688static void hci_cc_write_page_scan_type(struct hci_dev *hdev,
689 struct sk_buff *skb)
690{
691 u8 status = *((u8 *) skb->data);
692 u8 *type;
693
694 BT_DBG("%s status 0x%2.2x", hdev->name, status);
695
696 if (status)
697 return;
698
699 type = hci_sent_cmd_data(hdev, HCI_OP_WRITE_PAGE_SCAN_TYPE);
700 if (type)
701 hdev->page_scan_type = *type;
702}
703
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200704static void hci_cc_read_data_block_size(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300705 struct sk_buff *skb)
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200706{
707 struct hci_rp_read_data_block_size *rp = (void *) skb->data;
708
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300709 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200710
711 if (rp->status)
712 return;
713
714 hdev->block_mtu = __le16_to_cpu(rp->max_acl_len);
715 hdev->block_len = __le16_to_cpu(rp->block_len);
716 hdev->num_blocks = __le16_to_cpu(rp->num_blocks);
717
718 hdev->block_cnt = hdev->num_blocks;
719
720 BT_DBG("%s blk mtu %d cnt %d len %d", hdev->name, hdev->block_mtu,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300721 hdev->block_cnt, hdev->block_len);
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200722}
723
Johan Hedberg33f35722014-06-28 17:54:06 +0300724static void hci_cc_read_clock(struct hci_dev *hdev, struct sk_buff *skb)
725{
726 struct hci_rp_read_clock *rp = (void *) skb->data;
727 struct hci_cp_read_clock *cp;
728 struct hci_conn *conn;
729
730 BT_DBG("%s", hdev->name);
731
732 if (skb->len < sizeof(*rp))
733 return;
734
735 if (rp->status)
736 return;
737
738 hci_dev_lock(hdev);
739
740 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_CLOCK);
741 if (!cp)
742 goto unlock;
743
744 if (cp->which == 0x00) {
745 hdev->clock = le32_to_cpu(rp->clock);
746 goto unlock;
747 }
748
749 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
750 if (conn) {
751 conn->clock = le32_to_cpu(rp->clock);
752 conn->clock_accuracy = le16_to_cpu(rp->accuracy);
753 }
754
755unlock:
756 hci_dev_unlock(hdev);
757}
758
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300759static void hci_cc_read_local_amp_info(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300760 struct sk_buff *skb)
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300761{
762 struct hci_rp_read_local_amp_info *rp = (void *) skb->data;
763
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300764 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300765
766 if (rp->status)
Andrei Emeltchenko8e2a0d92012-09-27 17:26:08 +0300767 goto a2mp_rsp;
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300768
769 hdev->amp_status = rp->amp_status;
770 hdev->amp_total_bw = __le32_to_cpu(rp->total_bw);
771 hdev->amp_max_bw = __le32_to_cpu(rp->max_bw);
772 hdev->amp_min_latency = __le32_to_cpu(rp->min_latency);
773 hdev->amp_max_pdu = __le32_to_cpu(rp->max_pdu);
774 hdev->amp_type = rp->amp_type;
775 hdev->amp_pal_cap = __le16_to_cpu(rp->pal_cap);
776 hdev->amp_assoc_size = __le16_to_cpu(rp->max_assoc_size);
777 hdev->amp_be_flush_to = __le32_to_cpu(rp->be_flush_to);
778 hdev->amp_max_flush_to = __le32_to_cpu(rp->max_flush_to);
779
Andrei Emeltchenko8e2a0d92012-09-27 17:26:08 +0300780a2mp_rsp:
781 a2mp_send_getinfo_rsp(hdev);
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300782}
783
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300784static void hci_cc_read_local_amp_assoc(struct hci_dev *hdev,
785 struct sk_buff *skb)
786{
787 struct hci_rp_read_local_amp_assoc *rp = (void *) skb->data;
788 struct amp_assoc *assoc = &hdev->loc_assoc;
789 size_t rem_len, frag_len;
790
791 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
792
793 if (rp->status)
794 goto a2mp_rsp;
795
796 frag_len = skb->len - sizeof(*rp);
797 rem_len = __le16_to_cpu(rp->rem_len);
798
799 if (rem_len > frag_len) {
Andrei Emeltchenko2e430be32012-09-28 14:44:23 +0300800 BT_DBG("frag_len %zu rem_len %zu", frag_len, rem_len);
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300801
802 memcpy(assoc->data + assoc->offset, rp->frag, frag_len);
803 assoc->offset += frag_len;
804
805 /* Read other fragments */
806 amp_read_loc_assoc_frag(hdev, rp->phy_handle);
807
808 return;
809 }
810
811 memcpy(assoc->data + assoc->offset, rp->frag, rem_len);
812 assoc->len = assoc->offset + rem_len;
813 assoc->offset = 0;
814
815a2mp_rsp:
816 /* Send A2MP Rsp when all fragments are received */
817 a2mp_send_getampassoc_rsp(hdev, rp->status);
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +0300818 a2mp_send_create_phy_link_req(hdev, rp->status);
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300819}
820
Johan Hedbergd5859e22011-01-25 01:19:58 +0200821static void hci_cc_read_inq_rsp_tx_power(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300822 struct sk_buff *skb)
Johan Hedbergd5859e22011-01-25 01:19:58 +0200823{
Marcel Holtmann91c4e9b2012-03-11 19:27:21 -0700824 struct hci_rp_read_inq_rsp_tx_power *rp = (void *) skb->data;
Johan Hedbergd5859e22011-01-25 01:19:58 +0200825
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300826 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedbergd5859e22011-01-25 01:19:58 +0200827
Marcel Holtmann91c4e9b2012-03-11 19:27:21 -0700828 if (!rp->status)
829 hdev->inq_tx_power = rp->tx_power;
Johan Hedbergd5859e22011-01-25 01:19:58 +0200830}
831
Johan Hedberg980e1a52011-01-22 06:10:07 +0200832static void hci_cc_pin_code_reply(struct hci_dev *hdev, struct sk_buff *skb)
833{
834 struct hci_rp_pin_code_reply *rp = (void *) skb->data;
835 struct hci_cp_pin_code_reply *cp;
836 struct hci_conn *conn;
837
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300838 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200839
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200840 hci_dev_lock(hdev);
841
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200842 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg744cf192011-11-08 20:40:14 +0200843 mgmt_pin_code_reply_complete(hdev, &rp->bdaddr, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200844
Mikel Astizfa1bd912012-08-09 09:52:29 +0200845 if (rp->status)
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200846 goto unlock;
Johan Hedberg980e1a52011-01-22 06:10:07 +0200847
848 cp = hci_sent_cmd_data(hdev, HCI_OP_PIN_CODE_REPLY);
849 if (!cp)
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200850 goto unlock;
Johan Hedberg980e1a52011-01-22 06:10:07 +0200851
852 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
853 if (conn)
854 conn->pin_length = cp->pin_len;
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200855
856unlock:
857 hci_dev_unlock(hdev);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200858}
859
860static void hci_cc_pin_code_neg_reply(struct hci_dev *hdev, struct sk_buff *skb)
861{
862 struct hci_rp_pin_code_neg_reply *rp = (void *) skb->data;
863
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300864 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200865
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200866 hci_dev_lock(hdev);
867
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200868 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg744cf192011-11-08 20:40:14 +0200869 mgmt_pin_code_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300870 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200871
872 hci_dev_unlock(hdev);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200873}
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200874
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300875static void hci_cc_le_read_buffer_size(struct hci_dev *hdev,
876 struct sk_buff *skb)
877{
878 struct hci_rp_le_read_buffer_size *rp = (void *) skb->data;
879
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300880 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300881
882 if (rp->status)
883 return;
884
885 hdev->le_mtu = __le16_to_cpu(rp->le_mtu);
886 hdev->le_pkts = rp->le_max_pkt;
887
888 hdev->le_cnt = hdev->le_pkts;
889
890 BT_DBG("%s le mtu %d:%d", hdev->name, hdev->le_mtu, hdev->le_pkts);
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300891}
Johan Hedberg980e1a52011-01-22 06:10:07 +0200892
Johan Hedberg60e77322013-01-22 14:01:59 +0200893static void hci_cc_le_read_local_features(struct hci_dev *hdev,
894 struct sk_buff *skb)
895{
896 struct hci_rp_le_read_local_features *rp = (void *) skb->data;
897
898 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
899
900 if (!rp->status)
901 memcpy(hdev->le_features, rp->features, 8);
Johan Hedberg60e77322013-01-22 14:01:59 +0200902}
903
Johan Hedberg8fa19092012-10-19 20:57:49 +0300904static void hci_cc_le_read_adv_tx_power(struct hci_dev *hdev,
905 struct sk_buff *skb)
906{
907 struct hci_rp_le_read_adv_tx_power *rp = (void *) skb->data;
908
909 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
910
Johan Hedberg04b4edc2013-03-15 17:07:01 -0500911 if (!rp->status)
Johan Hedberg8fa19092012-10-19 20:57:49 +0300912 hdev->adv_tx_power = rp->tx_power;
Johan Hedberg8fa19092012-10-19 20:57:49 +0300913}
914
Johan Hedberga5c29682011-02-19 12:05:57 -0300915static void hci_cc_user_confirm_reply(struct hci_dev *hdev, struct sk_buff *skb)
916{
917 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
918
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300919 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberga5c29682011-02-19 12:05:57 -0300920
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200921 hci_dev_lock(hdev);
922
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200923 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300924 mgmt_user_confirm_reply_complete(hdev, &rp->bdaddr, ACL_LINK, 0,
925 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200926
927 hci_dev_unlock(hdev);
Johan Hedberga5c29682011-02-19 12:05:57 -0300928}
929
930static void hci_cc_user_confirm_neg_reply(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300931 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -0300932{
933 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
934
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300935 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberga5c29682011-02-19 12:05:57 -0300936
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200937 hci_dev_lock(hdev);
938
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200939 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg744cf192011-11-08 20:40:14 +0200940 mgmt_user_confirm_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300941 ACL_LINK, 0, rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200942
943 hci_dev_unlock(hdev);
Johan Hedberga5c29682011-02-19 12:05:57 -0300944}
945
Brian Gix1143d452011-11-23 08:28:34 -0800946static void hci_cc_user_passkey_reply(struct hci_dev *hdev, struct sk_buff *skb)
947{
948 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
949
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300950 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800951
952 hci_dev_lock(hdev);
953
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200954 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg272d90d2012-02-09 15:26:12 +0200955 mgmt_user_passkey_reply_complete(hdev, &rp->bdaddr, ACL_LINK,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300956 0, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800957
958 hci_dev_unlock(hdev);
959}
960
961static void hci_cc_user_passkey_neg_reply(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300962 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -0800963{
964 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
965
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300966 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800967
968 hci_dev_lock(hdev);
969
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200970 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Brian Gix1143d452011-11-23 08:28:34 -0800971 mgmt_user_passkey_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300972 ACL_LINK, 0, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800973
974 hci_dev_unlock(hdev);
975}
976
Marcel Holtmann4d2d2792014-01-10 02:07:26 -0800977static void hci_cc_read_local_oob_data(struct hci_dev *hdev,
978 struct sk_buff *skb)
Szymon Jancc35938b2011-03-22 13:12:21 +0100979{
980 struct hci_rp_read_local_oob_data *rp = (void *) skb->data;
981
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300982 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Szymon Jancc35938b2011-03-22 13:12:21 +0100983
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200984 hci_dev_lock(hdev);
Marcel Holtmann4d2d2792014-01-10 02:07:26 -0800985 mgmt_read_local_oob_data_complete(hdev, rp->hash, rp->randomizer,
986 NULL, NULL, rp->status);
987 hci_dev_unlock(hdev);
988}
989
990static void hci_cc_read_local_oob_ext_data(struct hci_dev *hdev,
991 struct sk_buff *skb)
992{
993 struct hci_rp_read_local_oob_ext_data *rp = (void *) skb->data;
994
995 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
996
997 hci_dev_lock(hdev);
998 mgmt_read_local_oob_data_complete(hdev, rp->hash192, rp->randomizer192,
999 rp->hash256, rp->randomizer256,
1000 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001001 hci_dev_unlock(hdev);
Szymon Jancc35938b2011-03-22 13:12:21 +01001002}
1003
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001004
1005static void hci_cc_le_set_random_addr(struct hci_dev *hdev, struct sk_buff *skb)
1006{
1007 __u8 status = *((__u8 *) skb->data);
1008 bdaddr_t *sent;
1009
1010 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1011
1012 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_RANDOM_ADDR);
1013 if (!sent)
1014 return;
1015
1016 hci_dev_lock(hdev);
1017
1018 if (!status)
1019 bacpy(&hdev->random_addr, sent);
1020
1021 hci_dev_unlock(hdev);
1022}
1023
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001024static void hci_cc_le_set_adv_enable(struct hci_dev *hdev, struct sk_buff *skb)
1025{
1026 __u8 *sent, status = *((__u8 *) skb->data);
1027
1028 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1029
1030 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_ENABLE);
1031 if (!sent)
1032 return;
1033
Johan Hedberg3c857752014-03-25 10:30:49 +02001034 if (status)
1035 return;
1036
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001037 hci_dev_lock(hdev);
1038
Johan Hedberg3c857752014-03-25 10:30:49 +02001039 /* If we're doing connection initation as peripheral. Set a
1040 * timeout in case something goes wrong.
1041 */
1042 if (*sent) {
1043 struct hci_conn *conn;
1044
1045 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
1046 if (conn)
1047 queue_delayed_work(hdev->workqueue,
1048 &conn->le_conn_timeout,
1049 HCI_LE_CONN_TIMEOUT);
1050 }
1051
1052 mgmt_advertising(hdev, *sent);
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001053
Johan Hedberg04b4edc2013-03-15 17:07:01 -05001054 hci_dev_unlock(hdev);
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001055}
1056
Marcel Holtmann533553f2014-03-21 12:18:10 -07001057static void hci_cc_le_set_scan_param(struct hci_dev *hdev, struct sk_buff *skb)
1058{
1059 struct hci_cp_le_set_scan_param *cp;
1060 __u8 status = *((__u8 *) skb->data);
1061
1062 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1063
1064 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_PARAM);
1065 if (!cp)
1066 return;
1067
1068 hci_dev_lock(hdev);
1069
1070 if (!status)
1071 hdev->le_scan_type = cp->type;
1072
1073 hci_dev_unlock(hdev);
1074}
1075
Johan Hedbergb9a63282014-03-25 10:51:52 +02001076static bool has_pending_adv_report(struct hci_dev *hdev)
1077{
1078 struct discovery_state *d = &hdev->discovery;
1079
1080 return bacmp(&d->last_adv_addr, BDADDR_ANY);
1081}
1082
1083static void clear_pending_adv_report(struct hci_dev *hdev)
1084{
1085 struct discovery_state *d = &hdev->discovery;
1086
1087 bacpy(&d->last_adv_addr, BDADDR_ANY);
1088 d->last_adv_data_len = 0;
1089}
1090
1091static void store_pending_adv_report(struct hci_dev *hdev, bdaddr_t *bdaddr,
Johan Hedbergff5cd292014-03-25 14:40:52 +02001092 u8 bdaddr_type, s8 rssi, u8 *data, u8 len)
Johan Hedbergb9a63282014-03-25 10:51:52 +02001093{
1094 struct discovery_state *d = &hdev->discovery;
1095
1096 bacpy(&d->last_adv_addr, bdaddr);
1097 d->last_adv_addr_type = bdaddr_type;
Johan Hedbergff5cd292014-03-25 14:40:52 +02001098 d->last_adv_rssi = rssi;
Johan Hedbergb9a63282014-03-25 10:51:52 +02001099 memcpy(d->last_adv_data, data, len);
1100 d->last_adv_data_len = len;
1101}
1102
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001103static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001104 struct sk_buff *skb)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001105{
1106 struct hci_cp_le_set_scan_enable *cp;
1107 __u8 status = *((__u8 *) skb->data);
1108
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001109 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001110
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001111 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_ENABLE);
1112 if (!cp)
1113 return;
1114
Andre Guedes3fd319b2013-04-30 15:29:36 -03001115 if (status)
1116 return;
1117
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001118 switch (cp->enable) {
Andre Guedes76a388b2013-04-04 20:21:02 -03001119 case LE_SCAN_ENABLE:
Andre Guedesd23264a2011-11-25 20:53:38 -03001120 set_bit(HCI_LE_SCAN, &hdev->dev_flags);
Johan Hedbergb9a63282014-03-25 10:51:52 +02001121 if (hdev->le_scan_type == LE_SCAN_ACTIVE)
1122 clear_pending_adv_report(hdev);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001123 break;
1124
Andre Guedes76a388b2013-04-04 20:21:02 -03001125 case LE_SCAN_DISABLE:
Johan Hedbergb9a63282014-03-25 10:51:52 +02001126 /* We do this here instead of when setting DISCOVERY_STOPPED
1127 * since the latter would potentially require waiting for
1128 * inquiry to stop too.
1129 */
1130 if (has_pending_adv_report(hdev)) {
1131 struct discovery_state *d = &hdev->discovery;
1132
1133 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001134 d->last_adv_addr_type, NULL,
Marcel Holtmannaf589252014-07-01 14:11:20 +02001135 d->last_adv_rssi, 0,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001136 d->last_adv_data,
Johan Hedbergb9a63282014-03-25 10:51:52 +02001137 d->last_adv_data_len, NULL, 0);
1138 }
1139
Johan Hedberg317ac8c2014-02-28 20:26:12 +02001140 /* Cancel this timer so that we don't try to disable scanning
1141 * when it's already disabled.
1142 */
1143 cancel_delayed_work(&hdev->le_scan_disable);
1144
Andre Guedesd23264a2011-11-25 20:53:38 -03001145 clear_bit(HCI_LE_SCAN, &hdev->dev_flags);
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001146 /* The HCI_LE_SCAN_INTERRUPTED flag indicates that we
1147 * interrupted scanning due to a connect request. Mark
1148 * therefore discovery as stopped.
1149 */
1150 if (test_and_clear_bit(HCI_LE_SCAN_INTERRUPTED,
1151 &hdev->dev_flags))
1152 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001153 break;
1154
1155 default:
1156 BT_ERR("Used reserved LE_Scan_Enable param %d", cp->enable);
1157 break;
Andre Guedes35815082011-05-26 16:23:53 -03001158 }
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001159}
1160
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001161static void hci_cc_le_read_white_list_size(struct hci_dev *hdev,
1162 struct sk_buff *skb)
1163{
1164 struct hci_rp_le_read_white_list_size *rp = (void *) skb->data;
1165
1166 BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size);
1167
1168 if (!rp->status)
1169 hdev->le_white_list_size = rp->size;
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001170}
1171
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001172static void hci_cc_le_clear_white_list(struct hci_dev *hdev,
1173 struct sk_buff *skb)
1174{
1175 __u8 status = *((__u8 *) skb->data);
1176
1177 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1178
1179 if (!status)
1180 hci_white_list_clear(hdev);
1181}
1182
1183static void hci_cc_le_add_to_white_list(struct hci_dev *hdev,
1184 struct sk_buff *skb)
1185{
1186 struct hci_cp_le_add_to_white_list *sent;
1187 __u8 status = *((__u8 *) skb->data);
1188
1189 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1190
1191 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_ADD_TO_WHITE_LIST);
1192 if (!sent)
1193 return;
1194
1195 if (!status)
1196 hci_white_list_add(hdev, &sent->bdaddr, sent->bdaddr_type);
1197}
1198
1199static void hci_cc_le_del_from_white_list(struct hci_dev *hdev,
1200 struct sk_buff *skb)
1201{
1202 struct hci_cp_le_del_from_white_list *sent;
1203 __u8 status = *((__u8 *) skb->data);
1204
1205 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1206
1207 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_DEL_FROM_WHITE_LIST);
1208 if (!sent)
1209 return;
1210
1211 if (!status)
1212 hci_white_list_del(hdev, &sent->bdaddr, sent->bdaddr_type);
1213}
1214
Johan Hedberg9b008c02013-01-22 14:02:01 +02001215static void hci_cc_le_read_supported_states(struct hci_dev *hdev,
1216 struct sk_buff *skb)
1217{
1218 struct hci_rp_le_read_supported_states *rp = (void *) skb->data;
1219
1220 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1221
1222 if (!rp->status)
1223 memcpy(hdev->le_states, rp->le_states, 8);
Johan Hedberg9b008c02013-01-22 14:02:01 +02001224}
1225
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001226static void hci_cc_write_le_host_supported(struct hci_dev *hdev,
1227 struct sk_buff *skb)
Andre Guedesf9b49302011-06-30 19:20:53 -03001228{
Johan Hedberg06199cf2012-02-22 16:37:11 +02001229 struct hci_cp_write_le_host_supported *sent;
Andre Guedesf9b49302011-06-30 19:20:53 -03001230 __u8 status = *((__u8 *) skb->data);
1231
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001232 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesf9b49302011-06-30 19:20:53 -03001233
Johan Hedberg06199cf2012-02-22 16:37:11 +02001234 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001235 if (!sent)
Andre Guedesf9b49302011-06-30 19:20:53 -03001236 return;
1237
Johan Hedberg8f984df2012-02-28 01:07:22 +02001238 if (!status) {
Johan Hedberg416a4ae2013-09-25 13:26:08 +03001239 if (sent->le) {
Johan Hedbergcad718e2013-04-17 15:00:51 +03001240 hdev->features[1][0] |= LMP_HOST_LE;
Johan Hedberg416a4ae2013-09-25 13:26:08 +03001241 set_bit(HCI_LE_ENABLED, &hdev->dev_flags);
1242 } else {
Johan Hedbergcad718e2013-04-17 15:00:51 +03001243 hdev->features[1][0] &= ~LMP_HOST_LE;
Johan Hedberg416a4ae2013-09-25 13:26:08 +03001244 clear_bit(HCI_LE_ENABLED, &hdev->dev_flags);
Johan Hedbergf3d3444a2013-10-05 12:01:04 +02001245 clear_bit(HCI_ADVERTISING, &hdev->dev_flags);
Johan Hedberg416a4ae2013-09-25 13:26:08 +03001246 }
Johan Hedberg53b2caa2012-10-24 21:11:59 +03001247
1248 if (sent->simul)
Johan Hedbergcad718e2013-04-17 15:00:51 +03001249 hdev->features[1][0] |= LMP_HOST_LE_BREDR;
Johan Hedberg53b2caa2012-10-24 21:11:59 +03001250 else
Johan Hedbergcad718e2013-04-17 15:00:51 +03001251 hdev->features[1][0] &= ~LMP_HOST_LE_BREDR;
Johan Hedberg8f984df2012-02-28 01:07:22 +02001252 }
Andre Guedesf9b49302011-06-30 19:20:53 -03001253}
1254
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02001255static void hci_cc_set_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
1256{
1257 struct hci_cp_le_set_adv_param *cp;
1258 u8 status = *((u8 *) skb->data);
1259
1260 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1261
1262 if (status)
1263 return;
1264
1265 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_PARAM);
1266 if (!cp)
1267 return;
1268
1269 hci_dev_lock(hdev);
1270 hdev->adv_addr_type = cp->own_address_type;
1271 hci_dev_unlock(hdev);
1272}
1273
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001274static void hci_cc_write_remote_amp_assoc(struct hci_dev *hdev,
1275 struct sk_buff *skb)
1276{
1277 struct hci_rp_write_remote_amp_assoc *rp = (void *) skb->data;
1278
1279 BT_DBG("%s status 0x%2.2x phy_handle 0x%2.2x",
1280 hdev->name, rp->status, rp->phy_handle);
1281
1282 if (rp->status)
1283 return;
1284
1285 amp_write_rem_assoc_continue(hdev, rp->phy_handle);
1286}
1287
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02001288static void hci_cc_read_rssi(struct hci_dev *hdev, struct sk_buff *skb)
1289{
1290 struct hci_rp_read_rssi *rp = (void *) skb->data;
1291 struct hci_conn *conn;
1292
1293 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1294
1295 if (rp->status)
1296 return;
1297
1298 hci_dev_lock(hdev);
1299
1300 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
1301 if (conn)
1302 conn->rssi = rp->rssi;
1303
1304 hci_dev_unlock(hdev);
1305}
1306
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001307static void hci_cc_read_tx_power(struct hci_dev *hdev, struct sk_buff *skb)
1308{
1309 struct hci_cp_read_tx_power *sent;
1310 struct hci_rp_read_tx_power *rp = (void *) skb->data;
1311 struct hci_conn *conn;
1312
1313 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1314
1315 if (rp->status)
1316 return;
1317
1318 sent = hci_sent_cmd_data(hdev, HCI_OP_READ_TX_POWER);
1319 if (!sent)
1320 return;
1321
1322 hci_dev_lock(hdev);
1323
1324 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001325 if (!conn)
1326 goto unlock;
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001327
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001328 switch (sent->type) {
1329 case 0x00:
1330 conn->tx_power = rp->tx_power;
1331 break;
1332 case 0x01:
1333 conn->max_tx_power = rp->tx_power;
1334 break;
1335 }
1336
1337unlock:
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001338 hci_dev_unlock(hdev);
1339}
1340
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001341static void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001342{
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001343 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001344
1345 if (status) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001346 hci_conn_check_pending(hdev);
Johan Hedberg314b2382011-04-27 10:29:57 -04001347 return;
1348 }
1349
Andre Guedes89352e72011-11-04 14:16:53 -03001350 set_bit(HCI_INQUIRY, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001351}
1352
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001353static void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001354{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001355 struct hci_cp_create_conn *cp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001356 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001357
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001358 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001359
1360 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_CONN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001361 if (!cp)
1362 return;
1363
1364 hci_dev_lock(hdev);
1365
1366 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1367
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001368 BT_DBG("%s bdaddr %pMR hcon %p", hdev->name, &cp->bdaddr, conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001369
1370 if (status) {
1371 if (conn && conn->state == BT_CONNECT) {
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001372 if (status != 0x0c || conn->attempt > 2) {
1373 conn->state = BT_CLOSED;
1374 hci_proto_connect_cfm(conn, status);
1375 hci_conn_del(conn);
1376 } else
1377 conn->state = BT_CONNECT2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001378 }
1379 } else {
1380 if (!conn) {
1381 conn = hci_conn_add(hdev, ACL_LINK, &cp->bdaddr);
1382 if (conn) {
Johan Hedberga0c808b2012-01-16 09:49:58 +02001383 conn->out = true;
Johan Hedberg4dae2792014-06-24 17:03:50 +03001384 set_bit(HCI_CONN_MASTER, &conn->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001385 } else
Gustavo F. Padovan893ef972010-07-18 15:13:37 -03001386 BT_ERR("No memory for new connection");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001387 }
1388 }
1389
1390 hci_dev_unlock(hdev);
1391}
1392
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001393static void hci_cs_add_sco(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001394{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001395 struct hci_cp_add_sco *cp;
1396 struct hci_conn *acl, *sco;
1397 __u16 handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001398
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001399 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001400
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001401 if (!status)
1402 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001403
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001404 cp = hci_sent_cmd_data(hdev, HCI_OP_ADD_SCO);
1405 if (!cp)
1406 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001407
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001408 handle = __le16_to_cpu(cp->handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001409
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001410 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001411
1412 hci_dev_lock(hdev);
1413
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001414 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001415 if (acl) {
1416 sco = acl->link;
1417 if (sco) {
1418 sco->state = BT_CLOSED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001419
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001420 hci_proto_connect_cfm(sco, status);
1421 hci_conn_del(sco);
1422 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001423 }
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001424
1425 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001426}
1427
Marcel Holtmannf8558552008-07-14 20:13:49 +02001428static void hci_cs_auth_requested(struct hci_dev *hdev, __u8 status)
1429{
1430 struct hci_cp_auth_requested *cp;
1431 struct hci_conn *conn;
1432
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001433 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001434
1435 if (!status)
1436 return;
1437
1438 cp = hci_sent_cmd_data(hdev, HCI_OP_AUTH_REQUESTED);
1439 if (!cp)
1440 return;
1441
1442 hci_dev_lock(hdev);
1443
1444 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1445 if (conn) {
1446 if (conn->state == BT_CONFIG) {
1447 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001448 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001449 }
1450 }
1451
1452 hci_dev_unlock(hdev);
1453}
1454
1455static void hci_cs_set_conn_encrypt(struct hci_dev *hdev, __u8 status)
1456{
1457 struct hci_cp_set_conn_encrypt *cp;
1458 struct hci_conn *conn;
1459
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001460 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001461
1462 if (!status)
1463 return;
1464
1465 cp = hci_sent_cmd_data(hdev, HCI_OP_SET_CONN_ENCRYPT);
1466 if (!cp)
1467 return;
1468
1469 hci_dev_lock(hdev);
1470
1471 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1472 if (conn) {
1473 if (conn->state == BT_CONFIG) {
1474 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001475 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001476 }
1477 }
1478
1479 hci_dev_unlock(hdev);
1480}
1481
Johan Hedberg127178d2010-11-18 22:22:29 +02001482static int hci_outgoing_auth_needed(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001483 struct hci_conn *conn)
Johan Hedberg392599b2010-11-18 22:22:28 +02001484{
Johan Hedberg392599b2010-11-18 22:22:28 +02001485 if (conn->state != BT_CONFIG || !conn->out)
1486 return 0;
1487
Johan Hedberg765c2a92011-01-19 12:06:52 +05301488 if (conn->pending_sec_level == BT_SECURITY_SDP)
Johan Hedberg392599b2010-11-18 22:22:28 +02001489 return 0;
1490
1491 /* Only request authentication for SSP connections or non-SSP
Johan Hedberg264b8b42014-01-08 16:40:39 +02001492 * devices with sec_level MEDIUM or HIGH or if MITM protection
1493 * is requested.
1494 */
Gustavo Padovan807deac2012-05-17 00:36:24 -03001495 if (!hci_conn_ssp_enabled(conn) && !(conn->auth_type & 0x01) &&
Johan Hedberg7e3691e2014-05-30 14:45:19 +03001496 conn->pending_sec_level != BT_SECURITY_FIPS &&
Johan Hedberg264b8b42014-01-08 16:40:39 +02001497 conn->pending_sec_level != BT_SECURITY_HIGH &&
1498 conn->pending_sec_level != BT_SECURITY_MEDIUM)
Johan Hedberg392599b2010-11-18 22:22:28 +02001499 return 0;
1500
Johan Hedberg392599b2010-11-18 22:22:28 +02001501 return 1;
1502}
1503
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001504static int hci_resolve_name(struct hci_dev *hdev,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001505 struct inquiry_entry *e)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001506{
1507 struct hci_cp_remote_name_req cp;
1508
1509 memset(&cp, 0, sizeof(cp));
1510
1511 bacpy(&cp.bdaddr, &e->data.bdaddr);
1512 cp.pscan_rep_mode = e->data.pscan_rep_mode;
1513 cp.pscan_mode = e->data.pscan_mode;
1514 cp.clock_offset = e->data.clock_offset;
1515
1516 return hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
1517}
1518
Johan Hedbergb644ba32012-01-17 21:48:47 +02001519static bool hci_resolve_next_name(struct hci_dev *hdev)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001520{
1521 struct discovery_state *discov = &hdev->discovery;
1522 struct inquiry_entry *e;
1523
Johan Hedbergb644ba32012-01-17 21:48:47 +02001524 if (list_empty(&discov->resolve))
1525 return false;
1526
1527 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
Ram Malovanyc8100892012-07-19 10:26:09 +03001528 if (!e)
1529 return false;
1530
Johan Hedbergb644ba32012-01-17 21:48:47 +02001531 if (hci_resolve_name(hdev, e) == 0) {
1532 e->name_state = NAME_PENDING;
1533 return true;
1534 }
1535
1536 return false;
1537}
1538
1539static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001540 bdaddr_t *bdaddr, u8 *name, u8 name_len)
Johan Hedbergb644ba32012-01-17 21:48:47 +02001541{
1542 struct discovery_state *discov = &hdev->discovery;
1543 struct inquiry_entry *e;
1544
1545 if (conn && !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001546 mgmt_device_connected(hdev, bdaddr, ACL_LINK, 0x00, 0, name,
1547 name_len, conn->dev_class);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001548
1549 if (discov->state == DISCOVERY_STOPPED)
1550 return;
1551
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001552 if (discov->state == DISCOVERY_STOPPING)
1553 goto discov_complete;
1554
1555 if (discov->state != DISCOVERY_RESOLVING)
1556 return;
1557
1558 e = hci_inquiry_cache_lookup_resolve(hdev, bdaddr, NAME_PENDING);
Ram Malovany7cc83802012-07-19 10:26:10 +03001559 /* If the device was not found in a list of found devices names of which
1560 * are pending. there is no need to continue resolving a next name as it
1561 * will be done upon receiving another Remote Name Request Complete
1562 * Event */
1563 if (!e)
1564 return;
1565
1566 list_del(&e->list);
1567 if (name) {
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001568 e->name_state = NAME_KNOWN;
Ram Malovany7cc83802012-07-19 10:26:10 +03001569 mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00,
1570 e->data.rssi, name, name_len);
Ram Malovanyc3e7c0d2012-07-19 10:26:11 +03001571 } else {
1572 e->name_state = NAME_NOT_KNOWN;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001573 }
1574
Johan Hedbergb644ba32012-01-17 21:48:47 +02001575 if (hci_resolve_next_name(hdev))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001576 return;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001577
1578discov_complete:
1579 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1580}
1581
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001582static void hci_cs_remote_name_req(struct hci_dev *hdev, __u8 status)
1583{
Johan Hedberg127178d2010-11-18 22:22:29 +02001584 struct hci_cp_remote_name_req *cp;
1585 struct hci_conn *conn;
1586
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001587 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Johan Hedberg127178d2010-11-18 22:22:29 +02001588
1589 /* If successful wait for the name req complete event before
1590 * checking for the need to do authentication */
1591 if (!status)
1592 return;
1593
1594 cp = hci_sent_cmd_data(hdev, HCI_OP_REMOTE_NAME_REQ);
1595 if (!cp)
1596 return;
1597
1598 hci_dev_lock(hdev);
1599
1600 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001601
1602 if (test_bit(HCI_MGMT, &hdev->dev_flags))
1603 hci_check_pending_name(hdev, conn, &cp->bdaddr, NULL, 0);
1604
Johan Hedberg79c6c702011-04-28 11:28:55 -07001605 if (!conn)
1606 goto unlock;
1607
1608 if (!hci_outgoing_auth_needed(hdev, conn))
1609 goto unlock;
1610
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001611 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02001612 struct hci_cp_auth_requested auth_cp;
1613
1614 auth_cp.handle = __cpu_to_le16(conn->handle);
1615 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED,
1616 sizeof(auth_cp), &auth_cp);
Johan Hedberg127178d2010-11-18 22:22:29 +02001617 }
1618
Johan Hedberg79c6c702011-04-28 11:28:55 -07001619unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02001620 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001621}
1622
Marcel Holtmann769be972008-07-14 20:13:49 +02001623static void hci_cs_read_remote_features(struct hci_dev *hdev, __u8 status)
1624{
1625 struct hci_cp_read_remote_features *cp;
1626 struct hci_conn *conn;
1627
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001628 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001629
1630 if (!status)
1631 return;
1632
1633 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_FEATURES);
1634 if (!cp)
1635 return;
1636
1637 hci_dev_lock(hdev);
1638
1639 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1640 if (conn) {
1641 if (conn->state == BT_CONFIG) {
Marcel Holtmann769be972008-07-14 20:13:49 +02001642 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001643 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001644 }
1645 }
1646
1647 hci_dev_unlock(hdev);
1648}
1649
1650static void hci_cs_read_remote_ext_features(struct hci_dev *hdev, __u8 status)
1651{
1652 struct hci_cp_read_remote_ext_features *cp;
1653 struct hci_conn *conn;
1654
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001655 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001656
1657 if (!status)
1658 return;
1659
1660 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES);
1661 if (!cp)
1662 return;
1663
1664 hci_dev_lock(hdev);
1665
1666 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1667 if (conn) {
1668 if (conn->state == BT_CONFIG) {
Marcel Holtmann769be972008-07-14 20:13:49 +02001669 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001670 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001671 }
1672 }
1673
1674 hci_dev_unlock(hdev);
1675}
1676
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001677static void hci_cs_setup_sync_conn(struct hci_dev *hdev, __u8 status)
1678{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001679 struct hci_cp_setup_sync_conn *cp;
1680 struct hci_conn *acl, *sco;
1681 __u16 handle;
1682
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001683 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001684
1685 if (!status)
1686 return;
1687
1688 cp = hci_sent_cmd_data(hdev, HCI_OP_SETUP_SYNC_CONN);
1689 if (!cp)
1690 return;
1691
1692 handle = __le16_to_cpu(cp->handle);
1693
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001694 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001695
1696 hci_dev_lock(hdev);
1697
1698 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001699 if (acl) {
1700 sco = acl->link;
1701 if (sco) {
1702 sco->state = BT_CLOSED;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001703
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001704 hci_proto_connect_cfm(sco, status);
1705 hci_conn_del(sco);
1706 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001707 }
1708
1709 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001710}
1711
1712static void hci_cs_sniff_mode(struct hci_dev *hdev, __u8 status)
1713{
1714 struct hci_cp_sniff_mode *cp;
1715 struct hci_conn *conn;
1716
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001717 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001718
1719 if (!status)
1720 return;
1721
1722 cp = hci_sent_cmd_data(hdev, HCI_OP_SNIFF_MODE);
1723 if (!cp)
1724 return;
1725
1726 hci_dev_lock(hdev);
1727
1728 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001729 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001730 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001731
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001732 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001733 hci_sco_setup(conn, status);
1734 }
1735
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001736 hci_dev_unlock(hdev);
1737}
1738
1739static void hci_cs_exit_sniff_mode(struct hci_dev *hdev, __u8 status)
1740{
1741 struct hci_cp_exit_sniff_mode *cp;
1742 struct hci_conn *conn;
1743
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001744 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001745
1746 if (!status)
1747 return;
1748
1749 cp = hci_sent_cmd_data(hdev, HCI_OP_EXIT_SNIFF_MODE);
1750 if (!cp)
1751 return;
1752
1753 hci_dev_lock(hdev);
1754
1755 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001756 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001757 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001758
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001759 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001760 hci_sco_setup(conn, status);
1761 }
1762
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001763 hci_dev_unlock(hdev);
1764}
1765
Johan Hedberg88c3df12012-02-09 14:27:38 +02001766static void hci_cs_disconnect(struct hci_dev *hdev, u8 status)
1767{
1768 struct hci_cp_disconnect *cp;
1769 struct hci_conn *conn;
1770
1771 if (!status)
1772 return;
1773
1774 cp = hci_sent_cmd_data(hdev, HCI_OP_DISCONNECT);
1775 if (!cp)
1776 return;
1777
1778 hci_dev_lock(hdev);
1779
1780 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1781 if (conn)
1782 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001783 conn->dst_type, status);
Johan Hedberg88c3df12012-02-09 14:27:38 +02001784
1785 hci_dev_unlock(hdev);
1786}
1787
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001788static void hci_cs_create_phylink(struct hci_dev *hdev, u8 status)
1789{
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001790 struct hci_cp_create_phy_link *cp;
1791
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001792 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001793
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001794 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_PHY_LINK);
1795 if (!cp)
1796 return;
1797
Andrei Emeltchenkoe58917b2012-10-31 15:46:33 +02001798 hci_dev_lock(hdev);
1799
1800 if (status) {
1801 struct hci_conn *hcon;
1802
1803 hcon = hci_conn_hash_lookup_handle(hdev, cp->phy_handle);
1804 if (hcon)
1805 hci_conn_del(hcon);
1806 } else {
1807 amp_write_remote_assoc(hdev, cp->phy_handle);
1808 }
1809
1810 hci_dev_unlock(hdev);
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001811}
1812
Andrei Emeltchenko0b26ab92012-09-27 17:26:24 +03001813static void hci_cs_accept_phylink(struct hci_dev *hdev, u8 status)
1814{
1815 struct hci_cp_accept_phy_link *cp;
1816
1817 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1818
1819 if (status)
1820 return;
1821
1822 cp = hci_sent_cmd_data(hdev, HCI_OP_ACCEPT_PHY_LINK);
1823 if (!cp)
1824 return;
1825
1826 amp_write_remote_assoc(hdev, cp->phy_handle);
1827}
1828
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001829static void hci_cs_le_create_conn(struct hci_dev *hdev, u8 status)
1830{
1831 struct hci_cp_le_create_conn *cp;
1832 struct hci_conn *conn;
1833
1834 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1835
1836 /* All connection failure handling is taken care of by the
1837 * hci_le_conn_failed function which is triggered by the HCI
1838 * request completion callbacks used for connecting.
1839 */
1840 if (status)
1841 return;
1842
1843 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_CREATE_CONN);
1844 if (!cp)
1845 return;
1846
1847 hci_dev_lock(hdev);
1848
1849 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->peer_addr);
1850 if (!conn)
1851 goto unlock;
1852
1853 /* Store the initiator and responder address information which
1854 * is needed for SMP. These values will not change during the
1855 * lifetime of the connection.
1856 */
1857 conn->init_addr_type = cp->own_address_type;
1858 if (cp->own_address_type == ADDR_LE_DEV_RANDOM)
1859 bacpy(&conn->init_addr, &hdev->random_addr);
1860 else
1861 bacpy(&conn->init_addr, &hdev->bdaddr);
1862
1863 conn->resp_addr_type = cp->peer_addr_type;
1864 bacpy(&conn->resp_addr, &cp->peer_addr);
1865
Johan Hedberg9489eca2014-02-28 17:45:46 +02001866 /* We don't want the connection attempt to stick around
1867 * indefinitely since LE doesn't have a page timeout concept
1868 * like BR/EDR. Set a timer for any connection that doesn't use
1869 * the white list for connecting.
1870 */
1871 if (cp->filter_policy == HCI_LE_USE_PEER_ADDR)
1872 queue_delayed_work(conn->hdev->workqueue,
1873 &conn->le_conn_timeout,
1874 HCI_LE_CONN_TIMEOUT);
1875
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001876unlock:
1877 hci_dev_unlock(hdev);
1878}
1879
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02001880static void hci_cs_le_start_enc(struct hci_dev *hdev, u8 status)
1881{
1882 struct hci_cp_le_start_enc *cp;
1883 struct hci_conn *conn;
1884
1885 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1886
1887 if (!status)
1888 return;
1889
1890 hci_dev_lock(hdev);
1891
1892 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_START_ENC);
1893 if (!cp)
1894 goto unlock;
1895
1896 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1897 if (!conn)
1898 goto unlock;
1899
1900 if (conn->state != BT_CONNECTED)
1901 goto unlock;
1902
1903 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
1904 hci_conn_drop(conn);
1905
1906unlock:
1907 hci_dev_unlock(hdev);
1908}
1909
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001910static void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001911{
1912 __u8 status = *((__u8 *) skb->data);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001913 struct discovery_state *discov = &hdev->discovery;
1914 struct inquiry_entry *e;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001915
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001916 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001917
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001918 hci_conn_check_pending(hdev);
Andre Guedes89352e72011-11-04 14:16:53 -03001919
1920 if (!test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
1921 return;
1922
Peter Zijlstra4e857c52014-03-17 18:06:10 +01001923 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -03001924 wake_up_bit(&hdev->flags, HCI_INQUIRY);
1925
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02001926 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001927 return;
1928
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001929 hci_dev_lock(hdev);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001930
Andre Guedes343f9352012-02-17 20:39:37 -03001931 if (discov->state != DISCOVERY_FINDING)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001932 goto unlock;
1933
1934 if (list_empty(&discov->resolve)) {
1935 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1936 goto unlock;
1937 }
1938
1939 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
1940 if (e && hci_resolve_name(hdev, e) == 0) {
1941 e->name_state = NAME_PENDING;
1942 hci_discovery_set_state(hdev, DISCOVERY_RESOLVING);
1943 } else {
1944 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1945 }
1946
1947unlock:
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001948 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001949}
1950
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001951static void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001952{
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001953 struct inquiry_data data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001954 struct inquiry_info *info = (void *) (skb->data + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001955 int num_rsp = *((__u8 *) skb->data);
1956
1957 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
1958
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001959 if (!num_rsp)
1960 return;
1961
Andre Guedes1519cc12012-03-21 00:03:38 -03001962 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
1963 return;
1964
Linus Torvalds1da177e2005-04-16 15:20:36 -07001965 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001966
Johan Hedberge17acd42011-03-30 23:57:16 +03001967 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02001968 u32 flags;
Johan Hedberg31754052012-01-04 13:39:52 +02001969
Linus Torvalds1da177e2005-04-16 15:20:36 -07001970 bacpy(&data.bdaddr, &info->bdaddr);
1971 data.pscan_rep_mode = info->pscan_rep_mode;
1972 data.pscan_period_mode = info->pscan_period_mode;
1973 data.pscan_mode = info->pscan_mode;
1974 memcpy(data.dev_class, info->dev_class, 3);
1975 data.clock_offset = info->clock_offset;
1976 data.rssi = 0x00;
Marcel Holtmann41a96212008-07-14 20:13:48 +02001977 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02001978
Marcel Holtmannaf589252014-07-01 14:11:20 +02001979 flags = hci_inquiry_cache_update(hdev, &data, false);
1980
Johan Hedberg48264f02011-11-09 13:58:58 +02001981 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannaf589252014-07-01 14:11:20 +02001982 info->dev_class, 0, flags, NULL, 0, NULL, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001983 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001984
Linus Torvalds1da177e2005-04-16 15:20:36 -07001985 hci_dev_unlock(hdev);
1986}
1987
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001988static void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001989{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001990 struct hci_ev_conn_complete *ev = (void *) skb->data;
1991 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001992
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001993 BT_DBG("%s", hdev->name);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001994
Linus Torvalds1da177e2005-04-16 15:20:36 -07001995 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07001996
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001997 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann94992372009-04-19 19:30:03 +02001998 if (!conn) {
1999 if (ev->link_type != SCO_LINK)
2000 goto unlock;
2001
2002 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
2003 if (!conn)
2004 goto unlock;
2005
2006 conn->type = SCO_LINK;
2007 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002008
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002009 if (!ev->status) {
2010 conn->handle = __le16_to_cpu(ev->handle);
Marcel Holtmann769be972008-07-14 20:13:49 +02002011
2012 if (conn->type == ACL_LINK) {
2013 conn->state = BT_CONFIG;
2014 hci_conn_hold(conn);
Szymon Janca9ea3ed2012-07-19 14:46:08 +02002015
2016 if (!conn->out && !hci_conn_ssp_enabled(conn) &&
2017 !hci_find_link_key(hdev, &ev->bdaddr))
2018 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
2019 else
2020 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Marcel Holtmann769be972008-07-14 20:13:49 +02002021 } else
2022 conn->state = BT_CONNECTED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002023
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002024 hci_conn_add_sysfs(conn);
2025
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002026 if (test_bit(HCI_AUTH, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002027 set_bit(HCI_CONN_AUTH, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002028
2029 if (test_bit(HCI_ENCRYPT, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002030 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002031
2032 /* Get remote features */
2033 if (conn->type == ACL_LINK) {
2034 struct hci_cp_read_remote_features cp;
2035 cp.handle = ev->handle;
Marcel Holtmann769be972008-07-14 20:13:49 +02002036 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_FEATURES,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002037 sizeof(cp), &cp);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002038 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002039
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002040 /* Set packet type for incoming connection */
Andrei Emeltchenkod095c1e2011-12-01 14:33:27 +02002041 if (!conn->out && hdev->hci_ver < BLUETOOTH_VER_2_0) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002042 struct hci_cp_change_conn_ptype cp;
2043 cp.handle = ev->handle;
Marcel Holtmanna8746412008-07-14 20:13:46 +02002044 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002045 hci_send_cmd(hdev, HCI_OP_CHANGE_CONN_PTYPE, sizeof(cp),
2046 &cp);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002047 }
Johan Hedberg17d5c042011-01-22 06:09:08 +02002048 } else {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002049 conn->state = BT_CLOSED;
Johan Hedberg17d5c042011-01-22 06:09:08 +02002050 if (conn->type == ACL_LINK)
Marcel Holtmann64c7b772014-02-18 14:22:20 -08002051 mgmt_connect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002052 conn->dst_type, ev->status);
Johan Hedberg17d5c042011-01-22 06:09:08 +02002053 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002054
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002055 if (conn->type == ACL_LINK)
2056 hci_sco_setup(conn, ev->status);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002057
Marcel Holtmann769be972008-07-14 20:13:49 +02002058 if (ev->status) {
2059 hci_proto_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002060 hci_conn_del(conn);
Marcel Holtmannc89b6e62009-01-15 21:57:03 +01002061 } else if (ev->link_type != ACL_LINK)
2062 hci_proto_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002063
2064unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002065 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002066
2067 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002068}
2069
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002070static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002071{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002072 struct hci_ev_conn_request *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002073 int mask = hdev->link_mode;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002074 __u8 flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002075
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03002076 BT_DBG("%s bdaddr %pMR type 0x%x", hdev->name, &ev->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002077 ev->link_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002078
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002079 mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type,
2080 &flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002081
Szymon Janc138d22e2011-02-17 16:44:23 +01002082 if ((mask & HCI_LM_ACCEPT) &&
Marcel Holtmannb9ee0a72013-10-17 17:24:13 -07002083 !hci_blacklist_lookup(hdev, &ev->bdaddr, BDADDR_BREDR)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002084 /* Connection accepted */
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02002085 struct inquiry_entry *ie;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002086 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002087
2088 hci_dev_lock(hdev);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002089
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02002090 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
2091 if (ie)
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02002092 memcpy(ie->data.dev_class, ev->dev_class, 3);
2093
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03002094 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type,
2095 &ev->bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002096 if (!conn) {
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02002097 conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr);
2098 if (!conn) {
Gustavo F. Padovan893ef972010-07-18 15:13:37 -03002099 BT_ERR("No memory for new connection");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002100 hci_dev_unlock(hdev);
2101 return;
2102 }
2103 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002104
Linus Torvalds1da177e2005-04-16 15:20:36 -07002105 memcpy(conn->dev_class, ev->dev_class, 3);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002106
Linus Torvalds1da177e2005-04-16 15:20:36 -07002107 hci_dev_unlock(hdev);
2108
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002109 if (ev->link_type == ACL_LINK ||
2110 (!(flags & HCI_PROTO_DEFER) && !lmp_esco_capable(hdev))) {
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002111 struct hci_cp_accept_conn_req cp;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002112 conn->state = BT_CONNECT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002113
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002114 bacpy(&cp.bdaddr, &ev->bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002115
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002116 if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER))
2117 cp.role = 0x00; /* Become master */
2118 else
2119 cp.role = 0x01; /* Remain slave */
2120
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002121 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp),
2122 &cp);
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002123 } else if (!(flags & HCI_PROTO_DEFER)) {
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002124 struct hci_cp_accept_sync_conn_req cp;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002125 conn->state = BT_CONNECT;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002126
2127 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmanna8746412008-07-14 20:13:46 +02002128 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002129
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002130 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
2131 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
2132 cp.max_latency = cpu_to_le16(0xffff);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002133 cp.content_format = cpu_to_le16(hdev->voice_setting);
2134 cp.retrans_effort = 0xff;
2135
2136 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002137 sizeof(cp), &cp);
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002138 } else {
2139 conn->state = BT_CONNECT2;
2140 hci_proto_connect_cfm(conn, 0);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002141 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002142 } else {
2143 /* Connection rejected */
2144 struct hci_cp_reject_conn_req cp;
2145
2146 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02002147 cp.reason = HCI_ERROR_REJ_BAD_ADDR;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002148 hci_send_cmd(hdev, HCI_OP_REJECT_CONN_REQ, sizeof(cp), &cp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002149 }
2150}
2151
Mikel Astizf0d6a0e2012-08-09 09:52:30 +02002152static u8 hci_to_mgmt_reason(u8 err)
2153{
2154 switch (err) {
2155 case HCI_ERROR_CONNECTION_TIMEOUT:
2156 return MGMT_DEV_DISCONN_TIMEOUT;
2157 case HCI_ERROR_REMOTE_USER_TERM:
2158 case HCI_ERROR_REMOTE_LOW_RESOURCES:
2159 case HCI_ERROR_REMOTE_POWER_OFF:
2160 return MGMT_DEV_DISCONN_REMOTE;
2161 case HCI_ERROR_LOCAL_HOST_TERM:
2162 return MGMT_DEV_DISCONN_LOCAL_HOST;
2163 default:
2164 return MGMT_DEV_DISCONN_UNKNOWN;
2165 }
2166}
2167
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002168static void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002169{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002170 struct hci_ev_disconn_complete *ev = (void *) skb->data;
Andre Guedesabf54a52013-11-07 17:36:09 -03002171 u8 reason = hci_to_mgmt_reason(ev->reason);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002172 struct hci_conn_params *params;
Marcel Holtmann04837f62006-07-03 10:02:33 +02002173 struct hci_conn *conn;
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002174 bool mgmt_connected;
Andre Guedes38462202013-11-07 17:36:10 -03002175 u8 type;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002176
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002177 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002178
Linus Torvalds1da177e2005-04-16 15:20:36 -07002179 hci_dev_lock(hdev);
2180
Marcel Holtmann04837f62006-07-03 10:02:33 +02002181 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergf7520542011-01-20 12:34:39 +02002182 if (!conn)
2183 goto unlock;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002184
Andre Guedesabf54a52013-11-07 17:36:09 -03002185 if (ev->status) {
2186 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
2187 conn->dst_type, ev->status);
2188 goto unlock;
Johan Hedberg37d9ef72011-11-10 15:54:39 +02002189 }
Johan Hedbergf7520542011-01-20 12:34:39 +02002190
Andre Guedes38462202013-11-07 17:36:10 -03002191 conn->state = BT_CLOSED;
2192
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002193 mgmt_connected = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags);
2194 mgmt_device_disconnected(hdev, &conn->dst, conn->type, conn->dst_type,
2195 reason, mgmt_connected);
Andre Guedesabf54a52013-11-07 17:36:09 -03002196
Johan Hedbergaf6a9c32014-06-24 13:15:53 +03002197 if (conn->type == ACL_LINK &&
2198 test_bit(HCI_CONN_FLUSH_KEY, &conn->flags))
Andre Guedes38462202013-11-07 17:36:10 -03002199 hci_remove_link_key(hdev, &conn->dst);
Johan Hedberg22102462013-10-05 12:01:06 +02002200
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002201 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
2202 if (params) {
2203 switch (params->auto_connect) {
2204 case HCI_AUTO_CONN_LINK_LOSS:
2205 if (ev->reason != HCI_ERROR_CONNECTION_TIMEOUT)
2206 break;
2207 /* Fall through */
2208
2209 case HCI_AUTO_CONN_ALWAYS:
2210 hci_pend_le_conn_add(hdev, &conn->dst, conn->dst_type);
2211 break;
2212
2213 default:
2214 break;
2215 }
2216 }
2217
Andre Guedes38462202013-11-07 17:36:10 -03002218 type = conn->type;
Johan Hedberg22102462013-10-05 12:01:06 +02002219
Andre Guedes38462202013-11-07 17:36:10 -03002220 hci_proto_disconn_cfm(conn, ev->reason);
2221 hci_conn_del(conn);
2222
2223 /* Re-enable advertising if necessary, since it might
2224 * have been disabled by the connection. From the
2225 * HCI_LE_Set_Advertise_Enable command description in
2226 * the core specification (v4.0):
2227 * "The Controller shall continue advertising until the Host
2228 * issues an LE_Set_Advertise_Enable command with
2229 * Advertising_Enable set to 0x00 (Advertising is disabled)
2230 * or until a connection is created or until the Advertising
2231 * is timed out due to Directed Advertising."
2232 */
2233 if (type == LE_LINK)
2234 mgmt_reenable_advertising(hdev);
Johan Hedbergf7520542011-01-20 12:34:39 +02002235
2236unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002237 hci_dev_unlock(hdev);
2238}
2239
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002240static void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002241{
2242 struct hci_ev_auth_complete *ev = (void *) skb->data;
2243 struct hci_conn *conn;
2244
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002245 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002246
2247 hci_dev_lock(hdev);
2248
2249 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002250 if (!conn)
2251 goto unlock;
2252
2253 if (!ev->status) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002254 if (!hci_conn_ssp_enabled(conn) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03002255 test_bit(HCI_CONN_REAUTH_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002256 BT_INFO("re-auth of legacy device is not possible.");
Johan Hedberg2a611692011-02-19 12:06:00 -03002257 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002258 set_bit(HCI_CONN_AUTH, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002259 conn->sec_level = conn->pending_sec_level;
Johan Hedberg2a611692011-02-19 12:06:00 -03002260 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002261 } else {
Johan Hedbergbab73cb2012-02-09 16:07:29 +02002262 mgmt_auth_failed(hdev, &conn->dst, conn->type, conn->dst_type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002263 ev->status);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002264 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002265
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002266 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
2267 clear_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002268
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002269 if (conn->state == BT_CONFIG) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002270 if (!ev->status && hci_conn_ssp_enabled(conn)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002271 struct hci_cp_set_conn_encrypt cp;
2272 cp.handle = ev->handle;
2273 cp.encrypt = 0x01;
2274 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002275 &cp);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002276 } else {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002277 conn->state = BT_CONNECTED;
2278 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002279 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002280 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002281 } else {
2282 hci_auth_cfm(conn, ev->status);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002283
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002284 hci_conn_hold(conn);
2285 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02002286 hci_conn_drop(conn);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002287 }
2288
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002289 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002290 if (!ev->status) {
2291 struct hci_cp_set_conn_encrypt cp;
2292 cp.handle = ev->handle;
2293 cp.encrypt = 0x01;
2294 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002295 &cp);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002296 } else {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002297 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002298 hci_encrypt_cfm(conn, ev->status, 0x00);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002299 }
2300 }
2301
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002302unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002303 hci_dev_unlock(hdev);
2304}
2305
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002306static void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002307{
Johan Hedberg127178d2010-11-18 22:22:29 +02002308 struct hci_ev_remote_name *ev = (void *) skb->data;
2309 struct hci_conn *conn;
2310
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002311 BT_DBG("%s", hdev->name);
2312
2313 hci_conn_check_pending(hdev);
Johan Hedberg127178d2010-11-18 22:22:29 +02002314
2315 hci_dev_lock(hdev);
2316
2317 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002318
2319 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
2320 goto check_auth;
2321
2322 if (ev->status == 0)
2323 hci_check_pending_name(hdev, conn, &ev->bdaddr, ev->name,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002324 strnlen(ev->name, HCI_MAX_NAME_LENGTH));
Johan Hedbergb644ba32012-01-17 21:48:47 +02002325 else
2326 hci_check_pending_name(hdev, conn, &ev->bdaddr, NULL, 0);
2327
2328check_auth:
Johan Hedberg79c6c702011-04-28 11:28:55 -07002329 if (!conn)
2330 goto unlock;
2331
2332 if (!hci_outgoing_auth_needed(hdev, conn))
2333 goto unlock;
2334
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002335 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002336 struct hci_cp_auth_requested cp;
2337 cp.handle = __cpu_to_le16(conn->handle);
2338 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp);
2339 }
2340
Johan Hedberg79c6c702011-04-28 11:28:55 -07002341unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02002342 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002343}
2344
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002345static void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002346{
2347 struct hci_ev_encrypt_change *ev = (void *) skb->data;
2348 struct hci_conn *conn;
2349
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002350 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002351
2352 hci_dev_lock(hdev);
2353
2354 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002355 if (!conn)
2356 goto unlock;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002357
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002358 if (!ev->status) {
2359 if (ev->encrypt) {
2360 /* Encryption implies authentication */
Johan Hedberg4dae2792014-06-24 17:03:50 +03002361 set_bit(HCI_CONN_AUTH, &conn->flags);
2362 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002363 conn->sec_level = conn->pending_sec_level;
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002364
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002365 /* P-256 authentication key implies FIPS */
2366 if (conn->key_type == HCI_LK_AUTH_COMBINATION_P256)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002367 set_bit(HCI_CONN_FIPS, &conn->flags);
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002368
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002369 if ((conn->type == ACL_LINK && ev->encrypt == 0x02) ||
2370 conn->type == LE_LINK)
2371 set_bit(HCI_CONN_AES_CCM, &conn->flags);
2372 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002373 clear_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002374 clear_bit(HCI_CONN_AES_CCM, &conn->flags);
2375 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002376 }
2377
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002378 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
2379
2380 if (ev->status && conn->state == BT_CONNECTED) {
2381 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2382 hci_conn_drop(conn);
2383 goto unlock;
2384 }
2385
2386 if (conn->state == BT_CONFIG) {
2387 if (!ev->status)
2388 conn->state = BT_CONNECTED;
2389
Marcel Holtmann40b552a2014-03-19 14:10:25 -07002390 /* In Secure Connections Only mode, do not allow any
2391 * connections that are not encrypted with AES-CCM
2392 * using a P-256 authenticated combination key.
2393 */
2394 if (test_bit(HCI_SC_ONLY, &hdev->dev_flags) &&
2395 (!test_bit(HCI_CONN_AES_CCM, &conn->flags) ||
2396 conn->key_type != HCI_LK_AUTH_COMBINATION_P256)) {
2397 hci_proto_connect_cfm(conn, HCI_ERROR_AUTH_FAILURE);
2398 hci_conn_drop(conn);
2399 goto unlock;
2400 }
2401
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002402 hci_proto_connect_cfm(conn, ev->status);
2403 hci_conn_drop(conn);
2404 } else
2405 hci_encrypt_cfm(conn, ev->status, ev->encrypt);
2406
Gustavo Padovana7d77232012-05-13 03:20:07 -03002407unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002408 hci_dev_unlock(hdev);
2409}
2410
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002411static void hci_change_link_key_complete_evt(struct hci_dev *hdev,
2412 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002413{
2414 struct hci_ev_change_link_key_complete *ev = (void *) skb->data;
2415 struct hci_conn *conn;
2416
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002417 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002418
2419 hci_dev_lock(hdev);
2420
2421 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
2422 if (conn) {
2423 if (!ev->status)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002424 set_bit(HCI_CONN_SECURE, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002425
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002426 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002427
2428 hci_key_change_cfm(conn, ev->status);
2429 }
2430
2431 hci_dev_unlock(hdev);
2432}
2433
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002434static void hci_remote_features_evt(struct hci_dev *hdev,
2435 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002436{
2437 struct hci_ev_remote_features *ev = (void *) skb->data;
2438 struct hci_conn *conn;
2439
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002440 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002441
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002442 hci_dev_lock(hdev);
2443
2444 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02002445 if (!conn)
2446 goto unlock;
Marcel Holtmann769be972008-07-14 20:13:49 +02002447
Johan Hedbergccd556f2010-11-10 17:11:51 +02002448 if (!ev->status)
Johan Hedbergcad718e2013-04-17 15:00:51 +03002449 memcpy(conn->features[0], ev->features, 8);
Johan Hedbergccd556f2010-11-10 17:11:51 +02002450
2451 if (conn->state != BT_CONFIG)
2452 goto unlock;
2453
2454 if (!ev->status && lmp_ssp_capable(hdev) && lmp_ssp_capable(conn)) {
2455 struct hci_cp_read_remote_ext_features cp;
2456 cp.handle = ev->handle;
2457 cp.page = 0x01;
2458 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002459 sizeof(cp), &cp);
Johan Hedberg392599b2010-11-18 22:22:28 +02002460 goto unlock;
2461 }
2462
Johan Hedberg671267b2012-05-12 16:11:50 -03002463 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002464 struct hci_cp_remote_name_req cp;
2465 memset(&cp, 0, sizeof(cp));
2466 bacpy(&cp.bdaddr, &conn->dst);
2467 cp.pscan_rep_mode = 0x02;
2468 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002469 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
2470 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002471 conn->dst_type, 0, NULL, 0,
2472 conn->dev_class);
Johan Hedberg392599b2010-11-18 22:22:28 +02002473
Johan Hedberg127178d2010-11-18 22:22:29 +02002474 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002475 conn->state = BT_CONNECTED;
2476 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002477 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02002478 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002479
Johan Hedbergccd556f2010-11-10 17:11:51 +02002480unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002481 hci_dev_unlock(hdev);
2482}
2483
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002484static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002485{
2486 struct hci_ev_cmd_complete *ev = (void *) skb->data;
Johan Hedberg9238f362013-03-05 20:37:48 +02002487 u8 status = skb->data[sizeof(*ev)];
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002488 __u16 opcode;
2489
2490 skb_pull(skb, sizeof(*ev));
2491
2492 opcode = __le16_to_cpu(ev->opcode);
2493
2494 switch (opcode) {
2495 case HCI_OP_INQUIRY_CANCEL:
2496 hci_cc_inquiry_cancel(hdev, skb);
2497 break;
2498
Andre Guedes4d934832012-03-21 00:03:35 -03002499 case HCI_OP_PERIODIC_INQ:
2500 hci_cc_periodic_inq(hdev, skb);
2501 break;
2502
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002503 case HCI_OP_EXIT_PERIODIC_INQ:
2504 hci_cc_exit_periodic_inq(hdev, skb);
2505 break;
2506
2507 case HCI_OP_REMOTE_NAME_REQ_CANCEL:
2508 hci_cc_remote_name_req_cancel(hdev, skb);
2509 break;
2510
2511 case HCI_OP_ROLE_DISCOVERY:
2512 hci_cc_role_discovery(hdev, skb);
2513 break;
2514
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002515 case HCI_OP_READ_LINK_POLICY:
2516 hci_cc_read_link_policy(hdev, skb);
2517 break;
2518
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002519 case HCI_OP_WRITE_LINK_POLICY:
2520 hci_cc_write_link_policy(hdev, skb);
2521 break;
2522
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002523 case HCI_OP_READ_DEF_LINK_POLICY:
2524 hci_cc_read_def_link_policy(hdev, skb);
2525 break;
2526
2527 case HCI_OP_WRITE_DEF_LINK_POLICY:
2528 hci_cc_write_def_link_policy(hdev, skb);
2529 break;
2530
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002531 case HCI_OP_RESET:
2532 hci_cc_reset(hdev, skb);
2533 break;
2534
2535 case HCI_OP_WRITE_LOCAL_NAME:
2536 hci_cc_write_local_name(hdev, skb);
2537 break;
2538
2539 case HCI_OP_READ_LOCAL_NAME:
2540 hci_cc_read_local_name(hdev, skb);
2541 break;
2542
2543 case HCI_OP_WRITE_AUTH_ENABLE:
2544 hci_cc_write_auth_enable(hdev, skb);
2545 break;
2546
2547 case HCI_OP_WRITE_ENCRYPT_MODE:
2548 hci_cc_write_encrypt_mode(hdev, skb);
2549 break;
2550
2551 case HCI_OP_WRITE_SCAN_ENABLE:
2552 hci_cc_write_scan_enable(hdev, skb);
2553 break;
2554
2555 case HCI_OP_READ_CLASS_OF_DEV:
2556 hci_cc_read_class_of_dev(hdev, skb);
2557 break;
2558
2559 case HCI_OP_WRITE_CLASS_OF_DEV:
2560 hci_cc_write_class_of_dev(hdev, skb);
2561 break;
2562
2563 case HCI_OP_READ_VOICE_SETTING:
2564 hci_cc_read_voice_setting(hdev, skb);
2565 break;
2566
2567 case HCI_OP_WRITE_VOICE_SETTING:
2568 hci_cc_write_voice_setting(hdev, skb);
2569 break;
2570
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -07002571 case HCI_OP_READ_NUM_SUPPORTED_IAC:
2572 hci_cc_read_num_supported_iac(hdev, skb);
2573 break;
2574
Marcel Holtmann333140b2008-07-14 20:13:48 +02002575 case HCI_OP_WRITE_SSP_MODE:
2576 hci_cc_write_ssp_mode(hdev, skb);
2577 break;
2578
Marcel Holtmanneac83dc2014-01-10 02:07:23 -08002579 case HCI_OP_WRITE_SC_SUPPORT:
2580 hci_cc_write_sc_support(hdev, skb);
2581 break;
2582
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002583 case HCI_OP_READ_LOCAL_VERSION:
2584 hci_cc_read_local_version(hdev, skb);
2585 break;
2586
2587 case HCI_OP_READ_LOCAL_COMMANDS:
2588 hci_cc_read_local_commands(hdev, skb);
2589 break;
2590
2591 case HCI_OP_READ_LOCAL_FEATURES:
2592 hci_cc_read_local_features(hdev, skb);
2593 break;
2594
Andre Guedes971e3a42011-06-30 19:20:52 -03002595 case HCI_OP_READ_LOCAL_EXT_FEATURES:
2596 hci_cc_read_local_ext_features(hdev, skb);
2597 break;
2598
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002599 case HCI_OP_READ_BUFFER_SIZE:
2600 hci_cc_read_buffer_size(hdev, skb);
2601 break;
2602
2603 case HCI_OP_READ_BD_ADDR:
2604 hci_cc_read_bd_addr(hdev, skb);
2605 break;
2606
Johan Hedbergf332ec62013-03-15 17:07:11 -05002607 case HCI_OP_READ_PAGE_SCAN_ACTIVITY:
2608 hci_cc_read_page_scan_activity(hdev, skb);
2609 break;
2610
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002611 case HCI_OP_WRITE_PAGE_SCAN_ACTIVITY:
2612 hci_cc_write_page_scan_activity(hdev, skb);
2613 break;
2614
Johan Hedbergf332ec62013-03-15 17:07:11 -05002615 case HCI_OP_READ_PAGE_SCAN_TYPE:
2616 hci_cc_read_page_scan_type(hdev, skb);
2617 break;
2618
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002619 case HCI_OP_WRITE_PAGE_SCAN_TYPE:
2620 hci_cc_write_page_scan_type(hdev, skb);
2621 break;
2622
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +02002623 case HCI_OP_READ_DATA_BLOCK_SIZE:
2624 hci_cc_read_data_block_size(hdev, skb);
2625 break;
2626
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +02002627 case HCI_OP_READ_FLOW_CONTROL_MODE:
2628 hci_cc_read_flow_control_mode(hdev, skb);
2629 break;
2630
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +03002631 case HCI_OP_READ_LOCAL_AMP_INFO:
2632 hci_cc_read_local_amp_info(hdev, skb);
2633 break;
2634
Johan Hedberg33f35722014-06-28 17:54:06 +03002635 case HCI_OP_READ_CLOCK:
2636 hci_cc_read_clock(hdev, skb);
2637 break;
2638
Andrei Emeltchenko903e4542012-09-27 17:26:09 +03002639 case HCI_OP_READ_LOCAL_AMP_ASSOC:
2640 hci_cc_read_local_amp_assoc(hdev, skb);
2641 break;
2642
Johan Hedbergd5859e22011-01-25 01:19:58 +02002643 case HCI_OP_READ_INQ_RSP_TX_POWER:
2644 hci_cc_read_inq_rsp_tx_power(hdev, skb);
2645 break;
2646
Johan Hedberg980e1a52011-01-22 06:10:07 +02002647 case HCI_OP_PIN_CODE_REPLY:
2648 hci_cc_pin_code_reply(hdev, skb);
2649 break;
2650
2651 case HCI_OP_PIN_CODE_NEG_REPLY:
2652 hci_cc_pin_code_neg_reply(hdev, skb);
2653 break;
2654
Szymon Jancc35938b2011-03-22 13:12:21 +01002655 case HCI_OP_READ_LOCAL_OOB_DATA:
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08002656 hci_cc_read_local_oob_data(hdev, skb);
2657 break;
2658
2659 case HCI_OP_READ_LOCAL_OOB_EXT_DATA:
2660 hci_cc_read_local_oob_ext_data(hdev, skb);
Szymon Jancc35938b2011-03-22 13:12:21 +01002661 break;
2662
Ville Tervo6ed58ec2011-02-10 22:38:48 -03002663 case HCI_OP_LE_READ_BUFFER_SIZE:
2664 hci_cc_le_read_buffer_size(hdev, skb);
2665 break;
2666
Johan Hedberg60e77322013-01-22 14:01:59 +02002667 case HCI_OP_LE_READ_LOCAL_FEATURES:
2668 hci_cc_le_read_local_features(hdev, skb);
2669 break;
2670
Johan Hedberg8fa19092012-10-19 20:57:49 +03002671 case HCI_OP_LE_READ_ADV_TX_POWER:
2672 hci_cc_le_read_adv_tx_power(hdev, skb);
2673 break;
2674
Johan Hedberga5c29682011-02-19 12:05:57 -03002675 case HCI_OP_USER_CONFIRM_REPLY:
2676 hci_cc_user_confirm_reply(hdev, skb);
2677 break;
2678
2679 case HCI_OP_USER_CONFIRM_NEG_REPLY:
2680 hci_cc_user_confirm_neg_reply(hdev, skb);
2681 break;
2682
Brian Gix1143d452011-11-23 08:28:34 -08002683 case HCI_OP_USER_PASSKEY_REPLY:
2684 hci_cc_user_passkey_reply(hdev, skb);
2685 break;
2686
2687 case HCI_OP_USER_PASSKEY_NEG_REPLY:
2688 hci_cc_user_passkey_neg_reply(hdev, skb);
Szymon Janc16cde992012-04-13 12:32:42 +02002689 break;
Andre Guedes07f7fa52011-12-02 21:13:31 +09002690
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08002691 case HCI_OP_LE_SET_RANDOM_ADDR:
2692 hci_cc_le_set_random_addr(hdev, skb);
2693 break;
2694
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01002695 case HCI_OP_LE_SET_ADV_ENABLE:
2696 hci_cc_le_set_adv_enable(hdev, skb);
2697 break;
2698
Marcel Holtmann533553f2014-03-21 12:18:10 -07002699 case HCI_OP_LE_SET_SCAN_PARAM:
2700 hci_cc_le_set_scan_param(hdev, skb);
2701 break;
2702
Andre Guedeseb9d91f2011-05-26 16:23:52 -03002703 case HCI_OP_LE_SET_SCAN_ENABLE:
2704 hci_cc_le_set_scan_enable(hdev, skb);
2705 break;
2706
Johan Hedbergcf1d0812013-01-22 14:02:00 +02002707 case HCI_OP_LE_READ_WHITE_LIST_SIZE:
2708 hci_cc_le_read_white_list_size(hdev, skb);
2709 break;
2710
Marcel Holtmann0f36b582014-02-27 20:37:31 -08002711 case HCI_OP_LE_CLEAR_WHITE_LIST:
2712 hci_cc_le_clear_white_list(hdev, skb);
2713 break;
2714
2715 case HCI_OP_LE_ADD_TO_WHITE_LIST:
2716 hci_cc_le_add_to_white_list(hdev, skb);
2717 break;
2718
2719 case HCI_OP_LE_DEL_FROM_WHITE_LIST:
2720 hci_cc_le_del_from_white_list(hdev, skb);
2721 break;
2722
Johan Hedberg9b008c02013-01-22 14:02:01 +02002723 case HCI_OP_LE_READ_SUPPORTED_STATES:
2724 hci_cc_le_read_supported_states(hdev, skb);
2725 break;
2726
Andre Guedesf9b49302011-06-30 19:20:53 -03002727 case HCI_OP_WRITE_LE_HOST_SUPPORTED:
2728 hci_cc_write_le_host_supported(hdev, skb);
2729 break;
2730
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02002731 case HCI_OP_LE_SET_ADV_PARAM:
2732 hci_cc_set_adv_param(hdev, skb);
2733 break;
2734
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03002735 case HCI_OP_WRITE_REMOTE_AMP_ASSOC:
2736 hci_cc_write_remote_amp_assoc(hdev, skb);
2737 break;
2738
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02002739 case HCI_OP_READ_RSSI:
2740 hci_cc_read_rssi(hdev, skb);
2741 break;
2742
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02002743 case HCI_OP_READ_TX_POWER:
2744 hci_cc_read_tx_power(hdev, skb);
2745 break;
2746
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002747 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002748 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002749 break;
2750 }
2751
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002752 if (opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02002753 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02002754
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002755 hci_req_cmd_complete(hdev, opcode, status);
Johan Hedberg9238f362013-03-05 20:37:48 +02002756
Szymon Jancdbccd792012-12-11 08:51:19 +01002757 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002758 atomic_set(&hdev->cmd_cnt, 1);
2759 if (!skb_queue_empty(&hdev->cmd_q))
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02002760 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002761 }
2762}
2763
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002764static void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002765{
2766 struct hci_ev_cmd_status *ev = (void *) skb->data;
2767 __u16 opcode;
2768
2769 skb_pull(skb, sizeof(*ev));
2770
2771 opcode = __le16_to_cpu(ev->opcode);
2772
2773 switch (opcode) {
2774 case HCI_OP_INQUIRY:
2775 hci_cs_inquiry(hdev, ev->status);
2776 break;
2777
2778 case HCI_OP_CREATE_CONN:
2779 hci_cs_create_conn(hdev, ev->status);
2780 break;
2781
2782 case HCI_OP_ADD_SCO:
2783 hci_cs_add_sco(hdev, ev->status);
2784 break;
2785
Marcel Holtmannf8558552008-07-14 20:13:49 +02002786 case HCI_OP_AUTH_REQUESTED:
2787 hci_cs_auth_requested(hdev, ev->status);
2788 break;
2789
2790 case HCI_OP_SET_CONN_ENCRYPT:
2791 hci_cs_set_conn_encrypt(hdev, ev->status);
2792 break;
2793
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002794 case HCI_OP_REMOTE_NAME_REQ:
2795 hci_cs_remote_name_req(hdev, ev->status);
2796 break;
2797
Marcel Holtmann769be972008-07-14 20:13:49 +02002798 case HCI_OP_READ_REMOTE_FEATURES:
2799 hci_cs_read_remote_features(hdev, ev->status);
2800 break;
2801
2802 case HCI_OP_READ_REMOTE_EXT_FEATURES:
2803 hci_cs_read_remote_ext_features(hdev, ev->status);
2804 break;
2805
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002806 case HCI_OP_SETUP_SYNC_CONN:
2807 hci_cs_setup_sync_conn(hdev, ev->status);
2808 break;
2809
2810 case HCI_OP_SNIFF_MODE:
2811 hci_cs_sniff_mode(hdev, ev->status);
2812 break;
2813
2814 case HCI_OP_EXIT_SNIFF_MODE:
2815 hci_cs_exit_sniff_mode(hdev, ev->status);
2816 break;
2817
Johan Hedberg8962ee72011-01-20 12:40:27 +02002818 case HCI_OP_DISCONNECT:
Johan Hedberg88c3df12012-02-09 14:27:38 +02002819 hci_cs_disconnect(hdev, ev->status);
Johan Hedberg8962ee72011-01-20 12:40:27 +02002820 break;
2821
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03002822 case HCI_OP_CREATE_PHY_LINK:
2823 hci_cs_create_phylink(hdev, ev->status);
2824 break;
2825
Andrei Emeltchenko0b26ab92012-09-27 17:26:24 +03002826 case HCI_OP_ACCEPT_PHY_LINK:
2827 hci_cs_accept_phylink(hdev, ev->status);
2828 break;
2829
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002830 case HCI_OP_LE_CREATE_CONN:
2831 hci_cs_le_create_conn(hdev, ev->status);
2832 break;
2833
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02002834 case HCI_OP_LE_START_ENC:
2835 hci_cs_le_start_enc(hdev, ev->status);
2836 break;
2837
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002838 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002839 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002840 break;
2841 }
2842
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002843 if (opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02002844 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02002845
Johan Hedberg02350a72013-04-03 21:50:29 +03002846 if (ev->status ||
2847 (hdev->sent_cmd && !bt_cb(hdev->sent_cmd)->req.event))
2848 hci_req_cmd_complete(hdev, opcode, ev->status);
Johan Hedberg9238f362013-03-05 20:37:48 +02002849
Gustavo F. Padovan10572132011-03-16 15:36:29 -03002850 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002851 atomic_set(&hdev->cmd_cnt, 1);
2852 if (!skb_queue_empty(&hdev->cmd_q))
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02002853 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002854 }
2855}
2856
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002857static void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002858{
2859 struct hci_ev_role_change *ev = (void *) skb->data;
2860 struct hci_conn *conn;
2861
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002862 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002863
2864 hci_dev_lock(hdev);
2865
2866 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
2867 if (conn) {
2868 if (!ev->status) {
2869 if (ev->role)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002870 clear_bit(HCI_CONN_MASTER, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002871 else
Johan Hedberg4dae2792014-06-24 17:03:50 +03002872 set_bit(HCI_CONN_MASTER, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002873 }
2874
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002875 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002876
2877 hci_role_switch_cfm(conn, ev->status, ev->role);
2878 }
2879
2880 hci_dev_unlock(hdev);
2881}
2882
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002883static void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002884{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002885 struct hci_ev_num_comp_pkts *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002886 int i;
2887
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02002888 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_PACKET_BASED) {
2889 BT_ERR("Wrong event for mode %d", hdev->flow_ctl_mode);
2890 return;
2891 }
2892
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02002893 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03002894 ev->num_hndl * sizeof(struct hci_comp_pkts_info)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002895 BT_DBG("%s bad parameters", hdev->name);
2896 return;
2897 }
2898
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02002899 BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl);
2900
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02002901 for (i = 0; i < ev->num_hndl; i++) {
2902 struct hci_comp_pkts_info *info = &ev->handles[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002903 struct hci_conn *conn;
2904 __u16 handle, count;
2905
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02002906 handle = __le16_to_cpu(info->handle);
2907 count = __le16_to_cpu(info->count);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002908
2909 conn = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002910 if (!conn)
2911 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002912
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002913 conn->sent -= count;
2914
2915 switch (conn->type) {
2916 case ACL_LINK:
2917 hdev->acl_cnt += count;
2918 if (hdev->acl_cnt > hdev->acl_pkts)
2919 hdev->acl_cnt = hdev->acl_pkts;
2920 break;
2921
2922 case LE_LINK:
2923 if (hdev->le_pkts) {
2924 hdev->le_cnt += count;
2925 if (hdev->le_cnt > hdev->le_pkts)
2926 hdev->le_cnt = hdev->le_pkts;
2927 } else {
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02002928 hdev->acl_cnt += count;
2929 if (hdev->acl_cnt > hdev->acl_pkts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002930 hdev->acl_cnt = hdev->acl_pkts;
2931 }
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002932 break;
2933
2934 case SCO_LINK:
2935 hdev->sco_cnt += count;
2936 if (hdev->sco_cnt > hdev->sco_pkts)
2937 hdev->sco_cnt = hdev->sco_pkts;
2938 break;
2939
2940 default:
2941 BT_ERR("Unknown type %d conn %p", conn->type, conn);
2942 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002943 }
2944 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002945
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02002946 queue_work(hdev->workqueue, &hdev->tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002947}
2948
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03002949static struct hci_conn *__hci_conn_lookup_handle(struct hci_dev *hdev,
2950 __u16 handle)
2951{
2952 struct hci_chan *chan;
2953
2954 switch (hdev->dev_type) {
2955 case HCI_BREDR:
2956 return hci_conn_hash_lookup_handle(hdev, handle);
2957 case HCI_AMP:
2958 chan = hci_chan_lookup_handle(hdev, handle);
2959 if (chan)
2960 return chan->conn;
2961 break;
2962 default:
2963 BT_ERR("%s unknown dev_type %d", hdev->name, hdev->dev_type);
2964 break;
2965 }
2966
2967 return NULL;
2968}
2969
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002970static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002971{
2972 struct hci_ev_num_comp_blocks *ev = (void *) skb->data;
2973 int i;
2974
2975 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_BLOCK_BASED) {
2976 BT_ERR("Wrong event for mode %d", hdev->flow_ctl_mode);
2977 return;
2978 }
2979
2980 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03002981 ev->num_hndl * sizeof(struct hci_comp_blocks_info)) {
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002982 BT_DBG("%s bad parameters", hdev->name);
2983 return;
2984 }
2985
2986 BT_DBG("%s num_blocks %d num_hndl %d", hdev->name, ev->num_blocks,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002987 ev->num_hndl);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002988
2989 for (i = 0; i < ev->num_hndl; i++) {
2990 struct hci_comp_blocks_info *info = &ev->handles[i];
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03002991 struct hci_conn *conn = NULL;
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002992 __u16 handle, block_count;
2993
2994 handle = __le16_to_cpu(info->handle);
2995 block_count = __le16_to_cpu(info->blocks);
2996
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03002997 conn = __hci_conn_lookup_handle(hdev, handle);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02002998 if (!conn)
2999 continue;
3000
3001 conn->sent -= block_count;
3002
3003 switch (conn->type) {
3004 case ACL_LINK:
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03003005 case AMP_LINK:
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003006 hdev->block_cnt += block_count;
3007 if (hdev->block_cnt > hdev->num_blocks)
3008 hdev->block_cnt = hdev->num_blocks;
3009 break;
3010
3011 default:
3012 BT_ERR("Unknown type %d conn %p", conn->type, conn);
3013 break;
3014 }
3015 }
3016
3017 queue_work(hdev->workqueue, &hdev->tx_work);
3018}
3019
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003020static void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003021{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003022 struct hci_ev_mode_change *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003023 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003024
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003025 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003026
3027 hci_dev_lock(hdev);
3028
Marcel Holtmann04837f62006-07-03 10:02:33 +02003029 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3030 if (conn) {
3031 conn->mode = ev->mode;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003032
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003033 if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND,
3034 &conn->flags)) {
Marcel Holtmann04837f62006-07-03 10:02:33 +02003035 if (conn->mode == HCI_CM_ACTIVE)
Johan Hedberg58a681e2012-01-16 06:47:28 +02003036 set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003037 else
Johan Hedberg58a681e2012-01-16 06:47:28 +02003038 clear_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003039 }
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003040
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003041 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003042 hci_sco_setup(conn, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003043 }
3044
3045 hci_dev_unlock(hdev);
3046}
3047
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003048static void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003049{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003050 struct hci_ev_pin_code_req *ev = (void *) skb->data;
3051 struct hci_conn *conn;
3052
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003053 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003054
3055 hci_dev_lock(hdev);
3056
3057 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003058 if (!conn)
3059 goto unlock;
3060
3061 if (conn->state == BT_CONNECTED) {
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003062 hci_conn_hold(conn);
3063 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003064 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003065 }
3066
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003067 if (!test_bit(HCI_PAIRABLE, &hdev->dev_flags))
Johan Hedberg03b555e2011-01-04 15:40:05 +02003068 hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003069 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003070 else if (test_bit(HCI_MGMT, &hdev->dev_flags)) {
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003071 u8 secure;
3072
3073 if (conn->pending_sec_level == BT_SECURITY_HIGH)
3074 secure = 1;
3075 else
3076 secure = 0;
3077
Johan Hedberg744cf192011-11-08 20:40:14 +02003078 mgmt_pin_code_request(hdev, &ev->bdaddr, secure);
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003079 }
Johan Hedberg980e1a52011-01-22 06:10:07 +02003080
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003081unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003082 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003083}
3084
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003085static void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003086{
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003087 struct hci_ev_link_key_req *ev = (void *) skb->data;
3088 struct hci_cp_link_key_reply cp;
3089 struct hci_conn *conn;
3090 struct link_key *key;
3091
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003092 BT_DBG("%s", hdev->name);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003093
Andrei Emeltchenko034cbea2013-05-14 11:44:16 +03003094 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003095 return;
3096
3097 hci_dev_lock(hdev);
3098
3099 key = hci_find_link_key(hdev, &ev->bdaddr);
3100 if (!key) {
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003101 BT_DBG("%s link key not found for %pMR", hdev->name,
3102 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003103 goto not_found;
3104 }
3105
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003106 BT_DBG("%s found key type %u for %pMR", hdev->name, key->type,
3107 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003108
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003109 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003110 if (conn) {
Marcel Holtmann66138ce2014-01-10 02:07:20 -08003111 if ((key->type == HCI_LK_UNAUTH_COMBINATION_P192 ||
3112 key->type == HCI_LK_UNAUTH_COMBINATION_P256) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03003113 conn->auth_type != 0xff && (conn->auth_type & 0x01)) {
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003114 BT_DBG("%s ignoring unauthenticated key", hdev->name);
3115 goto not_found;
3116 }
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003117
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003118 if (key->type == HCI_LK_COMBINATION && key->pin_len < 16 &&
Johan Hedbergf3fb0b52014-06-02 10:12:44 +03003119 (conn->pending_sec_level == BT_SECURITY_HIGH ||
3120 conn->pending_sec_level == BT_SECURITY_FIPS)) {
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003121 BT_DBG("%s ignoring key unauthenticated for high security",
3122 hdev->name);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003123 goto not_found;
3124 }
3125
3126 conn->key_type = key->type;
3127 conn->pin_length = key->pin_len;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003128 }
3129
3130 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9b3b4462012-05-23 11:31:20 +03003131 memcpy(cp.link_key, key->val, HCI_LINK_KEY_SIZE);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003132
3133 hci_send_cmd(hdev, HCI_OP_LINK_KEY_REPLY, sizeof(cp), &cp);
3134
3135 hci_dev_unlock(hdev);
3136
3137 return;
3138
3139not_found:
3140 hci_send_cmd(hdev, HCI_OP_LINK_KEY_NEG_REPLY, 6, &ev->bdaddr);
3141 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003142}
3143
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003144static void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003145{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003146 struct hci_ev_link_key_notify *ev = (void *) skb->data;
3147 struct hci_conn *conn;
Johan Hedberg7652ff62014-06-24 13:15:49 +03003148 struct link_key *key;
3149 bool persistent;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003150 u8 pin_len = 0;
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003151
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003152 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003153
3154 hci_dev_lock(hdev);
3155
3156 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3157 if (conn) {
3158 hci_conn_hold(conn);
3159 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Johan Hedberg980e1a52011-01-22 06:10:07 +02003160 pin_len = conn->pin_length;
Waldemar Rymarkiewicz13d39312011-04-28 12:07:55 +02003161
3162 if (ev->key_type != HCI_LK_CHANGED_COMBINATION)
3163 conn->key_type = ev->key_type;
3164
David Herrmann76a68ba2013-04-06 20:28:37 +02003165 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003166 }
3167
Johan Hedberg7652ff62014-06-24 13:15:49 +03003168 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
3169 goto unlock;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003170
Johan Hedberg7652ff62014-06-24 13:15:49 +03003171 key = hci_add_link_key(hdev, conn, &ev->bdaddr, ev->link_key,
3172 ev->key_type, pin_len, &persistent);
3173 if (!key)
3174 goto unlock;
3175
3176 mgmt_new_link_key(hdev, key, persistent);
3177
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003178 /* Keep debug keys around only if the HCI_KEEP_DEBUG_KEYS flag
3179 * is set. If it's not set simply remove the key from the kernel
3180 * list (we've still notified user space about it but with
3181 * store_hint being 0).
3182 */
3183 if (key->type == HCI_LK_DEBUG_COMBINATION &&
3184 !test_bit(HCI_KEEP_DEBUG_KEYS, &hdev->dev_flags)) {
3185 list_del(&key->list);
3186 kfree(key);
3187 } else if (conn) {
Johan Hedbergaf6a9c32014-06-24 13:15:53 +03003188 if (persistent)
3189 clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3190 else
3191 set_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003192 }
Johan Hedberg7652ff62014-06-24 13:15:49 +03003193
3194unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003195 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003196}
3197
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003198static void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04837f62006-07-03 10:02:33 +02003199{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003200 struct hci_ev_clock_offset *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003201 struct hci_conn *conn;
3202
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003203 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003204
3205 hci_dev_lock(hdev);
3206
3207 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003208 if (conn && !ev->status) {
3209 struct inquiry_entry *ie;
3210
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003211 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3212 if (ie) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003213 ie->data.clock_offset = ev->clock_offset;
3214 ie->timestamp = jiffies;
3215 }
3216 }
3217
3218 hci_dev_unlock(hdev);
3219}
3220
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003221static void hci_pkt_type_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna8746412008-07-14 20:13:46 +02003222{
3223 struct hci_ev_pkt_type_change *ev = (void *) skb->data;
3224 struct hci_conn *conn;
3225
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003226 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna8746412008-07-14 20:13:46 +02003227
3228 hci_dev_lock(hdev);
3229
3230 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3231 if (conn && !ev->status)
3232 conn->pkt_type = __le16_to_cpu(ev->pkt_type);
3233
3234 hci_dev_unlock(hdev);
3235}
3236
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003237static void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003238{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003239 struct hci_ev_pscan_rep_mode *ev = (void *) skb->data;
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003240 struct inquiry_entry *ie;
3241
3242 BT_DBG("%s", hdev->name);
3243
3244 hci_dev_lock(hdev);
3245
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003246 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3247 if (ie) {
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003248 ie->data.pscan_rep_mode = ev->pscan_rep_mode;
3249 ie->timestamp = jiffies;
3250 }
3251
3252 hci_dev_unlock(hdev);
3253}
3254
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003255static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
3256 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003257{
3258 struct inquiry_data data;
3259 int num_rsp = *((__u8 *) skb->data);
3260
3261 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3262
3263 if (!num_rsp)
3264 return;
3265
Andre Guedes1519cc12012-03-21 00:03:38 -03003266 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
3267 return;
3268
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003269 hci_dev_lock(hdev);
3270
3271 if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) {
Szymon Janc138d22e2011-02-17 16:44:23 +01003272 struct inquiry_info_with_rssi_and_pscan_mode *info;
3273 info = (void *) (skb->data + 1);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003274
Johan Hedberge17acd42011-03-30 23:57:16 +03003275 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003276 u32 flags;
3277
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003278 bacpy(&data.bdaddr, &info->bdaddr);
3279 data.pscan_rep_mode = info->pscan_rep_mode;
3280 data.pscan_period_mode = info->pscan_period_mode;
3281 data.pscan_mode = info->pscan_mode;
3282 memcpy(data.dev_class, info->dev_class, 3);
3283 data.clock_offset = info->clock_offset;
3284 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003285 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02003286
Marcel Holtmannaf589252014-07-01 14:11:20 +02003287 flags = hci_inquiry_cache_update(hdev, &data, false);
3288
Johan Hedberg48264f02011-11-09 13:58:58 +02003289 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003290 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003291 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003292 }
3293 } else {
3294 struct inquiry_info_with_rssi *info = (void *) (skb->data + 1);
3295
Johan Hedberge17acd42011-03-30 23:57:16 +03003296 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003297 u32 flags;
3298
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003299 bacpy(&data.bdaddr, &info->bdaddr);
3300 data.pscan_rep_mode = info->pscan_rep_mode;
3301 data.pscan_period_mode = info->pscan_period_mode;
3302 data.pscan_mode = 0x00;
3303 memcpy(data.dev_class, info->dev_class, 3);
3304 data.clock_offset = info->clock_offset;
3305 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003306 data.ssp_mode = 0x00;
Marcel Holtmannaf589252014-07-01 14:11:20 +02003307
3308 flags = hci_inquiry_cache_update(hdev, &data, false);
3309
Johan Hedberg48264f02011-11-09 13:58:58 +02003310 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003311 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003312 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003313 }
3314 }
3315
3316 hci_dev_unlock(hdev);
3317}
3318
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003319static void hci_remote_ext_features_evt(struct hci_dev *hdev,
3320 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003321{
Marcel Holtmann41a96212008-07-14 20:13:48 +02003322 struct hci_ev_remote_ext_features *ev = (void *) skb->data;
3323 struct hci_conn *conn;
3324
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003325 BT_DBG("%s", hdev->name);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003326
Marcel Holtmann41a96212008-07-14 20:13:48 +02003327 hci_dev_lock(hdev);
3328
3329 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02003330 if (!conn)
3331 goto unlock;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003332
Johan Hedbergcad718e2013-04-17 15:00:51 +03003333 if (ev->page < HCI_MAX_PAGES)
3334 memcpy(conn->features[ev->page], ev->features, 8);
3335
Johan Hedbergccd556f2010-11-10 17:11:51 +02003336 if (!ev->status && ev->page == 0x01) {
3337 struct inquiry_entry *ie;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003338
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003339 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3340 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003341 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann769be972008-07-14 20:13:49 +02003342
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303343 if (ev->features[0] & LMP_HOST_SSP) {
Johan Hedberg58a681e2012-01-16 06:47:28 +02003344 set_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303345 } else {
3346 /* It is mandatory by the Bluetooth specification that
3347 * Extended Inquiry Results are only used when Secure
3348 * Simple Pairing is enabled, but some devices violate
3349 * this.
3350 *
3351 * To make these devices work, the internal SSP
3352 * enabled flag needs to be cleared if the remote host
3353 * features do not indicate SSP support */
3354 clear_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
3355 }
Marcel Holtmanneb9a8f32014-01-15 22:37:38 -08003356
3357 if (ev->features[0] & LMP_HOST_SC)
3358 set_bit(HCI_CONN_SC_ENABLED, &conn->flags);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003359 }
3360
Johan Hedbergccd556f2010-11-10 17:11:51 +02003361 if (conn->state != BT_CONFIG)
3362 goto unlock;
3363
Johan Hedberg671267b2012-05-12 16:11:50 -03003364 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02003365 struct hci_cp_remote_name_req cp;
3366 memset(&cp, 0, sizeof(cp));
3367 bacpy(&cp.bdaddr, &conn->dst);
3368 cp.pscan_rep_mode = 0x02;
3369 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02003370 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
3371 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003372 conn->dst_type, 0, NULL, 0,
3373 conn->dev_class);
Johan Hedberg392599b2010-11-18 22:22:28 +02003374
Johan Hedberg127178d2010-11-18 22:22:29 +02003375 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02003376 conn->state = BT_CONNECTED;
3377 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003378 hci_conn_drop(conn);
Johan Hedbergccd556f2010-11-10 17:11:51 +02003379 }
3380
3381unlock:
Marcel Holtmann41a96212008-07-14 20:13:48 +02003382 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003383}
3384
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003385static void hci_sync_conn_complete_evt(struct hci_dev *hdev,
3386 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003387{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003388 struct hci_ev_sync_conn_complete *ev = (void *) skb->data;
3389 struct hci_conn *conn;
3390
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003391 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003392
3393 hci_dev_lock(hdev);
3394
3395 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003396 if (!conn) {
3397 if (ev->link_type == ESCO_LINK)
3398 goto unlock;
3399
3400 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
3401 if (!conn)
3402 goto unlock;
3403
3404 conn->type = SCO_LINK;
3405 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003406
Marcel Holtmann732547f2009-04-19 19:14:14 +02003407 switch (ev->status) {
3408 case 0x00:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003409 conn->handle = __le16_to_cpu(ev->handle);
3410 conn->state = BT_CONNECTED;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02003411
3412 hci_conn_add_sysfs(conn);
Marcel Holtmann732547f2009-04-19 19:14:14 +02003413 break;
3414
Nick Pelly81218d22014-06-30 11:25:01 +05303415 case 0x10: /* Connection Accept Timeout */
Frédéric Dalleau1a4c9582013-08-19 14:24:02 +02003416 case 0x0d: /* Connection Rejected due to Limited Resources */
Stephen Coe705e5712010-02-16 11:29:44 -05003417 case 0x11: /* Unsupported Feature or Parameter Value */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003418 case 0x1c: /* SCO interval rejected */
Nick Pelly1038a002010-02-03 11:42:26 -08003419 case 0x1a: /* Unsupported Remote Feature */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003420 case 0x1f: /* Unspecified error */
Andrew Earl27539bc2014-03-10 10:31:04 +00003421 case 0x20: /* Unsupported LMP Parameter value */
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003422 if (conn->out) {
Marcel Holtmann732547f2009-04-19 19:14:14 +02003423 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
3424 (hdev->esco_type & EDR_ESCO_MASK);
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003425 if (hci_setup_sync(conn, conn->link->handle))
3426 goto unlock;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003427 }
3428 /* fall through */
3429
3430 default:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003431 conn->state = BT_CLOSED;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003432 break;
3433 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003434
3435 hci_proto_connect_cfm(conn, ev->status);
3436 if (ev->status)
3437 hci_conn_del(conn);
3438
3439unlock:
3440 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003441}
3442
Marcel Holtmannefdcf8e2013-10-15 10:31:12 -07003443static inline size_t eir_get_length(u8 *eir, size_t eir_len)
3444{
3445 size_t parsed = 0;
3446
3447 while (parsed < eir_len) {
3448 u8 field_len = eir[0];
3449
3450 if (field_len == 0)
3451 return parsed;
3452
3453 parsed += field_len + 1;
3454 eir += field_len + 1;
3455 }
3456
3457 return eir_len;
3458}
3459
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003460static void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
3461 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003462{
3463 struct inquiry_data data;
3464 struct extended_inquiry_info *info = (void *) (skb->data + 1);
3465 int num_rsp = *((__u8 *) skb->data);
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303466 size_t eir_len;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003467
3468 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3469
3470 if (!num_rsp)
3471 return;
3472
Andre Guedes1519cc12012-03-21 00:03:38 -03003473 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
3474 return;
3475
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003476 hci_dev_lock(hdev);
3477
Johan Hedberge17acd42011-03-30 23:57:16 +03003478 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003479 u32 flags;
3480 bool name_known;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003481
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003482 bacpy(&data.bdaddr, &info->bdaddr);
Szymon Janc138d22e2011-02-17 16:44:23 +01003483 data.pscan_rep_mode = info->pscan_rep_mode;
3484 data.pscan_period_mode = info->pscan_period_mode;
3485 data.pscan_mode = 0x00;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003486 memcpy(data.dev_class, info->dev_class, 3);
Szymon Janc138d22e2011-02-17 16:44:23 +01003487 data.clock_offset = info->clock_offset;
3488 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003489 data.ssp_mode = 0x01;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003490
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003491 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg4ddb1932012-01-15 20:04:43 +02003492 name_known = eir_has_data_type(info->data,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003493 sizeof(info->data),
3494 EIR_NAME_COMPLETE);
Johan Hedberg561aafb2012-01-04 13:31:59 +02003495 else
3496 name_known = true;
3497
Marcel Holtmannaf589252014-07-01 14:11:20 +02003498 flags = hci_inquiry_cache_update(hdev, &data, name_known);
3499
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303500 eir_len = eir_get_length(info->data, sizeof(info->data));
Marcel Holtmannaf589252014-07-01 14:11:20 +02003501
Johan Hedberg48264f02011-11-09 13:58:58 +02003502 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003503 info->dev_class, info->rssi,
3504 flags, info->data, eir_len, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003505 }
3506
3507 hci_dev_unlock(hdev);
3508}
3509
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003510static void hci_key_refresh_complete_evt(struct hci_dev *hdev,
3511 struct sk_buff *skb)
3512{
3513 struct hci_ev_key_refresh_complete *ev = (void *) skb->data;
3514 struct hci_conn *conn;
3515
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003516 BT_DBG("%s status 0x%2.2x handle 0x%4.4x", hdev->name, ev->status,
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003517 __le16_to_cpu(ev->handle));
3518
3519 hci_dev_lock(hdev);
3520
3521 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3522 if (!conn)
3523 goto unlock;
3524
Johan Hedberg9eb1fbf2014-04-11 12:02:31 -07003525 /* For BR/EDR the necessary steps are taken through the
3526 * auth_complete event.
3527 */
3528 if (conn->type != LE_LINK)
3529 goto unlock;
3530
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003531 if (!ev->status)
3532 conn->sec_level = conn->pending_sec_level;
3533
3534 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
3535
3536 if (ev->status && conn->state == BT_CONNECTED) {
Andre Guedesbed71742013-01-30 11:50:56 -03003537 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
David Herrmann76a68ba2013-04-06 20:28:37 +02003538 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003539 goto unlock;
3540 }
3541
3542 if (conn->state == BT_CONFIG) {
3543 if (!ev->status)
3544 conn->state = BT_CONNECTED;
3545
3546 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003547 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003548 } else {
3549 hci_auth_cfm(conn, ev->status);
3550
3551 hci_conn_hold(conn);
3552 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003553 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003554 }
3555
3556unlock:
3557 hci_dev_unlock(hdev);
3558}
3559
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003560static u8 hci_get_auth_req(struct hci_conn *conn)
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003561{
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003562 /* If remote requests no-bonding follow that lead */
Mikel Astizacabae92013-06-28 10:56:28 +02003563 if (conn->remote_auth == HCI_AT_NO_BONDING ||
3564 conn->remote_auth == HCI_AT_NO_BONDING_MITM)
Waldemar Rymarkiewicz58797bf2011-04-28 12:07:58 +02003565 return conn->remote_auth | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003566
Mikel Astizb7f94c82014-04-08 14:21:31 +02003567 /* If both remote and local have enough IO capabilities, require
3568 * MITM protection
3569 */
3570 if (conn->remote_cap != HCI_IO_NO_INPUT_OUTPUT &&
3571 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT)
3572 return conn->remote_auth | 0x01;
3573
Timo Mueller7e741702014-04-08 14:21:33 +02003574 /* No MITM protection possible so ignore remote requirement */
3575 return (conn->remote_auth & ~0x01) | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003576}
3577
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003578static void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003579{
3580 struct hci_ev_io_capa_request *ev = (void *) skb->data;
3581 struct hci_conn *conn;
3582
3583 BT_DBG("%s", hdev->name);
3584
3585 hci_dev_lock(hdev);
3586
3587 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003588 if (!conn)
3589 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02003590
Johan Hedberg03b555e2011-01-04 15:40:05 +02003591 hci_conn_hold(conn);
3592
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003593 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg03b555e2011-01-04 15:40:05 +02003594 goto unlock;
3595
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003596 if (test_bit(HCI_PAIRABLE, &hdev->dev_flags) ||
Gustavo Padovan807deac2012-05-17 00:36:24 -03003597 (conn->remote_auth & ~0x01) == HCI_AT_NO_BONDING) {
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003598 struct hci_cp_io_capability_reply cp;
3599
3600 bacpy(&cp.bdaddr, &ev->bdaddr);
Hemant Gupta7a7f1e72012-01-16 13:34:29 +05303601 /* Change the IO capability from KeyboardDisplay
3602 * to DisplayYesNo as it is not supported by BT spec. */
3603 cp.capability = (conn->io_capability == 0x04) ?
Mikel Astiza7676312013-06-28 10:56:29 +02003604 HCI_IO_DISPLAY_YESNO : conn->io_capability;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003605
3606 /* If we are initiators, there is no remote information yet */
3607 if (conn->remote_auth == 0xff) {
3608 cp.authentication = conn->auth_type;
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003609
Mikel Astizb16c6602014-04-08 14:21:34 +02003610 /* Request MITM protection if our IO caps allow it
Johan Hedberg4ad51a72014-06-09 14:41:25 +03003611 * except for the no-bonding case.
3612 * conn->auth_type is not updated here since
3613 * that might cause the user confirmation to be
3614 * rejected in case the remote doesn't have the
3615 * IO capabilities for MITM.
Mikel Astizb16c6602014-04-08 14:21:34 +02003616 */
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003617 if (conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Mikel Astizb16c6602014-04-08 14:21:34 +02003618 cp.authentication != HCI_AT_NO_BONDING)
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003619 cp.authentication |= 0x01;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003620 } else {
3621 conn->auth_type = hci_get_auth_req(conn);
3622 cp.authentication = conn->auth_type;
3623 }
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003624
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003625 if (hci_find_remote_oob_data(hdev, &conn->dst) &&
3626 (conn->out || test_bit(HCI_CONN_REMOTE_OOB, &conn->flags)))
Szymon Jancce85ee12011-03-22 13:12:23 +01003627 cp.oob_data = 0x01;
3628 else
3629 cp.oob_data = 0x00;
3630
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003631 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003632 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003633 } else {
3634 struct hci_cp_io_capability_neg_reply cp;
3635
3636 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003637 cp.reason = HCI_ERROR_PAIRING_NOT_ALLOWED;
Johan Hedberg03b555e2011-01-04 15:40:05 +02003638
3639 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003640 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003641 }
3642
3643unlock:
3644 hci_dev_unlock(hdev);
3645}
3646
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003647static void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *skb)
Johan Hedberg03b555e2011-01-04 15:40:05 +02003648{
3649 struct hci_ev_io_capa_reply *ev = (void *) skb->data;
3650 struct hci_conn *conn;
3651
3652 BT_DBG("%s", hdev->name);
3653
3654 hci_dev_lock(hdev);
3655
3656 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3657 if (!conn)
3658 goto unlock;
3659
Johan Hedberg03b555e2011-01-04 15:40:05 +02003660 conn->remote_cap = ev->capability;
Johan Hedberg03b555e2011-01-04 15:40:05 +02003661 conn->remote_auth = ev->authentication;
Johan Hedberg58a681e2012-01-16 06:47:28 +02003662 if (ev->oob_data)
3663 set_bit(HCI_CONN_REMOTE_OOB, &conn->flags);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003664
3665unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02003666 hci_dev_unlock(hdev);
3667}
3668
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003669static void hci_user_confirm_request_evt(struct hci_dev *hdev,
3670 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -03003671{
3672 struct hci_ev_user_confirm_req *ev = (void *) skb->data;
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003673 int loc_mitm, rem_mitm, confirm_hint = 0;
Johan Hedberg7a828902011-04-28 11:28:53 -07003674 struct hci_conn *conn;
Johan Hedberga5c29682011-02-19 12:05:57 -03003675
3676 BT_DBG("%s", hdev->name);
3677
3678 hci_dev_lock(hdev);
3679
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003680 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg7a828902011-04-28 11:28:53 -07003681 goto unlock;
Johan Hedberga5c29682011-02-19 12:05:57 -03003682
Johan Hedberg7a828902011-04-28 11:28:53 -07003683 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3684 if (!conn)
3685 goto unlock;
3686
3687 loc_mitm = (conn->auth_type & 0x01);
3688 rem_mitm = (conn->remote_auth & 0x01);
3689
3690 /* If we require MITM but the remote device can't provide that
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003691 * (it has NoInputNoOutput) then reject the confirmation request
3692 */
3693 if (loc_mitm && conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) {
Johan Hedberg7a828902011-04-28 11:28:53 -07003694 BT_DBG("Rejecting request: remote device can't provide MITM");
3695 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003696 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07003697 goto unlock;
3698 }
3699
3700 /* If no side requires MITM protection; auto-accept */
Mikel Astiza7676312013-06-28 10:56:29 +02003701 if ((!loc_mitm || conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) &&
3702 (!rem_mitm || conn->io_capability == HCI_IO_NO_INPUT_OUTPUT)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003703
3704 /* If we're not the initiators request authorization to
3705 * proceed from user space (mgmt_user_confirm with
Johan Hedbergba15a582014-06-09 13:58:14 +03003706 * confirm_hint set to 1). The exception is if neither
3707 * side had MITM in which case we do auto-accept.
3708 */
3709 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) &&
3710 (loc_mitm || rem_mitm)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003711 BT_DBG("Confirming auto-accept as acceptor");
3712 confirm_hint = 1;
3713 goto confirm;
3714 }
3715
Johan Hedberg9f616562011-04-28 11:28:54 -07003716 BT_DBG("Auto-accept of user confirmation with %ums delay",
Gustavo Padovan807deac2012-05-17 00:36:24 -03003717 hdev->auto_accept_delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07003718
3719 if (hdev->auto_accept_delay > 0) {
3720 int delay = msecs_to_jiffies(hdev->auto_accept_delay);
Johan Hedberg7bc18d92013-10-16 18:11:39 +03003721 queue_delayed_work(conn->hdev->workqueue,
3722 &conn->auto_accept_work, delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07003723 goto unlock;
3724 }
3725
Johan Hedberg7a828902011-04-28 11:28:53 -07003726 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003727 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07003728 goto unlock;
3729 }
3730
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003731confirm:
Johan Hedberg39adbff2014-03-20 08:18:14 +02003732 mgmt_user_confirm_request(hdev, &ev->bdaddr, ACL_LINK, 0,
3733 le32_to_cpu(ev->passkey), confirm_hint);
Johan Hedberg7a828902011-04-28 11:28:53 -07003734
3735unlock:
Johan Hedberga5c29682011-02-19 12:05:57 -03003736 hci_dev_unlock(hdev);
3737}
3738
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003739static void hci_user_passkey_request_evt(struct hci_dev *hdev,
3740 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -08003741{
3742 struct hci_ev_user_passkey_req *ev = (void *) skb->data;
3743
3744 BT_DBG("%s", hdev->name);
3745
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003746 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg272d90d2012-02-09 15:26:12 +02003747 mgmt_user_passkey_request(hdev, &ev->bdaddr, ACL_LINK, 0);
Brian Gix1143d452011-11-23 08:28:34 -08003748}
3749
Johan Hedberg92a25252012-09-06 18:39:26 +03003750static void hci_user_passkey_notify_evt(struct hci_dev *hdev,
3751 struct sk_buff *skb)
3752{
3753 struct hci_ev_user_passkey_notify *ev = (void *) skb->data;
3754 struct hci_conn *conn;
3755
3756 BT_DBG("%s", hdev->name);
3757
3758 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3759 if (!conn)
3760 return;
3761
3762 conn->passkey_notify = __le32_to_cpu(ev->passkey);
3763 conn->passkey_entered = 0;
3764
3765 if (test_bit(HCI_MGMT, &hdev->dev_flags))
3766 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
3767 conn->dst_type, conn->passkey_notify,
3768 conn->passkey_entered);
3769}
3770
3771static void hci_keypress_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
3772{
3773 struct hci_ev_keypress_notify *ev = (void *) skb->data;
3774 struct hci_conn *conn;
3775
3776 BT_DBG("%s", hdev->name);
3777
3778 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3779 if (!conn)
3780 return;
3781
3782 switch (ev->type) {
3783 case HCI_KEYPRESS_STARTED:
3784 conn->passkey_entered = 0;
3785 return;
3786
3787 case HCI_KEYPRESS_ENTERED:
3788 conn->passkey_entered++;
3789 break;
3790
3791 case HCI_KEYPRESS_ERASED:
3792 conn->passkey_entered--;
3793 break;
3794
3795 case HCI_KEYPRESS_CLEARED:
3796 conn->passkey_entered = 0;
3797 break;
3798
3799 case HCI_KEYPRESS_COMPLETED:
3800 return;
3801 }
3802
3803 if (test_bit(HCI_MGMT, &hdev->dev_flags))
3804 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
3805 conn->dst_type, conn->passkey_notify,
3806 conn->passkey_entered);
3807}
3808
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003809static void hci_simple_pair_complete_evt(struct hci_dev *hdev,
3810 struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003811{
3812 struct hci_ev_simple_pair_complete *ev = (void *) skb->data;
3813 struct hci_conn *conn;
3814
3815 BT_DBG("%s", hdev->name);
3816
3817 hci_dev_lock(hdev);
3818
3819 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg2a611692011-02-19 12:06:00 -03003820 if (!conn)
3821 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02003822
Johan Hedberg2a611692011-02-19 12:06:00 -03003823 /* To avoid duplicate auth_failed events to user space we check
3824 * the HCI_CONN_AUTH_PEND flag which will be set if we
3825 * initiated the authentication. A traditional auth_complete
3826 * event gets always produced as initiator and is also mapped to
3827 * the mgmt_auth_failed event */
Mikel Astizfa1bd912012-08-09 09:52:29 +02003828 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) && ev->status)
Johan Hedbergbab73cb2012-02-09 16:07:29 +02003829 mgmt_auth_failed(hdev, &conn->dst, conn->type, conn->dst_type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003830 ev->status);
Johan Hedberg2a611692011-02-19 12:06:00 -03003831
David Herrmann76a68ba2013-04-06 20:28:37 +02003832 hci_conn_drop(conn);
Johan Hedberg2a611692011-02-19 12:06:00 -03003833
3834unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02003835 hci_dev_unlock(hdev);
3836}
3837
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003838static void hci_remote_host_features_evt(struct hci_dev *hdev,
3839 struct sk_buff *skb)
Marcel Holtmann41a96212008-07-14 20:13:48 +02003840{
3841 struct hci_ev_remote_host_features *ev = (void *) skb->data;
3842 struct inquiry_entry *ie;
Johan Hedbergcad718e2013-04-17 15:00:51 +03003843 struct hci_conn *conn;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003844
3845 BT_DBG("%s", hdev->name);
3846
3847 hci_dev_lock(hdev);
3848
Johan Hedbergcad718e2013-04-17 15:00:51 +03003849 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3850 if (conn)
3851 memcpy(conn->features[1], ev->features, 8);
3852
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003853 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3854 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003855 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003856
3857 hci_dev_unlock(hdev);
3858}
3859
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003860static void hci_remote_oob_data_request_evt(struct hci_dev *hdev,
3861 struct sk_buff *skb)
Szymon Janc2763eda2011-03-22 13:12:22 +01003862{
3863 struct hci_ev_remote_oob_data_request *ev = (void *) skb->data;
3864 struct oob_data *data;
3865
3866 BT_DBG("%s", hdev->name);
3867
3868 hci_dev_lock(hdev);
3869
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003870 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Szymon Jance1ba1f12011-04-06 13:01:59 +02003871 goto unlock;
3872
Szymon Janc2763eda2011-03-22 13:12:22 +01003873 data = hci_find_remote_oob_data(hdev, &ev->bdaddr);
3874 if (data) {
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003875 if (test_bit(HCI_SC_ENABLED, &hdev->dev_flags)) {
3876 struct hci_cp_remote_oob_ext_data_reply cp;
Szymon Janc2763eda2011-03-22 13:12:22 +01003877
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003878 bacpy(&cp.bdaddr, &ev->bdaddr);
3879 memcpy(cp.hash192, data->hash192, sizeof(cp.hash192));
3880 memcpy(cp.randomizer192, data->randomizer192,
3881 sizeof(cp.randomizer192));
3882 memcpy(cp.hash256, data->hash256, sizeof(cp.hash256));
3883 memcpy(cp.randomizer256, data->randomizer256,
3884 sizeof(cp.randomizer256));
Szymon Janc2763eda2011-03-22 13:12:22 +01003885
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003886 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_EXT_DATA_REPLY,
3887 sizeof(cp), &cp);
3888 } else {
3889 struct hci_cp_remote_oob_data_reply cp;
3890
3891 bacpy(&cp.bdaddr, &ev->bdaddr);
3892 memcpy(cp.hash, data->hash192, sizeof(cp.hash));
3893 memcpy(cp.randomizer, data->randomizer192,
3894 sizeof(cp.randomizer));
3895
3896 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_REPLY,
3897 sizeof(cp), &cp);
3898 }
Szymon Janc2763eda2011-03-22 13:12:22 +01003899 } else {
3900 struct hci_cp_remote_oob_data_neg_reply cp;
3901
3902 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003903 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_NEG_REPLY,
3904 sizeof(cp), &cp);
Szymon Janc2763eda2011-03-22 13:12:22 +01003905 }
3906
Szymon Jance1ba1f12011-04-06 13:01:59 +02003907unlock:
Szymon Janc2763eda2011-03-22 13:12:22 +01003908 hci_dev_unlock(hdev);
3909}
3910
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003911static void hci_phy_link_complete_evt(struct hci_dev *hdev,
3912 struct sk_buff *skb)
3913{
3914 struct hci_ev_phy_link_complete *ev = (void *) skb->data;
3915 struct hci_conn *hcon, *bredr_hcon;
3916
3917 BT_DBG("%s handle 0x%2.2x status 0x%2.2x", hdev->name, ev->phy_handle,
3918 ev->status);
3919
3920 hci_dev_lock(hdev);
3921
3922 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
3923 if (!hcon) {
3924 hci_dev_unlock(hdev);
3925 return;
3926 }
3927
3928 if (ev->status) {
3929 hci_conn_del(hcon);
3930 hci_dev_unlock(hdev);
3931 return;
3932 }
3933
3934 bredr_hcon = hcon->amp_mgr->l2cap_conn->hcon;
3935
3936 hcon->state = BT_CONNECTED;
3937 bacpy(&hcon->dst, &bredr_hcon->dst);
3938
3939 hci_conn_hold(hcon);
3940 hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003941 hci_conn_drop(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003942
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003943 hci_conn_add_sysfs(hcon);
3944
Andrei Emeltchenkocf70ff22012-10-31 15:46:36 +02003945 amp_physical_cfm(bredr_hcon, hcon);
3946
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003947 hci_dev_unlock(hdev);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003948}
3949
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03003950static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
3951{
3952 struct hci_ev_logical_link_complete *ev = (void *) skb->data;
3953 struct hci_conn *hcon;
3954 struct hci_chan *hchan;
3955 struct amp_mgr *mgr;
3956
3957 BT_DBG("%s log_handle 0x%4.4x phy_handle 0x%2.2x status 0x%2.2x",
3958 hdev->name, le16_to_cpu(ev->handle), ev->phy_handle,
3959 ev->status);
3960
3961 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
3962 if (!hcon)
3963 return;
3964
3965 /* Create AMP hchan */
3966 hchan = hci_chan_create(hcon);
3967 if (!hchan)
3968 return;
3969
3970 hchan->handle = le16_to_cpu(ev->handle);
3971
3972 BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
3973
3974 mgr = hcon->amp_mgr;
3975 if (mgr && mgr->bredr_chan) {
3976 struct l2cap_chan *bredr_chan = mgr->bredr_chan;
3977
3978 l2cap_chan_lock(bredr_chan);
3979
3980 bredr_chan->conn->mtu = hdev->block_mtu;
3981 l2cap_logical_cfm(bredr_chan, hchan, 0);
3982 hci_conn_hold(hcon);
3983
3984 l2cap_chan_unlock(bredr_chan);
3985 }
3986}
3987
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02003988static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
3989 struct sk_buff *skb)
3990{
3991 struct hci_ev_disconn_logical_link_complete *ev = (void *) skb->data;
3992 struct hci_chan *hchan;
3993
3994 BT_DBG("%s log handle 0x%4.4x status 0x%2.2x", hdev->name,
3995 le16_to_cpu(ev->handle), ev->status);
3996
3997 if (ev->status)
3998 return;
3999
4000 hci_dev_lock(hdev);
4001
4002 hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
4003 if (!hchan)
4004 goto unlock;
4005
4006 amp_destroy_logical_link(hchan, ev->reason);
4007
4008unlock:
4009 hci_dev_unlock(hdev);
4010}
4011
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004012static void hci_disconn_phylink_complete_evt(struct hci_dev *hdev,
4013 struct sk_buff *skb)
4014{
4015 struct hci_ev_disconn_phy_link_complete *ev = (void *) skb->data;
4016 struct hci_conn *hcon;
4017
4018 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4019
4020 if (ev->status)
4021 return;
4022
4023 hci_dev_lock(hdev);
4024
4025 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4026 if (hcon) {
4027 hcon->state = BT_CLOSED;
4028 hci_conn_del(hcon);
4029 }
4030
4031 hci_dev_unlock(hdev);
4032}
4033
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004034static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004035{
4036 struct hci_ev_le_conn_complete *ev = (void *) skb->data;
4037 struct hci_conn *conn;
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004038 struct smp_irk *irk;
Ville Tervofcd89c02011-02-10 22:38:47 -03004039
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004040 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Ville Tervofcd89c02011-02-10 22:38:47 -03004041
4042 hci_dev_lock(hdev);
4043
Andre Guedesb47a09b2012-07-27 15:10:15 -03004044 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
Ville Tervob62f3282011-02-10 22:38:50 -03004045 if (!conn) {
4046 conn = hci_conn_add(hdev, LE_LINK, &ev->bdaddr);
4047 if (!conn) {
4048 BT_ERR("No memory for new connection");
Andre Guedes230fd162012-07-27 15:10:10 -03004049 goto unlock;
Ville Tervob62f3282011-02-10 22:38:50 -03004050 }
Andre Guedes29b79882011-05-31 14:20:54 -03004051
4052 conn->dst_type = ev->bdaddr_type;
Andre Guedesb9b343d2012-07-27 15:10:11 -03004053
4054 if (ev->role == LE_CONN_ROLE_MASTER) {
4055 conn->out = true;
Johan Hedberg4dae2792014-06-24 17:03:50 +03004056 set_bit(HCI_CONN_MASTER, &conn->flags);
Andre Guedesb9b343d2012-07-27 15:10:11 -03004057 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004058
4059 /* If we didn't have a hci_conn object previously
4060 * but we're in master role this must be something
4061 * initiated using a white list. Since white list based
4062 * connections are not "first class citizens" we don't
4063 * have full tracking of them. Therefore, we go ahead
4064 * with a "best effort" approach of determining the
4065 * initiator address based on the HCI_PRIVACY flag.
4066 */
4067 if (conn->out) {
4068 conn->resp_addr_type = ev->bdaddr_type;
4069 bacpy(&conn->resp_addr, &ev->bdaddr);
4070 if (test_bit(HCI_PRIVACY, &hdev->dev_flags)) {
4071 conn->init_addr_type = ADDR_LE_DEV_RANDOM;
4072 bacpy(&conn->init_addr, &hdev->rpa);
4073 } else {
4074 hci_copy_identity_address(hdev,
4075 &conn->init_addr,
4076 &conn->init_addr_type);
4077 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004078 }
Johan Hedberg9489eca2014-02-28 17:45:46 +02004079 } else {
4080 cancel_delayed_work(&conn->le_conn_timeout);
Ville Tervob62f3282011-02-10 22:38:50 -03004081 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004082
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004083 if (!conn->out) {
4084 /* Set the responder (our side) address type based on
4085 * the advertising address type.
4086 */
4087 conn->resp_addr_type = hdev->adv_addr_type;
4088 if (hdev->adv_addr_type == ADDR_LE_DEV_RANDOM)
4089 bacpy(&conn->resp_addr, &hdev->random_addr);
4090 else
4091 bacpy(&conn->resp_addr, &hdev->bdaddr);
4092
4093 conn->init_addr_type = ev->bdaddr_type;
4094 bacpy(&conn->init_addr, &ev->bdaddr);
Marcel Holtmanna720d732014-06-23 12:14:51 +02004095
4096 /* For incoming connections, set the default minimum
4097 * and maximum connection interval. They will be used
4098 * to check if the parameters are in range and if not
4099 * trigger the connection update procedure.
4100 */
4101 conn->le_conn_min_interval = hdev->le_conn_min_interval;
4102 conn->le_conn_max_interval = hdev->le_conn_max_interval;
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004103 }
Johan Hedberg7be2edb2014-02-23 19:42:17 +02004104
Marcel Holtmannedb4b462014-02-18 15:13:43 -08004105 /* Lookup the identity address from the stored connection
4106 * address and address type.
4107 *
4108 * When establishing connections to an identity address, the
4109 * connection procedure will store the resolvable random
4110 * address first. Now if it can be converted back into the
4111 * identity address, start using the identity address from
4112 * now on.
4113 */
4114 irk = hci_get_irk(hdev, &conn->dst, conn->dst_type);
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004115 if (irk) {
4116 bacpy(&conn->dst, &irk->bdaddr);
4117 conn->dst_type = irk->addr_type;
4118 }
4119
Andre Guedescd17dec2012-07-27 15:10:16 -03004120 if (ev->status) {
Andre Guedes06c053f2014-02-26 20:21:41 -03004121 hci_le_conn_failed(conn, ev->status);
Andre Guedescd17dec2012-07-27 15:10:16 -03004122 goto unlock;
4123 }
4124
Johan Hedbergb644ba32012-01-17 21:48:47 +02004125 if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Marcel Holtmann01fdb0f2014-02-18 14:22:19 -08004126 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03004127 conn->dst_type, 0, NULL, 0, NULL);
Vinicius Costa Gomes83bc71b2011-05-06 18:41:43 -03004128
Vinicius Costa Gomes7b5c0d52011-06-09 18:50:50 -03004129 conn->sec_level = BT_SECURITY_LOW;
Ville Tervofcd89c02011-02-10 22:38:47 -03004130 conn->handle = __le16_to_cpu(ev->handle);
4131 conn->state = BT_CONNECTED;
4132
Marcel Holtmanne04fde62014-06-23 11:40:04 +02004133 conn->le_conn_interval = le16_to_cpu(ev->interval);
4134 conn->le_conn_latency = le16_to_cpu(ev->latency);
4135 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4136
Ville Tervofcd89c02011-02-10 22:38:47 -03004137 hci_conn_add_sysfs(conn);
4138
4139 hci_proto_connect_cfm(conn, ev->status);
4140
Andre Guedesa4790db2014-02-26 20:21:47 -03004141 hci_pend_le_conn_del(hdev, &conn->dst, conn->dst_type);
4142
Ville Tervofcd89c02011-02-10 22:38:47 -03004143unlock:
4144 hci_dev_unlock(hdev);
4145}
4146
Marcel Holtmann1855d922014-06-23 11:40:05 +02004147static void hci_le_conn_update_complete_evt(struct hci_dev *hdev,
4148 struct sk_buff *skb)
4149{
4150 struct hci_ev_le_conn_update_complete *ev = (void *) skb->data;
4151 struct hci_conn *conn;
4152
4153 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4154
4155 if (ev->status)
4156 return;
4157
4158 hci_dev_lock(hdev);
4159
4160 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
4161 if (conn) {
4162 conn->le_conn_interval = le16_to_cpu(ev->interval);
4163 conn->le_conn_latency = le16_to_cpu(ev->latency);
4164 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4165 }
4166
4167 hci_dev_unlock(hdev);
4168}
4169
Andre Guedesa4790db2014-02-26 20:21:47 -03004170/* This function requires the caller holds hdev->lock */
4171static void check_pending_le_conn(struct hci_dev *hdev, bdaddr_t *addr,
4172 u8 addr_type)
4173{
4174 struct hci_conn *conn;
Andre Guedes5b906a82014-02-26 20:21:53 -03004175 struct smp_irk *irk;
4176
4177 /* If this is a resolvable address, we should resolve it and then
4178 * update address and address type variables.
4179 */
4180 irk = hci_get_irk(hdev, addr, addr_type);
4181 if (irk) {
4182 addr = &irk->bdaddr;
4183 addr_type = irk->addr_type;
4184 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004185
4186 if (!hci_pend_le_conn_lookup(hdev, addr, addr_type))
4187 return;
4188
4189 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
4190 HCI_AT_NO_BONDING);
4191 if (!IS_ERR(conn))
4192 return;
4193
4194 switch (PTR_ERR(conn)) {
4195 case -EBUSY:
4196 /* If hci_connect() returns -EBUSY it means there is already
4197 * an LE connection attempt going on. Since controllers don't
4198 * support more than one connection attempt at the time, we
4199 * don't consider this an error case.
4200 */
4201 break;
4202 default:
4203 BT_DBG("Failed to connect: err %ld", PTR_ERR(conn));
4204 }
4205}
4206
Johan Hedberg4af605d2014-03-24 10:48:00 +02004207static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
4208 u8 bdaddr_type, s8 rssi, u8 *data, u8 len)
4209{
Johan Hedbergb9a63282014-03-25 10:51:52 +02004210 struct discovery_state *d = &hdev->discovery;
Johan Hedberg474ee062014-03-25 14:34:59 +02004211 bool match;
Johan Hedbergb9a63282014-03-25 10:51:52 +02004212
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004213 /* Passive scanning shouldn't trigger any device found events */
4214 if (hdev->le_scan_type == LE_SCAN_PASSIVE) {
4215 if (type == LE_ADV_IND || type == LE_ADV_DIRECT_IND)
4216 check_pending_le_conn(hdev, bdaddr, bdaddr_type);
4217 return;
4218 }
Johan Hedberg4af605d2014-03-24 10:48:00 +02004219
Johan Hedbergb9a63282014-03-25 10:51:52 +02004220 /* If there's nothing pending either store the data from this
4221 * event or send an immediate device found event if the data
4222 * should not be stored for later.
4223 */
4224 if (!has_pending_adv_report(hdev)) {
4225 /* If the report will trigger a SCAN_REQ store it for
4226 * later merging.
4227 */
4228 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4229 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004230 rssi, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004231 return;
4232 }
4233
4234 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannaf589252014-07-01 14:11:20 +02004235 rssi, 0, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004236 return;
4237 }
4238
Johan Hedberg474ee062014-03-25 14:34:59 +02004239 /* Check if the pending report is for the same device as the new one */
4240 match = (!bacmp(bdaddr, &d->last_adv_addr) &&
4241 bdaddr_type == d->last_adv_addr_type);
4242
Johan Hedbergb9a63282014-03-25 10:51:52 +02004243 /* If the pending data doesn't match this report or this isn't a
4244 * scan response (e.g. we got a duplicate ADV_IND) then force
4245 * sending of the pending data.
4246 */
Johan Hedberg474ee062014-03-25 14:34:59 +02004247 if (type != LE_ADV_SCAN_RSP || !match) {
4248 /* Send out whatever is in the cache, but skip duplicates */
4249 if (!match)
4250 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004251 d->last_adv_addr_type, NULL,
Marcel Holtmannaf589252014-07-01 14:11:20 +02004252 d->last_adv_rssi, 0,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004253 d->last_adv_data,
Johan Hedberg474ee062014-03-25 14:34:59 +02004254 d->last_adv_data_len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004255
4256 /* If the new report will trigger a SCAN_REQ store it for
4257 * later merging.
4258 */
4259 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4260 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004261 rssi, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004262 return;
4263 }
4264
4265 /* The advertising reports cannot be merged, so clear
4266 * the pending report and send out a device found event.
4267 */
4268 clear_pending_adv_report(hdev);
Johan Hedberg5c5b93e2014-03-29 08:39:53 +02004269 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannaf589252014-07-01 14:11:20 +02004270 rssi, 0, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004271 return;
4272 }
4273
4274 /* If we get here we've got a pending ADV_IND or ADV_SCAN_IND and
4275 * the new event is a SCAN_RSP. We can therefore proceed with
4276 * sending a merged device found event.
4277 */
4278 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Marcel Holtmannaf589252014-07-01 14:11:20 +02004279 d->last_adv_addr_type, NULL, rssi, 0,
Marcel Holtmann42bd6a52014-07-01 14:11:19 +02004280 d->last_adv_data, d->last_adv_data_len, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004281 clear_pending_adv_report(hdev);
Johan Hedberg4af605d2014-03-24 10:48:00 +02004282}
4283
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004284static void hci_le_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andre Guedes9aa04c92011-05-26 16:23:51 -03004285{
Andre Guedese95beb42011-09-26 20:48:35 -03004286 u8 num_reports = skb->data[0];
4287 void *ptr = &skb->data[1];
Andre Guedes9aa04c92011-05-26 16:23:51 -03004288
Andre Guedesa4790db2014-02-26 20:21:47 -03004289 hci_dev_lock(hdev);
4290
Andre Guedese95beb42011-09-26 20:48:35 -03004291 while (num_reports--) {
4292 struct hci_ev_le_advertising_info *ev = ptr;
Johan Hedberg4af605d2014-03-24 10:48:00 +02004293 s8 rssi;
Andre Guedesa4790db2014-02-26 20:21:47 -03004294
Andre Guedes3c9e9192012-01-10 18:20:50 -03004295 rssi = ev->data[ev->length];
Johan Hedberg4af605d2014-03-24 10:48:00 +02004296 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
4297 ev->bdaddr_type, rssi, ev->data, ev->length);
Andre Guedes3c9e9192012-01-10 18:20:50 -03004298
Andre Guedese95beb42011-09-26 20:48:35 -03004299 ptr += sizeof(*ev) + ev->length + 1;
Andre Guedes9aa04c92011-05-26 16:23:51 -03004300 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004301
4302 hci_dev_unlock(hdev);
Andre Guedes9aa04c92011-05-26 16:23:51 -03004303}
4304
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004305static void hci_le_ltk_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004306{
4307 struct hci_ev_le_ltk_req *ev = (void *) skb->data;
4308 struct hci_cp_le_ltk_reply cp;
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004309 struct hci_cp_le_ltk_neg_reply neg;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004310 struct hci_conn *conn;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004311 struct smp_ltk *ltk;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004312
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004313 BT_DBG("%s handle 0x%4.4x", hdev->name, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004314
4315 hci_dev_lock(hdev);
4316
4317 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004318 if (conn == NULL)
4319 goto not_found;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004320
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08004321 ltk = hci_find_ltk(hdev, ev->ediv, ev->rand, conn->out);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004322 if (ltk == NULL)
4323 goto not_found;
4324
4325 memcpy(cp.ltk, ltk->val, sizeof(ltk->val));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004326 cp.handle = cpu_to_le16(conn->handle);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004327
4328 if (ltk->authenticated)
Andre Guedesf8776212013-07-31 16:25:28 -03004329 conn->pending_sec_level = BT_SECURITY_HIGH;
4330 else
4331 conn->pending_sec_level = BT_SECURITY_MEDIUM;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004332
Andre Guedes89cbb4d2013-07-31 16:25:29 -03004333 conn->enc_key_size = ltk->enc_size;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004334
4335 hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp);
4336
Claudio Takahasi5981a882013-07-25 16:34:24 -03004337 /* Ref. Bluetooth Core SPEC pages 1975 and 2004. STK is a
4338 * temporary key used to encrypt a connection following
4339 * pairing. It is used during the Encrypted Session Setup to
4340 * distribute the keys. Later, security can be re-established
4341 * using a distributed LTK.
4342 */
Johan Hedberg2ceba532014-06-16 19:25:16 +03004343 if (ltk->type == SMP_STK) {
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004344 list_del(&ltk->list);
4345 kfree(ltk);
4346 }
4347
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004348 hci_dev_unlock(hdev);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004349
4350 return;
4351
4352not_found:
4353 neg.handle = ev->handle;
4354 hci_send_cmd(hdev, HCI_OP_LE_LTK_NEG_REPLY, sizeof(neg), &neg);
4355 hci_dev_unlock(hdev);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004356}
4357
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004358static void hci_le_meta_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004359{
4360 struct hci_ev_le_meta *le_ev = (void *) skb->data;
4361
4362 skb_pull(skb, sizeof(*le_ev));
4363
4364 switch (le_ev->subevent) {
4365 case HCI_EV_LE_CONN_COMPLETE:
4366 hci_le_conn_complete_evt(hdev, skb);
4367 break;
4368
Marcel Holtmann1855d922014-06-23 11:40:05 +02004369 case HCI_EV_LE_CONN_UPDATE_COMPLETE:
4370 hci_le_conn_update_complete_evt(hdev, skb);
4371 break;
4372
Andre Guedes9aa04c92011-05-26 16:23:51 -03004373 case HCI_EV_LE_ADVERTISING_REPORT:
4374 hci_le_adv_report_evt(hdev, skb);
4375 break;
4376
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004377 case HCI_EV_LE_LTK_REQ:
4378 hci_le_ltk_request_evt(hdev, skb);
4379 break;
4380
Ville Tervofcd89c02011-02-10 22:38:47 -03004381 default:
4382 break;
4383 }
4384}
4385
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03004386static void hci_chan_selected_evt(struct hci_dev *hdev, struct sk_buff *skb)
4387{
4388 struct hci_ev_channel_selected *ev = (void *) skb->data;
4389 struct hci_conn *hcon;
4390
4391 BT_DBG("%s handle 0x%2.2x", hdev->name, ev->phy_handle);
4392
4393 skb_pull(skb, sizeof(*ev));
4394
4395 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4396 if (!hcon)
4397 return;
4398
4399 amp_read_loc_assoc_final_data(hdev, hcon);
4400}
4401
Linus Torvalds1da177e2005-04-16 15:20:36 -07004402void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
4403{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004404 struct hci_event_hdr *hdr = (void *) skb->data;
4405 __u8 event = hdr->evt;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004406
Johan Hedbergb6ddb632013-04-02 13:34:31 +03004407 hci_dev_lock(hdev);
4408
4409 /* Received events are (currently) only needed when a request is
4410 * ongoing so avoid unnecessary memory allocation.
4411 */
4412 if (hdev->req_status == HCI_REQ_PEND) {
4413 kfree_skb(hdev->recv_evt);
4414 hdev->recv_evt = skb_clone(skb, GFP_KERNEL);
4415 }
4416
4417 hci_dev_unlock(hdev);
4418
Linus Torvalds1da177e2005-04-16 15:20:36 -07004419 skb_pull(skb, HCI_EVENT_HDR_SIZE);
4420
Johan Hedberg02350a72013-04-03 21:50:29 +03004421 if (hdev->sent_cmd && bt_cb(hdev->sent_cmd)->req.event == event) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02004422 struct hci_command_hdr *cmd_hdr = (void *) hdev->sent_cmd->data;
4423 u16 opcode = __le16_to_cpu(cmd_hdr->opcode);
Johan Hedberg02350a72013-04-03 21:50:29 +03004424
4425 hci_req_cmd_complete(hdev, opcode, 0);
4426 }
4427
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004428 switch (event) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004429 case HCI_EV_INQUIRY_COMPLETE:
4430 hci_inquiry_complete_evt(hdev, skb);
4431 break;
4432
4433 case HCI_EV_INQUIRY_RESULT:
4434 hci_inquiry_result_evt(hdev, skb);
4435 break;
4436
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004437 case HCI_EV_CONN_COMPLETE:
4438 hci_conn_complete_evt(hdev, skb);
Marcel Holtmann21d9e302005-09-13 01:32:25 +02004439 break;
4440
Linus Torvalds1da177e2005-04-16 15:20:36 -07004441 case HCI_EV_CONN_REQUEST:
4442 hci_conn_request_evt(hdev, skb);
4443 break;
4444
Linus Torvalds1da177e2005-04-16 15:20:36 -07004445 case HCI_EV_DISCONN_COMPLETE:
4446 hci_disconn_complete_evt(hdev, skb);
4447 break;
4448
Linus Torvalds1da177e2005-04-16 15:20:36 -07004449 case HCI_EV_AUTH_COMPLETE:
4450 hci_auth_complete_evt(hdev, skb);
4451 break;
4452
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004453 case HCI_EV_REMOTE_NAME:
4454 hci_remote_name_evt(hdev, skb);
4455 break;
4456
Linus Torvalds1da177e2005-04-16 15:20:36 -07004457 case HCI_EV_ENCRYPT_CHANGE:
4458 hci_encrypt_change_evt(hdev, skb);
4459 break;
4460
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004461 case HCI_EV_CHANGE_LINK_KEY_COMPLETE:
4462 hci_change_link_key_complete_evt(hdev, skb);
4463 break;
4464
4465 case HCI_EV_REMOTE_FEATURES:
4466 hci_remote_features_evt(hdev, skb);
4467 break;
4468
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004469 case HCI_EV_CMD_COMPLETE:
4470 hci_cmd_complete_evt(hdev, skb);
4471 break;
4472
4473 case HCI_EV_CMD_STATUS:
4474 hci_cmd_status_evt(hdev, skb);
4475 break;
4476
4477 case HCI_EV_ROLE_CHANGE:
4478 hci_role_change_evt(hdev, skb);
4479 break;
4480
4481 case HCI_EV_NUM_COMP_PKTS:
4482 hci_num_comp_pkts_evt(hdev, skb);
4483 break;
4484
4485 case HCI_EV_MODE_CHANGE:
4486 hci_mode_change_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004487 break;
4488
4489 case HCI_EV_PIN_CODE_REQ:
4490 hci_pin_code_request_evt(hdev, skb);
4491 break;
4492
4493 case HCI_EV_LINK_KEY_REQ:
4494 hci_link_key_request_evt(hdev, skb);
4495 break;
4496
4497 case HCI_EV_LINK_KEY_NOTIFY:
4498 hci_link_key_notify_evt(hdev, skb);
4499 break;
4500
4501 case HCI_EV_CLOCK_OFFSET:
4502 hci_clock_offset_evt(hdev, skb);
4503 break;
4504
Marcel Holtmanna8746412008-07-14 20:13:46 +02004505 case HCI_EV_PKT_TYPE_CHANGE:
4506 hci_pkt_type_change_evt(hdev, skb);
4507 break;
4508
Marcel Holtmann85a1e932005-08-09 20:28:02 -07004509 case HCI_EV_PSCAN_REP_MODE:
4510 hci_pscan_rep_mode_evt(hdev, skb);
4511 break;
4512
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004513 case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
4514 hci_inquiry_result_with_rssi_evt(hdev, skb);
4515 break;
4516
4517 case HCI_EV_REMOTE_EXT_FEATURES:
4518 hci_remote_ext_features_evt(hdev, skb);
4519 break;
4520
4521 case HCI_EV_SYNC_CONN_COMPLETE:
4522 hci_sync_conn_complete_evt(hdev, skb);
4523 break;
4524
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004525 case HCI_EV_EXTENDED_INQUIRY_RESULT:
4526 hci_extended_inquiry_result_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004527 break;
4528
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004529 case HCI_EV_KEY_REFRESH_COMPLETE:
4530 hci_key_refresh_complete_evt(hdev, skb);
4531 break;
4532
Marcel Holtmann04936842008-07-14 20:13:48 +02004533 case HCI_EV_IO_CAPA_REQUEST:
4534 hci_io_capa_request_evt(hdev, skb);
4535 break;
4536
Johan Hedberg03b555e2011-01-04 15:40:05 +02004537 case HCI_EV_IO_CAPA_REPLY:
4538 hci_io_capa_reply_evt(hdev, skb);
4539 break;
4540
Johan Hedberga5c29682011-02-19 12:05:57 -03004541 case HCI_EV_USER_CONFIRM_REQUEST:
4542 hci_user_confirm_request_evt(hdev, skb);
4543 break;
4544
Brian Gix1143d452011-11-23 08:28:34 -08004545 case HCI_EV_USER_PASSKEY_REQUEST:
4546 hci_user_passkey_request_evt(hdev, skb);
4547 break;
4548
Johan Hedberg92a25252012-09-06 18:39:26 +03004549 case HCI_EV_USER_PASSKEY_NOTIFY:
4550 hci_user_passkey_notify_evt(hdev, skb);
4551 break;
4552
4553 case HCI_EV_KEYPRESS_NOTIFY:
4554 hci_keypress_notify_evt(hdev, skb);
4555 break;
4556
Marcel Holtmann04936842008-07-14 20:13:48 +02004557 case HCI_EV_SIMPLE_PAIR_COMPLETE:
4558 hci_simple_pair_complete_evt(hdev, skb);
4559 break;
4560
Marcel Holtmann41a96212008-07-14 20:13:48 +02004561 case HCI_EV_REMOTE_HOST_FEATURES:
4562 hci_remote_host_features_evt(hdev, skb);
4563 break;
4564
Ville Tervofcd89c02011-02-10 22:38:47 -03004565 case HCI_EV_LE_META:
4566 hci_le_meta_evt(hdev, skb);
4567 break;
4568
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03004569 case HCI_EV_CHANNEL_SELECTED:
4570 hci_chan_selected_evt(hdev, skb);
4571 break;
4572
Szymon Janc2763eda2011-03-22 13:12:22 +01004573 case HCI_EV_REMOTE_OOB_DATA_REQUEST:
4574 hci_remote_oob_data_request_evt(hdev, skb);
4575 break;
4576
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004577 case HCI_EV_PHY_LINK_COMPLETE:
4578 hci_phy_link_complete_evt(hdev, skb);
4579 break;
4580
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004581 case HCI_EV_LOGICAL_LINK_COMPLETE:
4582 hci_loglink_complete_evt(hdev, skb);
4583 break;
4584
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02004585 case HCI_EV_DISCONN_LOGICAL_LINK_COMPLETE:
4586 hci_disconn_loglink_complete_evt(hdev, skb);
4587 break;
4588
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004589 case HCI_EV_DISCONN_PHY_LINK_COMPLETE:
4590 hci_disconn_phylink_complete_evt(hdev, skb);
4591 break;
4592
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02004593 case HCI_EV_NUM_COMP_BLOCKS:
4594 hci_num_comp_blocks_evt(hdev, skb);
4595 break;
4596
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004597 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004598 BT_DBG("%s event 0x%2.2x", hdev->name, event);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004599 break;
4600 }
4601
4602 kfree_skb(skb);
4603 hdev->stat.evt_rx++;
4604}