Bluetooth: mgmt: program multi-adv on power on
[deliverable/linux.git] / net / bluetooth / mgmt.c
CommitLineData
0381101f
JH
1/*
2 BlueZ - Bluetooth protocol stack for Linux
ea585ab5 3
0381101f 4 Copyright (C) 2010 Nokia Corporation
ea585ab5 5 Copyright (C) 2011-2012 Intel Corporation
0381101f
JH
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
15 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
18 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
20 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
22 SOFTWARE IS DISCLAIMED.
23*/
24
25/* Bluetooth HCI Management interface */
26
3a9a231d 27#include <linux/module.h>
0381101f
JH
28#include <asm/unaligned.h>
29
30#include <net/bluetooth/bluetooth.h>
31#include <net/bluetooth/hci_core.h>
7129069e 32#include <net/bluetooth/hci_sock.h>
4bc58f51 33#include <net/bluetooth/l2cap.h>
0381101f 34#include <net/bluetooth/mgmt.h>
ac4b7236 35
0857dd3b 36#include "hci_request.h"
ac4b7236 37#include "smp.h"
a380b6cf 38#include "mgmt_util.h"
0381101f 39
2da9c55c 40#define MGMT_VERSION 1
beb1c21b 41#define MGMT_REVISION 9
02d98129 42
e70bb2e8
JH
43static const u16 mgmt_commands[] = {
44 MGMT_OP_READ_INDEX_LIST,
45 MGMT_OP_READ_INFO,
46 MGMT_OP_SET_POWERED,
47 MGMT_OP_SET_DISCOVERABLE,
48 MGMT_OP_SET_CONNECTABLE,
49 MGMT_OP_SET_FAST_CONNECTABLE,
b2939475 50 MGMT_OP_SET_BONDABLE,
e70bb2e8
JH
51 MGMT_OP_SET_LINK_SECURITY,
52 MGMT_OP_SET_SSP,
53 MGMT_OP_SET_HS,
54 MGMT_OP_SET_LE,
55 MGMT_OP_SET_DEV_CLASS,
56 MGMT_OP_SET_LOCAL_NAME,
57 MGMT_OP_ADD_UUID,
58 MGMT_OP_REMOVE_UUID,
59 MGMT_OP_LOAD_LINK_KEYS,
60 MGMT_OP_LOAD_LONG_TERM_KEYS,
61 MGMT_OP_DISCONNECT,
62 MGMT_OP_GET_CONNECTIONS,
63 MGMT_OP_PIN_CODE_REPLY,
64 MGMT_OP_PIN_CODE_NEG_REPLY,
65 MGMT_OP_SET_IO_CAPABILITY,
66 MGMT_OP_PAIR_DEVICE,
67 MGMT_OP_CANCEL_PAIR_DEVICE,
68 MGMT_OP_UNPAIR_DEVICE,
69 MGMT_OP_USER_CONFIRM_REPLY,
70 MGMT_OP_USER_CONFIRM_NEG_REPLY,
71 MGMT_OP_USER_PASSKEY_REPLY,
72 MGMT_OP_USER_PASSKEY_NEG_REPLY,
73 MGMT_OP_READ_LOCAL_OOB_DATA,
74 MGMT_OP_ADD_REMOTE_OOB_DATA,
75 MGMT_OP_REMOVE_REMOTE_OOB_DATA,
76 MGMT_OP_START_DISCOVERY,
77 MGMT_OP_STOP_DISCOVERY,
78 MGMT_OP_CONFIRM_NAME,
79 MGMT_OP_BLOCK_DEVICE,
80 MGMT_OP_UNBLOCK_DEVICE,
cdbaccca 81 MGMT_OP_SET_DEVICE_ID,
4375f103 82 MGMT_OP_SET_ADVERTISING,
0663ca2a 83 MGMT_OP_SET_BREDR,
d13eafce 84 MGMT_OP_SET_STATIC_ADDRESS,
7f72134e 85 MGMT_OP_SET_SCAN_PARAMS,
e98d2ce2 86 MGMT_OP_SET_SECURE_CONN,
4e39ac81 87 MGMT_OP_SET_DEBUG_KEYS,
62b04cd1 88 MGMT_OP_SET_PRIVACY,
41edf160 89 MGMT_OP_LOAD_IRKS,
dd983808 90 MGMT_OP_GET_CONN_INFO,
95868426 91 MGMT_OP_GET_CLOCK_INFO,
2faade53
MH
92 MGMT_OP_ADD_DEVICE,
93 MGMT_OP_REMOVE_DEVICE,
a26f3dcf 94 MGMT_OP_LOAD_CONN_PARAM,
73d1df2a 95 MGMT_OP_READ_UNCONF_INDEX_LIST,
9fc3bfb6 96 MGMT_OP_READ_CONFIG_INFO,
dbece37a 97 MGMT_OP_SET_EXTERNAL_CONFIG,
9713c17b 98 MGMT_OP_SET_PUBLIC_ADDRESS,
66ea9427 99 MGMT_OP_START_SERVICE_DISCOVERY,
4f0f155c 100 MGMT_OP_READ_LOCAL_OOB_EXT_DATA,
96f1474a 101 MGMT_OP_READ_EXT_INDEX_LIST,
d3d5305b 102 MGMT_OP_READ_ADV_FEATURES,
24b4f38f 103 MGMT_OP_ADD_ADVERTISING,
da929335 104 MGMT_OP_REMOVE_ADVERTISING,
e70bb2e8
JH
105};
106
107static const u16 mgmt_events[] = {
108 MGMT_EV_CONTROLLER_ERROR,
109 MGMT_EV_INDEX_ADDED,
110 MGMT_EV_INDEX_REMOVED,
111 MGMT_EV_NEW_SETTINGS,
112 MGMT_EV_CLASS_OF_DEV_CHANGED,
113 MGMT_EV_LOCAL_NAME_CHANGED,
114 MGMT_EV_NEW_LINK_KEY,
115 MGMT_EV_NEW_LONG_TERM_KEY,
116 MGMT_EV_DEVICE_CONNECTED,
117 MGMT_EV_DEVICE_DISCONNECTED,
118 MGMT_EV_CONNECT_FAILED,
119 MGMT_EV_PIN_CODE_REQUEST,
120 MGMT_EV_USER_CONFIRM_REQUEST,
121 MGMT_EV_USER_PASSKEY_REQUEST,
122 MGMT_EV_AUTH_FAILED,
123 MGMT_EV_DEVICE_FOUND,
124 MGMT_EV_DISCOVERING,
125 MGMT_EV_DEVICE_BLOCKED,
126 MGMT_EV_DEVICE_UNBLOCKED,
127 MGMT_EV_DEVICE_UNPAIRED,
92a25256 128 MGMT_EV_PASSKEY_NOTIFY,
1b60ef21 129 MGMT_EV_NEW_IRK,
7ee4ea36 130 MGMT_EV_NEW_CSRK,
8afef092
MH
131 MGMT_EV_DEVICE_ADDED,
132 MGMT_EV_DEVICE_REMOVED,
ffb5a827 133 MGMT_EV_NEW_CONN_PARAM,
0602a8ad 134 MGMT_EV_UNCONF_INDEX_ADDED,
edd3896b 135 MGMT_EV_UNCONF_INDEX_REMOVED,
f4537c04 136 MGMT_EV_NEW_CONFIG_OPTIONS,
ced85549
MH
137 MGMT_EV_EXT_INDEX_ADDED,
138 MGMT_EV_EXT_INDEX_REMOVED,
72000df2 139 MGMT_EV_LOCAL_OOB_DATA_UPDATED,
24b4f38f
AU
140 MGMT_EV_ADVERTISING_ADDED,
141 MGMT_EV_ADVERTISING_REMOVED,
e70bb2e8
JH
142};
143
99c679ac
MH
144static const u16 mgmt_untrusted_commands[] = {
145 MGMT_OP_READ_INDEX_LIST,
146 MGMT_OP_READ_INFO,
147 MGMT_OP_READ_UNCONF_INDEX_LIST,
148 MGMT_OP_READ_CONFIG_INFO,
149 MGMT_OP_READ_EXT_INDEX_LIST,
150};
151
152static const u16 mgmt_untrusted_events[] = {
153 MGMT_EV_INDEX_ADDED,
154 MGMT_EV_INDEX_REMOVED,
155 MGMT_EV_NEW_SETTINGS,
156 MGMT_EV_CLASS_OF_DEV_CHANGED,
157 MGMT_EV_LOCAL_NAME_CHANGED,
158 MGMT_EV_UNCONF_INDEX_ADDED,
159 MGMT_EV_UNCONF_INDEX_REMOVED,
160 MGMT_EV_NEW_CONFIG_OPTIONS,
161 MGMT_EV_EXT_INDEX_ADDED,
162 MGMT_EV_EXT_INDEX_REMOVED,
163};
164
17b02e62 165#define CACHE_TIMEOUT msecs_to_jiffies(2 * 1000)
7d78525d 166
d25b78e2
JH
167#define ZERO_KEY "\x00\x00\x00\x00\x00\x00\x00\x00" \
168 "\x00\x00\x00\x00\x00\x00\x00\x00"
169
ca69b795
JH
170/* HCI to MGMT error code conversion table */
171static u8 mgmt_status_table[] = {
172 MGMT_STATUS_SUCCESS,
173 MGMT_STATUS_UNKNOWN_COMMAND, /* Unknown Command */
174 MGMT_STATUS_NOT_CONNECTED, /* No Connection */
175 MGMT_STATUS_FAILED, /* Hardware Failure */
176 MGMT_STATUS_CONNECT_FAILED, /* Page Timeout */
177 MGMT_STATUS_AUTH_FAILED, /* Authentication Failed */
eadd663a 178 MGMT_STATUS_AUTH_FAILED, /* PIN or Key Missing */
ca69b795
JH
179 MGMT_STATUS_NO_RESOURCES, /* Memory Full */
180 MGMT_STATUS_TIMEOUT, /* Connection Timeout */
181 MGMT_STATUS_NO_RESOURCES, /* Max Number of Connections */
182 MGMT_STATUS_NO_RESOURCES, /* Max Number of SCO Connections */
183 MGMT_STATUS_ALREADY_CONNECTED, /* ACL Connection Exists */
184 MGMT_STATUS_BUSY, /* Command Disallowed */
185 MGMT_STATUS_NO_RESOURCES, /* Rejected Limited Resources */
186 MGMT_STATUS_REJECTED, /* Rejected Security */
187 MGMT_STATUS_REJECTED, /* Rejected Personal */
188 MGMT_STATUS_TIMEOUT, /* Host Timeout */
189 MGMT_STATUS_NOT_SUPPORTED, /* Unsupported Feature */
190 MGMT_STATUS_INVALID_PARAMS, /* Invalid Parameters */
191 MGMT_STATUS_DISCONNECTED, /* OE User Ended Connection */
192 MGMT_STATUS_NO_RESOURCES, /* OE Low Resources */
193 MGMT_STATUS_DISCONNECTED, /* OE Power Off */
194 MGMT_STATUS_DISCONNECTED, /* Connection Terminated */
195 MGMT_STATUS_BUSY, /* Repeated Attempts */
196 MGMT_STATUS_REJECTED, /* Pairing Not Allowed */
197 MGMT_STATUS_FAILED, /* Unknown LMP PDU */
198 MGMT_STATUS_NOT_SUPPORTED, /* Unsupported Remote Feature */
199 MGMT_STATUS_REJECTED, /* SCO Offset Rejected */
200 MGMT_STATUS_REJECTED, /* SCO Interval Rejected */
201 MGMT_STATUS_REJECTED, /* Air Mode Rejected */
202 MGMT_STATUS_INVALID_PARAMS, /* Invalid LMP Parameters */
203 MGMT_STATUS_FAILED, /* Unspecified Error */
204 MGMT_STATUS_NOT_SUPPORTED, /* Unsupported LMP Parameter Value */
205 MGMT_STATUS_FAILED, /* Role Change Not Allowed */
206 MGMT_STATUS_TIMEOUT, /* LMP Response Timeout */
207 MGMT_STATUS_FAILED, /* LMP Error Transaction Collision */
208 MGMT_STATUS_FAILED, /* LMP PDU Not Allowed */
209 MGMT_STATUS_REJECTED, /* Encryption Mode Not Accepted */
210 MGMT_STATUS_FAILED, /* Unit Link Key Used */
211 MGMT_STATUS_NOT_SUPPORTED, /* QoS Not Supported */
212 MGMT_STATUS_TIMEOUT, /* Instant Passed */
213 MGMT_STATUS_NOT_SUPPORTED, /* Pairing Not Supported */
214 MGMT_STATUS_FAILED, /* Transaction Collision */
215 MGMT_STATUS_INVALID_PARAMS, /* Unacceptable Parameter */
216 MGMT_STATUS_REJECTED, /* QoS Rejected */
217 MGMT_STATUS_NOT_SUPPORTED, /* Classification Not Supported */
218 MGMT_STATUS_REJECTED, /* Insufficient Security */
219 MGMT_STATUS_INVALID_PARAMS, /* Parameter Out Of Range */
220 MGMT_STATUS_BUSY, /* Role Switch Pending */
221 MGMT_STATUS_FAILED, /* Slot Violation */
222 MGMT_STATUS_FAILED, /* Role Switch Failed */
223 MGMT_STATUS_INVALID_PARAMS, /* EIR Too Large */
224 MGMT_STATUS_NOT_SUPPORTED, /* Simple Pairing Not Supported */
225 MGMT_STATUS_BUSY, /* Host Busy Pairing */
226 MGMT_STATUS_REJECTED, /* Rejected, No Suitable Channel */
227 MGMT_STATUS_BUSY, /* Controller Busy */
228 MGMT_STATUS_INVALID_PARAMS, /* Unsuitable Connection Interval */
229 MGMT_STATUS_TIMEOUT, /* Directed Advertising Timeout */
230 MGMT_STATUS_AUTH_FAILED, /* Terminated Due to MIC Failure */
231 MGMT_STATUS_CONNECT_FAILED, /* Connection Establishment Failed */
232 MGMT_STATUS_CONNECT_FAILED, /* MAC Connection Failed */
233};
234
235static u8 mgmt_status(u8 hci_status)
236{
237 if (hci_status < ARRAY_SIZE(mgmt_status_table))
238 return mgmt_status_table[hci_status];
239
240 return MGMT_STATUS_FAILED;
241}
242
c08b1a1d
MH
243static int mgmt_index_event(u16 event, struct hci_dev *hdev, void *data,
244 u16 len, int flag)
f9207338 245{
c08b1a1d
MH
246 return mgmt_send_event(event, hdev, HCI_CHANNEL_CONTROL, data, len,
247 flag, NULL);
f9207338
MH
248}
249
72000df2
MH
250static int mgmt_limited_event(u16 event, struct hci_dev *hdev, void *data,
251 u16 len, int flag, struct sock *skip_sk)
252{
253 return mgmt_send_event(event, hdev, HCI_CHANNEL_CONTROL, data, len,
254 flag, skip_sk);
255}
256
f6b7712e
MH
257static int mgmt_generic_event(u16 event, struct hci_dev *hdev, void *data,
258 u16 len, struct sock *skip_sk)
259{
260 return mgmt_send_event(event, hdev, HCI_CHANNEL_CONTROL, data, len,
261 HCI_MGMT_GENERIC_EVENTS, skip_sk);
262}
263
7a00ff44
JH
264static int mgmt_event(u16 event, struct hci_dev *hdev, void *data, u16 len,
265 struct sock *skip_sk)
266{
267 return mgmt_send_event(event, hdev, HCI_CHANNEL_CONTROL, data, len,
c08b1a1d 268 HCI_SOCK_TRUSTED, skip_sk);
7a00ff44
JH
269}
270
04124681
GP
271static int read_version(struct sock *sk, struct hci_dev *hdev, void *data,
272 u16 data_len)
a38528f1
JH
273{
274 struct mgmt_rp_read_version rp;
275
276 BT_DBG("sock %p", sk);
277
278 rp.version = MGMT_VERSION;
dcf4adbf 279 rp.revision = cpu_to_le16(MGMT_REVISION);
a38528f1 280
2a1afb5a
JH
281 return mgmt_cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_VERSION, 0,
282 &rp, sizeof(rp));
a38528f1
JH
283}
284
04124681
GP
285static int read_commands(struct sock *sk, struct hci_dev *hdev, void *data,
286 u16 data_len)
e70bb2e8
JH
287{
288 struct mgmt_rp_read_commands *rp;
99c679ac 289 u16 num_commands, num_events;
e70bb2e8
JH
290 size_t rp_size;
291 int i, err;
292
293 BT_DBG("sock %p", sk);
294
99c679ac
MH
295 if (hci_sock_test_flag(sk, HCI_SOCK_TRUSTED)) {
296 num_commands = ARRAY_SIZE(mgmt_commands);
297 num_events = ARRAY_SIZE(mgmt_events);
298 } else {
299 num_commands = ARRAY_SIZE(mgmt_untrusted_commands);
300 num_events = ARRAY_SIZE(mgmt_untrusted_events);
301 }
302
e70bb2e8
JH
303 rp_size = sizeof(*rp) + ((num_commands + num_events) * sizeof(u16));
304
305 rp = kmalloc(rp_size, GFP_KERNEL);
306 if (!rp)
307 return -ENOMEM;
308
dcf4adbf
JP
309 rp->num_commands = cpu_to_le16(num_commands);
310 rp->num_events = cpu_to_le16(num_events);
e70bb2e8 311
99c679ac
MH
312 if (hci_sock_test_flag(sk, HCI_SOCK_TRUSTED)) {
313 __le16 *opcode = rp->opcodes;
314
315 for (i = 0; i < num_commands; i++, opcode++)
316 put_unaligned_le16(mgmt_commands[i], opcode);
e70bb2e8 317
99c679ac
MH
318 for (i = 0; i < num_events; i++, opcode++)
319 put_unaligned_le16(mgmt_events[i], opcode);
320 } else {
321 __le16 *opcode = rp->opcodes;
322
323 for (i = 0; i < num_commands; i++, opcode++)
324 put_unaligned_le16(mgmt_untrusted_commands[i], opcode);
325
326 for (i = 0; i < num_events; i++, opcode++)
327 put_unaligned_le16(mgmt_untrusted_events[i], opcode);
328 }
e70bb2e8 329
2a1afb5a
JH
330 err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_COMMANDS, 0,
331 rp, rp_size);
e70bb2e8
JH
332 kfree(rp);
333
334 return err;
335}
336
04124681
GP
337static int read_index_list(struct sock *sk, struct hci_dev *hdev, void *data,
338 u16 data_len)
faba42eb 339{
faba42eb 340 struct mgmt_rp_read_index_list *rp;
8035ded4 341 struct hci_dev *d;
a38528f1 342 size_t rp_len;
faba42eb 343 u16 count;
476e44cb 344 int err;
faba42eb
JH
345
346 BT_DBG("sock %p", sk);
347
348 read_lock(&hci_dev_list_lock);
349
350 count = 0;
bb4b2a9a 351 list_for_each_entry(d, &hci_dev_list, list) {
73d1df2a 352 if (d->dev_type == HCI_BREDR &&
d7a5a11d 353 !hci_dev_test_flag(d, HCI_UNCONFIGURED))
1514b892 354 count++;
faba42eb
JH
355 }
356
a38528f1
JH
357 rp_len = sizeof(*rp) + (2 * count);
358 rp = kmalloc(rp_len, GFP_ATOMIC);
359 if (!rp) {
b2c60d42 360 read_unlock(&hci_dev_list_lock);
faba42eb 361 return -ENOMEM;
b2c60d42 362 }
faba42eb 363
476e44cb 364 count = 0;
8035ded4 365 list_for_each_entry(d, &hci_dev_list, list) {
d7a5a11d
MH
366 if (hci_dev_test_flag(d, HCI_SETUP) ||
367 hci_dev_test_flag(d, HCI_CONFIG) ||
368 hci_dev_test_flag(d, HCI_USER_CHANNEL))
ab81cbf9
JH
369 continue;
370
73d1df2a
MH
371 /* Devices marked as raw-only are neither configured
372 * nor unconfigured controllers.
373 */
374 if (test_bit(HCI_QUIRK_RAW_DEVICE, &d->quirks))
fee746b0
MH
375 continue;
376
73d1df2a 377 if (d->dev_type == HCI_BREDR &&
d7a5a11d 378 !hci_dev_test_flag(d, HCI_UNCONFIGURED)) {
1514b892
MH
379 rp->index[count++] = cpu_to_le16(d->id);
380 BT_DBG("Added hci%u", d->id);
381 }
faba42eb
JH
382 }
383
476e44cb
JH
384 rp->num_controllers = cpu_to_le16(count);
385 rp_len = sizeof(*rp) + (2 * count);
386
faba42eb
JH
387 read_unlock(&hci_dev_list_lock);
388
2a1afb5a
JH
389 err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_INDEX_LIST,
390 0, rp, rp_len);
faba42eb 391
a38528f1
JH
392 kfree(rp);
393
394 return err;
faba42eb
JH
395}
396
73d1df2a
MH
397static int read_unconf_index_list(struct sock *sk, struct hci_dev *hdev,
398 void *data, u16 data_len)
399{
400 struct mgmt_rp_read_unconf_index_list *rp;
401 struct hci_dev *d;
402 size_t rp_len;
403 u16 count;
404 int err;
405
406 BT_DBG("sock %p", sk);
407
408 read_lock(&hci_dev_list_lock);
409
410 count = 0;
411 list_for_each_entry(d, &hci_dev_list, list) {
412 if (d->dev_type == HCI_BREDR &&
d7a5a11d 413 hci_dev_test_flag(d, HCI_UNCONFIGURED))
73d1df2a
MH
414 count++;
415 }
416
417 rp_len = sizeof(*rp) + (2 * count);
418 rp = kmalloc(rp_len, GFP_ATOMIC);
419 if (!rp) {
420 read_unlock(&hci_dev_list_lock);
421 return -ENOMEM;
422 }
423
424 count = 0;
425 list_for_each_entry(d, &hci_dev_list, list) {
d7a5a11d
MH
426 if (hci_dev_test_flag(d, HCI_SETUP) ||
427 hci_dev_test_flag(d, HCI_CONFIG) ||
428 hci_dev_test_flag(d, HCI_USER_CHANNEL))
73d1df2a
MH
429 continue;
430
431 /* Devices marked as raw-only are neither configured
432 * nor unconfigured controllers.
433 */
434 if (test_bit(HCI_QUIRK_RAW_DEVICE, &d->quirks))
435 continue;
436
437 if (d->dev_type == HCI_BREDR &&
d7a5a11d 438 hci_dev_test_flag(d, HCI_UNCONFIGURED)) {
73d1df2a
MH
439 rp->index[count++] = cpu_to_le16(d->id);
440 BT_DBG("Added hci%u", d->id);
441 }
442 }
443
444 rp->num_controllers = cpu_to_le16(count);
445 rp_len = sizeof(*rp) + (2 * count);
446
447 read_unlock(&hci_dev_list_lock);
448
2a1afb5a
JH
449 err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE,
450 MGMT_OP_READ_UNCONF_INDEX_LIST, 0, rp, rp_len);
73d1df2a
MH
451
452 kfree(rp);
453
454 return err;
455}
456
96f1474a
MH
457static int read_ext_index_list(struct sock *sk, struct hci_dev *hdev,
458 void *data, u16 data_len)
459{
460 struct mgmt_rp_read_ext_index_list *rp;
461 struct hci_dev *d;
462 size_t rp_len;
463 u16 count;
464 int err;
465
466 BT_DBG("sock %p", sk);
467
468 read_lock(&hci_dev_list_lock);
469
470 count = 0;
471 list_for_each_entry(d, &hci_dev_list, list) {
472 if (d->dev_type == HCI_BREDR || d->dev_type == HCI_AMP)
473 count++;
474 }
475
476 rp_len = sizeof(*rp) + (sizeof(rp->entry[0]) * count);
477 rp = kmalloc(rp_len, GFP_ATOMIC);
478 if (!rp) {
479 read_unlock(&hci_dev_list_lock);
480 return -ENOMEM;
481 }
482
483 count = 0;
484 list_for_each_entry(d, &hci_dev_list, list) {
485 if (hci_dev_test_flag(d, HCI_SETUP) ||
486 hci_dev_test_flag(d, HCI_CONFIG) ||
487 hci_dev_test_flag(d, HCI_USER_CHANNEL))
488 continue;
489
490 /* Devices marked as raw-only are neither configured
491 * nor unconfigured controllers.
492 */
493 if (test_bit(HCI_QUIRK_RAW_DEVICE, &d->quirks))
494 continue;
495
496 if (d->dev_type == HCI_BREDR) {
497 if (hci_dev_test_flag(d, HCI_UNCONFIGURED))
498 rp->entry[count].type = 0x01;
499 else
500 rp->entry[count].type = 0x00;
501 } else if (d->dev_type == HCI_AMP) {
502 rp->entry[count].type = 0x02;
503 } else {
504 continue;
505 }
506
507 rp->entry[count].bus = d->bus;
508 rp->entry[count++].index = cpu_to_le16(d->id);
509 BT_DBG("Added hci%u", d->id);
510 }
511
512 rp->num_controllers = cpu_to_le16(count);
513 rp_len = sizeof(*rp) + (sizeof(rp->entry[0]) * count);
514
515 read_unlock(&hci_dev_list_lock);
516
517 /* If this command is called at least once, then all the
518 * default index and unconfigured index events are disabled
519 * and from now on only extended index events are used.
520 */
521 hci_sock_set_flag(sk, HCI_MGMT_EXT_INDEX_EVENTS);
522 hci_sock_clear_flag(sk, HCI_MGMT_INDEX_EVENTS);
523 hci_sock_clear_flag(sk, HCI_MGMT_UNCONF_INDEX_EVENTS);
524
525 err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE,
526 MGMT_OP_READ_EXT_INDEX_LIST, 0, rp, rp_len);
527
528 kfree(rp);
529
530 return err;
531}
532
dbece37a
MH
533static bool is_configured(struct hci_dev *hdev)
534{
535 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) &&
d7a5a11d 536 !hci_dev_test_flag(hdev, HCI_EXT_CONFIGURED))
dbece37a
MH
537 return false;
538
539 if (test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) &&
540 !bacmp(&hdev->public_addr, BDADDR_ANY))
541 return false;
542
543 return true;
544}
545
89bc22d2
MH
546static __le32 get_missing_options(struct hci_dev *hdev)
547{
548 u32 options = 0;
549
dbece37a 550 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) &&
d7a5a11d 551 !hci_dev_test_flag(hdev, HCI_EXT_CONFIGURED))
eb1904f4
MH
552 options |= MGMT_OPTION_EXTERNAL_CONFIG;
553
89bc22d2
MH
554 if (test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) &&
555 !bacmp(&hdev->public_addr, BDADDR_ANY))
556 options |= MGMT_OPTION_PUBLIC_ADDRESS;
557
558 return cpu_to_le32(options);
559}
560
f4537c04
MH
561static int new_options(struct hci_dev *hdev, struct sock *skip)
562{
563 __le32 options = get_missing_options(hdev);
564
f6b7712e
MH
565 return mgmt_generic_event(MGMT_EV_NEW_CONFIG_OPTIONS, hdev, &options,
566 sizeof(options), skip);
f4537c04
MH
567}
568
dbece37a
MH
569static int send_options_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
570{
571 __le32 options = get_missing_options(hdev);
572
2a1afb5a
JH
573 return mgmt_cmd_complete(sk, hdev->id, opcode, 0, &options,
574 sizeof(options));
dbece37a
MH
575}
576
9fc3bfb6
MH
577static int read_config_info(struct sock *sk, struct hci_dev *hdev,
578 void *data, u16 data_len)
579{
580 struct mgmt_rp_read_config_info rp;
89bc22d2 581 u32 options = 0;
9fc3bfb6
MH
582
583 BT_DBG("sock %p %s", sk, hdev->name);
584
585 hci_dev_lock(hdev);
586
587 memset(&rp, 0, sizeof(rp));
588 rp.manufacturer = cpu_to_le16(hdev->manufacturer);
89bc22d2 589
eb1904f4
MH
590 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks))
591 options |= MGMT_OPTION_EXTERNAL_CONFIG;
592
9fc3bfb6 593 if (hdev->set_bdaddr)
89bc22d2
MH
594 options |= MGMT_OPTION_PUBLIC_ADDRESS;
595
596 rp.supported_options = cpu_to_le32(options);
597 rp.missing_options = get_missing_options(hdev);
9fc3bfb6
MH
598
599 hci_dev_unlock(hdev);
600
2a1afb5a
JH
601 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_CONFIG_INFO, 0,
602 &rp, sizeof(rp));
9fc3bfb6
MH
603}
604
69ab39ea
JH
605static u32 get_supported_settings(struct hci_dev *hdev)
606{
607 u32 settings = 0;
608
609 settings |= MGMT_SETTING_POWERED;
b2939475 610 settings |= MGMT_SETTING_BONDABLE;
b1de97d8 611 settings |= MGMT_SETTING_DEBUG_KEYS;
3742abfc
JH
612 settings |= MGMT_SETTING_CONNECTABLE;
613 settings |= MGMT_SETTING_DISCOVERABLE;
69ab39ea 614
ed3fa31f 615 if (lmp_bredr_capable(hdev)) {
1a47aee8
JH
616 if (hdev->hci_ver >= BLUETOOTH_VER_1_2)
617 settings |= MGMT_SETTING_FAST_CONNECTABLE;
69ab39ea
JH
618 settings |= MGMT_SETTING_BREDR;
619 settings |= MGMT_SETTING_LINK_SECURITY;
a82974c9
MH
620
621 if (lmp_ssp_capable(hdev)) {
622 settings |= MGMT_SETTING_SSP;
623 settings |= MGMT_SETTING_HS;
624 }
e98d2ce2 625
05b3c3e7 626 if (lmp_sc_capable(hdev))
e98d2ce2 627 settings |= MGMT_SETTING_SECURE_CONN;
848566b3 628 }
d7b7e796 629
eeca6f89 630 if (lmp_le_capable(hdev)) {
9d42820f 631 settings |= MGMT_SETTING_LE;
eeca6f89 632 settings |= MGMT_SETTING_ADVERTISING;
a3209694 633 settings |= MGMT_SETTING_SECURE_CONN;
0f4bd942 634 settings |= MGMT_SETTING_PRIVACY;
93690c22 635 settings |= MGMT_SETTING_STATIC_ADDRESS;
eeca6f89 636 }
69ab39ea 637
eb1904f4
MH
638 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) ||
639 hdev->set_bdaddr)
9fc3bfb6
MH
640 settings |= MGMT_SETTING_CONFIGURATION;
641
69ab39ea
JH
642 return settings;
643}
644
645static u32 get_current_settings(struct hci_dev *hdev)
646{
647 u32 settings = 0;
648
f1f0eb02 649 if (hdev_is_powered(hdev))
f0d4b78a
MH
650 settings |= MGMT_SETTING_POWERED;
651
d7a5a11d 652 if (hci_dev_test_flag(hdev, HCI_CONNECTABLE))
69ab39ea
JH
653 settings |= MGMT_SETTING_CONNECTABLE;
654
d7a5a11d 655 if (hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE))
1a4d3c4b
JH
656 settings |= MGMT_SETTING_FAST_CONNECTABLE;
657
d7a5a11d 658 if (hci_dev_test_flag(hdev, HCI_DISCOVERABLE))
69ab39ea
JH
659 settings |= MGMT_SETTING_DISCOVERABLE;
660
d7a5a11d 661 if (hci_dev_test_flag(hdev, HCI_BONDABLE))
b2939475 662 settings |= MGMT_SETTING_BONDABLE;
69ab39ea 663
d7a5a11d 664 if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
69ab39ea
JH
665 settings |= MGMT_SETTING_BREDR;
666
d7a5a11d 667 if (hci_dev_test_flag(hdev, HCI_LE_ENABLED))
69ab39ea
JH
668 settings |= MGMT_SETTING_LE;
669
d7a5a11d 670 if (hci_dev_test_flag(hdev, HCI_LINK_SECURITY))
69ab39ea
JH
671 settings |= MGMT_SETTING_LINK_SECURITY;
672
d7a5a11d 673 if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED))
69ab39ea
JH
674 settings |= MGMT_SETTING_SSP;
675
d7a5a11d 676 if (hci_dev_test_flag(hdev, HCI_HS_ENABLED))
6d80dfd0
JH
677 settings |= MGMT_SETTING_HS;
678
d7a5a11d 679 if (hci_dev_test_flag(hdev, HCI_ADVERTISING))
eeca6f89
JH
680 settings |= MGMT_SETTING_ADVERTISING;
681
d7a5a11d 682 if (hci_dev_test_flag(hdev, HCI_SC_ENABLED))
e98d2ce2
MH
683 settings |= MGMT_SETTING_SECURE_CONN;
684
d7a5a11d 685 if (hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS))
b1de97d8
MH
686 settings |= MGMT_SETTING_DEBUG_KEYS;
687
d7a5a11d 688 if (hci_dev_test_flag(hdev, HCI_PRIVACY))
0f4bd942
JH
689 settings |= MGMT_SETTING_PRIVACY;
690
93690c22
MH
691 /* The current setting for static address has two purposes. The
692 * first is to indicate if the static address will be used and
693 * the second is to indicate if it is actually set.
694 *
695 * This means if the static address is not configured, this flag
08dc0e98 696 * will never be set. If the address is configured, then if the
93690c22
MH
697 * address is actually used decides if the flag is set or not.
698 *
699 * For single mode LE only controllers and dual-mode controllers
700 * with BR/EDR disabled, the existence of the static address will
701 * be evaluated.
702 */
b7cb93e5 703 if (hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) ||
d7a5a11d 704 !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) ||
93690c22
MH
705 !bacmp(&hdev->bdaddr, BDADDR_ANY)) {
706 if (bacmp(&hdev->static_addr, BDADDR_ANY))
707 settings |= MGMT_SETTING_STATIC_ADDRESS;
708 }
709
69ab39ea
JH
710 return settings;
711}
712
ef580372
JH
713#define PNP_INFO_SVCLASS_ID 0x1200
714
213202ed
JH
715static u8 *create_uuid16_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len)
716{
717 u8 *ptr = data, *uuids_start = NULL;
718 struct bt_uuid *uuid;
719
720 if (len < 4)
721 return ptr;
722
723 list_for_each_entry(uuid, &hdev->uuids, list) {
724 u16 uuid16;
725
726 if (uuid->size != 16)
727 continue;
728
729 uuid16 = get_unaligned_le16(&uuid->uuid[12]);
730 if (uuid16 < 0x1100)
731 continue;
732
733 if (uuid16 == PNP_INFO_SVCLASS_ID)
734 continue;
735
736 if (!uuids_start) {
737 uuids_start = ptr;
738 uuids_start[0] = 1;
739 uuids_start[1] = EIR_UUID16_ALL;
740 ptr += 2;
741 }
742
743 /* Stop if not enough space to put next UUID */
744 if ((ptr - data) + sizeof(u16) > len) {
745 uuids_start[1] = EIR_UUID16_SOME;
746 break;
747 }
748
749 *ptr++ = (uuid16 & 0x00ff);
750 *ptr++ = (uuid16 & 0xff00) >> 8;
751 uuids_start[0] += sizeof(uuid16);
752 }
753
754 return ptr;
755}
756
cdf1963f
JH
757static u8 *create_uuid32_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len)
758{
759 u8 *ptr = data, *uuids_start = NULL;
760 struct bt_uuid *uuid;
761
762 if (len < 6)
763 return ptr;
764
765 list_for_each_entry(uuid, &hdev->uuids, list) {
766 if (uuid->size != 32)
767 continue;
768
769 if (!uuids_start) {
770 uuids_start = ptr;
771 uuids_start[0] = 1;
772 uuids_start[1] = EIR_UUID32_ALL;
773 ptr += 2;
774 }
775
776 /* Stop if not enough space to put next UUID */
777 if ((ptr - data) + sizeof(u32) > len) {
778 uuids_start[1] = EIR_UUID32_SOME;
779 break;
780 }
781
782 memcpy(ptr, &uuid->uuid[12], sizeof(u32));
783 ptr += sizeof(u32);
784 uuids_start[0] += sizeof(u32);
785 }
786
787 return ptr;
788}
789
c00d575b
JH
790static u8 *create_uuid128_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len)
791{
792 u8 *ptr = data, *uuids_start = NULL;
793 struct bt_uuid *uuid;
794
795 if (len < 18)
796 return ptr;
797
798 list_for_each_entry(uuid, &hdev->uuids, list) {
799 if (uuid->size != 128)
800 continue;
801
802 if (!uuids_start) {
803 uuids_start = ptr;
804 uuids_start[0] = 1;
805 uuids_start[1] = EIR_UUID128_ALL;
806 ptr += 2;
807 }
808
809 /* Stop if not enough space to put next UUID */
810 if ((ptr - data) + 16 > len) {
811 uuids_start[1] = EIR_UUID128_SOME;
812 break;
813 }
814
815 memcpy(ptr, uuid->uuid, 16);
816 ptr += 16;
817 uuids_start[0] += 16;
818 }
819
820 return ptr;
821}
822
333ae95d
JH
823static struct mgmt_pending_cmd *pending_find(u16 opcode, struct hci_dev *hdev)
824{
825 return mgmt_pending_find(HCI_CHANNEL_CONTROL, opcode, hdev);
826}
827
333ae95d
JH
828static struct mgmt_pending_cmd *pending_find_data(u16 opcode,
829 struct hci_dev *hdev,
830 const void *data)
831{
832 return mgmt_pending_find_data(HCI_CHANNEL_CONTROL, opcode, hdev, data);
833}
834
91aa9bb2
FG
835static u8 get_current_adv_instance(struct hci_dev *hdev)
836{
837 /* The "Set Advertising" setting supersedes the "Add Advertising"
838 * setting. Here we set the advertising data based on which
839 * setting was set. When neither apply, default to the global settings,
840 * represented by instance "0".
841 */
842 if (hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE) &&
843 !hci_dev_test_flag(hdev, HCI_ADVERTISING))
3ff37e6b 844 return hdev->cur_adv_instance;
91aa9bb2
FG
845
846 return 0x00;
847}
848
4117ed70 849static u8 create_default_scan_rsp_data(struct hci_dev *hdev, u8 *ptr)
f14d8f64 850{
7a5f4990
MH
851 u8 ad_len = 0;
852 size_t name_len;
853
854 name_len = strlen(hdev->dev_name);
855 if (name_len > 0) {
856 size_t max_len = HCI_MAX_AD_LENGTH - ad_len - 2;
857
858 if (name_len > max_len) {
859 name_len = max_len;
860 ptr[1] = EIR_NAME_SHORT;
861 } else
862 ptr[1] = EIR_NAME_COMPLETE;
863
864 ptr[0] = name_len + 1;
865
866 memcpy(ptr + 2, hdev->dev_name, name_len);
867
868 ad_len += (name_len + 2);
869 ptr += (name_len + 2);
870 }
871
872 return ad_len;
f14d8f64
MH
873}
874
ca21fbe9
FG
875static u8 create_instance_scan_rsp_data(struct hci_dev *hdev, u8 instance,
876 u8 *ptr)
4117ed70 877{
ca21fbe9
FG
878 struct adv_info *adv_instance;
879
880 adv_instance = hci_find_adv_instance(hdev, instance);
881 if (!adv_instance)
882 return 0;
883
4117ed70
AU
884 /* TODO: Set the appropriate entries based on advertising instance flags
885 * here once flags other than 0 are supported.
886 */
ca21fbe9
FG
887 memcpy(ptr, adv_instance->scan_rsp_data,
888 adv_instance->scan_rsp_len);
4117ed70 889
ca21fbe9 890 return adv_instance->scan_rsp_len;
4117ed70
AU
891}
892
efae002c 893static void update_inst_scan_rsp_data(struct hci_request *req, u8 instance)
f14d8f64
MH
894{
895 struct hci_dev *hdev = req->hdev;
896 struct hci_cp_le_set_scan_rsp_data cp;
897 u8 len;
898
d7a5a11d 899 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
f14d8f64
MH
900 return;
901
902 memset(&cp, 0, sizeof(cp));
903
4117ed70 904 if (instance)
ca21fbe9 905 len = create_instance_scan_rsp_data(hdev, instance, cp.data);
4117ed70
AU
906 else
907 len = create_default_scan_rsp_data(hdev, cp.data);
f14d8f64 908
eb438b5f 909 if (hdev->scan_rsp_data_len == len &&
4117ed70 910 !memcmp(cp.data, hdev->scan_rsp_data, len))
f14d8f64
MH
911 return;
912
eb438b5f
JH
913 memcpy(hdev->scan_rsp_data, cp.data, sizeof(cp.data));
914 hdev->scan_rsp_data_len = len;
f14d8f64
MH
915
916 cp.length = len;
917
918 hci_req_add(req, HCI_OP_LE_SET_SCAN_RSP_DATA, sizeof(cp), &cp);
919}
920
4117ed70
AU
921static void update_scan_rsp_data(struct hci_request *req)
922{
efae002c 923 update_inst_scan_rsp_data(req, get_current_adv_instance(req->hdev));
4117ed70
AU
924}
925
9a43e25f
JH
926static u8 get_adv_discov_flags(struct hci_dev *hdev)
927{
3b0602cd 928 struct mgmt_pending_cmd *cmd;
9a43e25f
JH
929
930 /* If there's a pending mgmt command the flags will not yet have
931 * their final values, so check for this first.
932 */
333ae95d 933 cmd = pending_find(MGMT_OP_SET_DISCOVERABLE, hdev);
9a43e25f
JH
934 if (cmd) {
935 struct mgmt_mode *cp = cmd->param;
936 if (cp->val == 0x01)
937 return LE_AD_GENERAL;
938 else if (cp->val == 0x02)
939 return LE_AD_LIMITED;
940 } else {
d7a5a11d 941 if (hci_dev_test_flag(hdev, HCI_LIMITED_DISCOVERABLE))
9a43e25f 942 return LE_AD_LIMITED;
d7a5a11d 943 else if (hci_dev_test_flag(hdev, HCI_DISCOVERABLE))
9a43e25f
JH
944 return LE_AD_GENERAL;
945 }
946
947 return 0;
948}
949
fdf51784
AU
950static bool get_connectable(struct hci_dev *hdev)
951{
952 struct mgmt_pending_cmd *cmd;
441ad2d0 953
fdf51784
AU
954 /* If there's a pending mgmt command the flag will not yet have
955 * it's final value, so check for this first.
956 */
957 cmd = pending_find(MGMT_OP_SET_CONNECTABLE, hdev);
958 if (cmd) {
959 struct mgmt_mode *cp = cmd->param;
441ad2d0 960
fdf51784 961 return cp->val;
441ad2d0
MH
962 }
963
fdf51784
AU
964 return hci_dev_test_flag(hdev, HCI_CONNECTABLE);
965}
441ad2d0 966
fdf51784
AU
967static u32 get_adv_instance_flags(struct hci_dev *hdev, u8 instance)
968{
969 u32 flags;
411b4121 970 struct adv_info *adv_instance;
441ad2d0 971
bea28e65
FG
972 if (instance == 0x00) {
973 /* Instance 0 always manages the "Tx Power" and "Flags"
974 * fields
975 */
976 flags = MGMT_ADV_FLAG_TX_POWER | MGMT_ADV_FLAG_MANAGED_FLAGS;
411b4121 977
bea28e65
FG
978 /* For instance 0, the HCI_ADVERTISING_CONNECTABLE setting
979 * corresponds to the "connectable" instance flag.
980 */
981 if (hci_dev_test_flag(hdev, HCI_ADVERTISING_CONNECTABLE))
982 flags |= MGMT_ADV_FLAG_CONNECTABLE;
fdf51784 983
bea28e65 984 return flags;
411b4121 985 }
fdf51784 986
bea28e65 987 adv_instance = hci_find_adv_instance(hdev, instance);
fdf51784 988
bea28e65
FG
989 /* Return 0 when we got an invalid instance identifier. */
990 if (!adv_instance)
991 return 0;
fdf51784 992
bea28e65 993 return adv_instance->flags;
441ad2d0
MH
994}
995
7b683b74 996static u8 get_cur_adv_instance_scan_rsp_len(struct hci_dev *hdev)
c7d4883b 997{
7b683b74
FG
998 u8 instance = get_current_adv_instance(hdev);
999 struct adv_info *adv_instance;
1000
1001 /* Ignore instance 0 */
1002 if (instance == 0x00)
1003 return 0;
1004
1005 adv_instance = hci_find_adv_instance(hdev, instance);
1006 if (!adv_instance)
c7d4883b
AU
1007 return 0;
1008
1009 /* TODO: Take into account the "appearance" and "local-name" flags here.
1010 * These are currently being ignored as they are not supported.
1011 */
7b683b74 1012 return adv_instance->scan_rsp_len;
c7d4883b
AU
1013}
1014
fdf51784 1015static u8 create_instance_adv_data(struct hci_dev *hdev, u8 instance, u8 *ptr)
24b4f38f 1016{
f63ba24b 1017 struct adv_info *adv_instance = NULL;
b44133ff 1018 u8 ad_len = 0, flags = 0;
f63ba24b
FG
1019 u32 instance_flags;
1020
1021 /* Return 0 when the current instance identifier is invalid. */
1022 if (instance) {
1023 adv_instance = hci_find_adv_instance(hdev, instance);
1024 if (!adv_instance)
1025 return 0;
1026 }
1027
1028 instance_flags = get_adv_instance_flags(hdev, instance);
b44133ff 1029
807ec772
AU
1030 /* The Add Advertising command allows userspace to set both the general
1031 * and limited discoverable flags.
1032 */
fdf51784 1033 if (instance_flags & MGMT_ADV_FLAG_DISCOV)
b44133ff
AU
1034 flags |= LE_AD_GENERAL;
1035
fdf51784 1036 if (instance_flags & MGMT_ADV_FLAG_LIMITED_DISCOV)
807ec772
AU
1037 flags |= LE_AD_LIMITED;
1038
fdf51784 1039 if (flags || (instance_flags & MGMT_ADV_FLAG_MANAGED_FLAGS)) {
67e0c0cd
AU
1040 /* If a discovery flag wasn't provided, simply use the global
1041 * settings.
1042 */
1043 if (!flags)
1044 flags |= get_adv_discov_flags(hdev);
1045
b44133ff
AU
1046 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
1047 flags |= LE_AD_NO_BREDR;
1048
fdf51784
AU
1049 /* If flags would still be empty, then there is no need to
1050 * include the "Flags" AD field".
1051 */
1052 if (flags) {
1053 ptr[0] = 0x02;
1054 ptr[1] = EIR_FLAGS;
1055 ptr[2] = flags;
b44133ff 1056
fdf51784
AU
1057 ad_len += 3;
1058 ptr += 3;
1059 }
b44133ff
AU
1060 }
1061
f63ba24b
FG
1062 if (adv_instance) {
1063 memcpy(ptr, adv_instance->adv_data,
1064 adv_instance->adv_data_len);
1065 ad_len += adv_instance->adv_data_len;
1066 ptr += adv_instance->adv_data_len;
38c8af60
MH
1067 }
1068
fdf51784 1069 /* Provide Tx Power only if we can provide a valid value for it */
5507e358 1070 if (hdev->adv_tx_power != HCI_TX_POWER_INVALID &&
fdf51784 1071 (instance_flags & MGMT_ADV_FLAG_TX_POWER)) {
5507e358
AU
1072 ptr[0] = 0x02;
1073 ptr[1] = EIR_TX_POWER;
1074 ptr[2] = (u8)hdev->adv_tx_power;
1075
1076 ad_len += 3;
1077 ptr += 3;
1078 }
1079
b44133ff 1080 return ad_len;
24b4f38f
AU
1081}
1082
efae002c 1083static void update_inst_adv_data(struct hci_request *req, u8 instance)
441ad2d0
MH
1084{
1085 struct hci_dev *hdev = req->hdev;
1086 struct hci_cp_le_set_adv_data cp;
1087 u8 len;
1088
d7a5a11d 1089 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
441ad2d0
MH
1090 return;
1091
1092 memset(&cp, 0, sizeof(cp));
1093
fdf51784 1094 len = create_instance_adv_data(hdev, instance, cp.data);
441ad2d0 1095
24b4f38f 1096 /* There's nothing to do if the data hasn't changed */
441ad2d0
MH
1097 if (hdev->adv_data_len == len &&
1098 memcmp(cp.data, hdev->adv_data, len) == 0)
1099 return;
1100
1101 memcpy(hdev->adv_data, cp.data, sizeof(cp.data));
1102 hdev->adv_data_len = len;
1103
1104 cp.length = len;
1105
1106 hci_req_add(req, HCI_OP_LE_SET_ADV_DATA, sizeof(cp), &cp);
1107}
1108
e7a685d3
AU
1109static void update_adv_data(struct hci_request *req)
1110{
efae002c 1111 update_inst_adv_data(req, get_current_adv_instance(req->hdev));
24b4f38f
AU
1112}
1113
bc6d2d04
JH
1114int mgmt_update_adv_data(struct hci_dev *hdev)
1115{
1116 struct hci_request req;
1117
1118 hci_req_init(&req, hdev);
1119 update_adv_data(&req);
1120
1121 return hci_req_run(&req, NULL);
1122}
1123
ef580372
JH
1124static void create_eir(struct hci_dev *hdev, u8 *data)
1125{
1126 u8 *ptr = data;
ef580372
JH
1127 size_t name_len;
1128
1129 name_len = strlen(hdev->dev_name);
1130
1131 if (name_len > 0) {
1132 /* EIR Data type */
1133 if (name_len > 48) {
1134 name_len = 48;
1135 ptr[1] = EIR_NAME_SHORT;
1136 } else
1137 ptr[1] = EIR_NAME_COMPLETE;
1138
1139 /* EIR Data length */
1140 ptr[0] = name_len + 1;
1141
1142 memcpy(ptr + 2, hdev->dev_name, name_len);
1143
ef580372
JH
1144 ptr += (name_len + 2);
1145 }
1146
bbaf444a 1147 if (hdev->inq_tx_power != HCI_TX_POWER_INVALID) {
91c4e9b1
MH
1148 ptr[0] = 2;
1149 ptr[1] = EIR_TX_POWER;
1150 ptr[2] = (u8) hdev->inq_tx_power;
1151
91c4e9b1
MH
1152 ptr += 3;
1153 }
1154
2b9be137
MH
1155 if (hdev->devid_source > 0) {
1156 ptr[0] = 9;
1157 ptr[1] = EIR_DEVICE_ID;
1158
1159 put_unaligned_le16(hdev->devid_source, ptr + 2);
1160 put_unaligned_le16(hdev->devid_vendor, ptr + 4);
1161 put_unaligned_le16(hdev->devid_product, ptr + 6);
1162 put_unaligned_le16(hdev->devid_version, ptr + 8);
1163
2b9be137
MH
1164 ptr += 10;
1165 }
1166
213202ed 1167 ptr = create_uuid16_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
cdf1963f 1168 ptr = create_uuid32_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
c00d575b 1169 ptr = create_uuid128_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
ef580372
JH
1170}
1171
890ea898 1172static void update_eir(struct hci_request *req)
ef580372 1173{
890ea898 1174 struct hci_dev *hdev = req->hdev;
ef580372
JH
1175 struct hci_cp_write_eir cp;
1176
504c8dcd 1177 if (!hdev_is_powered(hdev))
890ea898 1178 return;
7770c4aa 1179
976eb20e 1180 if (!lmp_ext_inq_capable(hdev))
890ea898 1181 return;
ef580372 1182
d7a5a11d 1183 if (!hci_dev_test_flag(hdev, HCI_SSP_ENABLED))
890ea898 1184 return;
ef580372 1185
d7a5a11d 1186 if (hci_dev_test_flag(hdev, HCI_SERVICE_CACHE))
890ea898 1187 return;
ef580372
JH
1188
1189 memset(&cp, 0, sizeof(cp));
1190
1191 create_eir(hdev, cp.data);
1192
1193 if (memcmp(cp.data, hdev->eir, sizeof(cp.data)) == 0)
890ea898 1194 return;
ef580372
JH
1195
1196 memcpy(hdev->eir, cp.data, sizeof(cp.data));
1197
890ea898 1198 hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
ef580372
JH
1199}
1200
1201static u8 get_service_classes(struct hci_dev *hdev)
1202{
1203 struct bt_uuid *uuid;
1204 u8 val = 0;
1205
1206 list_for_each_entry(uuid, &hdev->uuids, list)
1207 val |= uuid->svc_hint;
1208
1209 return val;
1210}
1211
890ea898 1212static void update_class(struct hci_request *req)
ef580372 1213{
890ea898 1214 struct hci_dev *hdev = req->hdev;
ef580372
JH
1215 u8 cod[3];
1216
1217 BT_DBG("%s", hdev->name);
1218
504c8dcd 1219 if (!hdev_is_powered(hdev))
890ea898 1220 return;
7770c4aa 1221
d7a5a11d 1222 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
f87ea1da
JH
1223 return;
1224
d7a5a11d 1225 if (hci_dev_test_flag(hdev, HCI_SERVICE_CACHE))
890ea898 1226 return;
ef580372
JH
1227
1228 cod[0] = hdev->minor_class;
1229 cod[1] = hdev->major_class;
1230 cod[2] = get_service_classes(hdev);
1231
d7a5a11d 1232 if (hci_dev_test_flag(hdev, HCI_LIMITED_DISCOVERABLE))
6acd7db4
MH
1233 cod[1] |= 0x20;
1234
ef580372 1235 if (memcmp(cod, hdev->dev_class, 3) == 0)
890ea898 1236 return;
ef580372 1237
890ea898 1238 hci_req_add(req, HCI_OP_WRITE_CLASS_OF_DEV, sizeof(cod), cod);
ef580372
JH
1239}
1240
0ec5ae84
JH
1241static void disable_advertising(struct hci_request *req)
1242{
1243 u8 enable = 0x00;
1244
1245 hci_req_add(req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable), &enable);
1246}
1247
199a2fb1
JH
1248static void enable_advertising(struct hci_request *req)
1249{
1250 struct hci_dev *hdev = req->hdev;
1251 struct hci_cp_le_set_adv_param cp;
8f2a0601 1252 u8 own_addr_type, enable = 0x01;
a4858cb9 1253 bool connectable;
e7a685d3
AU
1254 u8 instance;
1255 u32 flags;
199a2fb1 1256
0ec5ae84
JH
1257 if (hci_conn_num(hdev, LE_LINK) > 0)
1258 return;
1259
d7a5a11d 1260 if (hci_dev_test_flag(hdev, HCI_LE_ADV))
0ec5ae84
JH
1261 disable_advertising(req);
1262
5ce194c4 1263 /* Clear the HCI_LE_ADV bit temporarily so that the
8d97250e
JH
1264 * hci_update_random_address knows that it's safe to go ahead
1265 * and write a new random address. The flag will be set back on
1266 * as soon as the SET_ADV_ENABLE HCI command completes.
1267 */
a358dc11 1268 hci_dev_clear_flag(hdev, HCI_LE_ADV);
8d97250e 1269
e7a685d3
AU
1270 instance = get_current_adv_instance(hdev);
1271 flags = get_adv_instance_flags(hdev, instance);
faccb950
AU
1272
1273 /* If the "connectable" instance flag was not set, then choose between
1274 * ADV_IND and ADV_NONCONN_IND based on the global connectable setting.
1275 */
1276 connectable = (flags & MGMT_ADV_FLAG_CONNECTABLE) ||
1277 get_connectable(hdev);
8f2a0601 1278
a4858cb9
JH
1279 /* Set require_privacy to true only when non-connectable
1280 * advertising is used. In that case it is fine to use a
1281 * non-resolvable private address.
1282 */
1283 if (hci_update_random_address(req, !connectable, &own_addr_type) < 0)
8f2a0601
JH
1284 return;
1285
41c90c18 1286 memset(&cp, 0, sizeof(cp));
628531c9
GL
1287 cp.min_interval = cpu_to_le16(hdev->le_adv_min_interval);
1288 cp.max_interval = cpu_to_le16(hdev->le_adv_max_interval);
c7d4883b
AU
1289
1290 if (connectable)
1291 cp.type = LE_ADV_IND;
7b683b74 1292 else if (get_cur_adv_instance_scan_rsp_len(hdev))
c7d4883b
AU
1293 cp.type = LE_ADV_SCAN_IND;
1294 else
1295 cp.type = LE_ADV_NONCONN_IND;
1296
8f2a0601 1297 cp.own_address_type = own_addr_type;
199a2fb1
JH
1298 cp.channel_map = hdev->le_adv_channel_map;
1299
1300 hci_req_add(req, HCI_OP_LE_SET_ADV_PARAM, sizeof(cp), &cp);
1301
1302 hci_req_add(req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable), &enable);
1303}
1304
7d78525d
JH
1305static void service_cache_off(struct work_struct *work)
1306{
1307 struct hci_dev *hdev = container_of(work, struct hci_dev,
04124681 1308 service_cache.work);
890ea898 1309 struct hci_request req;
7d78525d 1310
a69d8927 1311 if (!hci_dev_test_and_clear_flag(hdev, HCI_SERVICE_CACHE))
7d78525d
JH
1312 return;
1313
890ea898
JH
1314 hci_req_init(&req, hdev);
1315
7d78525d
JH
1316 hci_dev_lock(hdev);
1317
890ea898
JH
1318 update_eir(&req);
1319 update_class(&req);
7d78525d
JH
1320
1321 hci_dev_unlock(hdev);
890ea898
JH
1322
1323 hci_req_run(&req, NULL);
7d78525d
JH
1324}
1325
d6bfd59c
JH
1326static void rpa_expired(struct work_struct *work)
1327{
1328 struct hci_dev *hdev = container_of(work, struct hci_dev,
1329 rpa_expired.work);
1330 struct hci_request req;
1331
1332 BT_DBG("");
1333
a1536da2 1334 hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
d6bfd59c 1335
d7a5a11d 1336 if (!hci_dev_test_flag(hdev, HCI_ADVERTISING))
d6bfd59c
JH
1337 return;
1338
1339 /* The generation of a new RPA and programming it into the
1340 * controller happens in the enable_advertising() function.
1341 */
d6bfd59c 1342 hci_req_init(&req, hdev);
d6bfd59c 1343 enable_advertising(&req);
d6bfd59c
JH
1344 hci_req_run(&req, NULL);
1345}
1346
6a919082 1347static void mgmt_init_hdev(struct sock *sk, struct hci_dev *hdev)
7d78525d 1348{
238be788 1349 if (hci_dev_test_and_set_flag(hdev, HCI_MGMT))
6a919082
JH
1350 return;
1351
4f87da80 1352 INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off);
d6bfd59c 1353 INIT_DELAYED_WORK(&hdev->rpa_expired, rpa_expired);
7d78525d 1354
4f87da80
JH
1355 /* Non-mgmt controlled devices get this bit set
1356 * implicitly so that pairing works for them, however
1357 * for mgmt we require user-space to explicitly enable
1358 * it
1359 */
a358dc11 1360 hci_dev_clear_flag(hdev, HCI_BONDABLE);
7d78525d
JH
1361}
1362
0f4e68cf 1363static int read_controller_info(struct sock *sk, struct hci_dev *hdev,
04124681 1364 void *data, u16 data_len)
0381101f 1365{
a38528f1 1366 struct mgmt_rp_read_info rp;
f7b64e69 1367
bdb6d971 1368 BT_DBG("sock %p %s", sk, hdev->name);
f7b64e69 1369
09fd0de5 1370 hci_dev_lock(hdev);
f7b64e69 1371
dc4fe30b
JH
1372 memset(&rp, 0, sizeof(rp));
1373
69ab39ea 1374 bacpy(&rp.bdaddr, &hdev->bdaddr);
f7b64e69 1375
69ab39ea 1376 rp.version = hdev->hci_ver;
eb55ef07 1377 rp.manufacturer = cpu_to_le16(hdev->manufacturer);
69ab39ea
JH
1378
1379 rp.supported_settings = cpu_to_le32(get_supported_settings(hdev));
1380 rp.current_settings = cpu_to_le32(get_current_settings(hdev));
f7b64e69 1381
a38528f1 1382 memcpy(rp.dev_class, hdev->dev_class, 3);
f7b64e69 1383
dc4fe30b 1384 memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name));
27fcc362 1385 memcpy(rp.short_name, hdev->short_name, sizeof(hdev->short_name));
dc4fe30b 1386
09fd0de5 1387 hci_dev_unlock(hdev);
0381101f 1388
2a1afb5a
JH
1389 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_INFO, 0, &rp,
1390 sizeof(rp));
0381101f
JH
1391}
1392
69ab39ea 1393static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
8680570b 1394{
69ab39ea 1395 __le32 settings = cpu_to_le32(get_current_settings(hdev));
8680570b 1396
2a1afb5a
JH
1397 return mgmt_cmd_complete(sk, hdev->id, opcode, 0, &settings,
1398 sizeof(settings));
8680570b
JH
1399}
1400
1904a853 1401static void clean_up_hci_complete(struct hci_dev *hdev, u8 status, u16 opcode)
8b064a3a
JH
1402{
1403 BT_DBG("%s status 0x%02x", hdev->name, status);
1404
a3172b7e
JH
1405 if (hci_conn_count(hdev) == 0) {
1406 cancel_delayed_work(&hdev->power_off);
8b064a3a 1407 queue_work(hdev->req_workqueue, &hdev->power_off.work);
a3172b7e 1408 }
8b064a3a
JH
1409}
1410
23a48093 1411static bool hci_stop_discovery(struct hci_request *req)
21a60d30
JH
1412{
1413 struct hci_dev *hdev = req->hdev;
1414 struct hci_cp_remote_name_req_cancel cp;
1415 struct inquiry_entry *e;
1416
1417 switch (hdev->discovery.state) {
1418 case DISCOVERY_FINDING:
07d2334a 1419 if (test_bit(HCI_INQUIRY, &hdev->flags))
21a60d30 1420 hci_req_add(req, HCI_OP_INQUIRY_CANCEL, 0, NULL);
07d2334a
JP
1421
1422 if (hci_dev_test_flag(hdev, HCI_LE_SCAN)) {
21a60d30
JH
1423 cancel_delayed_work(&hdev->le_scan_disable);
1424 hci_req_add_le_scan_disable(req);
1425 }
1426
23a48093 1427 return true;
21a60d30
JH
1428
1429 case DISCOVERY_RESOLVING:
1430 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY,
1431 NAME_PENDING);
1432 if (!e)
23a48093 1433 break;
21a60d30
JH
1434
1435 bacpy(&cp.bdaddr, &e->data.bdaddr);
1436 hci_req_add(req, HCI_OP_REMOTE_NAME_REQ_CANCEL, sizeof(cp),
1437 &cp);
1438
23a48093 1439 return true;
21a60d30
JH
1440
1441 default:
1442 /* Passive scanning */
d7a5a11d 1443 if (hci_dev_test_flag(hdev, HCI_LE_SCAN)) {
21a60d30 1444 hci_req_add_le_scan_disable(req);
23a48093
JH
1445 return true;
1446 }
1447
21a60d30
JH
1448 break;
1449 }
23a48093
JH
1450
1451 return false;
21a60d30
JH
1452}
1453
912098a6
AU
1454static void advertising_added(struct sock *sk, struct hci_dev *hdev,
1455 u8 instance)
1456{
1457 struct mgmt_ev_advertising_added ev;
1458
1459 ev.instance = instance;
1460
1461 mgmt_event(MGMT_EV_ADVERTISING_ADDED, hdev, &ev, sizeof(ev), sk);
1462}
1463
1464static void advertising_removed(struct sock *sk, struct hci_dev *hdev,
1465 u8 instance)
1466{
1467 struct mgmt_ev_advertising_removed ev;
1468
1469 ev.instance = instance;
1470
1471 mgmt_event(MGMT_EV_ADVERTISING_REMOVED, hdev, &ev, sizeof(ev), sk);
1472}
1473
7816b820
FG
1474static int schedule_adv_instance(struct hci_request *req, u8 instance,
1475 bool force) {
1476 struct hci_dev *hdev = req->hdev;
1477 struct adv_info *adv_instance = NULL;
1478 u16 timeout;
1479
1480 if (hci_dev_test_flag(hdev, HCI_ADVERTISING) ||
1481 !hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE))
1482 return -EPERM;
1483
1484 if (hdev->adv_instance_timeout)
1485 return -EBUSY;
1486
1487 adv_instance = hci_find_adv_instance(hdev, instance);
1488 if (!adv_instance)
1489 return -ENOENT;
1490
1491 /* A zero timeout means unlimited advertising. As long as there is
1492 * only one instance, duration should be ignored. We still set a timeout
1493 * in case further instances are being added later on.
1494 *
1495 * If the remaining lifetime of the instance is more than the duration
1496 * then the timeout corresponds to the duration, otherwise it will be
1497 * reduced to the remaining instance lifetime.
1498 */
1499 if (adv_instance->timeout == 0 ||
1500 adv_instance->duration <= adv_instance->remaining_time)
1501 timeout = adv_instance->duration;
1502 else
1503 timeout = adv_instance->remaining_time;
1504
1505 /* The remaining time is being reduced unless the instance is being
1506 * advertised without time limit.
1507 */
1508 if (adv_instance->timeout)
1509 adv_instance->remaining_time =
1510 adv_instance->remaining_time - timeout;
1511
1512 hdev->adv_instance_timeout = timeout;
1513 queue_delayed_work(hdev->workqueue,
1514 &hdev->adv_instance_expire,
1515 msecs_to_jiffies(timeout * 1000));
1516
1517 /* If we're just re-scheduling the same instance again then do not
1518 * execute any HCI commands. This happens when a single instance is
1519 * being advertised.
1520 */
1521 if (!force && hdev->cur_adv_instance == instance &&
1522 hci_dev_test_flag(hdev, HCI_LE_ADV))
1523 return 0;
1524
1525 hdev->cur_adv_instance = instance;
1526 update_adv_data(req);
1527 update_scan_rsp_data(req);
1528 enable_advertising(req);
1529
1530 return 0;
1531}
1532
1533static void cancel_adv_timeout(struct hci_dev *hdev)
1534{
1535 if (hdev->adv_instance_timeout) {
1536 hdev->adv_instance_timeout = 0;
1537 cancel_delayed_work(&hdev->adv_instance_expire);
1538 }
1539}
1540
847818d9
FG
1541/* For a single instance:
1542 * - force == true: The instance will be removed even when its remaining
1543 * lifetime is not zero.
1544 * - force == false: the instance will be deactivated but kept stored unless
1545 * the remaining lifetime is zero.
1546 *
1547 * For instance == 0x00:
1548 * - force == true: All instances will be removed regardless of their timeout
1549 * setting.
1550 * - force == false: Only instances that have a timeout will be removed.
1551 */
1552static void clear_adv_instance(struct hci_dev *hdev, struct hci_request *req,
1553 u8 instance, bool force)
912098a6 1554{
847818d9
FG
1555 struct adv_info *adv_instance, *n, *next_instance = NULL;
1556 int err;
1557 u8 rem_inst;
912098a6 1558
847818d9
FG
1559 /* Cancel any timeout concerning the removed instance(s). */
1560 if (!instance || hdev->cur_adv_instance == instance)
1561 cancel_adv_timeout(hdev);
912098a6 1562
847818d9
FG
1563 /* Get the next instance to advertise BEFORE we remove
1564 * the current one. This can be the same instance again
1565 * if there is only one instance.
1566 */
1567 if (instance && hdev->cur_adv_instance == instance)
1568 next_instance = hci_get_next_instance(hdev, instance);
912098a6 1569
847818d9
FG
1570 if (instance == 0x00) {
1571 list_for_each_entry_safe(adv_instance, n, &hdev->adv_instances,
1572 list) {
1573 if (!(force || adv_instance->timeout))
1574 continue;
912098a6 1575
847818d9
FG
1576 rem_inst = adv_instance->instance;
1577 err = hci_remove_adv_instance(hdev, rem_inst);
1578 if (!err)
1579 advertising_removed(NULL, hdev, rem_inst);
1580 }
1581 hdev->cur_adv_instance = 0x00;
1582 } else {
1583 adv_instance = hci_find_adv_instance(hdev, instance);
1584
1585 if (force || (adv_instance && adv_instance->timeout &&
1586 !adv_instance->remaining_time)) {
1587 /* Don't advertise a removed instance. */
1588 if (next_instance &&
1589 next_instance->instance == instance)
1590 next_instance = NULL;
1591
1592 err = hci_remove_adv_instance(hdev, instance);
1593 if (!err)
1594 advertising_removed(NULL, hdev, instance);
1595 }
1596 }
1597
1598 if (list_empty(&hdev->adv_instances)) {
1599 hdev->cur_adv_instance = 0x00;
1600 hci_dev_clear_flag(hdev, HCI_ADVERTISING_INSTANCE);
1601 }
1602
1603 if (!req || !hdev_is_powered(hdev) ||
912098a6
AU
1604 hci_dev_test_flag(hdev, HCI_ADVERTISING))
1605 return;
1606
847818d9
FG
1607 if (next_instance)
1608 schedule_adv_instance(req, next_instance->instance, false);
912098a6
AU
1609}
1610
8b064a3a
JH
1611static int clean_up_hci_state(struct hci_dev *hdev)
1612{
1613 struct hci_request req;
1614 struct hci_conn *conn;
23a48093
JH
1615 bool discov_stopped;
1616 int err;
8b064a3a
JH
1617
1618 hci_req_init(&req, hdev);
1619
1620 if (test_bit(HCI_ISCAN, &hdev->flags) ||
1621 test_bit(HCI_PSCAN, &hdev->flags)) {
1622 u8 scan = 0x00;
1623 hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
1624 }
1625
847818d9 1626 clear_adv_instance(hdev, NULL, 0x00, false);
912098a6 1627
d7a5a11d 1628 if (hci_dev_test_flag(hdev, HCI_LE_ADV))
8b064a3a
JH
1629 disable_advertising(&req);
1630
23a48093 1631 discov_stopped = hci_stop_discovery(&req);
8b064a3a
JH
1632
1633 list_for_each_entry(conn, &hdev->conn_hash.list, list) {
1634 struct hci_cp_disconnect dc;
c9910d0f
JH
1635 struct hci_cp_reject_conn_req rej;
1636
1637 switch (conn->state) {
1638 case BT_CONNECTED:
1639 case BT_CONFIG:
1640 dc.handle = cpu_to_le16(conn->handle);
1641 dc.reason = 0x15; /* Terminated due to Power Off */
1642 hci_req_add(&req, HCI_OP_DISCONNECT, sizeof(dc), &dc);
1643 break;
1644 case BT_CONNECT:
1645 if (conn->type == LE_LINK)
1646 hci_req_add(&req, HCI_OP_LE_CREATE_CONN_CANCEL,
1647 0, NULL);
1648 else if (conn->type == ACL_LINK)
1649 hci_req_add(&req, HCI_OP_CREATE_CONN_CANCEL,
1650 6, &conn->dst);
1651 break;
1652 case BT_CONNECT2:
1653 bacpy(&rej.bdaddr, &conn->dst);
1654 rej.reason = 0x15; /* Terminated due to Power Off */
1655 if (conn->type == ACL_LINK)
1656 hci_req_add(&req, HCI_OP_REJECT_CONN_REQ,
1657 sizeof(rej), &rej);
1658 else if (conn->type == SCO_LINK)
1659 hci_req_add(&req, HCI_OP_REJECT_SYNC_CONN_REQ,
1660 sizeof(rej), &rej);
1661 break;
1662 }
8b064a3a
JH
1663 }
1664
23a48093
JH
1665 err = hci_req_run(&req, clean_up_hci_complete);
1666 if (!err && discov_stopped)
1667 hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
1668
1669 return err;
8b064a3a
JH
1670}
1671
bdb6d971 1672static int set_powered(struct sock *sk, struct hci_dev *hdev, void *data,
04124681 1673 u16 len)
eec8d2bc 1674{
650f726d 1675 struct mgmt_mode *cp = data;
3b0602cd 1676 struct mgmt_pending_cmd *cmd;
4b34ee78 1677 int err;
eec8d2bc 1678
bdb6d971 1679 BT_DBG("request for %s", hdev->name);
eec8d2bc 1680
a7e80f25 1681 if (cp->val != 0x00 && cp->val != 0x01)
a69e8375
JH
1682 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
1683 MGMT_STATUS_INVALID_PARAMS);
a7e80f25 1684
09fd0de5 1685 hci_dev_lock(hdev);
eec8d2bc 1686
333ae95d 1687 if (pending_find(MGMT_OP_SET_POWERED, hdev)) {
a69e8375
JH
1688 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
1689 MGMT_STATUS_BUSY);
87b95ba6
JH
1690 goto failed;
1691 }
1692
a69d8927 1693 if (hci_dev_test_and_clear_flag(hdev, HCI_AUTO_OFF)) {
f0d4b78a
MH
1694 cancel_delayed_work(&hdev->power_off);
1695
1696 if (cp->val) {
a1d70450
JH
1697 mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev,
1698 data, len);
1699 err = mgmt_powered(hdev, 1);
f0d4b78a
MH
1700 goto failed;
1701 }
1702 }
1703
4b34ee78 1704 if (!!cp->val == hdev_is_powered(hdev)) {
69ab39ea 1705 err = send_settings_rsp(sk, MGMT_OP_SET_POWERED, hdev);
eec8d2bc
JH
1706 goto failed;
1707 }
1708
2e58ef3e 1709 cmd = mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev, data, len);
366a0336
JH
1710 if (!cmd) {
1711 err = -ENOMEM;
eec8d2bc 1712 goto failed;
366a0336 1713 }
eec8d2bc 1714
8b064a3a 1715 if (cp->val) {
19202573 1716 queue_work(hdev->req_workqueue, &hdev->power_on);
8b064a3a
JH
1717 err = 0;
1718 } else {
1719 /* Disconnect connections, stop scans, etc */
1720 err = clean_up_hci_state(hdev);
a3172b7e
JH
1721 if (!err)
1722 queue_delayed_work(hdev->req_workqueue, &hdev->power_off,
1723 HCI_POWER_OFF_TIMEOUT);
eec8d2bc 1724
8b064a3a
JH
1725 /* ENODATA means there were no HCI commands queued */
1726 if (err == -ENODATA) {
a3172b7e 1727 cancel_delayed_work(&hdev->power_off);
8b064a3a
JH
1728 queue_work(hdev->req_workqueue, &hdev->power_off.work);
1729 err = 0;
1730 }
1731 }
eec8d2bc
JH
1732
1733failed:
09fd0de5 1734 hci_dev_unlock(hdev);
366a0336 1735 return err;
eec8d2bc
JH
1736}
1737
beadb2bd
JH
1738static int new_settings(struct hci_dev *hdev, struct sock *skip)
1739{
f6b7712e 1740 __le32 ev = cpu_to_le32(get_current_settings(hdev));
beadb2bd 1741
f6b7712e
MH
1742 return mgmt_generic_event(MGMT_EV_NEW_SETTINGS, hdev, &ev,
1743 sizeof(ev), skip);
beadb2bd
JH
1744}
1745
91a668b0
JH
1746int mgmt_new_settings(struct hci_dev *hdev)
1747{
1748 return new_settings(hdev, NULL);
1749}
1750
bd99abdd
JH
1751struct cmd_lookup {
1752 struct sock *sk;
1753 struct hci_dev *hdev;
1754 u8 mgmt_status;
1755};
1756
3b0602cd 1757static void settings_rsp(struct mgmt_pending_cmd *cmd, void *data)
bd99abdd
JH
1758{
1759 struct cmd_lookup *match = data;
1760
1761 send_settings_rsp(cmd->sk, cmd->opcode, match->hdev);
1762
1763 list_del(&cmd->list);
1764
1765 if (match->sk == NULL) {
1766 match->sk = cmd->sk;
1767 sock_hold(match->sk);
1768 }
1769
1770 mgmt_pending_free(cmd);
1771}
1772
3b0602cd 1773static void cmd_status_rsp(struct mgmt_pending_cmd *cmd, void *data)
bd99abdd
JH
1774{
1775 u8 *status = data;
1776
a69e8375 1777 mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, *status);
bd99abdd
JH
1778 mgmt_pending_remove(cmd);
1779}
1780
3b0602cd 1781static void cmd_complete_rsp(struct mgmt_pending_cmd *cmd, void *data)
1b9b5ee5
JH
1782{
1783 if (cmd->cmd_complete) {
1784 u8 *status = data;
1785
1786 cmd->cmd_complete(cmd, *status);
1787 mgmt_pending_remove(cmd);
1788
1789 return;
1790 }
1791
1792 cmd_status_rsp(cmd, data);
1793}
1794
3b0602cd 1795static int generic_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
f5818c22 1796{
2a1afb5a
JH
1797 return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status,
1798 cmd->param, cmd->param_len);
f5818c22
JH
1799}
1800
3b0602cd 1801static int addr_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
7776d1d8 1802{
2a1afb5a
JH
1803 return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status,
1804 cmd->param, sizeof(struct mgmt_addr_info));
7776d1d8
JH
1805}
1806
e6fe7986
JH
1807static u8 mgmt_bredr_support(struct hci_dev *hdev)
1808{
1809 if (!lmp_bredr_capable(hdev))
1810 return MGMT_STATUS_NOT_SUPPORTED;
d7a5a11d 1811 else if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
e6fe7986
JH
1812 return MGMT_STATUS_REJECTED;
1813 else
1814 return MGMT_STATUS_SUCCESS;
1815}
1816
1817static u8 mgmt_le_support(struct hci_dev *hdev)
1818{
1819 if (!lmp_le_capable(hdev))
1820 return MGMT_STATUS_NOT_SUPPORTED;
d7a5a11d 1821 else if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
e6fe7986
JH
1822 return MGMT_STATUS_REJECTED;
1823 else
1824 return MGMT_STATUS_SUCCESS;
1825}
1826
1904a853
MH
1827static void set_discoverable_complete(struct hci_dev *hdev, u8 status,
1828 u16 opcode)
bfaf8c9f 1829{
3b0602cd 1830 struct mgmt_pending_cmd *cmd;
bfaf8c9f 1831 struct mgmt_mode *cp;
970ba524 1832 struct hci_request req;
bfaf8c9f
JH
1833 bool changed;
1834
1835 BT_DBG("status 0x%02x", status);
1836
1837 hci_dev_lock(hdev);
1838
333ae95d 1839 cmd = pending_find(MGMT_OP_SET_DISCOVERABLE, hdev);
bfaf8c9f
JH
1840 if (!cmd)
1841 goto unlock;
1842
1843 if (status) {
1844 u8 mgmt_err = mgmt_status(status);
a69e8375 1845 mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
a358dc11 1846 hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
bfaf8c9f
JH
1847 goto remove_cmd;
1848 }
1849
1850 cp = cmd->param;
d4462a07 1851 if (cp->val) {
238be788 1852 changed = !hci_dev_test_and_set_flag(hdev, HCI_DISCOVERABLE);
d4462a07
MH
1853
1854 if (hdev->discov_timeout > 0) {
1855 int to = msecs_to_jiffies(hdev->discov_timeout * 1000);
1856 queue_delayed_work(hdev->workqueue, &hdev->discov_off,
1857 to);
1858 }
1859 } else {
a69d8927 1860 changed = hci_dev_test_and_clear_flag(hdev, HCI_DISCOVERABLE);
d4462a07 1861 }
bfaf8c9f
JH
1862
1863 send_settings_rsp(cmd->sk, MGMT_OP_SET_DISCOVERABLE, hdev);
1864
1865 if (changed)
1866 new_settings(hdev, cmd->sk);
1867
970ba524
MH
1868 /* When the discoverable mode gets changed, make sure
1869 * that class of device has the limited discoverable
432df05e
JH
1870 * bit correctly set. Also update page scan based on whitelist
1871 * entries.
970ba524
MH
1872 */
1873 hci_req_init(&req, hdev);
1d2dc5b7 1874 __hci_update_page_scan(&req);
970ba524
MH
1875 update_class(&req);
1876 hci_req_run(&req, NULL);
1877
bfaf8c9f
JH
1878remove_cmd:
1879 mgmt_pending_remove(cmd);
1880
1881unlock:
1882 hci_dev_unlock(hdev);
1883}
1884
bdb6d971 1885static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
04124681 1886 u16 len)
73f22f62 1887{
650f726d 1888 struct mgmt_cp_set_discoverable *cp = data;
3b0602cd 1889 struct mgmt_pending_cmd *cmd;
bfaf8c9f 1890 struct hci_request req;
5e5282bb 1891 u16 timeout;
9a43e25f 1892 u8 scan;
73f22f62
JH
1893 int err;
1894
bdb6d971 1895 BT_DBG("request for %s", hdev->name);
73f22f62 1896
d7a5a11d
MH
1897 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED) &&
1898 !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
a69e8375
JH
1899 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1900 MGMT_STATUS_REJECTED);
33c525c0 1901
310a3d48 1902 if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
a69e8375
JH
1903 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1904 MGMT_STATUS_INVALID_PARAMS);
a7e80f25 1905
1f350c87 1906 timeout = __le16_to_cpu(cp->timeout);
310a3d48
MH
1907
1908 /* Disabling discoverable requires that no timeout is set,
1909 * and enabling limited discoverable requires a timeout.
1910 */
1911 if ((cp->val == 0x00 && timeout > 0) ||
1912 (cp->val == 0x02 && timeout == 0))
a69e8375
JH
1913 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1914 MGMT_STATUS_INVALID_PARAMS);
73f22f62 1915
09fd0de5 1916 hci_dev_lock(hdev);
73f22f62 1917
5e5282bb 1918 if (!hdev_is_powered(hdev) && timeout > 0) {
a69e8375
JH
1919 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1920 MGMT_STATUS_NOT_POWERED);
73f22f62
JH
1921 goto failed;
1922 }
1923
333ae95d
JH
1924 if (pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
1925 pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
a69e8375
JH
1926 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1927 MGMT_STATUS_BUSY);
73f22f62
JH
1928 goto failed;
1929 }
1930
d7a5a11d 1931 if (!hci_dev_test_flag(hdev, HCI_CONNECTABLE)) {
a69e8375
JH
1932 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1933 MGMT_STATUS_REJECTED);
5e5282bb
JH
1934 goto failed;
1935 }
1936
1937 if (!hdev_is_powered(hdev)) {
0224d2fa
JH
1938 bool changed = false;
1939
310a3d48
MH
1940 /* Setting limited discoverable when powered off is
1941 * not a valid operation since it requires a timeout
1942 * and so no need to check HCI_LIMITED_DISCOVERABLE.
1943 */
d7a5a11d 1944 if (!!cp->val != hci_dev_test_flag(hdev, HCI_DISCOVERABLE)) {
ce05d603 1945 hci_dev_change_flag(hdev, HCI_DISCOVERABLE);
0224d2fa
JH
1946 changed = true;
1947 }
1948
5e5282bb 1949 err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
0224d2fa
JH
1950 if (err < 0)
1951 goto failed;
1952
1953 if (changed)
1954 err = new_settings(hdev, sk);
1955
5e5282bb
JH
1956 goto failed;
1957 }
1958
310a3d48
MH
1959 /* If the current mode is the same, then just update the timeout
1960 * value with the new value. And if only the timeout gets updated,
1961 * then no need for any HCI transactions.
1962 */
d7a5a11d
MH
1963 if (!!cp->val == hci_dev_test_flag(hdev, HCI_DISCOVERABLE) &&
1964 (cp->val == 0x02) == hci_dev_test_flag(hdev,
1965 HCI_LIMITED_DISCOVERABLE)) {
36261547
MH
1966 cancel_delayed_work(&hdev->discov_off);
1967 hdev->discov_timeout = timeout;
955638ec 1968
36261547
MH
1969 if (cp->val && hdev->discov_timeout > 0) {
1970 int to = msecs_to_jiffies(hdev->discov_timeout * 1000);
955638ec 1971 queue_delayed_work(hdev->workqueue, &hdev->discov_off,
36261547 1972 to);
955638ec
MH
1973 }
1974
69ab39ea 1975 err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
73f22f62
JH
1976 goto failed;
1977 }
1978
2e58ef3e 1979 cmd = mgmt_pending_add(sk, MGMT_OP_SET_DISCOVERABLE, hdev, data, len);
366a0336
JH
1980 if (!cmd) {
1981 err = -ENOMEM;
73f22f62 1982 goto failed;
366a0336 1983 }
73f22f62 1984
310a3d48
MH
1985 /* Cancel any potential discoverable timeout that might be
1986 * still active and store new timeout value. The arming of
1987 * the timeout happens in the complete handler.
1988 */
1989 cancel_delayed_work(&hdev->discov_off);
1990 hdev->discov_timeout = timeout;
1991
b456f87c
JH
1992 /* Limited discoverable mode */
1993 if (cp->val == 0x02)
a1536da2 1994 hci_dev_set_flag(hdev, HCI_LIMITED_DISCOVERABLE);
b456f87c 1995 else
a358dc11 1996 hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
b456f87c 1997
bfaf8c9f
JH
1998 hci_req_init(&req, hdev);
1999
9a43e25f
JH
2000 /* The procedure for LE-only controllers is much simpler - just
2001 * update the advertising data.
2002 */
d7a5a11d 2003 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
9a43e25f
JH
2004 goto update_ad;
2005
73f22f62
JH
2006 scan = SCAN_PAGE;
2007
310a3d48
MH
2008 if (cp->val) {
2009 struct hci_cp_write_current_iac_lap hci_cp;
2010
2011 if (cp->val == 0x02) {
2012 /* Limited discoverable mode */
33337dcb 2013 hci_cp.num_iac = min_t(u8, hdev->num_iac, 2);
310a3d48
MH
2014 hci_cp.iac_lap[0] = 0x00; /* LIAC */
2015 hci_cp.iac_lap[1] = 0x8b;
2016 hci_cp.iac_lap[2] = 0x9e;
2017 hci_cp.iac_lap[3] = 0x33; /* GIAC */
2018 hci_cp.iac_lap[4] = 0x8b;
2019 hci_cp.iac_lap[5] = 0x9e;
2020 } else {
2021 /* General discoverable mode */
310a3d48
MH
2022 hci_cp.num_iac = 1;
2023 hci_cp.iac_lap[0] = 0x33; /* GIAC */
2024 hci_cp.iac_lap[1] = 0x8b;
2025 hci_cp.iac_lap[2] = 0x9e;
2026 }
2027
2028 hci_req_add(&req, HCI_OP_WRITE_CURRENT_IAC_LAP,
2029 (hci_cp.num_iac * 3) + 1, &hci_cp);
2030
73f22f62 2031 scan |= SCAN_INQUIRY;
310a3d48 2032 } else {
a358dc11 2033 hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
310a3d48 2034 }
73f22f62 2035
310a3d48 2036 hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, sizeof(scan), &scan);
bfaf8c9f 2037
9a43e25f
JH
2038update_ad:
2039 update_adv_data(&req);
2040
bfaf8c9f 2041 err = hci_req_run(&req, set_discoverable_complete);
73f22f62 2042 if (err < 0)
a664b5bc 2043 mgmt_pending_remove(cmd);
73f22f62
JH
2044
2045failed:
09fd0de5 2046 hci_dev_unlock(hdev);
73f22f62
JH
2047 return err;
2048}
2049
406d7804
JH
2050static void write_fast_connectable(struct hci_request *req, bool enable)
2051{
bd98b996 2052 struct hci_dev *hdev = req->hdev;
406d7804
JH
2053 struct hci_cp_write_page_scan_activity acp;
2054 u8 type;
2055
d7a5a11d 2056 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
547003b1
JH
2057 return;
2058
4c01f8b8
JH
2059 if (hdev->hci_ver < BLUETOOTH_VER_1_2)
2060 return;
2061
406d7804
JH
2062 if (enable) {
2063 type = PAGE_SCAN_TYPE_INTERLACED;
2064
2065 /* 160 msec page scan interval */
dcf4adbf 2066 acp.interval = cpu_to_le16(0x0100);
406d7804
JH
2067 } else {
2068 type = PAGE_SCAN_TYPE_STANDARD; /* default */
2069
2070 /* default 1.28 sec page scan */
dcf4adbf 2071 acp.interval = cpu_to_le16(0x0800);
406d7804
JH
2072 }
2073
dcf4adbf 2074 acp.window = cpu_to_le16(0x0012);
406d7804 2075
bd98b996
JH
2076 if (__cpu_to_le16(hdev->page_scan_interval) != acp.interval ||
2077 __cpu_to_le16(hdev->page_scan_window) != acp.window)
2078 hci_req_add(req, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY,
2079 sizeof(acp), &acp);
2080
2081 if (hdev->page_scan_type != type)
2082 hci_req_add(req, HCI_OP_WRITE_PAGE_SCAN_TYPE, 1, &type);
406d7804
JH
2083}
2084
1904a853
MH
2085static void set_connectable_complete(struct hci_dev *hdev, u8 status,
2086 u16 opcode)
2b76f453 2087{
3b0602cd 2088 struct mgmt_pending_cmd *cmd;
d7b856f9 2089 struct mgmt_mode *cp;
bc6d2d04 2090 bool conn_changed, discov_changed;
2b76f453
JH
2091
2092 BT_DBG("status 0x%02x", status);
2093
2094 hci_dev_lock(hdev);
2095
333ae95d 2096 cmd = pending_find(MGMT_OP_SET_CONNECTABLE, hdev);
2b76f453
JH
2097 if (!cmd)
2098 goto unlock;
2099
37438c1f
JH
2100 if (status) {
2101 u8 mgmt_err = mgmt_status(status);
a69e8375 2102 mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
37438c1f
JH
2103 goto remove_cmd;
2104 }
2105
d7b856f9 2106 cp = cmd->param;
bc6d2d04 2107 if (cp->val) {
238be788
MH
2108 conn_changed = !hci_dev_test_and_set_flag(hdev,
2109 HCI_CONNECTABLE);
bc6d2d04
JH
2110 discov_changed = false;
2111 } else {
a69d8927
MH
2112 conn_changed = hci_dev_test_and_clear_flag(hdev,
2113 HCI_CONNECTABLE);
2114 discov_changed = hci_dev_test_and_clear_flag(hdev,
2115 HCI_DISCOVERABLE);
bc6d2d04 2116 }
d7b856f9 2117
2b76f453
JH
2118 send_settings_rsp(cmd->sk, MGMT_OP_SET_CONNECTABLE, hdev);
2119
bc6d2d04 2120 if (conn_changed || discov_changed) {
d7b856f9 2121 new_settings(hdev, cmd->sk);
1d2dc5b7 2122 hci_update_page_scan(hdev);
bc6d2d04
JH
2123 if (discov_changed)
2124 mgmt_update_adv_data(hdev);
2b7be33e
JH
2125 hci_update_background_scan(hdev);
2126 }
d7b856f9 2127
37438c1f 2128remove_cmd:
2b76f453
JH
2129 mgmt_pending_remove(cmd);
2130
2131unlock:
2132 hci_dev_unlock(hdev);
2133}
2134
e8ba3a1f
JH
2135static int set_connectable_update_settings(struct hci_dev *hdev,
2136 struct sock *sk, u8 val)
2137{
2138 bool changed = false;
2139 int err;
2140
d7a5a11d 2141 if (!!val != hci_dev_test_flag(hdev, HCI_CONNECTABLE))
e8ba3a1f
JH
2142 changed = true;
2143
2144 if (val) {
a1536da2 2145 hci_dev_set_flag(hdev, HCI_CONNECTABLE);
e8ba3a1f 2146 } else {
a358dc11
MH
2147 hci_dev_clear_flag(hdev, HCI_CONNECTABLE);
2148 hci_dev_clear_flag(hdev, HCI_DISCOVERABLE);
e8ba3a1f
JH
2149 }
2150
2151 err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
2152 if (err < 0)
2153 return err;
2154
562064e6 2155 if (changed) {
1d2dc5b7 2156 hci_update_page_scan(hdev);
562064e6 2157 hci_update_background_scan(hdev);
e8ba3a1f 2158 return new_settings(hdev, sk);
562064e6 2159 }
e8ba3a1f
JH
2160
2161 return 0;
2162}
2163
bdb6d971 2164static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
04124681 2165 u16 len)
9fbcbb45 2166{
650f726d 2167 struct mgmt_mode *cp = data;
3b0602cd 2168 struct mgmt_pending_cmd *cmd;
2b76f453 2169 struct hci_request req;
1987fdc7 2170 u8 scan;
9fbcbb45
JH
2171 int err;
2172
bdb6d971 2173 BT_DBG("request for %s", hdev->name);
9fbcbb45 2174
d7a5a11d
MH
2175 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED) &&
2176 !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
a69e8375
JH
2177 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
2178 MGMT_STATUS_REJECTED);
33c525c0 2179
a7e80f25 2180 if (cp->val != 0x00 && cp->val != 0x01)
a69e8375
JH
2181 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
2182 MGMT_STATUS_INVALID_PARAMS);
a7e80f25 2183
09fd0de5 2184 hci_dev_lock(hdev);
9fbcbb45 2185
4b34ee78 2186 if (!hdev_is_powered(hdev)) {
e8ba3a1f 2187 err = set_connectable_update_settings(hdev, sk, cp->val);
9fbcbb45
JH
2188 goto failed;
2189 }
2190
333ae95d
JH
2191 if (pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
2192 pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
a69e8375
JH
2193 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
2194 MGMT_STATUS_BUSY);
9fbcbb45
JH
2195 goto failed;
2196 }
2197
2e58ef3e 2198 cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, hdev, data, len);
366a0336
JH
2199 if (!cmd) {
2200 err = -ENOMEM;
9fbcbb45 2201 goto failed;
366a0336 2202 }
9fbcbb45 2203
9b74246f 2204 hci_req_init(&req, hdev);
9fbcbb45 2205
9a43e25f
JH
2206 /* If BR/EDR is not enabled and we disable advertising as a
2207 * by-product of disabling connectable, we need to update the
2208 * advertising flags.
2209 */
d7a5a11d 2210 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
9a43e25f 2211 if (!cp->val) {
a358dc11
MH
2212 hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
2213 hci_dev_clear_flag(hdev, HCI_DISCOVERABLE);
9a43e25f
JH
2214 }
2215 update_adv_data(&req);
2216 } else if (cp->val != test_bit(HCI_PSCAN, &hdev->flags)) {
9b74246f
JH
2217 if (cp->val) {
2218 scan = SCAN_PAGE;
2219 } else {
3bd27240
JH
2220 /* If we don't have any whitelist entries just
2221 * disable all scanning. If there are entries
2222 * and we had both page and inquiry scanning
2223 * enabled then fall back to only page scanning.
2224 * Otherwise no changes are needed.
2225 */
2226 if (list_empty(&hdev->whitelist))
2227 scan = SCAN_DISABLED;
2228 else if (test_bit(HCI_ISCAN, &hdev->flags))
2229 scan = SCAN_PAGE;
2230 else
2231 goto no_scan_update;
9b74246f
JH
2232
2233 if (test_bit(HCI_ISCAN, &hdev->flags) &&
8d6083fe 2234 hdev->discov_timeout > 0)
9b74246f
JH
2235 cancel_delayed_work(&hdev->discov_off);
2236 }
2b76f453 2237
9b74246f
JH
2238 hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
2239 }
2b76f453 2240
3bd27240 2241no_scan_update:
e8b1202c 2242 /* Update the advertising parameters if necessary */
880897d4
AU
2243 if (hci_dev_test_flag(hdev, HCI_ADVERTISING) ||
2244 hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE))
1987fdc7 2245 enable_advertising(&req);
1987fdc7 2246
2b76f453 2247 err = hci_req_run(&req, set_connectable_complete);
9b74246f 2248 if (err < 0) {
a664b5bc 2249 mgmt_pending_remove(cmd);
9b74246f 2250 if (err == -ENODATA)
a81070ba
JH
2251 err = set_connectable_update_settings(hdev, sk,
2252 cp->val);
9b74246f
JH
2253 goto failed;
2254 }
9fbcbb45
JH
2255
2256failed:
09fd0de5 2257 hci_dev_unlock(hdev);
9fbcbb45
JH
2258 return err;
2259}
2260
b2939475 2261static int set_bondable(struct sock *sk, struct hci_dev *hdev, void *data,
04124681 2262 u16 len)
c542a06c 2263{
650f726d 2264 struct mgmt_mode *cp = data;
55594356 2265 bool changed;
c542a06c
JH
2266 int err;
2267
bdb6d971 2268 BT_DBG("request for %s", hdev->name);
c542a06c 2269
a7e80f25 2270 if (cp->val != 0x00 && cp->val != 0x01)
a69e8375
JH
2271 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BONDABLE,
2272 MGMT_STATUS_INVALID_PARAMS);
a7e80f25 2273
09fd0de5 2274 hci_dev_lock(hdev);
c542a06c
JH
2275
2276 if (cp->val)
238be788 2277 changed = !hci_dev_test_and_set_flag(hdev, HCI_BONDABLE);
c542a06c 2278 else
a69d8927 2279 changed = hci_dev_test_and_clear_flag(hdev, HCI_BONDABLE);
c542a06c 2280
b2939475 2281 err = send_settings_rsp(sk, MGMT_OP_SET_BONDABLE, hdev);
c542a06c 2282 if (err < 0)
55594356 2283 goto unlock;
c542a06c 2284
55594356
MH
2285 if (changed)
2286 err = new_settings(hdev, sk);
c542a06c 2287
55594356 2288unlock:
09fd0de5 2289 hci_dev_unlock(hdev);
c542a06c
JH
2290 return err;
2291}
2292
04124681
GP
2293static int set_link_security(struct sock *sk, struct hci_dev *hdev, void *data,
2294 u16 len)
33ef95ed
JH
2295{
2296 struct mgmt_mode *cp = data;
3b0602cd 2297 struct mgmt_pending_cmd *cmd;
e6fe7986 2298 u8 val, status;
33ef95ed
JH
2299 int err;
2300
bdb6d971 2301 BT_DBG("request for %s", hdev->name);
33ef95ed 2302
e6fe7986
JH
2303 status = mgmt_bredr_support(hdev);
2304 if (status)
a69e8375
JH
2305 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
2306 status);
33c525c0 2307
a7e80f25 2308 if (cp->val != 0x00 && cp->val != 0x01)
a69e8375
JH
2309 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
2310 MGMT_STATUS_INVALID_PARAMS);
a7e80f25 2311
33ef95ed
JH
2312 hci_dev_lock(hdev);
2313
4b34ee78 2314 if (!hdev_is_powered(hdev)) {
47990ea0
JH
2315 bool changed = false;
2316
d7a5a11d 2317 if (!!cp->val != hci_dev_test_flag(hdev, HCI_LINK_SECURITY)) {
ce05d603 2318 hci_dev_change_flag(hdev, HCI_LINK_SECURITY);
47990ea0
JH
2319 changed = true;
2320 }
2321
2322 err = send_settings_rsp(sk, MGMT_OP_SET_LINK_SECURITY, hdev);
2323 if (err < 0)
2324 goto failed;
2325
2326 if (changed)
2327 err = new_settings(hdev, sk);
2328
33ef95ed
JH
2329 goto failed;
2330 }
2331
333ae95d 2332 if (pending_find(MGMT_OP_SET_LINK_SECURITY, hdev)) {
a69e8375
JH
2333 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
2334 MGMT_STATUS_BUSY);
33ef95ed
JH
2335 goto failed;
2336 }
2337
2338 val = !!cp->val;
2339
2340 if (test_bit(HCI_AUTH, &hdev->flags) == val) {
2341 err = send_settings_rsp(sk, MGMT_OP_SET_LINK_SECURITY, hdev);
2342 goto failed;
2343 }
2344
2345 cmd = mgmt_pending_add(sk, MGMT_OP_SET_LINK_SECURITY, hdev, data, len);
2346 if (!cmd) {
2347 err = -ENOMEM;
2348 goto failed;
2349 }
2350
2351 err = hci_send_cmd(hdev, HCI_OP_WRITE_AUTH_ENABLE, sizeof(val), &val);
2352 if (err < 0) {
2353 mgmt_pending_remove(cmd);
2354 goto failed;
2355 }
2356
2357failed:
2358 hci_dev_unlock(hdev);
33ef95ed
JH
2359 return err;
2360}
2361
bdb6d971 2362static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
ed2c4ee3
JH
2363{
2364 struct mgmt_mode *cp = data;
3b0602cd 2365 struct mgmt_pending_cmd *cmd;
72ef0c1a 2366 u8 status;
ed2c4ee3
JH
2367 int err;
2368
bdb6d971 2369 BT_DBG("request for %s", hdev->name);
ed2c4ee3 2370
cdba5281
MH
2371 status = mgmt_bredr_support(hdev);
2372 if (status)
a69e8375 2373 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, status);
cdba5281 2374
13ecd8b6 2375 if (!lmp_ssp_capable(hdev))
a69e8375
JH
2376 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
2377 MGMT_STATUS_NOT_SUPPORTED);
ed2c4ee3 2378
a7e80f25 2379 if (cp->val != 0x00 && cp->val != 0x01)
a69e8375
JH
2380 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
2381 MGMT_STATUS_INVALID_PARAMS);
a7e80f25 2382
13ecd8b6 2383 hci_dev_lock(hdev);
6c8f12c1 2384
4b34ee78 2385 if (!hdev_is_powered(hdev)) {
9ecb3e24 2386 bool changed;
c0ecddc2 2387
9ecb3e24 2388 if (cp->val) {
238be788
MH
2389 changed = !hci_dev_test_and_set_flag(hdev,
2390 HCI_SSP_ENABLED);
9ecb3e24 2391 } else {
a69d8927
MH
2392 changed = hci_dev_test_and_clear_flag(hdev,
2393 HCI_SSP_ENABLED);
9ecb3e24 2394 if (!changed)
a69d8927
MH
2395 changed = hci_dev_test_and_clear_flag(hdev,
2396 HCI_HS_ENABLED);
9ecb3e24 2397 else
a358dc11 2398 hci_dev_clear_flag(hdev, HCI_HS_ENABLED);
c0ecddc2
JH
2399 }
2400
2401 err = send_settings_rsp(sk, MGMT_OP_SET_SSP, hdev);
2402 if (err < 0)
2403 goto failed;
2404
2405 if (changed)
2406 err = new_settings(hdev, sk);
2407
ed2c4ee3
JH
2408 goto failed;
2409 }
2410
333ae95d 2411 if (pending_find(MGMT_OP_SET_SSP, hdev)) {
a69e8375
JH
2412 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
2413 MGMT_STATUS_BUSY);
ed2c4ee3
JH
2414 goto failed;
2415 }
2416
d7a5a11d 2417 if (!!cp->val == hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
ed2c4ee3
JH
2418 err = send_settings_rsp(sk, MGMT_OP_SET_SSP, hdev);
2419 goto failed;
2420 }
2421
2422 cmd = mgmt_pending_add(sk, MGMT_OP_SET_SSP, hdev, data, len);
2423 if (!cmd) {
2424 err = -ENOMEM;
2425 goto failed;
2426 }
2427
d7a5a11d 2428 if (!cp->val && hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS))
3769972b
JH
2429 hci_send_cmd(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE,
2430 sizeof(cp->val), &cp->val);
2431
72ef0c1a 2432 err = hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, 1, &cp->val);
ed2c4ee3
JH
2433 if (err < 0) {
2434 mgmt_pending_remove(cmd);
2435 goto failed;
2436 }
2437
2438failed:
2439 hci_dev_unlock(hdev);
ed2c4ee3
JH
2440 return err;
2441}
2442
bdb6d971 2443static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
6d80dfd0
JH
2444{
2445 struct mgmt_mode *cp = data;
ee392693 2446 bool changed;
e6fe7986 2447 u8 status;
ee392693 2448 int err;
6d80dfd0 2449
bdb6d971 2450 BT_DBG("request for %s", hdev->name);
6d80dfd0 2451
e6fe7986
JH
2452 status = mgmt_bredr_support(hdev);
2453 if (status)
a69e8375 2454 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, status);
6d80dfd0 2455
9ecb3e24 2456 if (!lmp_ssp_capable(hdev))
a69e8375
JH
2457 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
2458 MGMT_STATUS_NOT_SUPPORTED);
9ecb3e24 2459
d7a5a11d 2460 if (!hci_dev_test_flag(hdev, HCI_SSP_ENABLED))
a69e8375
JH
2461 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
2462 MGMT_STATUS_REJECTED);
9ecb3e24 2463
a7e80f25 2464 if (cp->val != 0x00 && cp->val != 0x01)
a69e8375
JH
2465 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
2466 MGMT_STATUS_INVALID_PARAMS);
a7e80f25 2467
ee392693
MH
2468 hci_dev_lock(hdev);
2469
333ae95d 2470 if (pending_find(MGMT_OP_SET_SSP, hdev)) {
a69e8375
JH
2471 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
2472 MGMT_STATUS_BUSY);
a2cb01de
JH
2473 goto unlock;
2474 }
2475
a0cdf960 2476 if (cp->val) {
238be788 2477 changed = !hci_dev_test_and_set_flag(hdev, HCI_HS_ENABLED);
a0cdf960
MH
2478 } else {
2479 if (hdev_is_powered(hdev)) {
a69e8375
JH
2480 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
2481 MGMT_STATUS_REJECTED);
a0cdf960
MH
2482 goto unlock;
2483 }
2484
a69d8927 2485 changed = hci_dev_test_and_clear_flag(hdev, HCI_HS_ENABLED);
a0cdf960 2486 }
ee392693
MH
2487
2488 err = send_settings_rsp(sk, MGMT_OP_SET_HS, hdev);
2489 if (err < 0)
2490 goto unlock;
2491
2492 if (changed)
2493 err = new_settings(hdev, sk);
6d80dfd0 2494
ee392693
MH
2495unlock:
2496 hci_dev_unlock(hdev);
2497 return err;
6d80dfd0
JH
2498}
2499
1904a853 2500static void le_enable_complete(struct hci_dev *hdev, u8 status, u16 opcode)
416a4ae5
JH
2501{
2502 struct cmd_lookup match = { NULL, hdev };
2503
3ad67582
JK
2504 hci_dev_lock(hdev);
2505
416a4ae5
JH
2506 if (status) {
2507 u8 mgmt_err = mgmt_status(status);
2508
2509 mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, cmd_status_rsp,
2510 &mgmt_err);
3ad67582 2511 goto unlock;
416a4ae5
JH
2512 }
2513
2514 mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, settings_rsp, &match);
2515
2516 new_settings(hdev, match.sk);
2517
2518 if (match.sk)
2519 sock_put(match.sk);
441ad2d0
MH
2520
2521 /* Make sure the controller has a good default for
2522 * advertising data. Restrict the update to when LE
2523 * has actually been enabled. During power on, the
2524 * update in powered_update_hci will take care of it.
2525 */
d7a5a11d 2526 if (hci_dev_test_flag(hdev, HCI_LE_ENABLED)) {
441ad2d0
MH
2527 struct hci_request req;
2528
441ad2d0 2529 hci_req_init(&req, hdev);
5947f4bc 2530 update_adv_data(&req);
f14d8f64 2531 update_scan_rsp_data(&req);
2cf22218 2532 __hci_update_background_scan(&req);
441ad2d0 2533 hci_req_run(&req, NULL);
441ad2d0 2534 }
3ad67582
JK
2535
2536unlock:
2537 hci_dev_unlock(hdev);
416a4ae5
JH
2538}
2539
bdb6d971 2540static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
06199cf8
JH
2541{
2542 struct mgmt_mode *cp = data;
2543 struct hci_cp_write_le_host_supported hci_cp;
3b0602cd 2544 struct mgmt_pending_cmd *cmd;
416a4ae5 2545 struct hci_request req;
06199cf8 2546 int err;
0b60eba1 2547 u8 val, enabled;
06199cf8 2548
bdb6d971 2549 BT_DBG("request for %s", hdev->name);
06199cf8 2550
13ecd8b6 2551 if (!lmp_le_capable(hdev))
a69e8375
JH
2552 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
2553 MGMT_STATUS_NOT_SUPPORTED);
1de028ce 2554
a7e80f25 2555 if (cp->val != 0x00 && cp->val != 0x01)
a69e8375
JH
2556 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
2557 MGMT_STATUS_INVALID_PARAMS);
a7e80f25 2558
e7844ee5
MH
2559 /* Bluetooth single mode LE only controllers or dual-mode
2560 * controllers configured as LE only devices, do not allow
2561 * switching LE off. These have either LE enabled explicitly
2562 * or BR/EDR has been previously switched off.
2563 *
2564 * When trying to enable an already enabled LE, then gracefully
2565 * send a positive response. Trying to disable it however will
2566 * result into rejection.
2567 */
2568 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
2569 if (cp->val == 0x01)
2570 return send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
2571
a69e8375
JH
2572 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
2573 MGMT_STATUS_REJECTED);
e7844ee5 2574 }
c73eee91 2575
13ecd8b6 2576 hci_dev_lock(hdev);
06199cf8
JH
2577
2578 val = !!cp->val;
ffa88e02 2579 enabled = lmp_host_le_capable(hdev);
06199cf8 2580
847818d9
FG
2581 if (!val)
2582 clear_adv_instance(hdev, NULL, 0x00, true);
2583
0b60eba1 2584 if (!hdev_is_powered(hdev) || val == enabled) {
06199cf8
JH
2585 bool changed = false;
2586
d7a5a11d 2587 if (val != hci_dev_test_flag(hdev, HCI_LE_ENABLED)) {
ce05d603 2588 hci_dev_change_flag(hdev, HCI_LE_ENABLED);
06199cf8
JH
2589 changed = true;
2590 }
2591
d7a5a11d 2592 if (!val && hci_dev_test_flag(hdev, HCI_ADVERTISING)) {
a358dc11 2593 hci_dev_clear_flag(hdev, HCI_ADVERTISING);
eeca6f89
JH
2594 changed = true;
2595 }
2596
06199cf8
JH
2597 err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
2598 if (err < 0)
1de028ce 2599 goto unlock;
06199cf8
JH
2600
2601 if (changed)
2602 err = new_settings(hdev, sk);
2603
1de028ce 2604 goto unlock;
06199cf8
JH
2605 }
2606
333ae95d
JH
2607 if (pending_find(MGMT_OP_SET_LE, hdev) ||
2608 pending_find(MGMT_OP_SET_ADVERTISING, hdev)) {
a69e8375
JH
2609 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
2610 MGMT_STATUS_BUSY);
1de028ce 2611 goto unlock;
06199cf8
JH
2612 }
2613
2614 cmd = mgmt_pending_add(sk, MGMT_OP_SET_LE, hdev, data, len);
2615 if (!cmd) {
2616 err = -ENOMEM;
1de028ce 2617 goto unlock;
06199cf8
JH
2618 }
2619
441ad2d0
MH
2620 hci_req_init(&req, hdev);
2621
06199cf8
JH
2622 memset(&hci_cp, 0, sizeof(hci_cp));
2623
2624 if (val) {
2625 hci_cp.le = val;
32226e4f 2626 hci_cp.simul = 0x00;
441ad2d0 2627 } else {
d7a5a11d 2628 if (hci_dev_test_flag(hdev, HCI_LE_ADV))
441ad2d0 2629 disable_advertising(&req);
06199cf8
JH
2630 }
2631
416a4ae5
JH
2632 hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),
2633 &hci_cp);
2634
2635 err = hci_req_run(&req, le_enable_complete);
0c01bc48 2636 if (err < 0)
06199cf8 2637 mgmt_pending_remove(cmd);
06199cf8 2638
1de028ce
JH
2639unlock:
2640 hci_dev_unlock(hdev);
06199cf8
JH
2641 return err;
2642}
2643
0cab9c80
JH
2644/* This is a helper function to test for pending mgmt commands that can
2645 * cause CoD or EIR HCI commands. We can only allow one such pending
2646 * mgmt command at a time since otherwise we cannot easily track what
2647 * the current values are, will be, and based on that calculate if a new
2648 * HCI command needs to be sent and if yes with what value.
2649 */
2650static bool pending_eir_or_class(struct hci_dev *hdev)
2651{
3b0602cd 2652 struct mgmt_pending_cmd *cmd;
0cab9c80
JH
2653
2654 list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
2655 switch (cmd->opcode) {
2656 case MGMT_OP_ADD_UUID:
2657 case MGMT_OP_REMOVE_UUID:
2658 case MGMT_OP_SET_DEV_CLASS:
2659 case MGMT_OP_SET_POWERED:
2660 return true;
2661 }
2662 }
2663
2664 return false;
2665}
2666
83be8eca
JH
2667static const u8 bluetooth_base_uuid[] = {
2668 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
2669 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2670};
2671
2672static u8 get_uuid_size(const u8 *uuid)
2673{
2674 u32 val;
2675
2676 if (memcmp(uuid, bluetooth_base_uuid, 12))
2677 return 128;
2678
2679 val = get_unaligned_le32(&uuid[12]);
2680 if (val > 0xffff)
2681 return 32;
2682
2683 return 16;
2684}
2685
92da6097
JH
2686static void mgmt_class_complete(struct hci_dev *hdev, u16 mgmt_op, u8 status)
2687{
3b0602cd 2688 struct mgmt_pending_cmd *cmd;
92da6097
JH
2689
2690 hci_dev_lock(hdev);
2691
333ae95d 2692 cmd = pending_find(mgmt_op, hdev);
92da6097
JH
2693 if (!cmd)
2694 goto unlock;
2695
2a1afb5a
JH
2696 mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
2697 mgmt_status(status), hdev->dev_class, 3);
92da6097
JH
2698
2699 mgmt_pending_remove(cmd);
2700
2701unlock:
2702 hci_dev_unlock(hdev);
2703}
2704
1904a853 2705static void add_uuid_complete(struct hci_dev *hdev, u8 status, u16 opcode)
92da6097
JH
2706{
2707 BT_DBG("status 0x%02x", status);
2708
2709 mgmt_class_complete(hdev, MGMT_OP_ADD_UUID, status);
2710}
2711
bdb6d971 2712static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
2aeb9a1a 2713{
650f726d 2714 struct mgmt_cp_add_uuid *cp = data;
3b0602cd 2715 struct mgmt_pending_cmd *cmd;
890ea898 2716 struct hci_request req;
2aeb9a1a 2717 struct bt_uuid *uuid;
2aeb9a1a
JH
2718 int err;
2719
bdb6d971 2720 BT_DBG("request for %s", hdev->name);
2aeb9a1a 2721
09fd0de5 2722 hci_dev_lock(hdev);
2aeb9a1a 2723
0cab9c80 2724 if (pending_eir_or_class(hdev)) {
a69e8375
JH
2725 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID,
2726 MGMT_STATUS_BUSY);
c95f0ba7
JH
2727 goto failed;
2728 }
2729
92c4c204 2730 uuid = kmalloc(sizeof(*uuid), GFP_KERNEL);
2aeb9a1a
JH
2731 if (!uuid) {
2732 err = -ENOMEM;
2733 goto failed;
2734 }
2735
2736 memcpy(uuid->uuid, cp->uuid, 16);
1aff6f09 2737 uuid->svc_hint = cp->svc_hint;
83be8eca 2738 uuid->size = get_uuid_size(cp->uuid);
2aeb9a1a 2739
de66aa63 2740 list_add_tail(&uuid->list, &hdev->uuids);
2aeb9a1a 2741
890ea898 2742 hci_req_init(&req, hdev);
1aff6f09 2743
890ea898
JH
2744 update_class(&req);
2745 update_eir(&req);
2746
92da6097
JH
2747 err = hci_req_run(&req, add_uuid_complete);
2748 if (err < 0) {
2749 if (err != -ENODATA)
2750 goto failed;
80a1e1db 2751
2a1afb5a
JH
2752 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0,
2753 hdev->dev_class, 3);
90e70454
JH
2754 goto failed;
2755 }
2756
2757 cmd = mgmt_pending_add(sk, MGMT_OP_ADD_UUID, hdev, data, len);
890ea898 2758 if (!cmd) {
90e70454 2759 err = -ENOMEM;
890ea898
JH
2760 goto failed;
2761 }
2762
2763 err = 0;
2aeb9a1a
JH
2764
2765failed:
09fd0de5 2766 hci_dev_unlock(hdev);
2aeb9a1a
JH
2767 return err;
2768}
2769
24b78d0f
JH
2770static bool enable_service_cache(struct hci_dev *hdev)
2771{
2772 if (!hdev_is_powered(hdev))
2773 return false;
2774
238be788 2775 if (!hci_dev_test_and_set_flag(hdev, HCI_SERVICE_CACHE)) {
46818ed5
JH
2776 queue_delayed_work(hdev->workqueue, &hdev->service_cache,
2777 CACHE_TIMEOUT);
24b78d0f
JH
2778 return true;
2779 }
2780
2781 return false;
2782}
2783
1904a853 2784static void remove_uuid_complete(struct hci_dev *hdev, u8 status, u16 opcode)
92da6097
JH
2785{
2786 BT_DBG("status 0x%02x", status);
2787
2788 mgmt_class_complete(hdev, MGMT_OP_REMOVE_UUID, status);
2789}
2790
bdb6d971 2791static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
8ce8e2b5 2792 u16 len)
2aeb9a1a 2793{
650f726d 2794 struct mgmt_cp_remove_uuid *cp = data;
3b0602cd 2795 struct mgmt_pending_cmd *cmd;
056341c8 2796 struct bt_uuid *match, *tmp;
2aeb9a1a 2797 u8 bt_uuid_any[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
890ea898 2798 struct hci_request req;
2aeb9a1a
JH
2799 int err, found;
2800
bdb6d971 2801 BT_DBG("request for %s", hdev->name);
2aeb9a1a 2802
09fd0de5 2803 hci_dev_lock(hdev);
2aeb9a1a 2804
0cab9c80 2805 if (pending_eir_or_class(hdev)) {
a69e8375
JH
2806 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
2807 MGMT_STATUS_BUSY);
c95f0ba7
JH
2808 goto unlock;
2809 }
2810
2aeb9a1a 2811 if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
35f7498a 2812 hci_uuids_clear(hdev);
4004b6d9 2813
24b78d0f 2814 if (enable_service_cache(hdev)) {
2a1afb5a
JH
2815 err = mgmt_cmd_complete(sk, hdev->id,
2816 MGMT_OP_REMOVE_UUID,
2817 0, hdev->dev_class, 3);
24b78d0f
JH
2818 goto unlock;
2819 }
4004b6d9 2820
9246a869 2821 goto update_class;
2aeb9a1a
JH
2822 }
2823
2824 found = 0;
2825
056341c8 2826 list_for_each_entry_safe(match, tmp, &hdev->uuids, list) {
2aeb9a1a
JH
2827 if (memcmp(match->uuid, cp->uuid, 16) != 0)
2828 continue;
2829
2830 list_del(&match->list);
482049f7 2831 kfree(match);
2aeb9a1a
JH
2832 found++;
2833 }
2834
2835 if (found == 0) {
a69e8375
JH
2836 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
2837 MGMT_STATUS_INVALID_PARAMS);
2aeb9a1a
JH
2838 goto unlock;
2839 }
2840
9246a869 2841update_class:
890ea898 2842 hci_req_init(&req, hdev);
1aff6f09 2843
890ea898
JH
2844 update_class(&req);
2845 update_eir(&req);
2846
92da6097
JH
2847 err = hci_req_run(&req, remove_uuid_complete);
2848 if (err < 0) {
2849 if (err != -ENODATA)
2850 goto unlock;
80a1e1db 2851
2a1afb5a
JH
2852 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0,
2853 hdev->dev_class, 3);
90e70454
JH
2854 goto unlock;
2855 }
2856
2857 cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_UUID, hdev, data, len);
890ea898 2858 if (!cmd) {
90e70454 2859 err = -ENOMEM;
890ea898
JH
2860 goto unlock;
2861 }
2862
2863 err = 0;
2aeb9a1a
JH
2864
2865unlock:
09fd0de5 2866 hci_dev_unlock(hdev);
2aeb9a1a
JH
2867 return err;
2868}
2869
1904a853 2870static void set_class_complete(struct hci_dev *hdev, u8 status, u16 opcode)
92da6097
JH
2871{
2872 BT_DBG("status 0x%02x", status);
2873
2874 mgmt_class_complete(hdev, MGMT_OP_SET_DEV_CLASS, status);
2875}
2876
bdb6d971 2877static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
04124681 2878 u16 len)
1aff6f09 2879{
650f726d 2880 struct mgmt_cp_set_dev_class *cp = data;
3b0602cd 2881 struct mgmt_pending_cmd *cmd;
890ea898 2882 struct hci_request req;
1aff6f09
JH
2883 int err;
2884
bdb6d971 2885 BT_DBG("request for %s", hdev->name);
1aff6f09 2886
6203fc98 2887 if (!lmp_bredr_capable(hdev))
a69e8375
JH
2888 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
2889 MGMT_STATUS_NOT_SUPPORTED);
1aff6f09 2890
0cab9c80 2891 hci_dev_lock(hdev);
ee98f473 2892
0cab9c80 2893 if (pending_eir_or_class(hdev)) {
a69e8375
JH
2894 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
2895 MGMT_STATUS_BUSY);
0cab9c80
JH
2896 goto unlock;
2897 }
c95f0ba7 2898
0cab9c80 2899 if ((cp->minor & 0x03) != 0 || (cp->major & 0xe0) != 0) {
a69e8375
JH
2900 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
2901 MGMT_STATUS_INVALID_PARAMS);
0cab9c80
JH
2902 goto unlock;
2903 }
575b3a02 2904
932f5ff5
JH
2905 hdev->major_class = cp->major;
2906 hdev->minor_class = cp->minor;
2907
b5235a65 2908 if (!hdev_is_powered(hdev)) {
2a1afb5a
JH
2909 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
2910 hdev->dev_class, 3);
b5235a65
JH
2911 goto unlock;
2912 }
2913
890ea898
JH
2914 hci_req_init(&req, hdev);
2915
a69d8927 2916 if (hci_dev_test_and_clear_flag(hdev, HCI_SERVICE_CACHE)) {
7d78525d
JH
2917 hci_dev_unlock(hdev);
2918 cancel_delayed_work_sync(&hdev->service_cache);
2919 hci_dev_lock(hdev);
890ea898 2920 update_eir(&req);
7d78525d 2921 }
14c0b608 2922
890ea898
JH
2923 update_class(&req);
2924
92da6097
JH
2925 err = hci_req_run(&req, set_class_complete);
2926 if (err < 0) {
2927 if (err != -ENODATA)
2928 goto unlock;
1aff6f09 2929
2a1afb5a
JH
2930 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
2931 hdev->dev_class, 3);
90e70454
JH
2932 goto unlock;
2933 }
2934
2935 cmd = mgmt_pending_add(sk, MGMT_OP_SET_DEV_CLASS, hdev, data, len);
890ea898 2936 if (!cmd) {
90e70454 2937 err = -ENOMEM;
890ea898
JH
2938 goto unlock;
2939 }
2940
2941 err = 0;
1aff6f09 2942
b5235a65 2943unlock:
09fd0de5 2944 hci_dev_unlock(hdev);
1aff6f09
JH
2945 return err;
2946}
2947
bdb6d971 2948static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
8ce8e2b5 2949 u16 len)
55ed8ca1 2950{
650f726d 2951 struct mgmt_cp_load_link_keys *cp = data;
ba1d6936
JH
2952 const u16 max_key_count = ((U16_MAX - sizeof(*cp)) /
2953 sizeof(struct mgmt_link_key_info));
4e51eae9 2954 u16 key_count, expected_len;
b1de97d8 2955 bool changed;
a492cd52 2956 int i;
55ed8ca1 2957
9060d5cf
MH
2958 BT_DBG("request for %s", hdev->name);
2959
2960 if (!lmp_bredr_capable(hdev))
a69e8375
JH
2961 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
2962 MGMT_STATUS_NOT_SUPPORTED);
9060d5cf 2963
1f350c87 2964 key_count = __le16_to_cpu(cp->key_count);
ba1d6936
JH
2965 if (key_count > max_key_count) {
2966 BT_ERR("load_link_keys: too big key_count value %u",
2967 key_count);
a69e8375
JH
2968 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
2969 MGMT_STATUS_INVALID_PARAMS);
ba1d6936 2970 }
55ed8ca1 2971
86742e1e
JH
2972 expected_len = sizeof(*cp) + key_count *
2973 sizeof(struct mgmt_link_key_info);
a492cd52 2974 if (expected_len != len) {
86742e1e 2975 BT_ERR("load_link_keys: expected %u bytes, got %u bytes",
2606ecbc 2976 expected_len, len);
a69e8375
JH
2977 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
2978 MGMT_STATUS_INVALID_PARAMS);
55ed8ca1
JH
2979 }
2980
4ae14301 2981 if (cp->debug_keys != 0x00 && cp->debug_keys != 0x01)
a69e8375
JH
2982 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
2983 MGMT_STATUS_INVALID_PARAMS);
4ae14301 2984
bdb6d971 2985 BT_DBG("%s debug_keys %u key_count %u", hdev->name, cp->debug_keys,
8ce8e2b5 2986 key_count);
55ed8ca1 2987
4ee71b20
JH
2988 for (i = 0; i < key_count; i++) {
2989 struct mgmt_link_key_info *key = &cp->keys[i];
2990
8e991132 2991 if (key->addr.type != BDADDR_BREDR || key->type > 0x08)
a69e8375
JH
2992 return mgmt_cmd_status(sk, hdev->id,
2993 MGMT_OP_LOAD_LINK_KEYS,
2994 MGMT_STATUS_INVALID_PARAMS);
4ee71b20
JH
2995 }
2996
09fd0de5 2997 hci_dev_lock(hdev);
55ed8ca1
JH
2998
2999 hci_link_keys_clear(hdev);
3000
55ed8ca1 3001 if (cp->debug_keys)
238be788 3002 changed = !hci_dev_test_and_set_flag(hdev, HCI_KEEP_DEBUG_KEYS);
55ed8ca1 3003 else
a69d8927
MH
3004 changed = hci_dev_test_and_clear_flag(hdev,
3005 HCI_KEEP_DEBUG_KEYS);
b1de97d8
MH
3006
3007 if (changed)
3008 new_settings(hdev, NULL);
55ed8ca1 3009
a492cd52 3010 for (i = 0; i < key_count; i++) {
86742e1e 3011 struct mgmt_link_key_info *key = &cp->keys[i];
55ed8ca1 3012
58e9293c
JH
3013 /* Always ignore debug keys and require a new pairing if
3014 * the user wants to use them.
3015 */
3016 if (key->type == HCI_LK_DEBUG_COMBINATION)
3017 continue;
3018
7652ff6a
JH
3019 hci_add_link_key(hdev, NULL, &key->addr.bdaddr, key->val,
3020 key->type, key->pin_len, NULL);
55ed8ca1
JH
3021 }
3022
2a1afb5a 3023 mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0);
0e5f875a 3024
09fd0de5 3025 hci_dev_unlock(hdev);
55ed8ca1 3026
a492cd52 3027 return 0;
55ed8ca1
JH
3028}
3029
b1078ad0 3030static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 3031 u8 addr_type, struct sock *skip_sk)
b1078ad0
JH
3032{
3033 struct mgmt_ev_device_unpaired ev;
3034
3035 bacpy(&ev.addr.bdaddr, bdaddr);
3036 ev.addr.type = addr_type;
3037
3038 return mgmt_event(MGMT_EV_DEVICE_UNPAIRED, hdev, &ev, sizeof(ev),
04124681 3039 skip_sk);
b1078ad0
JH
3040}
3041
bdb6d971 3042static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
04124681 3043 u16 len)
55ed8ca1 3044{
124f6e35
JH
3045 struct mgmt_cp_unpair_device *cp = data;
3046 struct mgmt_rp_unpair_device rp;
a8a1d19e 3047 struct hci_cp_disconnect dc;
3b0602cd 3048 struct mgmt_pending_cmd *cmd;
55ed8ca1 3049 struct hci_conn *conn;
55ed8ca1
JH
3050 int err;
3051
a8a1d19e 3052 memset(&rp, 0, sizeof(rp));
124f6e35
JH
3053 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
3054 rp.addr.type = cp->addr.type;
a8a1d19e 3055
4ee71b20 3056 if (!bdaddr_type_is_valid(cp->addr.type))
2a1afb5a
JH
3057 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
3058 MGMT_STATUS_INVALID_PARAMS,
3059 &rp, sizeof(rp));
4ee71b20 3060
118da70b 3061 if (cp->disconnect != 0x00 && cp->disconnect != 0x01)
2a1afb5a
JH
3062 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
3063 MGMT_STATUS_INVALID_PARAMS,
3064 &rp, sizeof(rp));
118da70b 3065
4ee71b20
JH
3066 hci_dev_lock(hdev);
3067
86a8cfc6 3068 if (!hdev_is_powered(hdev)) {
2a1afb5a
JH
3069 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
3070 MGMT_STATUS_NOT_POWERED, &rp,
3071 sizeof(rp));
86a8cfc6
JH
3072 goto unlock;
3073 }
3074
e0b2b27e 3075 if (cp->addr.type == BDADDR_BREDR) {
89cbb063
AA
3076 /* If disconnection is requested, then look up the
3077 * connection. If the remote device is connected, it
3078 * will be later used to terminate the link.
3079 *
3080 * Setting it to NULL explicitly will cause no
3081 * termination of the link.
3082 */
3083 if (cp->disconnect)
3084 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
3085 &cp->addr.bdaddr);
3086 else
3087 conn = NULL;
3088
124f6e35 3089 err = hci_remove_link_key(hdev, &cp->addr.bdaddr);
e0b2b27e
JH
3090 } else {
3091 u8 addr_type;
3092
89cbb063
AA
3093 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK,
3094 &cp->addr.bdaddr);
3095 if (conn) {
3096 /* Defer clearing up the connection parameters
3097 * until closing to give a chance of keeping
3098 * them if a repairing happens.
3099 */
3100 set_bit(HCI_CONN_PARAM_REMOVAL_PEND, &conn->flags);
3101
3102 /* If disconnection is not requested, then
3103 * clear the connection variable so that the
3104 * link is not terminated.
3105 */
3106 if (!cp->disconnect)
3107 conn = NULL;
3108 }
3109
e0b2b27e
JH
3110 if (cp->addr.type == BDADDR_LE_PUBLIC)
3111 addr_type = ADDR_LE_DEV_PUBLIC;
3112 else
3113 addr_type = ADDR_LE_DEV_RANDOM;
3114
a7ec7338
JH
3115 hci_remove_irk(hdev, &cp->addr.bdaddr, addr_type);
3116
e0b2b27e
JH
3117 err = hci_remove_ltk(hdev, &cp->addr.bdaddr, addr_type);
3118 }
b0dbfb46 3119
55ed8ca1 3120 if (err < 0) {
2a1afb5a
JH
3121 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
3122 MGMT_STATUS_NOT_PAIRED, &rp,
3123 sizeof(rp));
55ed8ca1
JH
3124 goto unlock;
3125 }
3126
89cbb063
AA
3127 /* If the connection variable is set, then termination of the
3128 * link is requested.
3129 */
a8a1d19e 3130 if (!conn) {
2a1afb5a
JH
3131 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0,
3132 &rp, sizeof(rp));
b1078ad0 3133 device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk);
a8a1d19e
JH
3134 goto unlock;
3135 }
55ed8ca1 3136
124f6e35 3137 cmd = mgmt_pending_add(sk, MGMT_OP_UNPAIR_DEVICE, hdev, cp,
04124681 3138 sizeof(*cp));
a8a1d19e
JH
3139 if (!cmd) {
3140 err = -ENOMEM;
3141 goto unlock;
55ed8ca1
JH
3142 }
3143
d8b7b1e4
JH
3144 cmd->cmd_complete = addr_cmd_complete;
3145
eb55ef07 3146 dc.handle = cpu_to_le16(conn->handle);
a8a1d19e
JH
3147 dc.reason = 0x13; /* Remote User Terminated Connection */
3148 err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
3149 if (err < 0)
3150 mgmt_pending_remove(cmd);
3151
55ed8ca1 3152unlock:
09fd0de5 3153 hci_dev_unlock(hdev);
55ed8ca1
JH
3154 return err;
3155}
3156
bdb6d971 3157static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
04124681 3158 u16 len)
8962ee74 3159{
650f726d 3160 struct mgmt_cp_disconnect *cp = data;
06a63b19 3161 struct mgmt_rp_disconnect rp;
3b0602cd 3162 struct mgmt_pending_cmd *cmd;
8962ee74 3163 struct hci_conn *conn;
8962ee74
JH
3164 int err;
3165
3166 BT_DBG("");
3167
06a63b19
JH
3168 memset(&rp, 0, sizeof(rp));
3169 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
3170 rp.addr.type = cp->addr.type;
3171
4ee71b20 3172 if (!bdaddr_type_is_valid(cp->addr.type))
2a1afb5a
JH
3173 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
3174 MGMT_STATUS_INVALID_PARAMS,
3175 &rp, sizeof(rp));
4ee71b20 3176
09fd0de5 3177 hci_dev_lock(hdev);
8962ee74
JH
3178
3179 if (!test_bit(HCI_UP, &hdev->flags)) {
2a1afb5a
JH
3180 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
3181 MGMT_STATUS_NOT_POWERED, &rp,
3182 sizeof(rp));
8962ee74
JH
3183 goto failed;
3184 }
3185
333ae95d 3186 if (pending_find(MGMT_OP_DISCONNECT, hdev)) {
2a1afb5a
JH
3187 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
3188 MGMT_STATUS_BUSY, &rp, sizeof(rp));
8962ee74
JH
3189 goto failed;
3190 }
3191
591f47f3 3192 if (cp->addr.type == BDADDR_BREDR)
8fc9ced3
GP
3193 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
3194 &cp->addr.bdaddr);
88c3df13
JH
3195 else
3196 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
365227e5 3197
f960727e 3198 if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) {
2a1afb5a
JH
3199 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
3200 MGMT_STATUS_NOT_CONNECTED, &rp,
3201 sizeof(rp));
8962ee74
JH
3202 goto failed;
3203 }
3204
2e58ef3e 3205 cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len);
366a0336
JH
3206 if (!cmd) {
3207 err = -ENOMEM;
8962ee74 3208 goto failed;
366a0336 3209 }
8962ee74 3210
f5818c22
JH
3211 cmd->cmd_complete = generic_cmd_complete;
3212
e3f2f92a 3213 err = hci_disconnect(conn, HCI_ERROR_REMOTE_USER_TERM);
8962ee74 3214 if (err < 0)
a664b5bc 3215 mgmt_pending_remove(cmd);
8962ee74
JH
3216
3217failed:
09fd0de5 3218 hci_dev_unlock(hdev);
8962ee74
JH
3219 return err;
3220}
3221
57c1477c 3222static u8 link_to_bdaddr(u8 link_type, u8 addr_type)
4c659c39
JH
3223{
3224 switch (link_type) {
3225 case LE_LINK:
48264f06
JH
3226 switch (addr_type) {
3227 case ADDR_LE_DEV_PUBLIC:
591f47f3 3228 return BDADDR_LE_PUBLIC;
0ed09148 3229
48264f06 3230 default:
0ed09148 3231 /* Fallback to LE Random address type */
591f47f3 3232 return BDADDR_LE_RANDOM;
48264f06 3233 }
0ed09148 3234
4c659c39 3235 default:
0ed09148 3236 /* Fallback to BR/EDR type */
591f47f3 3237 return BDADDR_BREDR;
4c659c39
JH
3238 }
3239}
3240
04124681
GP
3241static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data,
3242 u16 data_len)
2784eb41 3243{
2784eb41 3244 struct mgmt_rp_get_connections *rp;
8035ded4 3245 struct hci_conn *c;
a38528f1 3246 size_t rp_len;
60fc5fb6
JH
3247 int err;
3248 u16 i;
2784eb41
JH
3249
3250 BT_DBG("");
3251
09fd0de5 3252 hci_dev_lock(hdev);
2784eb41 3253
5f97c1df 3254 if (!hdev_is_powered(hdev)) {
a69e8375
JH
3255 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS,
3256 MGMT_STATUS_NOT_POWERED);
5f97c1df
JH
3257 goto unlock;
3258 }
3259
60fc5fb6 3260 i = 0;
b644ba33
JH
3261 list_for_each_entry(c, &hdev->conn_hash.list, list) {
3262 if (test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
60fc5fb6 3263 i++;
2784eb41
JH
3264 }
3265
60fc5fb6 3266 rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
92c4c204 3267 rp = kmalloc(rp_len, GFP_KERNEL);
a38528f1 3268 if (!rp) {
2784eb41
JH
3269 err = -ENOMEM;
3270 goto unlock;
3271 }
3272
2784eb41 3273 i = 0;
4c659c39 3274 list_for_each_entry(c, &hdev->conn_hash.list, list) {
b644ba33
JH
3275 if (!test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
3276 continue;
4c659c39 3277 bacpy(&rp->addr[i].bdaddr, &c->dst);
57c1477c 3278 rp->addr[i].type = link_to_bdaddr(c->type, c->dst_type);
0ed09148 3279 if (c->type == SCO_LINK || c->type == ESCO_LINK)
4c659c39
JH
3280 continue;
3281 i++;
3282 }
3283
eb55ef07 3284 rp->conn_count = cpu_to_le16(i);
60fc5fb6 3285
4c659c39
JH
3286 /* Recalculate length in case of filtered SCO connections, etc */
3287 rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
2784eb41 3288
2a1afb5a
JH
3289 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp,
3290 rp_len);
2784eb41 3291
a38528f1 3292 kfree(rp);
5f97c1df
JH
3293
3294unlock:
09fd0de5 3295 hci_dev_unlock(hdev);
2784eb41
JH
3296 return err;
3297}
3298
bdb6d971 3299static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
04124681 3300 struct mgmt_cp_pin_code_neg_reply *cp)
96d97a67 3301{
3b0602cd 3302 struct mgmt_pending_cmd *cmd;
96d97a67
WR
3303 int err;
3304
2e58ef3e 3305 cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp,
04124681 3306 sizeof(*cp));
96d97a67
WR
3307 if (!cmd)
3308 return -ENOMEM;
3309
d8457698 3310 err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
04124681 3311 sizeof(cp->addr.bdaddr), &cp->addr.bdaddr);
96d97a67
WR
3312 if (err < 0)
3313 mgmt_pending_remove(cmd);
3314
3315 return err;
3316}
3317
bdb6d971 3318static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
04124681 3319 u16 len)
980e1a53 3320{
96d97a67 3321 struct hci_conn *conn;
650f726d 3322 struct mgmt_cp_pin_code_reply *cp = data;
980e1a53 3323 struct hci_cp_pin_code_reply reply;
3b0602cd 3324 struct mgmt_pending_cmd *cmd;
980e1a53
JH
3325 int err;
3326
3327 BT_DBG("");
3328
09fd0de5 3329 hci_dev_lock(hdev);
980e1a53 3330
4b34ee78 3331 if (!hdev_is_powered(hdev)) {
a69e8375
JH
3332 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
3333 MGMT_STATUS_NOT_POWERED);
980e1a53
JH
3334 goto failed;
3335 }
3336
d8457698 3337 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr);
96d97a67 3338 if (!conn) {
a69e8375
JH
3339 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
3340 MGMT_STATUS_NOT_CONNECTED);
96d97a67
WR
3341 goto failed;
3342 }
3343
3344 if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) {
d8457698
JH
3345 struct mgmt_cp_pin_code_neg_reply ncp;
3346
3347 memcpy(&ncp.addr, &cp->addr, sizeof(ncp.addr));
96d97a67
WR
3348
3349 BT_ERR("PIN code is not 16 bytes long");
3350
bdb6d971 3351 err = send_pin_code_neg_reply(sk, hdev, &ncp);
96d97a67 3352 if (err >= 0)
a69e8375
JH
3353 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
3354 MGMT_STATUS_INVALID_PARAMS);
96d97a67
WR
3355
3356 goto failed;
3357 }
3358
00abfe44 3359 cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len);
366a0336
JH
3360 if (!cmd) {
3361 err = -ENOMEM;
980e1a53 3362 goto failed;
366a0336 3363 }
980e1a53 3364
7776d1d8
JH
3365 cmd->cmd_complete = addr_cmd_complete;
3366
d8457698 3367 bacpy(&reply.bdaddr, &cp->addr.bdaddr);
980e1a53 3368 reply.pin_len = cp->pin_len;
24718ca5 3369 memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code));
980e1a53
JH
3370
3371 err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
3372 if (err < 0)
a664b5bc 3373 mgmt_pending_remove(cmd);
980e1a53
JH
3374
3375failed:
09fd0de5 3376 hci_dev_unlock(hdev);
980e1a53
JH
3377 return err;
3378}
3379
04124681
GP
3380static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data,
3381 u16 len)
17fa4b9d 3382{
650f726d 3383 struct mgmt_cp_set_io_capability *cp = data;
17fa4b9d
JH
3384
3385 BT_DBG("");
3386
4ec86d4c 3387 if (cp->io_capability > SMP_IO_KEYBOARD_DISPLAY)
2a1afb5a
JH
3388 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY,
3389 MGMT_STATUS_INVALID_PARAMS, NULL, 0);
4ec86d4c 3390
09fd0de5 3391 hci_dev_lock(hdev);
17fa4b9d
JH
3392
3393 hdev->io_capability = cp->io_capability;
3394
3395 BT_DBG("%s IO capability set to 0x%02x", hdev->name,
8ce8e2b5 3396 hdev->io_capability);
17fa4b9d 3397
09fd0de5 3398 hci_dev_unlock(hdev);
17fa4b9d 3399
2a1afb5a
JH
3400 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0,
3401 NULL, 0);
17fa4b9d
JH
3402}
3403
3b0602cd 3404static struct mgmt_pending_cmd *find_pairing(struct hci_conn *conn)
e9a416b5
JH
3405{
3406 struct hci_dev *hdev = conn->hdev;
3b0602cd 3407 struct mgmt_pending_cmd *cmd;
e9a416b5 3408
2e58ef3e 3409 list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
e9a416b5
JH
3410 if (cmd->opcode != MGMT_OP_PAIR_DEVICE)
3411 continue;
3412
e9a416b5
JH
3413 if (cmd->user_data != conn)
3414 continue;
3415
3416 return cmd;
3417 }
3418
3419 return NULL;
3420}
3421
3b0602cd 3422static int pairing_complete(struct mgmt_pending_cmd *cmd, u8 status)
e9a416b5
JH
3423{
3424 struct mgmt_rp_pair_device rp;
3425 struct hci_conn *conn = cmd->user_data;
9df74653 3426 int err;
e9a416b5 3427
61b1a7fb
JH
3428 bacpy(&rp.addr.bdaddr, &conn->dst);
3429 rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
e9a416b5 3430
2a1afb5a
JH
3431 err = mgmt_cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE,
3432 status, &rp, sizeof(rp));
e9a416b5
JH
3433
3434 /* So we don't get further callbacks for this connection */
3435 conn->connect_cfm_cb = NULL;
3436 conn->security_cfm_cb = NULL;
3437 conn->disconn_cfm_cb = NULL;
3438
76a68ba0 3439 hci_conn_drop(conn);
89cbb063
AA
3440
3441 /* The device is paired so there is no need to remove
3442 * its connection parameters anymore.
3443 */
3444 clear_bit(HCI_CONN_PARAM_REMOVAL_PEND, &conn->flags);
15013aeb
JH
3445
3446 hci_conn_put(conn);
9df74653
JH
3447
3448 return err;
e9a416b5
JH
3449}
3450
f4a407be
JH
3451void mgmt_smp_complete(struct hci_conn *conn, bool complete)
3452{
3453 u8 status = complete ? MGMT_STATUS_SUCCESS : MGMT_STATUS_FAILED;
3b0602cd 3454 struct mgmt_pending_cmd *cmd;
f4a407be
JH
3455
3456 cmd = find_pairing(conn);
a511b35b 3457 if (cmd) {
04ab2749 3458 cmd->cmd_complete(cmd, status);
a511b35b
JH
3459 mgmt_pending_remove(cmd);
3460 }
f4a407be
JH
3461}
3462
e9a416b5
JH
3463static void pairing_complete_cb(struct hci_conn *conn, u8 status)
3464{
3b0602cd 3465 struct mgmt_pending_cmd *cmd;
e9a416b5
JH
3466
3467 BT_DBG("status %u", status);
3468
3469 cmd = find_pairing(conn);
a511b35b 3470 if (!cmd) {
e9a416b5 3471 BT_DBG("Unable to find a pending command");
a511b35b
JH
3472 return;
3473 }
3474
3475 cmd->cmd_complete(cmd, mgmt_status(status));
3476 mgmt_pending_remove(cmd);
e9a416b5
JH
3477}
3478
f4a407be 3479static void le_pairing_complete_cb(struct hci_conn *conn, u8 status)
4c47d739 3480{
3b0602cd 3481 struct mgmt_pending_cmd *cmd;
4c47d739
VA
3482
3483 BT_DBG("status %u", status);
3484
3485 if (!status)
3486 return;
3487
3488 cmd = find_pairing(conn);
a511b35b 3489 if (!cmd) {
4c47d739 3490 BT_DBG("Unable to find a pending command");
a511b35b
JH
3491 return;
3492 }
3493
3494 cmd->cmd_complete(cmd, mgmt_status(status));
3495 mgmt_pending_remove(cmd);
4c47d739
VA
3496}
3497
bdb6d971 3498static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
04124681 3499 u16 len)
e9a416b5 3500{
650f726d 3501 struct mgmt_cp_pair_device *cp = data;
1425acb7 3502 struct mgmt_rp_pair_device rp;
3b0602cd 3503 struct mgmt_pending_cmd *cmd;
e9a416b5
JH
3504 u8 sec_level, auth_type;
3505 struct hci_conn *conn;
e9a416b5
JH
3506 int err;
3507
3508 BT_DBG("");
3509
f950a30e
SJ
3510 memset(&rp, 0, sizeof(rp));
3511 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
3512 rp.addr.type = cp->addr.type;
3513
4ee71b20 3514 if (!bdaddr_type_is_valid(cp->addr.type))
2a1afb5a
JH
3515 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
3516 MGMT_STATUS_INVALID_PARAMS,
3517 &rp, sizeof(rp));
4ee71b20 3518
4ec86d4c 3519 if (cp->io_cap > SMP_IO_KEYBOARD_DISPLAY)
2a1afb5a
JH
3520 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
3521 MGMT_STATUS_INVALID_PARAMS,
3522 &rp, sizeof(rp));
4ec86d4c 3523
09fd0de5 3524 hci_dev_lock(hdev);
e9a416b5 3525
5f97c1df 3526 if (!hdev_is_powered(hdev)) {
2a1afb5a
JH
3527 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
3528 MGMT_STATUS_NOT_POWERED, &rp,
3529 sizeof(rp));
5f97c1df
JH
3530 goto unlock;
3531 }
3532
55e76b38
JH
3533 if (hci_bdaddr_is_paired(hdev, &cp->addr.bdaddr, cp->addr.type)) {
3534 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
3535 MGMT_STATUS_ALREADY_PAIRED, &rp,
3536 sizeof(rp));
3537 goto unlock;
3538 }
3539
c908df36 3540 sec_level = BT_SECURITY_MEDIUM;
6fd6b915 3541 auth_type = HCI_AT_DEDICATED_BONDING;
e9a416b5 3542
6f77d8c7 3543 if (cp->addr.type == BDADDR_BREDR) {
04a6c589
AG
3544 conn = hci_connect_acl(hdev, &cp->addr.bdaddr, sec_level,
3545 auth_type);
6f77d8c7
AG
3546 } else {
3547 u8 addr_type;
3548
3549 /* Convert from L2CAP channel address type to HCI address type
3550 */
3551 if (cp->addr.type == BDADDR_LE_PUBLIC)
3552 addr_type = ADDR_LE_DEV_PUBLIC;
3553 else
3554 addr_type = ADDR_LE_DEV_RANDOM;
3555
7c264b10
MH
3556 /* When pairing a new device, it is expected to remember
3557 * this device for future connections. Adding the connection
3558 * parameter information ahead of time allows tracking
3559 * of the slave preferred values and will speed up any
3560 * further connection establishment.
3561 *
3562 * If connection parameters already exist, then they
3563 * will be kept and this function does nothing.
3564 */
3565 hci_conn_params_add(hdev, &cp->addr.bdaddr, addr_type);
3566
6f77d8c7 3567 conn = hci_connect_le(hdev, &cp->addr.bdaddr, addr_type,
e804d25d
JH
3568 sec_level, HCI_LE_CONN_TIMEOUT,
3569 HCI_ROLE_MASTER);
6f77d8c7 3570 }
7a512d01 3571
30e76272 3572 if (IS_ERR(conn)) {
489dc48e
AK
3573 int status;
3574
3575 if (PTR_ERR(conn) == -EBUSY)
3576 status = MGMT_STATUS_BUSY;
faa81030
LR
3577 else if (PTR_ERR(conn) == -EOPNOTSUPP)
3578 status = MGMT_STATUS_NOT_SUPPORTED;
3579 else if (PTR_ERR(conn) == -ECONNREFUSED)
3580 status = MGMT_STATUS_REJECTED;
489dc48e
AK
3581 else
3582 status = MGMT_STATUS_CONNECT_FAILED;
3583
2a1afb5a
JH
3584 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
3585 status, &rp, sizeof(rp));
e9a416b5
JH
3586 goto unlock;
3587 }
3588
3589 if (conn->connect_cfm_cb) {
76a68ba0 3590 hci_conn_drop(conn);
2a1afb5a
JH
3591 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
3592 MGMT_STATUS_BUSY, &rp, sizeof(rp));
e9a416b5
JH
3593 goto unlock;
3594 }
3595
2e58ef3e 3596 cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len);
e9a416b5
JH
3597 if (!cmd) {
3598 err = -ENOMEM;
76a68ba0 3599 hci_conn_drop(conn);
e9a416b5
JH
3600 goto unlock;
3601 }
3602
04ab2749
JH
3603 cmd->cmd_complete = pairing_complete;
3604
7a512d01 3605 /* For LE, just connecting isn't a proof that the pairing finished */
f4a407be 3606 if (cp->addr.type == BDADDR_BREDR) {
7a512d01 3607 conn->connect_cfm_cb = pairing_complete_cb;
f4a407be
JH
3608 conn->security_cfm_cb = pairing_complete_cb;
3609 conn->disconn_cfm_cb = pairing_complete_cb;
3610 } else {
3611 conn->connect_cfm_cb = le_pairing_complete_cb;
3612 conn->security_cfm_cb = le_pairing_complete_cb;
3613 conn->disconn_cfm_cb = le_pairing_complete_cb;
3614 }
7a512d01 3615
e9a416b5 3616 conn->io_capability = cp->io_cap;
f8aaf9b6 3617 cmd->user_data = hci_conn_get(conn);
e9a416b5 3618
6f78fd4b 3619 if ((conn->state == BT_CONNECTED || conn->state == BT_CONFIG) &&
a511b35b
JH
3620 hci_conn_security(conn, sec_level, auth_type, true)) {
3621 cmd->cmd_complete(cmd, 0);
3622 mgmt_pending_remove(cmd);
3623 }
e9a416b5
JH
3624
3625 err = 0;
3626
3627unlock:
09fd0de5 3628 hci_dev_unlock(hdev);
e9a416b5
JH
3629 return err;
3630}
3631
04124681
GP
3632static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
3633 u16 len)
28424707 3634{
0f4e68cf 3635 struct mgmt_addr_info *addr = data;
3b0602cd 3636 struct mgmt_pending_cmd *cmd;
28424707
JH
3637 struct hci_conn *conn;
3638 int err;
3639
3640 BT_DBG("");
3641
28424707
JH
3642 hci_dev_lock(hdev);
3643
5f97c1df 3644 if (!hdev_is_powered(hdev)) {
a69e8375
JH
3645 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
3646 MGMT_STATUS_NOT_POWERED);
5f97c1df
JH
3647 goto unlock;
3648 }
3649
333ae95d 3650 cmd = pending_find(MGMT_OP_PAIR_DEVICE, hdev);
28424707 3651 if (!cmd) {
a69e8375
JH
3652 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
3653 MGMT_STATUS_INVALID_PARAMS);
28424707
JH
3654 goto unlock;
3655 }
3656
3657 conn = cmd->user_data;
3658
3659 if (bacmp(&addr->bdaddr, &conn->dst) != 0) {
a69e8375
JH
3660 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
3661 MGMT_STATUS_INVALID_PARAMS);
28424707
JH
3662 goto unlock;
3663 }
3664
a511b35b
JH
3665 cmd->cmd_complete(cmd, MGMT_STATUS_CANCELLED);
3666 mgmt_pending_remove(cmd);
28424707 3667
2a1afb5a
JH
3668 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0,
3669 addr, sizeof(*addr));
28424707
JH
3670unlock:
3671 hci_dev_unlock(hdev);
28424707
JH
3672 return err;
3673}
3674
bdb6d971 3675static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
1707c60e 3676 struct mgmt_addr_info *addr, u16 mgmt_op,
04124681 3677 u16 hci_op, __le32 passkey)
a5c29683 3678{
3b0602cd 3679 struct mgmt_pending_cmd *cmd;
0df4c185 3680 struct hci_conn *conn;
a5c29683
JH
3681 int err;
3682
09fd0de5 3683 hci_dev_lock(hdev);
08ba5382 3684
4b34ee78 3685 if (!hdev_is_powered(hdev)) {
2a1afb5a
JH
3686 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op,
3687 MGMT_STATUS_NOT_POWERED, addr,
3688 sizeof(*addr));
0df4c185 3689 goto done;
a5c29683
JH
3690 }
3691
1707c60e
JH
3692 if (addr->type == BDADDR_BREDR)
3693 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &addr->bdaddr);
272d90df 3694 else
1707c60e 3695 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &addr->bdaddr);
272d90df
JH
3696
3697 if (!conn) {
2a1afb5a
JH
3698 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op,
3699 MGMT_STATUS_NOT_CONNECTED, addr,
3700 sizeof(*addr));
272d90df
JH
3701 goto done;
3702 }
47c15e2b 3703
1707c60e 3704 if (addr->type == BDADDR_LE_PUBLIC || addr->type == BDADDR_LE_RANDOM) {
5fe57d9e 3705 err = smp_user_confirm_reply(conn, mgmt_op, passkey);
5fe57d9e 3706 if (!err)
2a1afb5a
JH
3707 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op,
3708 MGMT_STATUS_SUCCESS, addr,
3709 sizeof(*addr));
5fe57d9e 3710 else
2a1afb5a
JH
3711 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op,
3712 MGMT_STATUS_FAILED, addr,
3713 sizeof(*addr));
47c15e2b 3714
47c15e2b
BG
3715 goto done;
3716 }
3717
1707c60e 3718 cmd = mgmt_pending_add(sk, mgmt_op, hdev, addr, sizeof(*addr));
a5c29683
JH
3719 if (!cmd) {
3720 err = -ENOMEM;
0df4c185 3721 goto done;
a5c29683
JH
3722 }
3723
7776d1d8
JH
3724 cmd->cmd_complete = addr_cmd_complete;
3725
0df4c185 3726 /* Continue with pairing via HCI */
604086b7
BG
3727 if (hci_op == HCI_OP_USER_PASSKEY_REPLY) {
3728 struct hci_cp_user_passkey_reply cp;
3729
1707c60e 3730 bacpy(&cp.bdaddr, &addr->bdaddr);
604086b7
BG
3731 cp.passkey = passkey;
3732 err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp);
3733 } else
1707c60e
JH
3734 err = hci_send_cmd(hdev, hci_op, sizeof(addr->bdaddr),
3735 &addr->bdaddr);
604086b7 3736
a664b5bc
JH
3737 if (err < 0)
3738 mgmt_pending_remove(cmd);
a5c29683 3739
0df4c185 3740done:
09fd0de5 3741 hci_dev_unlock(hdev);
a5c29683
JH
3742 return err;
3743}
3744
afeb019d
JK
3745static int pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
3746 void *data, u16 len)
3747{
3748 struct mgmt_cp_pin_code_neg_reply *cp = data;
3749
3750 BT_DBG("");
3751
1707c60e 3752 return user_pairing_resp(sk, hdev, &cp->addr,
afeb019d
JK
3753 MGMT_OP_PIN_CODE_NEG_REPLY,
3754 HCI_OP_PIN_CODE_NEG_REPLY, 0);
3755}
3756
04124681
GP
3757static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data,
3758 u16 len)
0df4c185 3759{
650f726d 3760 struct mgmt_cp_user_confirm_reply *cp = data;
0df4c185
BG
3761
3762 BT_DBG("");
3763
3764 if (len != sizeof(*cp))
a69e8375
JH
3765 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY,
3766 MGMT_STATUS_INVALID_PARAMS);
0df4c185 3767
1707c60e 3768 return user_pairing_resp(sk, hdev, &cp->addr,
04124681
GP
3769 MGMT_OP_USER_CONFIRM_REPLY,
3770 HCI_OP_USER_CONFIRM_REPLY, 0);
0df4c185
BG
3771}
3772
bdb6d971 3773static int user_confirm_neg_reply(struct sock *sk, struct hci_dev *hdev,
04124681 3774 void *data, u16 len)
0df4c185 3775{
c9c2659f 3776 struct mgmt_cp_user_confirm_neg_reply *cp = data;
0df4c185
BG
3777
3778 BT_DBG("");
3779
1707c60e 3780 return user_pairing_resp(sk, hdev, &cp->addr,
04124681
GP
3781 MGMT_OP_USER_CONFIRM_NEG_REPLY,
3782 HCI_OP_USER_CONFIRM_NEG_REPLY, 0);
0df4c185
BG
3783}
3784
04124681
GP
3785static int user_passkey_reply(struct sock *sk, struct hci_dev *hdev, void *data,
3786 u16 len)
604086b7 3787{
650f726d 3788 struct mgmt_cp_user_passkey_reply *cp = data;
604086b7
BG
3789
3790 BT_DBG("");
3791
1707c60e 3792 return user_pairing_resp(sk, hdev, &cp->addr,
04124681
GP
3793 MGMT_OP_USER_PASSKEY_REPLY,
3794 HCI_OP_USER_PASSKEY_REPLY, cp->passkey);
604086b7
BG
3795}
3796
bdb6d971 3797static int user_passkey_neg_reply(struct sock *sk, struct hci_dev *hdev,
04124681 3798 void *data, u16 len)
604086b7 3799{
650f726d 3800 struct mgmt_cp_user_passkey_neg_reply *cp = data;
604086b7
BG
3801
3802 BT_DBG("");
3803
1707c60e 3804 return user_pairing_resp(sk, hdev, &cp->addr,
04124681
GP
3805 MGMT_OP_USER_PASSKEY_NEG_REPLY,
3806 HCI_OP_USER_PASSKEY_NEG_REPLY, 0);
604086b7
BG
3807}
3808
13928971 3809static void update_name(struct hci_request *req)
2b4bf397 3810{
13928971 3811 struct hci_dev *hdev = req->hdev;
2b4bf397
JH
3812 struct hci_cp_write_local_name cp;
3813
13928971 3814 memcpy(cp.name, hdev->dev_name, sizeof(cp.name));
2b4bf397 3815
890ea898 3816 hci_req_add(req, HCI_OP_WRITE_LOCAL_NAME, sizeof(cp), &cp);
2b4bf397
JH
3817}
3818
1904a853 3819static void set_name_complete(struct hci_dev *hdev, u8 status, u16 opcode)
13928971
JH
3820{
3821 struct mgmt_cp_set_local_name *cp;
3b0602cd 3822 struct mgmt_pending_cmd *cmd;
13928971
JH
3823
3824 BT_DBG("status 0x%02x", status);
3825
3826 hci_dev_lock(hdev);
3827
333ae95d 3828 cmd = pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
13928971
JH
3829 if (!cmd)
3830 goto unlock;
3831
3832 cp = cmd->param;
3833
3834 if (status)
a69e8375
JH
3835 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME,
3836 mgmt_status(status));
13928971 3837 else
2a1afb5a
JH
3838 mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
3839 cp, sizeof(*cp));
13928971
JH
3840
3841 mgmt_pending_remove(cmd);
3842
3843unlock:
3844 hci_dev_unlock(hdev);
3845}
3846
bdb6d971 3847static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
04124681 3848 u16 len)
b312b161 3849{
2b4bf397 3850 struct mgmt_cp_set_local_name *cp = data;
3b0602cd 3851 struct mgmt_pending_cmd *cmd;
890ea898 3852 struct hci_request req;
b312b161
JH
3853 int err;
3854
3855 BT_DBG("");
3856
09fd0de5 3857 hci_dev_lock(hdev);
b312b161 3858
b3f2ca94
JH
3859 /* If the old values are the same as the new ones just return a
3860 * direct command complete event.
3861 */
3862 if (!memcmp(hdev->dev_name, cp->name, sizeof(hdev->dev_name)) &&
3863 !memcmp(hdev->short_name, cp->short_name,
3864 sizeof(hdev->short_name))) {
2a1afb5a
JH
3865 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
3866 data, len);
b3f2ca94
JH
3867 goto failed;
3868 }
3869
2b4bf397 3870 memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name));
28cc7bde 3871
b5235a65 3872 if (!hdev_is_powered(hdev)) {
2b4bf397 3873 memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));
28cc7bde 3874
2a1afb5a
JH
3875 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
3876 data, len);
28cc7bde
JH
3877 if (err < 0)
3878 goto failed;
3879
f6b7712e
MH
3880 err = mgmt_generic_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev,
3881 data, len, sk);
28cc7bde 3882
b5235a65
JH
3883 goto failed;
3884 }
3885
28cc7bde 3886 cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len);
b312b161
JH
3887 if (!cmd) {
3888 err = -ENOMEM;
3889 goto failed;
3890 }
3891
13928971
JH
3892 memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));
3893
890ea898 3894 hci_req_init(&req, hdev);
3f985050
JH
3895
3896 if (lmp_bredr_capable(hdev)) {
3897 update_name(&req);
3898 update_eir(&req);
3899 }
3900
7a5f4990
MH
3901 /* The name is stored in the scan response data and so
3902 * no need to udpate the advertising data here.
3903 */
3f985050 3904 if (lmp_le_capable(hdev))
7a5f4990 3905 update_scan_rsp_data(&req);
3f985050 3906
13928971 3907 err = hci_req_run(&req, set_name_complete);
b312b161
JH
3908 if (err < 0)
3909 mgmt_pending_remove(cmd);
3910
3911failed:
09fd0de5 3912 hci_dev_unlock(hdev);
b312b161
JH
3913 return err;
3914}
3915
1b9441f8
JH
3916static void read_local_oob_data_complete(struct hci_dev *hdev, u8 status,
3917 u16 opcode, struct sk_buff *skb)
3918{
3919 struct mgmt_rp_read_local_oob_data mgmt_rp;
3920 size_t rp_size = sizeof(mgmt_rp);
3921 struct mgmt_pending_cmd *cmd;
3922
3923 BT_DBG("%s status %u", hdev->name, status);
3924
3925 cmd = pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev);
3926 if (!cmd)
3927 return;
3928
3929 if (status || !skb) {
3930 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
3931 status ? mgmt_status(status) : MGMT_STATUS_FAILED);
3932 goto remove;
3933 }
3934
3935 memset(&mgmt_rp, 0, sizeof(mgmt_rp));
3936
3937 if (opcode == HCI_OP_READ_LOCAL_OOB_DATA) {
3938 struct hci_rp_read_local_oob_data *rp = (void *) skb->data;
3939
3940 if (skb->len < sizeof(*rp)) {
3941 mgmt_cmd_status(cmd->sk, hdev->id,
3942 MGMT_OP_READ_LOCAL_OOB_DATA,
3943 MGMT_STATUS_FAILED);
3944 goto remove;
3945 }
3946
3947 memcpy(mgmt_rp.hash192, rp->hash, sizeof(rp->hash));
3948 memcpy(mgmt_rp.rand192, rp->rand, sizeof(rp->rand));
3949
3950 rp_size -= sizeof(mgmt_rp.hash256) + sizeof(mgmt_rp.rand256);
3951 } else {
3952 struct hci_rp_read_local_oob_ext_data *rp = (void *) skb->data;
3953
3954 if (skb->len < sizeof(*rp)) {
3955 mgmt_cmd_status(cmd->sk, hdev->id,
3956 MGMT_OP_READ_LOCAL_OOB_DATA,
3957 MGMT_STATUS_FAILED);
3958 goto remove;
3959 }
3960
3961 memcpy(mgmt_rp.hash192, rp->hash192, sizeof(rp->hash192));
3962 memcpy(mgmt_rp.rand192, rp->rand192, sizeof(rp->rand192));
3963
3964 memcpy(mgmt_rp.hash256, rp->hash256, sizeof(rp->hash256));
3965 memcpy(mgmt_rp.rand256, rp->rand256, sizeof(rp->rand256));
3966 }
3967
3968 mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
3969 MGMT_STATUS_SUCCESS, &mgmt_rp, rp_size);
3970
3971remove:
3972 mgmt_pending_remove(cmd);
3973}
3974
0f4e68cf 3975static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev,
04124681 3976 void *data, u16 data_len)
c35938b2 3977{
3b0602cd 3978 struct mgmt_pending_cmd *cmd;
1b9441f8 3979 struct hci_request req;
c35938b2
SJ
3980 int err;
3981
bdb6d971 3982 BT_DBG("%s", hdev->name);
c35938b2 3983
09fd0de5 3984 hci_dev_lock(hdev);
c35938b2 3985
4b34ee78 3986 if (!hdev_is_powered(hdev)) {
a69e8375
JH
3987 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
3988 MGMT_STATUS_NOT_POWERED);
c35938b2
SJ
3989 goto unlock;
3990 }
3991
9a1a1996 3992 if (!lmp_ssp_capable(hdev)) {
a69e8375
JH
3993 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
3994 MGMT_STATUS_NOT_SUPPORTED);
c35938b2
SJ
3995 goto unlock;
3996 }
3997
333ae95d 3998 if (pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) {
a69e8375
JH
3999 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
4000 MGMT_STATUS_BUSY);
c35938b2
SJ
4001 goto unlock;
4002 }
4003
2e58ef3e 4004 cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0);
c35938b2
SJ
4005 if (!cmd) {
4006 err = -ENOMEM;
4007 goto unlock;
4008 }
4009
1b9441f8
JH
4010 hci_req_init(&req, hdev);
4011
710f11c0 4012 if (bredr_sc_enabled(hdev))
1b9441f8 4013 hci_req_add(&req, HCI_OP_READ_LOCAL_OOB_EXT_DATA, 0, NULL);
4d2d2796 4014 else
1b9441f8 4015 hci_req_add(&req, HCI_OP_READ_LOCAL_OOB_DATA, 0, NULL);
4d2d2796 4016
1b9441f8 4017 err = hci_req_run_skb(&req, read_local_oob_data_complete);
c35938b2
SJ
4018 if (err < 0)
4019 mgmt_pending_remove(cmd);
4020
4021unlock:
09fd0de5 4022 hci_dev_unlock(hdev);
c35938b2
SJ
4023 return err;
4024}
4025
bdb6d971 4026static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
04124681 4027 void *data, u16 len)
2763eda6 4028{
5d57e796 4029 struct mgmt_addr_info *addr = data;
2763eda6
SJ
4030 int err;
4031
bdb6d971 4032 BT_DBG("%s ", hdev->name);
2763eda6 4033
5d57e796 4034 if (!bdaddr_type_is_valid(addr->type))
2a1afb5a
JH
4035 return mgmt_cmd_complete(sk, hdev->id,
4036 MGMT_OP_ADD_REMOTE_OOB_DATA,
4037 MGMT_STATUS_INVALID_PARAMS,
4038 addr, sizeof(*addr));
5d57e796 4039
09fd0de5 4040 hci_dev_lock(hdev);
2763eda6 4041
ec109113
MH
4042 if (len == MGMT_ADD_REMOTE_OOB_DATA_SIZE) {
4043 struct mgmt_cp_add_remote_oob_data *cp = data;
4044 u8 status;
bf1e3541 4045
c19a495c 4046 if (cp->addr.type != BDADDR_BREDR) {
2a1afb5a
JH
4047 err = mgmt_cmd_complete(sk, hdev->id,
4048 MGMT_OP_ADD_REMOTE_OOB_DATA,
4049 MGMT_STATUS_INVALID_PARAMS,
4050 &cp->addr, sizeof(cp->addr));
c19a495c
JH
4051 goto unlock;
4052 }
4053
ec109113 4054 err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr,
6928a924
JH
4055 cp->addr.type, cp->hash,
4056 cp->rand, NULL, NULL);
ec109113
MH
4057 if (err < 0)
4058 status = MGMT_STATUS_FAILED;
4059 else
4060 status = MGMT_STATUS_SUCCESS;
4061
2a1afb5a
JH
4062 err = mgmt_cmd_complete(sk, hdev->id,
4063 MGMT_OP_ADD_REMOTE_OOB_DATA, status,
4064 &cp->addr, sizeof(cp->addr));
ec109113
MH
4065 } else if (len == MGMT_ADD_REMOTE_OOB_EXT_DATA_SIZE) {
4066 struct mgmt_cp_add_remote_oob_ext_data *cp = data;
41bcfd50 4067 u8 *rand192, *hash192, *rand256, *hash256;
ec109113
MH
4068 u8 status;
4069
86df9200 4070 if (bdaddr_type_is_le(cp->addr.type)) {
d25b78e2
JH
4071 /* Enforce zero-valued 192-bit parameters as
4072 * long as legacy SMP OOB isn't implemented.
4073 */
4074 if (memcmp(cp->rand192, ZERO_KEY, 16) ||
4075 memcmp(cp->hash192, ZERO_KEY, 16)) {
2a1afb5a
JH
4076 err = mgmt_cmd_complete(sk, hdev->id,
4077 MGMT_OP_ADD_REMOTE_OOB_DATA,
4078 MGMT_STATUS_INVALID_PARAMS,
4079 addr, sizeof(*addr));
d25b78e2
JH
4080 goto unlock;
4081 }
4082
86df9200
JH
4083 rand192 = NULL;
4084 hash192 = NULL;
4085 } else {
41bcfd50
MH
4086 /* In case one of the P-192 values is set to zero,
4087 * then just disable OOB data for P-192.
4088 */
4089 if (!memcmp(cp->rand192, ZERO_KEY, 16) ||
4090 !memcmp(cp->hash192, ZERO_KEY, 16)) {
4091 rand192 = NULL;
4092 hash192 = NULL;
4093 } else {
4094 rand192 = cp->rand192;
4095 hash192 = cp->hash192;
4096 }
4097 }
4098
4099 /* In case one of the P-256 values is set to zero, then just
4100 * disable OOB data for P-256.
4101 */
4102 if (!memcmp(cp->rand256, ZERO_KEY, 16) ||
4103 !memcmp(cp->hash256, ZERO_KEY, 16)) {
4104 rand256 = NULL;
4105 hash256 = NULL;
4106 } else {
4107 rand256 = cp->rand256;
4108 hash256 = cp->hash256;
86df9200
JH
4109 }
4110
81328d5c 4111 err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr,
86df9200 4112 cp->addr.type, hash192, rand192,
41bcfd50 4113 hash256, rand256);
ec109113
MH
4114 if (err < 0)
4115 status = MGMT_STATUS_FAILED;
4116 else
4117 status = MGMT_STATUS_SUCCESS;
4118
2a1afb5a
JH
4119 err = mgmt_cmd_complete(sk, hdev->id,
4120 MGMT_OP_ADD_REMOTE_OOB_DATA,
4121 status, &cp->addr, sizeof(cp->addr));
ec109113
MH
4122 } else {
4123 BT_ERR("add_remote_oob_data: invalid length of %u bytes", len);
a69e8375
JH
4124 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA,
4125 MGMT_STATUS_INVALID_PARAMS);
ec109113 4126 }
2763eda6 4127
c19a495c 4128unlock:
09fd0de5 4129 hci_dev_unlock(hdev);
2763eda6
SJ
4130 return err;
4131}
4132
bdb6d971 4133static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
8ce8e2b5 4134 void *data, u16 len)
2763eda6 4135{
650f726d 4136 struct mgmt_cp_remove_remote_oob_data *cp = data;
bf1e3541 4137 u8 status;
2763eda6
SJ
4138 int err;
4139
bdb6d971 4140 BT_DBG("%s", hdev->name);
2763eda6 4141
c19a495c 4142 if (cp->addr.type != BDADDR_BREDR)
2a1afb5a
JH
4143 return mgmt_cmd_complete(sk, hdev->id,
4144 MGMT_OP_REMOVE_REMOTE_OOB_DATA,
4145 MGMT_STATUS_INVALID_PARAMS,
4146 &cp->addr, sizeof(cp->addr));
c19a495c 4147
09fd0de5 4148 hci_dev_lock(hdev);
2763eda6 4149
eedbd581
JH
4150 if (!bacmp(&cp->addr.bdaddr, BDADDR_ANY)) {
4151 hci_remote_oob_data_clear(hdev);
4152 status = MGMT_STATUS_SUCCESS;
4153 goto done;
4154 }
4155
6928a924 4156 err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr, cp->addr.type);
2763eda6 4157 if (err < 0)
bf1e3541 4158 status = MGMT_STATUS_INVALID_PARAMS;
2763eda6 4159 else
a6785be2 4160 status = MGMT_STATUS_SUCCESS;
bf1e3541 4161
eedbd581 4162done:
2a1afb5a
JH
4163 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
4164 status, &cp->addr, sizeof(cp->addr));
2763eda6 4165
09fd0de5 4166 hci_dev_unlock(hdev);
2763eda6
SJ
4167 return err;
4168}
4169
812abb13 4170static bool trigger_bredr_inquiry(struct hci_request *req, u8 *status)
41dc2bd6 4171{
8019044d 4172 struct hci_dev *hdev = req->hdev;
812abb13 4173 struct hci_cp_inquiry cp;
8019044d
MH
4174 /* General inquiry access code (GIAC) */
4175 u8 lap[3] = { 0x33, 0x8b, 0x9e };
812abb13
JP
4176
4177 *status = mgmt_bredr_support(hdev);
4178 if (*status)
4179 return false;
4180
4181 if (hci_dev_test_flag(hdev, HCI_INQUIRY)) {
4182 *status = MGMT_STATUS_BUSY;
4183 return false;
4184 }
4185
4186 hci_inquiry_cache_flush(hdev);
4187
4188 memset(&cp, 0, sizeof(cp));
4189 memcpy(&cp.lap, lap, sizeof(cp.lap));
4190 cp.length = DISCOV_BREDR_INQUIRY_LEN;
4191
4192 hci_req_add(req, HCI_OP_INQUIRY, sizeof(cp), &cp);
4193
4194 return true;
4195}
4196
4197static bool trigger_le_scan(struct hci_request *req, u16 interval, u8 *status)
4198{
4199 struct hci_dev *hdev = req->hdev;
4200 struct hci_cp_le_set_scan_param param_cp;
4201 struct hci_cp_le_set_scan_enable enable_cp;
8019044d 4202 u8 own_addr_type;
41dc2bd6
AG
4203 int err;
4204
812abb13
JP
4205 *status = mgmt_le_support(hdev);
4206 if (*status)
4207 return false;
41dc2bd6 4208
812abb13
JP
4209 if (hci_dev_test_flag(hdev, HCI_LE_ADV)) {
4210 /* Don't let discovery abort an outgoing connection attempt
4211 * that's using directed advertising.
4212 */
4213 if (hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT)) {
4214 *status = MGMT_STATUS_REJECTED;
8019044d
MH
4215 return false;
4216 }
41dc2bd6 4217
812abb13
JP
4218 disable_advertising(req);
4219 }
41dc2bd6 4220
812abb13
JP
4221 /* If controller is scanning, it means the background scanning is
4222 * running. Thus, we should temporarily stop it in order to set the
4223 * discovery scanning parameters.
4224 */
4225 if (hci_dev_test_flag(hdev, HCI_LE_SCAN))
4226 hci_req_add_le_scan_disable(req);
41dc2bd6 4227
812abb13
JP
4228 /* All active scans will be done with either a resolvable private
4229 * address (when privacy feature has been enabled) or non-resolvable
4230 * private address.
4231 */
4232 err = hci_update_random_address(req, true, &own_addr_type);
4233 if (err < 0) {
4234 *status = MGMT_STATUS_FAILED;
4235 return false;
4236 }
8019044d 4237
812abb13
JP
4238 memset(&param_cp, 0, sizeof(param_cp));
4239 param_cp.type = LE_SCAN_ACTIVE;
4240 param_cp.interval = cpu_to_le16(interval);
4241 param_cp.window = cpu_to_le16(DISCOV_LE_SCAN_WIN);
4242 param_cp.own_address_type = own_addr_type;
8019044d 4243
812abb13
JP
4244 hci_req_add(req, HCI_OP_LE_SET_SCAN_PARAM, sizeof(param_cp),
4245 &param_cp);
8019044d 4246
812abb13
JP
4247 memset(&enable_cp, 0, sizeof(enable_cp));
4248 enable_cp.enable = LE_SCAN_ENABLE;
4249 enable_cp.filter_dup = LE_SCAN_FILTER_DUP_ENABLE;
8019044d 4250
812abb13
JP
4251 hci_req_add(req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(enable_cp),
4252 &enable_cp);
4253
4254 return true;
4255}
8019044d 4256
812abb13
JP
4257static bool trigger_discovery(struct hci_request *req, u8 *status)
4258{
4259 struct hci_dev *hdev = req->hdev;
8019044d 4260
812abb13
JP
4261 switch (hdev->discovery.type) {
4262 case DISCOV_TYPE_BREDR:
4263 if (!trigger_bredr_inquiry(req, status))
4264 return false;
4265 break;
4266
4267 case DISCOV_TYPE_INTERLEAVED:
07d2334a
JP
4268 if (test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY,
4269 &hdev->quirks)) {
4270 /* During simultaneous discovery, we double LE scan
4271 * interval. We must leave some time for the controller
4272 * to do BR/EDR inquiry.
4273 */
4274 if (!trigger_le_scan(req, DISCOV_LE_SCAN_INT * 2,
4275 status))
4276 return false;
4277
4278 if (!trigger_bredr_inquiry(req, status))
4279 return false;
4280
4281 return true;
4282 }
4283
812abb13
JP
4284 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
4285 *status = MGMT_STATUS_NOT_SUPPORTED;
8019044d
MH
4286 return false;
4287 }
812abb13 4288 /* fall through */
8019044d 4289
812abb13
JP
4290 case DISCOV_TYPE_LE:
4291 if (!trigger_le_scan(req, DISCOV_LE_SCAN_INT, status))
4292 return false;
8019044d
MH
4293 break;
4294
4295 default:
4296 *status = MGMT_STATUS_INVALID_PARAMS;
4297 return false;
4298 }
4299
4300 return true;
41dc2bd6
AG
4301}
4302
1904a853
MH
4303static void start_discovery_complete(struct hci_dev *hdev, u8 status,
4304 u16 opcode)
7c307720 4305{
3b0602cd 4306 struct mgmt_pending_cmd *cmd;
11e6e25d 4307 unsigned long timeout;
ae55f598 4308
7c307720
AG
4309 BT_DBG("status %d", status);
4310
11e6e25d 4311 hci_dev_lock(hdev);
41dc2bd6 4312
333ae95d 4313 cmd = pending_find(MGMT_OP_START_DISCOVERY, hdev);
66ea9427 4314 if (!cmd)
333ae95d 4315 cmd = pending_find(MGMT_OP_START_SERVICE_DISCOVERY, hdev);
66ea9427 4316
11e6e25d 4317 if (cmd) {
2922a94f 4318 cmd->cmd_complete(cmd, mgmt_status(status));
11e6e25d
MH
4319 mgmt_pending_remove(cmd);
4320 }
7c307720
AG
4321
4322 if (status) {
11e6e25d
MH
4323 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
4324 goto unlock;
7c307720
AG
4325 }
4326
7c307720 4327 hci_discovery_set_state(hdev, DISCOVERY_FINDING);
7c307720 4328
2d28cfe7
JP
4329 /* If the scan involves LE scan, pick proper timeout to schedule
4330 * hdev->le_scan_disable that will stop it.
4331 */
7c307720
AG
4332 switch (hdev->discovery.type) {
4333 case DISCOV_TYPE_LE:
3d5a76f0 4334 timeout = msecs_to_jiffies(DISCOV_LE_TIMEOUT);
7c307720 4335 break;
7c307720 4336 case DISCOV_TYPE_INTERLEAVED:
07d2334a
JP
4337 /* When running simultaneous discovery, the LE scanning time
4338 * should occupy the whole discovery time sine BR/EDR inquiry
4339 * and LE scanning are scheduled by the controller.
4340 *
4341 * For interleaving discovery in comparison, BR/EDR inquiry
4342 * and LE scanning are done sequentially with separate
4343 * timeouts.
4344 */
4345 if (test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks))
4346 timeout = msecs_to_jiffies(DISCOV_LE_TIMEOUT);
4347 else
4348 timeout = msecs_to_jiffies(hdev->discov_interleaved_timeout);
7c307720 4349 break;
7c307720 4350 case DISCOV_TYPE_BREDR:
11e6e25d 4351 timeout = 0;
7c307720 4352 break;
7c307720
AG
4353 default:
4354 BT_ERR("Invalid discovery type %d", hdev->discovery.type);
11e6e25d
MH
4355 timeout = 0;
4356 break;
7c307720 4357 }
ae55f598 4358
2d28cfe7
JP
4359 if (timeout) {
4360 /* When service discovery is used and the controller has
4361 * a strict duplicate filter, it is important to remember
4362 * the start and duration of the scan. This is required
4363 * for restarting scanning during the discovery phase.
4364 */
4365 if (test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER,
4366 &hdev->quirks) &&
82f8b651 4367 hdev->discovery.result_filtering) {
2d28cfe7
JP
4368 hdev->discovery.scan_start = jiffies;
4369 hdev->discovery.scan_duration = timeout;
4370 }
4371
11e6e25d
MH
4372 queue_delayed_work(hdev->workqueue,
4373 &hdev->le_scan_disable, timeout);
2d28cfe7 4374 }
ae55f598 4375
11e6e25d
MH
4376unlock:
4377 hci_dev_unlock(hdev);
7c307720
AG
4378}
4379
bdb6d971 4380static int start_discovery(struct sock *sk, struct hci_dev *hdev,
04124681 4381 void *data, u16 len)
14a53664 4382{
650f726d 4383 struct mgmt_cp_start_discovery *cp = data;
3b0602cd 4384 struct mgmt_pending_cmd *cmd;
7c307720 4385 struct hci_request req;
8019044d 4386 u8 status;
14a53664
JH
4387 int err;
4388
bdb6d971 4389 BT_DBG("%s", hdev->name);
14a53664 4390
09fd0de5 4391 hci_dev_lock(hdev);
14a53664 4392
4b34ee78 4393 if (!hdev_is_powered(hdev)) {
2a1afb5a
JH
4394 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_START_DISCOVERY,
4395 MGMT_STATUS_NOT_POWERED,
4396 &cp->type, sizeof(cp->type));
bd2d1334
JH
4397 goto failed;
4398 }
4399
f5a969f2 4400 if (hdev->discovery.state != DISCOVERY_STOPPED ||
d7a5a11d 4401 hci_dev_test_flag(hdev, HCI_PERIODIC_INQ)) {
2a1afb5a
JH
4402 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_START_DISCOVERY,
4403 MGMT_STATUS_BUSY, &cp->type,
4404 sizeof(cp->type));
642be6c7
AG
4405 goto failed;
4406 }
4407
2922a94f 4408 cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, hdev, data, len);
14a53664
JH
4409 if (!cmd) {
4410 err = -ENOMEM;
4411 goto failed;
4412 }
4413
2922a94f
JH
4414 cmd->cmd_complete = generic_cmd_complete;
4415
22078800
MH
4416 /* Clear the discovery filter first to free any previously
4417 * allocated memory for the UUID list.
4418 */
4419 hci_discovery_filter_clear(hdev);
4420
4aab14e5 4421 hdev->discovery.type = cp->type;
da25cf6a 4422 hdev->discovery.report_invalid_rssi = false;
4aab14e5 4423
7c307720
AG
4424 hci_req_init(&req, hdev);
4425
8019044d 4426 if (!trigger_discovery(&req, &status)) {
2a1afb5a
JH
4427 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_START_DISCOVERY,
4428 status, &cp->type, sizeof(cp->type));
04106755
JH
4429 mgmt_pending_remove(cmd);
4430 goto failed;
f39799f5 4431 }
04106755 4432
7c307720 4433 err = hci_req_run(&req, start_discovery_complete);
f5a969f2 4434 if (err < 0) {
14a53664 4435 mgmt_pending_remove(cmd);
f5a969f2
MH
4436 goto failed;
4437 }
7c307720 4438
f5a969f2 4439 hci_discovery_set_state(hdev, DISCOVERY_STARTING);
7c307720 4440
14a53664 4441failed:
09fd0de5 4442 hci_dev_unlock(hdev);
14a53664
JH
4443 return err;
4444}
f39799f5 4445
3b0602cd
JH
4446static int service_discovery_cmd_complete(struct mgmt_pending_cmd *cmd,
4447 u8 status)
2922a94f 4448{
2a1afb5a
JH
4449 return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status,
4450 cmd->param, 1);
2922a94f 4451}
04106755 4452
66ea9427
JP
4453static int start_service_discovery(struct sock *sk, struct hci_dev *hdev,
4454 void *data, u16 len)
4455{
4456 struct mgmt_cp_start_service_discovery *cp = data;
3b0602cd 4457 struct mgmt_pending_cmd *cmd;
66ea9427
JP
4458 struct hci_request req;
4459 const u16 max_uuid_count = ((U16_MAX - sizeof(*cp)) / 16);
4460 u16 uuid_count, expected_len;
4461 u8 status;
4462 int err;
04106755 4463
66ea9427 4464 BT_DBG("%s", hdev->name);
e8bb6b97 4465
66ea9427 4466 hci_dev_lock(hdev);
7c307720 4467
66ea9427 4468 if (!hdev_is_powered(hdev)) {
2a1afb5a
JH
4469 err = mgmt_cmd_complete(sk, hdev->id,
4470 MGMT_OP_START_SERVICE_DISCOVERY,
4471 MGMT_STATUS_NOT_POWERED,
4472 &cp->type, sizeof(cp->type));
66ea9427
JP
4473 goto failed;
4474 }
7c307720 4475
66ea9427 4476 if (hdev->discovery.state != DISCOVERY_STOPPED ||
d7a5a11d 4477 hci_dev_test_flag(hdev, HCI_PERIODIC_INQ)) {
2a1afb5a
JH
4478 err = mgmt_cmd_complete(sk, hdev->id,
4479 MGMT_OP_START_SERVICE_DISCOVERY,
4480 MGMT_STATUS_BUSY, &cp->type,
4481 sizeof(cp->type));
66ea9427
JP
4482 goto failed;
4483 }
d9483943 4484
66ea9427
JP
4485 uuid_count = __le16_to_cpu(cp->uuid_count);
4486 if (uuid_count > max_uuid_count) {
4487 BT_ERR("service_discovery: too big uuid_count value %u",
4488 uuid_count);
2a1afb5a
JH
4489 err = mgmt_cmd_complete(sk, hdev->id,
4490 MGMT_OP_START_SERVICE_DISCOVERY,
4491 MGMT_STATUS_INVALID_PARAMS, &cp->type,
4492 sizeof(cp->type));
66ea9427
JP
4493 goto failed;
4494 }
4495
4496 expected_len = sizeof(*cp) + uuid_count * 16;
4497 if (expected_len != len) {
4498 BT_ERR("service_discovery: expected %u bytes, got %u bytes",
4499 expected_len, len);
2a1afb5a
JH
4500 err = mgmt_cmd_complete(sk, hdev->id,
4501 MGMT_OP_START_SERVICE_DISCOVERY,
4502 MGMT_STATUS_INVALID_PARAMS, &cp->type,
4503 sizeof(cp->type));
66ea9427
JP
4504 goto failed;
4505 }
4506
4507 cmd = mgmt_pending_add(sk, MGMT_OP_START_SERVICE_DISCOVERY,
2922a94f 4508 hdev, data, len);
66ea9427
JP
4509 if (!cmd) {
4510 err = -ENOMEM;
4511 goto failed;
4512 }
4513
2922a94f
JH
4514 cmd->cmd_complete = service_discovery_cmd_complete;
4515
22078800
MH
4516 /* Clear the discovery filter first to free any previously
4517 * allocated memory for the UUID list.
4518 */
4519 hci_discovery_filter_clear(hdev);
4520
82f8b651 4521 hdev->discovery.result_filtering = true;
66ea9427
JP
4522 hdev->discovery.type = cp->type;
4523 hdev->discovery.rssi = cp->rssi;
4524 hdev->discovery.uuid_count = uuid_count;
4525
4526 if (uuid_count > 0) {
4527 hdev->discovery.uuids = kmemdup(cp->uuids, uuid_count * 16,
4528 GFP_KERNEL);
4529 if (!hdev->discovery.uuids) {
2a1afb5a
JH
4530 err = mgmt_cmd_complete(sk, hdev->id,
4531 MGMT_OP_START_SERVICE_DISCOVERY,
4532 MGMT_STATUS_FAILED,
4533 &cp->type, sizeof(cp->type));
d9483943
JH
4534 mgmt_pending_remove(cmd);
4535 goto failed;
4536 }
66ea9427 4537 }
d9483943 4538
66ea9427 4539 hci_req_init(&req, hdev);
5e0452c0 4540
66ea9427 4541 if (!trigger_discovery(&req, &status)) {
2a1afb5a
JH
4542 err = mgmt_cmd_complete(sk, hdev->id,
4543 MGMT_OP_START_SERVICE_DISCOVERY,
4544 status, &cp->type, sizeof(cp->type));
04106755
JH
4545 mgmt_pending_remove(cmd);
4546 goto failed;
f39799f5 4547 }
3fd24153 4548
7c307720 4549 err = hci_req_run(&req, start_discovery_complete);
66ea9427 4550 if (err < 0) {
14a53664 4551 mgmt_pending_remove(cmd);
66ea9427
JP
4552 goto failed;
4553 }
4554
4555 hci_discovery_set_state(hdev, DISCOVERY_STARTING);
14a53664
JH
4556
4557failed:
09fd0de5 4558 hci_dev_unlock(hdev);
14a53664
JH
4559 return err;
4560}
4561
1904a853 4562static void stop_discovery_complete(struct hci_dev *hdev, u8 status, u16 opcode)
1183fdca 4563{
3b0602cd 4564 struct mgmt_pending_cmd *cmd;
1183fdca 4565
0e05bba6
AG
4566 BT_DBG("status %d", status);
4567
4568 hci_dev_lock(hdev);
4569
333ae95d 4570 cmd = pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
11e6e25d 4571 if (cmd) {
2922a94f 4572 cmd->cmd_complete(cmd, mgmt_status(status));
11e6e25d 4573 mgmt_pending_remove(cmd);
0e05bba6
AG
4574 }
4575
11e6e25d
MH
4576 if (!status)
4577 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
0e05bba6 4578
0e05bba6
AG
4579 hci_dev_unlock(hdev);
4580}
4581
bdb6d971 4582static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
04124681 4583 u16 len)
14a53664 4584{
d930650b 4585 struct mgmt_cp_stop_discovery *mgmt_cp = data;
3b0602cd 4586 struct mgmt_pending_cmd *cmd;
0e05bba6 4587 struct hci_request req;
14a53664
JH
4588 int err;
4589
bdb6d971 4590 BT_DBG("%s", hdev->name);
14a53664 4591
09fd0de5 4592 hci_dev_lock(hdev);
14a53664 4593
30dc78e1 4594 if (!hci_discovery_active(hdev)) {
2a1afb5a
JH
4595 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
4596 MGMT_STATUS_REJECTED, &mgmt_cp->type,
4597 sizeof(mgmt_cp->type));
d930650b
JH
4598 goto unlock;
4599 }
4600
4601 if (hdev->discovery.type != mgmt_cp->type) {
2a1afb5a
JH
4602 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
4603 MGMT_STATUS_INVALID_PARAMS,
4604 &mgmt_cp->type, sizeof(mgmt_cp->type));
30dc78e1 4605 goto unlock;
ff9ef578
JH
4606 }
4607
2922a94f 4608 cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, data, len);
14a53664
JH
4609 if (!cmd) {
4610 err = -ENOMEM;
30dc78e1
JH
4611 goto unlock;
4612 }
4613
2922a94f
JH
4614 cmd->cmd_complete = generic_cmd_complete;
4615
0e05bba6
AG
4616 hci_req_init(&req, hdev);
4617
21a60d30 4618 hci_stop_discovery(&req);
e0d9727e 4619
21a60d30
JH
4620 err = hci_req_run(&req, stop_discovery_complete);
4621 if (!err) {
4622 hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
0e05bba6 4623 goto unlock;
14a53664
JH
4624 }
4625
21a60d30
JH
4626 mgmt_pending_remove(cmd);
4627
4628 /* If no HCI commands were sent we're done */
4629 if (err == -ENODATA) {
2a1afb5a
JH
4630 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY, 0,
4631 &mgmt_cp->type, sizeof(mgmt_cp->type));
21a60d30
JH
4632 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
4633 }
14a53664 4634
30dc78e1 4635unlock:
09fd0de5 4636 hci_dev_unlock(hdev);
14a53664
JH
4637 return err;
4638}
4639
bdb6d971 4640static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
04124681 4641 u16 len)
561aafbc 4642{
650f726d 4643 struct mgmt_cp_confirm_name *cp = data;
561aafbc 4644 struct inquiry_entry *e;
561aafbc
JH
4645 int err;
4646
bdb6d971 4647 BT_DBG("%s", hdev->name);
561aafbc 4648
561aafbc
JH
4649 hci_dev_lock(hdev);
4650
30dc78e1 4651 if (!hci_discovery_active(hdev)) {
2a1afb5a
JH
4652 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
4653 MGMT_STATUS_FAILED, &cp->addr,
4654 sizeof(cp->addr));
30dc78e1
JH
4655 goto failed;
4656 }
4657
a198e7b1 4658 e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr);
561aafbc 4659 if (!e) {
2a1afb5a
JH
4660 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
4661 MGMT_STATUS_INVALID_PARAMS, &cp->addr,
4662 sizeof(cp->addr));
561aafbc
JH
4663 goto failed;
4664 }
4665
4666 if (cp->name_known) {
4667 e->name_state = NAME_KNOWN;
4668 list_del(&e->list);
4669 } else {
4670 e->name_state = NAME_NEEDED;
a3d4e20a 4671 hci_inquiry_cache_update_resolve(hdev, e);
561aafbc
JH
4672 }
4673
2a1afb5a
JH
4674 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0,
4675 &cp->addr, sizeof(cp->addr));
561aafbc
JH
4676
4677failed:
4678 hci_dev_unlock(hdev);
561aafbc
JH
4679 return err;
4680}
4681
bdb6d971 4682static int block_device(struct sock *sk, struct hci_dev *hdev, void *data,
04124681 4683 u16 len)
7fbec224 4684{
650f726d 4685 struct mgmt_cp_block_device *cp = data;
f0eeea8b 4686 u8 status;
7fbec224
AJ
4687 int err;
4688
bdb6d971 4689 BT_DBG("%s", hdev->name);
7fbec224 4690
4ee71b20 4691 if (!bdaddr_type_is_valid(cp->addr.type))
2a1afb5a
JH
4692 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE,
4693 MGMT_STATUS_INVALID_PARAMS,
4694 &cp->addr, sizeof(cp->addr));
4ee71b20 4695
09fd0de5 4696 hci_dev_lock(hdev);
5e762444 4697
dcc36c16
JH
4698 err = hci_bdaddr_list_add(&hdev->blacklist, &cp->addr.bdaddr,
4699 cp->addr.type);
2a8357f2 4700 if (err < 0) {
f0eeea8b 4701 status = MGMT_STATUS_FAILED;
2a8357f2
JH
4702 goto done;
4703 }
4704
4705 mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &cp->addr, sizeof(cp->addr),
4706 sk);
4707 status = MGMT_STATUS_SUCCESS;
f0eeea8b 4708
2a8357f2 4709done:
2a1afb5a
JH
4710 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status,
4711 &cp->addr, sizeof(cp->addr));
5e762444 4712
09fd0de5 4713 hci_dev_unlock(hdev);
7fbec224
AJ
4714
4715 return err;
4716}
4717
bdb6d971 4718static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data,
04124681 4719 u16 len)
7fbec224 4720{
650f726d 4721 struct mgmt_cp_unblock_device *cp = data;
f0eeea8b 4722 u8 status;
7fbec224
AJ
4723 int err;
4724
bdb6d971 4725 BT_DBG("%s", hdev->name);
7fbec224 4726
4ee71b20 4727 if (!bdaddr_type_is_valid(cp->addr.type))
2a1afb5a
JH
4728 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE,
4729 MGMT_STATUS_INVALID_PARAMS,
4730 &cp->addr, sizeof(cp->addr));
4ee71b20 4731
09fd0de5 4732 hci_dev_lock(hdev);
5e762444 4733
dcc36c16
JH
4734 err = hci_bdaddr_list_del(&hdev->blacklist, &cp->addr.bdaddr,
4735 cp->addr.type);
2a8357f2 4736 if (err < 0) {
f0eeea8b 4737 status = MGMT_STATUS_INVALID_PARAMS;
2a8357f2
JH
4738 goto done;
4739 }
4740
4741 mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &cp->addr, sizeof(cp->addr),
4742 sk);
4743 status = MGMT_STATUS_SUCCESS;
f0eeea8b 4744
2a8357f2 4745done:
2a1afb5a
JH
4746 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status,
4747 &cp->addr, sizeof(cp->addr));
5e762444 4748
09fd0de5 4749 hci_dev_unlock(hdev);
7fbec224
AJ
4750
4751 return err;
4752}
4753
cdbaccca
MH
4754static int set_device_id(struct sock *sk, struct hci_dev *hdev, void *data,
4755 u16 len)
4756{
4757 struct mgmt_cp_set_device_id *cp = data;
890ea898 4758 struct hci_request req;
cdbaccca 4759 int err;
c72d4b8a 4760 __u16 source;
cdbaccca
MH
4761
4762 BT_DBG("%s", hdev->name);
4763
c72d4b8a
SJ
4764 source = __le16_to_cpu(cp->source);
4765
4766 if (source > 0x0002)
a69e8375
JH
4767 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEVICE_ID,
4768 MGMT_STATUS_INVALID_PARAMS);
c72d4b8a 4769
cdbaccca
MH
4770 hci_dev_lock(hdev);
4771
c72d4b8a 4772 hdev->devid_source = source;
cdbaccca
MH
4773 hdev->devid_vendor = __le16_to_cpu(cp->vendor);
4774 hdev->devid_product = __le16_to_cpu(cp->product);
4775 hdev->devid_version = __le16_to_cpu(cp->version);
4776
2a1afb5a
JH
4777 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEVICE_ID, 0,
4778 NULL, 0);
cdbaccca 4779
890ea898
JH
4780 hci_req_init(&req, hdev);
4781 update_eir(&req);
4782 hci_req_run(&req, NULL);
cdbaccca
MH
4783
4784 hci_dev_unlock(hdev);
4785
4786 return err;
4787}
4788
24b4f38f
AU
4789static void enable_advertising_instance(struct hci_dev *hdev, u8 status,
4790 u16 opcode)
4791{
4792 BT_DBG("status %d", status);
4793}
4794
1904a853
MH
4795static void set_advertising_complete(struct hci_dev *hdev, u8 status,
4796 u16 opcode)
4375f103
JH
4797{
4798 struct cmd_lookup match = { NULL, hdev };
24b4f38f 4799 struct hci_request req;
7816b820
FG
4800 u8 instance;
4801 struct adv_info *adv_instance;
4802 int err;
4375f103 4803
3ad67582
JK
4804 hci_dev_lock(hdev);
4805
4375f103
JH
4806 if (status) {
4807 u8 mgmt_err = mgmt_status(status);
4808
4809 mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev,
4810 cmd_status_rsp, &mgmt_err);
3ad67582 4811 goto unlock;
4375f103
JH
4812 }
4813
d7a5a11d 4814 if (hci_dev_test_flag(hdev, HCI_LE_ADV))
a1536da2 4815 hci_dev_set_flag(hdev, HCI_ADVERTISING);
c93bd150 4816 else
a358dc11 4817 hci_dev_clear_flag(hdev, HCI_ADVERTISING);
c93bd150 4818
4375f103
JH
4819 mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, settings_rsp,
4820 &match);
4821
4822 new_settings(hdev, match.sk);
4823
4824 if (match.sk)
4825 sock_put(match.sk);
3ad67582 4826
24b4f38f 4827 /* If "Set Advertising" was just disabled and instance advertising was
7816b820 4828 * set up earlier, then re-enable multi-instance advertising.
24b4f38f
AU
4829 */
4830 if (hci_dev_test_flag(hdev, HCI_ADVERTISING) ||
7816b820
FG
4831 !hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE) ||
4832 list_empty(&hdev->adv_instances))
24b4f38f
AU
4833 goto unlock;
4834
7816b820
FG
4835 instance = hdev->cur_adv_instance;
4836 if (!instance) {
4837 adv_instance = list_first_entry_or_null(&hdev->adv_instances,
4838 struct adv_info, list);
4839 if (!adv_instance)
4840 goto unlock;
4841
4842 instance = adv_instance->instance;
4843 }
4844
24b4f38f
AU
4845 hci_req_init(&req, hdev);
4846
7816b820
FG
4847 err = schedule_adv_instance(&req, instance, true);
4848
4849 if (!err)
4850 err = hci_req_run(&req, enable_advertising_instance);
24b4f38f 4851
7816b820 4852 if (err)
24b4f38f
AU
4853 BT_ERR("Failed to re-configure advertising");
4854
3ad67582
JK
4855unlock:
4856 hci_dev_unlock(hdev);
4375f103
JH
4857}
4858
21b5187f
MH
4859static int set_advertising(struct sock *sk, struct hci_dev *hdev, void *data,
4860 u16 len)
4375f103
JH
4861{
4862 struct mgmt_mode *cp = data;
3b0602cd 4863 struct mgmt_pending_cmd *cmd;
4375f103 4864 struct hci_request req;
cc91cb04 4865 u8 val, status;
4375f103
JH
4866 int err;
4867
4868 BT_DBG("request for %s", hdev->name);
4869
e6fe7986
JH
4870 status = mgmt_le_support(hdev);
4871 if (status)
a69e8375
JH
4872 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
4873 status);
4375f103 4874
cc91cb04 4875 if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
a69e8375
JH
4876 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
4877 MGMT_STATUS_INVALID_PARAMS);
4375f103
JH
4878
4879 hci_dev_lock(hdev);
4880
4881 val = !!cp->val;
4375f103 4882
f74ca9b8
JH
4883 /* The following conditions are ones which mean that we should
4884 * not do any HCI communication but directly send a mgmt
4885 * response to user space (after toggling the flag if
4886 * necessary).
4887 */
cc91cb04 4888 if (!hdev_is_powered(hdev) ||
d7a5a11d
MH
4889 (val == hci_dev_test_flag(hdev, HCI_ADVERTISING) &&
4890 (cp->val == 0x02) == hci_dev_test_flag(hdev, HCI_ADVERTISING_CONNECTABLE)) ||
e8bb6b97 4891 hci_conn_num(hdev, LE_LINK) > 0 ||
d7a5a11d 4892 (hci_dev_test_flag(hdev, HCI_LE_SCAN) &&
e8bb6b97 4893 hdev->le_scan_type == LE_SCAN_ACTIVE)) {
cc91cb04 4894 bool changed;
4375f103 4895
cc91cb04 4896 if (cp->val) {
238be788 4897 changed = !hci_dev_test_and_set_flag(hdev, HCI_ADVERTISING);
cc91cb04 4898 if (cp->val == 0x02)
a1536da2 4899 hci_dev_set_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
cc91cb04 4900 else
a358dc11 4901 hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
cc91cb04 4902 } else {
a69d8927 4903 changed = hci_dev_test_and_clear_flag(hdev, HCI_ADVERTISING);
a358dc11 4904 hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
4375f103
JH
4905 }
4906
4907 err = send_settings_rsp(sk, MGMT_OP_SET_ADVERTISING, hdev);
4908 if (err < 0)
4909 goto unlock;
4910
4911 if (changed)
4912 err = new_settings(hdev, sk);
4913
4914 goto unlock;
4915 }
4916
333ae95d
JH
4917 if (pending_find(MGMT_OP_SET_ADVERTISING, hdev) ||
4918 pending_find(MGMT_OP_SET_LE, hdev)) {
a69e8375
JH
4919 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
4920 MGMT_STATUS_BUSY);
4375f103
JH
4921 goto unlock;
4922 }
4923
4924 cmd = mgmt_pending_add(sk, MGMT_OP_SET_ADVERTISING, hdev, data, len);
4925 if (!cmd) {
4926 err = -ENOMEM;
4927 goto unlock;
4928 }
4929
4930 hci_req_init(&req, hdev);
4931
cc91cb04 4932 if (cp->val == 0x02)
a1536da2 4933 hci_dev_set_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
cc91cb04 4934 else
a358dc11 4935 hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
cc91cb04 4936
7816b820
FG
4937 cancel_adv_timeout(hdev);
4938
24b4f38f 4939 if (val) {
7816b820
FG
4940 /* Switch to instance "0" for the Set Advertising setting.
4941 * We cannot use update_[adv|scan_rsp]_data() here as the
4942 * HCI_ADVERTISING flag is not yet set.
4943 */
efae002c
FG
4944 update_inst_adv_data(&req, 0x00);
4945 update_inst_scan_rsp_data(&req, 0x00);
bba3aa55 4946 enable_advertising(&req);
24b4f38f 4947 } else {
bba3aa55 4948 disable_advertising(&req);
24b4f38f 4949 }
4375f103
JH
4950
4951 err = hci_req_run(&req, set_advertising_complete);
4952 if (err < 0)
4953 mgmt_pending_remove(cmd);
4954
4955unlock:
4956 hci_dev_unlock(hdev);
4957 return err;
4958}
4959
d13eafce
MH
4960static int set_static_address(struct sock *sk, struct hci_dev *hdev,
4961 void *data, u16 len)
4962{
4963 struct mgmt_cp_set_static_address *cp = data;
4964 int err;
4965
4966 BT_DBG("%s", hdev->name);
4967
62af4443 4968 if (!lmp_le_capable(hdev))
a69e8375
JH
4969 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS,
4970 MGMT_STATUS_NOT_SUPPORTED);
d13eafce
MH
4971
4972 if (hdev_is_powered(hdev))
a69e8375
JH
4973 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS,
4974 MGMT_STATUS_REJECTED);
d13eafce
MH
4975
4976 if (bacmp(&cp->bdaddr, BDADDR_ANY)) {
4977 if (!bacmp(&cp->bdaddr, BDADDR_NONE))
a69e8375
JH
4978 return mgmt_cmd_status(sk, hdev->id,
4979 MGMT_OP_SET_STATIC_ADDRESS,
4980 MGMT_STATUS_INVALID_PARAMS);
d13eafce
MH
4981
4982 /* Two most significant bits shall be set */
4983 if ((cp->bdaddr.b[5] & 0xc0) != 0xc0)
a69e8375
JH
4984 return mgmt_cmd_status(sk, hdev->id,
4985 MGMT_OP_SET_STATIC_ADDRESS,
4986 MGMT_STATUS_INVALID_PARAMS);
d13eafce
MH
4987 }
4988
4989 hci_dev_lock(hdev);
4990
4991 bacpy(&hdev->static_addr, &cp->bdaddr);
4992
93690c22
MH
4993 err = send_settings_rsp(sk, MGMT_OP_SET_STATIC_ADDRESS, hdev);
4994 if (err < 0)
4995 goto unlock;
4996
4997 err = new_settings(hdev, sk);
d13eafce 4998
93690c22 4999unlock:
d13eafce 5000 hci_dev_unlock(hdev);
d13eafce
MH
5001 return err;
5002}
5003
14b49b9a
MH
5004static int set_scan_params(struct sock *sk, struct hci_dev *hdev,
5005 void *data, u16 len)
5006{
5007 struct mgmt_cp_set_scan_params *cp = data;
5008 __u16 interval, window;
5009 int err;
5010
5011 BT_DBG("%s", hdev->name);
5012
5013 if (!lmp_le_capable(hdev))
a69e8375
JH
5014 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
5015 MGMT_STATUS_NOT_SUPPORTED);
14b49b9a
MH
5016
5017 interval = __le16_to_cpu(cp->interval);
5018
5019 if (interval < 0x0004 || interval > 0x4000)
a69e8375
JH
5020 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
5021 MGMT_STATUS_INVALID_PARAMS);
14b49b9a
MH
5022
5023 window = __le16_to_cpu(cp->window);
5024
5025 if (window < 0x0004 || window > 0x4000)
a69e8375
JH
5026 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
5027 MGMT_STATUS_INVALID_PARAMS);
14b49b9a 5028
899e1075 5029 if (window > interval)
a69e8375
JH
5030 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
5031 MGMT_STATUS_INVALID_PARAMS);
899e1075 5032
14b49b9a
MH
5033 hci_dev_lock(hdev);
5034
5035 hdev->le_scan_interval = interval;
5036 hdev->le_scan_window = window;
5037
2a1afb5a
JH
5038 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, 0,
5039 NULL, 0);
14b49b9a 5040
dd2ef8e2
AG
5041 /* If background scan is running, restart it so new parameters are
5042 * loaded.
5043 */
d7a5a11d 5044 if (hci_dev_test_flag(hdev, HCI_LE_SCAN) &&
dd2ef8e2
AG
5045 hdev->discovery.state == DISCOVERY_STOPPED) {
5046 struct hci_request req;
5047
5048 hci_req_init(&req, hdev);
5049
5050 hci_req_add_le_scan_disable(&req);
5051 hci_req_add_le_passive_scan(&req);
5052
5053 hci_req_run(&req, NULL);
5054 }
5055
14b49b9a
MH
5056 hci_dev_unlock(hdev);
5057
5058 return err;
5059}
5060
1904a853
MH
5061static void fast_connectable_complete(struct hci_dev *hdev, u8 status,
5062 u16 opcode)
33e38b3e 5063{
3b0602cd 5064 struct mgmt_pending_cmd *cmd;
33e38b3e
JH
5065
5066 BT_DBG("status 0x%02x", status);
5067
5068 hci_dev_lock(hdev);
5069
333ae95d 5070 cmd = pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev);
33e38b3e
JH
5071 if (!cmd)
5072 goto unlock;
5073
5074 if (status) {
a69e8375
JH
5075 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
5076 mgmt_status(status));
33e38b3e 5077 } else {
1a4d3c4b
JH
5078 struct mgmt_mode *cp = cmd->param;
5079
5080 if (cp->val)
a1536da2 5081 hci_dev_set_flag(hdev, HCI_FAST_CONNECTABLE);
1a4d3c4b 5082 else
a358dc11 5083 hci_dev_clear_flag(hdev, HCI_FAST_CONNECTABLE);
1a4d3c4b 5084
33e38b3e
JH
5085 send_settings_rsp(cmd->sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev);
5086 new_settings(hdev, cmd->sk);
5087 }
5088
5089 mgmt_pending_remove(cmd);
5090
5091unlock:
5092 hci_dev_unlock(hdev);
5093}
5094
bdb6d971 5095static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
04124681 5096 void *data, u16 len)
f6422ec6 5097{
650f726d 5098 struct mgmt_mode *cp = data;
3b0602cd 5099 struct mgmt_pending_cmd *cmd;
33e38b3e 5100 struct hci_request req;
f6422ec6
AJ
5101 int err;
5102
bdb6d971 5103 BT_DBG("%s", hdev->name);
f6422ec6 5104
d7a5a11d 5105 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) ||
56f87901 5106 hdev->hci_ver < BLUETOOTH_VER_1_2)
a69e8375
JH
5107 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
5108 MGMT_STATUS_NOT_SUPPORTED);
33c525c0 5109
a7e80f25 5110 if (cp->val != 0x00 && cp->val != 0x01)
a69e8375
JH
5111 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
5112 MGMT_STATUS_INVALID_PARAMS);
a7e80f25 5113
f6422ec6
AJ
5114 hci_dev_lock(hdev);
5115
333ae95d 5116 if (pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev)) {
a69e8375
JH
5117 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
5118 MGMT_STATUS_BUSY);
05cbf29f
JH
5119 goto unlock;
5120 }
5121
d7a5a11d 5122 if (!!cp->val == hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE)) {
1a4d3c4b
JH
5123 err = send_settings_rsp(sk, MGMT_OP_SET_FAST_CONNECTABLE,
5124 hdev);
5125 goto unlock;
5126 }
5127
406ef2a6 5128 if (!hdev_is_powered(hdev)) {
ce05d603 5129 hci_dev_change_flag(hdev, HCI_FAST_CONNECTABLE);
406ef2a6
JH
5130 err = send_settings_rsp(sk, MGMT_OP_SET_FAST_CONNECTABLE,
5131 hdev);
5132 new_settings(hdev, sk);
5133 goto unlock;
5134 }
5135
33e38b3e
JH
5136 cmd = mgmt_pending_add(sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev,
5137 data, len);
5138 if (!cmd) {
5139 err = -ENOMEM;
5140 goto unlock;
f6422ec6
AJ
5141 }
5142
33e38b3e
JH
5143 hci_req_init(&req, hdev);
5144
406d7804 5145 write_fast_connectable(&req, cp->val);
33e38b3e
JH
5146
5147 err = hci_req_run(&req, fast_connectable_complete);
f6422ec6 5148 if (err < 0) {
a69e8375
JH
5149 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
5150 MGMT_STATUS_FAILED);
33e38b3e 5151 mgmt_pending_remove(cmd);
f6422ec6
AJ
5152 }
5153
33e38b3e 5154unlock:
f6422ec6 5155 hci_dev_unlock(hdev);
33e38b3e 5156
f6422ec6
AJ
5157 return err;
5158}
5159
1904a853 5160static void set_bredr_complete(struct hci_dev *hdev, u8 status, u16 opcode)
0663ca2a 5161{
3b0602cd 5162 struct mgmt_pending_cmd *cmd;
0663ca2a
JH
5163
5164 BT_DBG("status 0x%02x", status);
5165
5166 hci_dev_lock(hdev);
5167
333ae95d 5168 cmd = pending_find(MGMT_OP_SET_BREDR, hdev);
0663ca2a
JH
5169 if (!cmd)
5170 goto unlock;
5171
5172 if (status) {
5173 u8 mgmt_err = mgmt_status(status);
5174
5175 /* We need to restore the flag if related HCI commands
5176 * failed.
5177 */
a358dc11 5178 hci_dev_clear_flag(hdev, HCI_BREDR_ENABLED);
0663ca2a 5179
a69e8375 5180 mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
0663ca2a
JH
5181 } else {
5182 send_settings_rsp(cmd->sk, MGMT_OP_SET_BREDR, hdev);
5183 new_settings(hdev, cmd->sk);
5184 }
5185
5186 mgmt_pending_remove(cmd);
5187
5188unlock:
5189 hci_dev_unlock(hdev);
5190}
5191
5192static int set_bredr(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
5193{
5194 struct mgmt_mode *cp = data;
3b0602cd 5195 struct mgmt_pending_cmd *cmd;
0663ca2a
JH
5196 struct hci_request req;
5197 int err;
5198
5199 BT_DBG("request for %s", hdev->name);
5200
5201 if (!lmp_bredr_capable(hdev) || !lmp_le_capable(hdev))
a69e8375
JH
5202 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
5203 MGMT_STATUS_NOT_SUPPORTED);
0663ca2a 5204
d7a5a11d 5205 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
a69e8375
JH
5206 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
5207 MGMT_STATUS_REJECTED);
0663ca2a
JH
5208
5209 if (cp->val != 0x00 && cp->val != 0x01)
a69e8375
JH
5210 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
5211 MGMT_STATUS_INVALID_PARAMS);
0663ca2a
JH
5212
5213 hci_dev_lock(hdev);
5214
d7a5a11d 5215 if (cp->val == hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
0663ca2a
JH
5216 err = send_settings_rsp(sk, MGMT_OP_SET_BREDR, hdev);
5217 goto unlock;
5218 }
5219
5220 if (!hdev_is_powered(hdev)) {
5221 if (!cp->val) {
a358dc11
MH
5222 hci_dev_clear_flag(hdev, HCI_DISCOVERABLE);
5223 hci_dev_clear_flag(hdev, HCI_SSP_ENABLED);
5224 hci_dev_clear_flag(hdev, HCI_LINK_SECURITY);
5225 hci_dev_clear_flag(hdev, HCI_FAST_CONNECTABLE);
5226 hci_dev_clear_flag(hdev, HCI_HS_ENABLED);
0663ca2a
JH
5227 }
5228
ce05d603 5229 hci_dev_change_flag(hdev, HCI_BREDR_ENABLED);
0663ca2a
JH
5230
5231 err = send_settings_rsp(sk, MGMT_OP_SET_BREDR, hdev);
5232 if (err < 0)
5233 goto unlock;
5234
5235 err = new_settings(hdev, sk);
5236 goto unlock;
5237 }
5238
5239 /* Reject disabling when powered on */
5240 if (!cp->val) {
a69e8375
JH
5241 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
5242 MGMT_STATUS_REJECTED);
0663ca2a 5243 goto unlock;
111e4bcc
MH
5244 } else {
5245 /* When configuring a dual-mode controller to operate
5246 * with LE only and using a static address, then switching
5247 * BR/EDR back on is not allowed.
5248 *
5249 * Dual-mode controllers shall operate with the public
5250 * address as its identity address for BR/EDR and LE. So
5251 * reject the attempt to create an invalid configuration.
3a5486e1
MH
5252 *
5253 * The same restrictions applies when secure connections
5254 * has been enabled. For BR/EDR this is a controller feature
5255 * while for LE it is a host stack feature. This means that
5256 * switching BR/EDR back on when secure connections has been
5257 * enabled is not a supported transaction.
111e4bcc 5258 */
d7a5a11d 5259 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) &&
3a5486e1 5260 (bacmp(&hdev->static_addr, BDADDR_ANY) ||
d7a5a11d 5261 hci_dev_test_flag(hdev, HCI_SC_ENABLED))) {
a69e8375
JH
5262 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
5263 MGMT_STATUS_REJECTED);
111e4bcc
MH
5264 goto unlock;
5265 }
0663ca2a
JH
5266 }
5267
333ae95d 5268 if (pending_find(MGMT_OP_SET_BREDR, hdev)) {
a69e8375
JH
5269 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
5270 MGMT_STATUS_BUSY);
0663ca2a
JH
5271 goto unlock;
5272 }
5273
5274 cmd = mgmt_pending_add(sk, MGMT_OP_SET_BREDR, hdev, data, len);
5275 if (!cmd) {
5276 err = -ENOMEM;
5277 goto unlock;
5278 }
5279
5947f4bc 5280 /* We need to flip the bit already here so that update_adv_data
0663ca2a
JH
5281 * generates the correct flags.
5282 */
a1536da2 5283 hci_dev_set_flag(hdev, HCI_BREDR_ENABLED);
0663ca2a
JH
5284
5285 hci_req_init(&req, hdev);
aa8af46e 5286
432df05e 5287 write_fast_connectable(&req, false);
1d2dc5b7 5288 __hci_update_page_scan(&req);
aa8af46e 5289
f14d8f64
MH
5290 /* Since only the advertising data flags will change, there
5291 * is no need to update the scan response data.
5292 */
5947f4bc 5293 update_adv_data(&req);
aa8af46e 5294
0663ca2a
JH
5295 err = hci_req_run(&req, set_bredr_complete);
5296 if (err < 0)
5297 mgmt_pending_remove(cmd);
5298
5299unlock:
5300 hci_dev_unlock(hdev);
5301 return err;
5302}
5303
a1443f5a
JH
5304static void sc_enable_complete(struct hci_dev *hdev, u8 status, u16 opcode)
5305{
3b0602cd 5306 struct mgmt_pending_cmd *cmd;
a1443f5a
JH
5307 struct mgmt_mode *cp;
5308
5309 BT_DBG("%s status %u", hdev->name, status);
5310
5311 hci_dev_lock(hdev);
5312
333ae95d 5313 cmd = pending_find(MGMT_OP_SET_SECURE_CONN, hdev);
a1443f5a
JH
5314 if (!cmd)
5315 goto unlock;
5316
5317 if (status) {
a69e8375
JH
5318 mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode,
5319 mgmt_status(status));
a1443f5a
JH
5320 goto remove;
5321 }
5322
5323 cp = cmd->param;
5324
5325 switch (cp->val) {
5326 case 0x00:
a358dc11
MH
5327 hci_dev_clear_flag(hdev, HCI_SC_ENABLED);
5328 hci_dev_clear_flag(hdev, HCI_SC_ONLY);
a1443f5a
JH
5329 break;
5330 case 0x01:
a1536da2 5331 hci_dev_set_flag(hdev, HCI_SC_ENABLED);
a358dc11 5332 hci_dev_clear_flag(hdev, HCI_SC_ONLY);
a1443f5a
JH
5333 break;
5334 case 0x02:
a1536da2
MH
5335 hci_dev_set_flag(hdev, HCI_SC_ENABLED);
5336 hci_dev_set_flag(hdev, HCI_SC_ONLY);
a1443f5a
JH
5337 break;
5338 }
5339
5340 send_settings_rsp(cmd->sk, MGMT_OP_SET_SECURE_CONN, hdev);
5341 new_settings(hdev, cmd->sk);
5342
5343remove:
5344 mgmt_pending_remove(cmd);
5345unlock:
5346 hci_dev_unlock(hdev);
5347}
5348
eac83dc6
MH
5349static int set_secure_conn(struct sock *sk, struct hci_dev *hdev,
5350 void *data, u16 len)
5351{
5352 struct mgmt_mode *cp = data;
3b0602cd 5353 struct mgmt_pending_cmd *cmd;
a1443f5a 5354 struct hci_request req;
a3209694 5355 u8 val;
eac83dc6
MH
5356 int err;
5357
5358 BT_DBG("request for %s", hdev->name);
5359
05b3c3e7 5360 if (!lmp_sc_capable(hdev) &&
d7a5a11d 5361 !hci_dev_test_flag(hdev, HCI_LE_ENABLED))
a69e8375
JH
5362 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN,
5363 MGMT_STATUS_NOT_SUPPORTED);
eac83dc6 5364
d7a5a11d 5365 if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) &&
59200286 5366 lmp_sc_capable(hdev) &&
d7a5a11d 5367 !hci_dev_test_flag(hdev, HCI_SSP_ENABLED))
a69e8375
JH
5368 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN,
5369 MGMT_STATUS_REJECTED);
ed93ec69 5370
0ab04a9c 5371 if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
a69e8375 5372 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN,
eac83dc6
MH
5373 MGMT_STATUS_INVALID_PARAMS);
5374
5375 hci_dev_lock(hdev);
5376
05b3c3e7 5377 if (!hdev_is_powered(hdev) || !lmp_sc_capable(hdev) ||
d7a5a11d 5378 !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
eac83dc6
MH
5379 bool changed;
5380
0ab04a9c 5381 if (cp->val) {
238be788
MH
5382 changed = !hci_dev_test_and_set_flag(hdev,
5383 HCI_SC_ENABLED);
0ab04a9c 5384 if (cp->val == 0x02)
a1536da2 5385 hci_dev_set_flag(hdev, HCI_SC_ONLY);
0ab04a9c 5386 else
a358dc11 5387 hci_dev_clear_flag(hdev, HCI_SC_ONLY);
0ab04a9c 5388 } else {
a69d8927
MH
5389 changed = hci_dev_test_and_clear_flag(hdev,
5390 HCI_SC_ENABLED);
a358dc11 5391 hci_dev_clear_flag(hdev, HCI_SC_ONLY);
0ab04a9c 5392 }
eac83dc6
MH
5393
5394 err = send_settings_rsp(sk, MGMT_OP_SET_SECURE_CONN, hdev);
5395 if (err < 0)
5396 goto failed;
5397
5398 if (changed)
5399 err = new_settings(hdev, sk);
5400
5401 goto failed;
5402 }
5403
333ae95d 5404 if (pending_find(MGMT_OP_SET_SECURE_CONN, hdev)) {
a69e8375
JH
5405 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN,
5406 MGMT_STATUS_BUSY);
eac83dc6
MH
5407 goto failed;
5408 }
5409
0ab04a9c
MH
5410 val = !!cp->val;
5411
d7a5a11d
MH
5412 if (val == hci_dev_test_flag(hdev, HCI_SC_ENABLED) &&
5413 (cp->val == 0x02) == hci_dev_test_flag(hdev, HCI_SC_ONLY)) {
eac83dc6
MH
5414 err = send_settings_rsp(sk, MGMT_OP_SET_SECURE_CONN, hdev);
5415 goto failed;
5416 }
5417
5418 cmd = mgmt_pending_add(sk, MGMT_OP_SET_SECURE_CONN, hdev, data, len);
5419 if (!cmd) {
5420 err = -ENOMEM;
5421 goto failed;
5422 }
5423
a1443f5a
JH
5424 hci_req_init(&req, hdev);
5425 hci_req_add(&req, HCI_OP_WRITE_SC_SUPPORT, 1, &val);
5426 err = hci_req_run(&req, sc_enable_complete);
eac83dc6
MH
5427 if (err < 0) {
5428 mgmt_pending_remove(cmd);
5429 goto failed;
5430 }
5431
5432failed:
5433 hci_dev_unlock(hdev);
5434 return err;
5435}
5436
4e39ac81
MH
5437static int set_debug_keys(struct sock *sk, struct hci_dev *hdev,
5438 void *data, u16 len)
5439{
5440 struct mgmt_mode *cp = data;
b9710979 5441 bool changed, use_changed;
4e39ac81
MH
5442 int err;
5443
5444 BT_DBG("request for %s", hdev->name);
5445
b9710979 5446 if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
a69e8375
JH
5447 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEBUG_KEYS,
5448 MGMT_STATUS_INVALID_PARAMS);
4e39ac81
MH
5449
5450 hci_dev_lock(hdev);
5451
5452 if (cp->val)
238be788 5453 changed = !hci_dev_test_and_set_flag(hdev, HCI_KEEP_DEBUG_KEYS);
4e39ac81 5454 else
a69d8927
MH
5455 changed = hci_dev_test_and_clear_flag(hdev,
5456 HCI_KEEP_DEBUG_KEYS);
4e39ac81 5457
b9710979 5458 if (cp->val == 0x02)
238be788
MH
5459 use_changed = !hci_dev_test_and_set_flag(hdev,
5460 HCI_USE_DEBUG_KEYS);
b9710979 5461 else
a69d8927
MH
5462 use_changed = hci_dev_test_and_clear_flag(hdev,
5463 HCI_USE_DEBUG_KEYS);
b9710979
JH
5464
5465 if (hdev_is_powered(hdev) && use_changed &&
d7a5a11d 5466 hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
b9710979
JH
5467 u8 mode = (cp->val == 0x02) ? 0x01 : 0x00;
5468 hci_send_cmd(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE,
5469 sizeof(mode), &mode);
5470 }
5471
4e39ac81
MH
5472 err = send_settings_rsp(sk, MGMT_OP_SET_DEBUG_KEYS, hdev);
5473 if (err < 0)
5474 goto unlock;
5475
5476 if (changed)
5477 err = new_settings(hdev, sk);
5478
5479unlock:
5480 hci_dev_unlock(hdev);
5481 return err;
5482}
5483
62b04cd1
JH
5484static int set_privacy(struct sock *sk, struct hci_dev *hdev, void *cp_data,
5485 u16 len)
5486{
5487 struct mgmt_cp_set_privacy *cp = cp_data;
5488 bool changed;
5489 int err;
5490
5491 BT_DBG("request for %s", hdev->name);
5492
5493 if (!lmp_le_capable(hdev))
a69e8375
JH
5494 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY,
5495 MGMT_STATUS_NOT_SUPPORTED);
62b04cd1
JH
5496
5497 if (cp->privacy != 0x00 && cp->privacy != 0x01)
a69e8375
JH
5498 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY,
5499 MGMT_STATUS_INVALID_PARAMS);
62b04cd1
JH
5500
5501 if (hdev_is_powered(hdev))
a69e8375
JH
5502 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY,
5503 MGMT_STATUS_REJECTED);
62b04cd1
JH
5504
5505 hci_dev_lock(hdev);
5506
c21c0ea0
JH
5507 /* If user space supports this command it is also expected to
5508 * handle IRKs. Therefore, set the HCI_RPA_RESOLVING flag.
5509 */
a1536da2 5510 hci_dev_set_flag(hdev, HCI_RPA_RESOLVING);
c21c0ea0 5511
62b04cd1 5512 if (cp->privacy) {
238be788 5513 changed = !hci_dev_test_and_set_flag(hdev, HCI_PRIVACY);
62b04cd1 5514 memcpy(hdev->irk, cp->irk, sizeof(hdev->irk));
a1536da2 5515 hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
62b04cd1 5516 } else {
a69d8927 5517 changed = hci_dev_test_and_clear_flag(hdev, HCI_PRIVACY);
62b04cd1 5518 memset(hdev->irk, 0, sizeof(hdev->irk));
a358dc11 5519 hci_dev_clear_flag(hdev, HCI_RPA_EXPIRED);
62b04cd1
JH
5520 }
5521
5522 err = send_settings_rsp(sk, MGMT_OP_SET_PRIVACY, hdev);
5523 if (err < 0)
5524 goto unlock;
5525
5526 if (changed)
5527 err = new_settings(hdev, sk);
5528
5529unlock:
5530 hci_dev_unlock(hdev);
5531 return err;
5532}
5533
41edf160
JH
5534static bool irk_is_valid(struct mgmt_irk_info *irk)
5535{
5536 switch (irk->addr.type) {
5537 case BDADDR_LE_PUBLIC:
5538 return true;
5539
5540 case BDADDR_LE_RANDOM:
5541 /* Two most significant bits shall be set */
5542 if ((irk->addr.bdaddr.b[5] & 0xc0) != 0xc0)
5543 return false;
5544 return true;
5545 }
5546
5547 return false;
5548}
5549
5550static int load_irks(struct sock *sk, struct hci_dev *hdev, void *cp_data,
5551 u16 len)
5552{
5553 struct mgmt_cp_load_irks *cp = cp_data;
ba1d6936
JH
5554 const u16 max_irk_count = ((U16_MAX - sizeof(*cp)) /
5555 sizeof(struct mgmt_irk_info));
41edf160
JH
5556 u16 irk_count, expected_len;
5557 int i, err;
5558
5559 BT_DBG("request for %s", hdev->name);
5560
5561 if (!lmp_le_capable(hdev))
a69e8375
JH
5562 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS,
5563 MGMT_STATUS_NOT_SUPPORTED);
41edf160
JH
5564
5565 irk_count = __le16_to_cpu(cp->irk_count);
ba1d6936
JH
5566 if (irk_count > max_irk_count) {
5567 BT_ERR("load_irks: too big irk_count value %u", irk_count);
a69e8375
JH
5568 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS,
5569 MGMT_STATUS_INVALID_PARAMS);
ba1d6936 5570 }
41edf160
JH
5571
5572 expected_len = sizeof(*cp) + irk_count * sizeof(struct mgmt_irk_info);
5573 if (expected_len != len) {
5574 BT_ERR("load_irks: expected %u bytes, got %u bytes",
2606ecbc 5575 expected_len, len);
a69e8375
JH
5576 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS,
5577 MGMT_STATUS_INVALID_PARAMS);
41edf160
JH
5578 }
5579
5580 BT_DBG("%s irk_count %u", hdev->name, irk_count);
5581
5582 for (i = 0; i < irk_count; i++) {
5583 struct mgmt_irk_info *key = &cp->irks[i];
5584
5585 if (!irk_is_valid(key))
a69e8375
JH
5586 return mgmt_cmd_status(sk, hdev->id,
5587 MGMT_OP_LOAD_IRKS,
5588 MGMT_STATUS_INVALID_PARAMS);
41edf160
JH
5589 }
5590
5591 hci_dev_lock(hdev);
5592
5593 hci_smp_irks_clear(hdev);
5594
5595 for (i = 0; i < irk_count; i++) {
5596 struct mgmt_irk_info *irk = &cp->irks[i];
5597 u8 addr_type;
5598
5599 if (irk->addr.type == BDADDR_LE_PUBLIC)
5600 addr_type = ADDR_LE_DEV_PUBLIC;
5601 else
5602 addr_type = ADDR_LE_DEV_RANDOM;
5603
5604 hci_add_irk(hdev, &irk->addr.bdaddr, addr_type, irk->val,
5605 BDADDR_ANY);
5606 }
5607
a1536da2 5608 hci_dev_set_flag(hdev, HCI_RPA_RESOLVING);
41edf160 5609
2a1afb5a 5610 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_IRKS, 0, NULL, 0);
41edf160
JH
5611
5612 hci_dev_unlock(hdev);
5613
5614 return err;
5615}
5616
3f706b72
JH
5617static bool ltk_is_valid(struct mgmt_ltk_info *key)
5618{
5619 if (key->master != 0x00 && key->master != 0x01)
5620 return false;
490cb0b3
MH
5621
5622 switch (key->addr.type) {
5623 case BDADDR_LE_PUBLIC:
5624 return true;
5625
5626 case BDADDR_LE_RANDOM:
5627 /* Two most significant bits shall be set */
5628 if ((key->addr.bdaddr.b[5] & 0xc0) != 0xc0)
5629 return false;
5630 return true;
5631 }
5632
5633 return false;
3f706b72
JH
5634}
5635
bdb6d971 5636static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
04124681 5637 void *cp_data, u16 len)
346af67b 5638{
346af67b 5639 struct mgmt_cp_load_long_term_keys *cp = cp_data;
ba1d6936
JH
5640 const u16 max_key_count = ((U16_MAX - sizeof(*cp)) /
5641 sizeof(struct mgmt_ltk_info));
346af67b 5642 u16 key_count, expected_len;
715a5bf2 5643 int i, err;
346af67b 5644
cf99ba13
MH
5645 BT_DBG("request for %s", hdev->name);
5646
5647 if (!lmp_le_capable(hdev))
a69e8375
JH
5648 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
5649 MGMT_STATUS_NOT_SUPPORTED);
cf99ba13 5650
1f350c87 5651 key_count = __le16_to_cpu(cp->key_count);
ba1d6936
JH
5652 if (key_count > max_key_count) {
5653 BT_ERR("load_ltks: too big key_count value %u", key_count);
a69e8375
JH
5654 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
5655 MGMT_STATUS_INVALID_PARAMS);
ba1d6936 5656 }
346af67b
VCG
5657
5658 expected_len = sizeof(*cp) + key_count *
5659 sizeof(struct mgmt_ltk_info);
5660 if (expected_len != len) {
5661 BT_ERR("load_keys: expected %u bytes, got %u bytes",
2606ecbc 5662 expected_len, len);
a69e8375
JH
5663 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
5664 MGMT_STATUS_INVALID_PARAMS);
346af67b
VCG
5665 }
5666
bdb6d971 5667 BT_DBG("%s key_count %u", hdev->name, key_count);
346af67b 5668
54ad6d8a
JH
5669 for (i = 0; i < key_count; i++) {
5670 struct mgmt_ltk_info *key = &cp->keys[i];
5671
3f706b72 5672 if (!ltk_is_valid(key))
a69e8375
JH
5673 return mgmt_cmd_status(sk, hdev->id,
5674 MGMT_OP_LOAD_LONG_TERM_KEYS,
5675 MGMT_STATUS_INVALID_PARAMS);
54ad6d8a
JH
5676 }
5677
346af67b
VCG
5678 hci_dev_lock(hdev);
5679
5680 hci_smp_ltks_clear(hdev);
5681
5682 for (i = 0; i < key_count; i++) {
5683 struct mgmt_ltk_info *key = &cp->keys[i];
d7b25450 5684 u8 type, addr_type, authenticated;
79d95a19
MH
5685
5686 if (key->addr.type == BDADDR_LE_PUBLIC)
5687 addr_type = ADDR_LE_DEV_PUBLIC;
5688 else
5689 addr_type = ADDR_LE_DEV_RANDOM;
346af67b 5690
61b43357
JH
5691 switch (key->type) {
5692 case MGMT_LTK_UNAUTHENTICATED:
d7b25450 5693 authenticated = 0x00;
23fb8de3 5694 type = key->master ? SMP_LTK : SMP_LTK_SLAVE;
61b43357
JH
5695 break;
5696 case MGMT_LTK_AUTHENTICATED:
d7b25450 5697 authenticated = 0x01;
23fb8de3
JH
5698 type = key->master ? SMP_LTK : SMP_LTK_SLAVE;
5699 break;
5700 case MGMT_LTK_P256_UNAUTH:
5701 authenticated = 0x00;
5702 type = SMP_LTK_P256;
61b43357 5703 break;
23fb8de3
JH
5704 case MGMT_LTK_P256_AUTH:
5705 authenticated = 0x01;
5706 type = SMP_LTK_P256;
61b43357 5707 break;
23fb8de3
JH
5708 case MGMT_LTK_P256_DEBUG:
5709 authenticated = 0x00;
5710 type = SMP_LTK_P256_DEBUG;
61b43357
JH
5711 default:
5712 continue;
5713 }
d7b25450 5714
35d70271 5715 hci_add_ltk(hdev, &key->addr.bdaddr, addr_type, type,
d7b25450 5716 authenticated, key->val, key->enc_size, key->ediv,
35d70271 5717 key->rand);
346af67b
VCG
5718 }
5719
2a1afb5a 5720 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0,
715a5bf2
JH
5721 NULL, 0);
5722
346af67b 5723 hci_dev_unlock(hdev);
346af67b 5724
715a5bf2 5725 return err;
346af67b
VCG
5726}
5727
3b0602cd 5728static int conn_info_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
dd983808 5729{
dd983808 5730 struct hci_conn *conn = cmd->user_data;
9981bdb0 5731 struct mgmt_rp_get_conn_info rp;
9df74653 5732 int err;
dd983808 5733
9981bdb0 5734 memcpy(&rp.addr, cmd->param, sizeof(rp.addr));
dd983808 5735
9981bdb0 5736 if (status == MGMT_STATUS_SUCCESS) {
dd983808 5737 rp.rssi = conn->rssi;
9981bdb0
JH
5738 rp.tx_power = conn->tx_power;
5739 rp.max_tx_power = conn->max_tx_power;
5740 } else {
5741 rp.rssi = HCI_RSSI_INVALID;
5742 rp.tx_power = HCI_TX_POWER_INVALID;
5743 rp.max_tx_power = HCI_TX_POWER_INVALID;
dd983808
AK
5744 }
5745
2a1afb5a
JH
5746 err = mgmt_cmd_complete(cmd->sk, cmd->index, MGMT_OP_GET_CONN_INFO,
5747 status, &rp, sizeof(rp));
dd983808
AK
5748
5749 hci_conn_drop(conn);
f8aaf9b6 5750 hci_conn_put(conn);
9df74653
JH
5751
5752 return err;
dd983808
AK
5753}
5754
1904a853
MH
5755static void conn_info_refresh_complete(struct hci_dev *hdev, u8 hci_status,
5756 u16 opcode)
dd983808
AK
5757{
5758 struct hci_cp_read_rssi *cp;
3b0602cd 5759 struct mgmt_pending_cmd *cmd;
dd983808 5760 struct hci_conn *conn;
dd983808 5761 u16 handle;
9981bdb0 5762 u8 status;
dd983808 5763
9981bdb0 5764 BT_DBG("status 0x%02x", hci_status);
dd983808
AK
5765
5766 hci_dev_lock(hdev);
5767
dd983808
AK
5768 /* Commands sent in request are either Read RSSI or Read Transmit Power
5769 * Level so we check which one was last sent to retrieve connection
5770 * handle. Both commands have handle as first parameter so it's safe to
5771 * cast data on the same command struct.
5772 *
5773 * First command sent is always Read RSSI and we fail only if it fails.
5774 * In other case we simply override error to indicate success as we
5775 * already remembered if TX power value is actually valid.
5776 */
5777 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_RSSI);
5778 if (!cp) {
5779 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_TX_POWER);
9981bdb0
JH
5780 status = MGMT_STATUS_SUCCESS;
5781 } else {
5782 status = mgmt_status(hci_status);
dd983808
AK
5783 }
5784
5785 if (!cp) {
9981bdb0 5786 BT_ERR("invalid sent_cmd in conn_info response");
dd983808
AK
5787 goto unlock;
5788 }
5789
5790 handle = __le16_to_cpu(cp->handle);
5791 conn = hci_conn_hash_lookup_handle(hdev, handle);
5792 if (!conn) {
9981bdb0 5793 BT_ERR("unknown handle (%d) in conn_info response", handle);
dd983808
AK
5794 goto unlock;
5795 }
5796
333ae95d 5797 cmd = pending_find_data(MGMT_OP_GET_CONN_INFO, hdev, conn);
9981bdb0
JH
5798 if (!cmd)
5799 goto unlock;
dd983808 5800
9981bdb0
JH
5801 cmd->cmd_complete(cmd, status);
5802 mgmt_pending_remove(cmd);
dd983808
AK
5803
5804unlock:
5805 hci_dev_unlock(hdev);
5806}
5807
5808static int get_conn_info(struct sock *sk, struct hci_dev *hdev, void *data,
5809 u16 len)
5810{
5811 struct mgmt_cp_get_conn_info *cp = data;
5812 struct mgmt_rp_get_conn_info rp;
5813 struct hci_conn *conn;
5814 unsigned long conn_info_age;
5815 int err = 0;
5816
5817 BT_DBG("%s", hdev->name);
5818
5819 memset(&rp, 0, sizeof(rp));
5820 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
5821 rp.addr.type = cp->addr.type;
5822
5823 if (!bdaddr_type_is_valid(cp->addr.type))
2a1afb5a
JH
5824 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
5825 MGMT_STATUS_INVALID_PARAMS,
5826 &rp, sizeof(rp));
dd983808
AK
5827
5828 hci_dev_lock(hdev);
5829
5830 if (!hdev_is_powered(hdev)) {
2a1afb5a
JH
5831 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
5832 MGMT_STATUS_NOT_POWERED, &rp,
5833 sizeof(rp));
dd983808
AK
5834 goto unlock;
5835 }
5836
5837 if (cp->addr.type == BDADDR_BREDR)
5838 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
5839 &cp->addr.bdaddr);
5840 else
5841 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
5842
5843 if (!conn || conn->state != BT_CONNECTED) {
2a1afb5a
JH
5844 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
5845 MGMT_STATUS_NOT_CONNECTED, &rp,
5846 sizeof(rp));
dd983808
AK
5847 goto unlock;
5848 }
5849
333ae95d 5850 if (pending_find_data(MGMT_OP_GET_CONN_INFO, hdev, conn)) {
2a1afb5a
JH
5851 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
5852 MGMT_STATUS_BUSY, &rp, sizeof(rp));
9981bdb0
JH
5853 goto unlock;
5854 }
5855
dd983808
AK
5856 /* To avoid client trying to guess when to poll again for information we
5857 * calculate conn info age as random value between min/max set in hdev.
5858 */
5859 conn_info_age = hdev->conn_info_min_age +
5860 prandom_u32_max(hdev->conn_info_max_age -
5861 hdev->conn_info_min_age);
5862
5863 /* Query controller to refresh cached values if they are too old or were
5864 * never read.
5865 */
f4e2dd53
AK
5866 if (time_after(jiffies, conn->conn_info_timestamp +
5867 msecs_to_jiffies(conn_info_age)) ||
dd983808
AK
5868 !conn->conn_info_timestamp) {
5869 struct hci_request req;
5870 struct hci_cp_read_tx_power req_txp_cp;
5871 struct hci_cp_read_rssi req_rssi_cp;
3b0602cd 5872 struct mgmt_pending_cmd *cmd;
dd983808
AK
5873
5874 hci_req_init(&req, hdev);
5875 req_rssi_cp.handle = cpu_to_le16(conn->handle);
5876 hci_req_add(&req, HCI_OP_READ_RSSI, sizeof(req_rssi_cp),
5877 &req_rssi_cp);
5878
f7faab0c
AK
5879 /* For LE links TX power does not change thus we don't need to
5880 * query for it once value is known.
5881 */
5882 if (!bdaddr_type_is_le(cp->addr.type) ||
5883 conn->tx_power == HCI_TX_POWER_INVALID) {
5884 req_txp_cp.handle = cpu_to_le16(conn->handle);
5885 req_txp_cp.type = 0x00;
5886 hci_req_add(&req, HCI_OP_READ_TX_POWER,
5887 sizeof(req_txp_cp), &req_txp_cp);
5888 }
dd983808 5889
eed5daf3
AK
5890 /* Max TX power needs to be read only once per connection */
5891 if (conn->max_tx_power == HCI_TX_POWER_INVALID) {
5892 req_txp_cp.handle = cpu_to_le16(conn->handle);
5893 req_txp_cp.type = 0x01;
5894 hci_req_add(&req, HCI_OP_READ_TX_POWER,
5895 sizeof(req_txp_cp), &req_txp_cp);
5896 }
5897
dd983808
AK
5898 err = hci_req_run(&req, conn_info_refresh_complete);
5899 if (err < 0)
5900 goto unlock;
5901
5902 cmd = mgmt_pending_add(sk, MGMT_OP_GET_CONN_INFO, hdev,
5903 data, len);
5904 if (!cmd) {
5905 err = -ENOMEM;
5906 goto unlock;
5907 }
5908
5909 hci_conn_hold(conn);
f8aaf9b6 5910 cmd->user_data = hci_conn_get(conn);
9981bdb0 5911 cmd->cmd_complete = conn_info_cmd_complete;
dd983808
AK
5912
5913 conn->conn_info_timestamp = jiffies;
5914 } else {
5915 /* Cache is valid, just reply with values cached in hci_conn */
5916 rp.rssi = conn->rssi;
5917 rp.tx_power = conn->tx_power;
eed5daf3 5918 rp.max_tx_power = conn->max_tx_power;
dd983808 5919
2a1afb5a
JH
5920 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
5921 MGMT_STATUS_SUCCESS, &rp, sizeof(rp));
dd983808
AK
5922 }
5923
5924unlock:
5925 hci_dev_unlock(hdev);
5926 return err;
5927}
5928
3b0602cd 5929static int clock_info_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
95868426 5930{
69487371 5931 struct hci_conn *conn = cmd->user_data;
95868426 5932 struct mgmt_rp_get_clock_info rp;
69487371 5933 struct hci_dev *hdev;
9df74653 5934 int err;
69487371
JH
5935
5936 memset(&rp, 0, sizeof(rp));
5937 memcpy(&rp.addr, &cmd->param, sizeof(rp.addr));
5938
5939 if (status)
5940 goto complete;
5941
5942 hdev = hci_dev_get(cmd->index);
5943 if (hdev) {
5944 rp.local_clock = cpu_to_le32(hdev->clock);
5945 hci_dev_put(hdev);
5946 }
5947
5948 if (conn) {
5949 rp.piconet_clock = cpu_to_le32(conn->clock);
5950 rp.accuracy = cpu_to_le16(conn->clock_accuracy);
5951 }
5952
5953complete:
2a1afb5a
JH
5954 err = mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status, &rp,
5955 sizeof(rp));
69487371
JH
5956
5957 if (conn) {
5958 hci_conn_drop(conn);
5959 hci_conn_put(conn);
5960 }
9df74653
JH
5961
5962 return err;
69487371
JH
5963}
5964
1904a853 5965static void get_clock_info_complete(struct hci_dev *hdev, u8 status, u16 opcode)
69487371 5966{
95868426 5967 struct hci_cp_read_clock *hci_cp;
3b0602cd 5968 struct mgmt_pending_cmd *cmd;
95868426
JH
5969 struct hci_conn *conn;
5970
5971 BT_DBG("%s status %u", hdev->name, status);
5972
5973 hci_dev_lock(hdev);
5974
5975 hci_cp = hci_sent_cmd_data(hdev, HCI_OP_READ_CLOCK);
5976 if (!hci_cp)
5977 goto unlock;
5978
5979 if (hci_cp->which) {
5980 u16 handle = __le16_to_cpu(hci_cp->handle);
5981 conn = hci_conn_hash_lookup_handle(hdev, handle);
5982 } else {
5983 conn = NULL;
5984 }
5985
333ae95d 5986 cmd = pending_find_data(MGMT_OP_GET_CLOCK_INFO, hdev, conn);
95868426
JH
5987 if (!cmd)
5988 goto unlock;
5989
69487371 5990 cmd->cmd_complete(cmd, mgmt_status(status));
95868426 5991 mgmt_pending_remove(cmd);
95868426
JH
5992
5993unlock:
5994 hci_dev_unlock(hdev);
5995}
5996
5997static int get_clock_info(struct sock *sk, struct hci_dev *hdev, void *data,
5998 u16 len)
5999{
6000 struct mgmt_cp_get_clock_info *cp = data;
6001 struct mgmt_rp_get_clock_info rp;
6002 struct hci_cp_read_clock hci_cp;
3b0602cd 6003 struct mgmt_pending_cmd *cmd;
95868426
JH
6004 struct hci_request req;
6005 struct hci_conn *conn;
6006 int err;
6007
6008 BT_DBG("%s", hdev->name);
6009
6010 memset(&rp, 0, sizeof(rp));
6011 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
6012 rp.addr.type = cp->addr.type;
6013
6014 if (cp->addr.type != BDADDR_BREDR)
2a1afb5a
JH
6015 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO,
6016 MGMT_STATUS_INVALID_PARAMS,
6017 &rp, sizeof(rp));
95868426
JH
6018
6019 hci_dev_lock(hdev);
6020
6021 if (!hdev_is_powered(hdev)) {
2a1afb5a
JH
6022 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO,
6023 MGMT_STATUS_NOT_POWERED, &rp,
6024 sizeof(rp));
95868426
JH
6025 goto unlock;
6026 }
6027
6028 if (bacmp(&cp->addr.bdaddr, BDADDR_ANY)) {
6029 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
6030 &cp->addr.bdaddr);
6031 if (!conn || conn->state != BT_CONNECTED) {
2a1afb5a
JH
6032 err = mgmt_cmd_complete(sk, hdev->id,
6033 MGMT_OP_GET_CLOCK_INFO,
6034 MGMT_STATUS_NOT_CONNECTED,
6035 &rp, sizeof(rp));
95868426
JH
6036 goto unlock;
6037 }
6038 } else {
6039 conn = NULL;
6040 }
6041
6042 cmd = mgmt_pending_add(sk, MGMT_OP_GET_CLOCK_INFO, hdev, data, len);
6043 if (!cmd) {
6044 err = -ENOMEM;
6045 goto unlock;
6046 }
6047
69487371
JH
6048 cmd->cmd_complete = clock_info_cmd_complete;
6049
95868426
JH
6050 hci_req_init(&req, hdev);
6051
6052 memset(&hci_cp, 0, sizeof(hci_cp));
6053 hci_req_add(&req, HCI_OP_READ_CLOCK, sizeof(hci_cp), &hci_cp);
6054
6055 if (conn) {
6056 hci_conn_hold(conn);
f8aaf9b6 6057 cmd->user_data = hci_conn_get(conn);
95868426
JH
6058
6059 hci_cp.handle = cpu_to_le16(conn->handle);
6060 hci_cp.which = 0x01; /* Piconet clock */
6061 hci_req_add(&req, HCI_OP_READ_CLOCK, sizeof(hci_cp), &hci_cp);
6062 }
6063
6064 err = hci_req_run(&req, get_clock_info_complete);
6065 if (err < 0)
6066 mgmt_pending_remove(cmd);
6067
6068unlock:
6069 hci_dev_unlock(hdev);
6070 return err;
6071}
6072
5a154e6f
JH
6073static bool is_connected(struct hci_dev *hdev, bdaddr_t *addr, u8 type)
6074{
6075 struct hci_conn *conn;
6076
6077 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, addr);
6078 if (!conn)
6079 return false;
6080
6081 if (conn->dst_type != type)
6082 return false;
6083
6084 if (conn->state != BT_CONNECTED)
6085 return false;
6086
6087 return true;
6088}
6089
6090/* This function requires the caller holds hdev->lock */
6091static int hci_conn_params_set(struct hci_request *req, bdaddr_t *addr,
6092 u8 addr_type, u8 auto_connect)
6093{
6094 struct hci_dev *hdev = req->hdev;
6095 struct hci_conn_params *params;
6096
6097 params = hci_conn_params_add(hdev, addr, addr_type);
6098 if (!params)
6099 return -EIO;
6100
6101 if (params->auto_connect == auto_connect)
6102 return 0;
6103
6104 list_del_init(&params->action);
6105
6106 switch (auto_connect) {
6107 case HCI_AUTO_CONN_DISABLED:
6108 case HCI_AUTO_CONN_LINK_LOSS:
6109 __hci_update_background_scan(req);
6110 break;
6111 case HCI_AUTO_CONN_REPORT:
6112 list_add(&params->action, &hdev->pend_le_reports);
6113 __hci_update_background_scan(req);
6114 break;
6115 case HCI_AUTO_CONN_DIRECT:
6116 case HCI_AUTO_CONN_ALWAYS:
6117 if (!is_connected(hdev, addr, addr_type)) {
6118 list_add(&params->action, &hdev->pend_le_conns);
6119 __hci_update_background_scan(req);
6120 }
6121 break;
6122 }
6123
6124 params->auto_connect = auto_connect;
6125
6126 BT_DBG("addr %pMR (type %u) auto_connect %u", addr, addr_type,
6127 auto_connect);
6128
6129 return 0;
6130}
6131
8afef092
MH
6132static void device_added(struct sock *sk, struct hci_dev *hdev,
6133 bdaddr_t *bdaddr, u8 type, u8 action)
6134{
6135 struct mgmt_ev_device_added ev;
6136
6137 bacpy(&ev.addr.bdaddr, bdaddr);
6138 ev.addr.type = type;
6139 ev.action = action;
6140
6141 mgmt_event(MGMT_EV_DEVICE_ADDED, hdev, &ev, sizeof(ev), sk);
6142}
6143
1904a853 6144static void add_device_complete(struct hci_dev *hdev, u8 status, u16 opcode)
5a154e6f 6145{
3b0602cd 6146 struct mgmt_pending_cmd *cmd;
5a154e6f
JH
6147
6148 BT_DBG("status 0x%02x", status);
6149
6150 hci_dev_lock(hdev);
6151
333ae95d 6152 cmd = pending_find(MGMT_OP_ADD_DEVICE, hdev);
5a154e6f
JH
6153 if (!cmd)
6154 goto unlock;
6155
6156 cmd->cmd_complete(cmd, mgmt_status(status));
6157 mgmt_pending_remove(cmd);
6158
6159unlock:
6160 hci_dev_unlock(hdev);
6161}
6162
2faade53
MH
6163static int add_device(struct sock *sk, struct hci_dev *hdev,
6164 void *data, u16 len)
6165{
6166 struct mgmt_cp_add_device *cp = data;
3b0602cd 6167 struct mgmt_pending_cmd *cmd;
5a154e6f 6168 struct hci_request req;
2faade53
MH
6169 u8 auto_conn, addr_type;
6170 int err;
6171
6172 BT_DBG("%s", hdev->name);
6173
6659358e 6174 if (!bdaddr_type_is_valid(cp->addr.type) ||
2faade53 6175 !bacmp(&cp->addr.bdaddr, BDADDR_ANY))
2a1afb5a
JH
6176 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE,
6177 MGMT_STATUS_INVALID_PARAMS,
6178 &cp->addr, sizeof(cp->addr));
2faade53 6179
4b9e7e75 6180 if (cp->action != 0x00 && cp->action != 0x01 && cp->action != 0x02)
2a1afb5a
JH
6181 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE,
6182 MGMT_STATUS_INVALID_PARAMS,
6183 &cp->addr, sizeof(cp->addr));
2faade53 6184
5a154e6f
JH
6185 hci_req_init(&req, hdev);
6186
2faade53
MH
6187 hci_dev_lock(hdev);
6188
5a154e6f
JH
6189 cmd = mgmt_pending_add(sk, MGMT_OP_ADD_DEVICE, hdev, data, len);
6190 if (!cmd) {
6191 err = -ENOMEM;
6192 goto unlock;
6193 }
6194
6195 cmd->cmd_complete = addr_cmd_complete;
6196
6659358e 6197 if (cp->addr.type == BDADDR_BREDR) {
4b9e7e75 6198 /* Only incoming connections action is supported for now */
6659358e 6199 if (cp->action != 0x01) {
9df74653
JH
6200 err = cmd->cmd_complete(cmd,
6201 MGMT_STATUS_INVALID_PARAMS);
5a154e6f 6202 mgmt_pending_remove(cmd);
6659358e
JH
6203 goto unlock;
6204 }
6205
6206 err = hci_bdaddr_list_add(&hdev->whitelist, &cp->addr.bdaddr,
6207 cp->addr.type);
6208 if (err)
6209 goto unlock;
a397407f 6210
5a154e6f 6211 __hci_update_page_scan(&req);
a397407f 6212
6659358e
JH
6213 goto added;
6214 }
6215
2faade53
MH
6216 if (cp->addr.type == BDADDR_LE_PUBLIC)
6217 addr_type = ADDR_LE_DEV_PUBLIC;
6218 else
6219 addr_type = ADDR_LE_DEV_RANDOM;
6220
4b9e7e75 6221 if (cp->action == 0x02)
2faade53 6222 auto_conn = HCI_AUTO_CONN_ALWAYS;
4b9e7e75
MH
6223 else if (cp->action == 0x01)
6224 auto_conn = HCI_AUTO_CONN_DIRECT;
2faade53 6225 else
a3451d27 6226 auto_conn = HCI_AUTO_CONN_REPORT;
2faade53 6227
bf5b3c8b
MH
6228 /* If the connection parameters don't exist for this device,
6229 * they will be created and configured with defaults.
6230 */
5a154e6f 6231 if (hci_conn_params_set(&req, &cp->addr.bdaddr, addr_type,
d06b50ce 6232 auto_conn) < 0) {
9df74653 6233 err = cmd->cmd_complete(cmd, MGMT_STATUS_FAILED);
5a154e6f 6234 mgmt_pending_remove(cmd);
2faade53
MH
6235 goto unlock;
6236 }
6237
6659358e 6238added:
8afef092
MH
6239 device_added(sk, hdev, &cp->addr.bdaddr, cp->addr.type, cp->action);
6240
5a154e6f
JH
6241 err = hci_req_run(&req, add_device_complete);
6242 if (err < 0) {
6243 /* ENODATA means no HCI commands were needed (e.g. if
6244 * the adapter is powered off).
6245 */
9df74653
JH
6246 if (err == -ENODATA)
6247 err = cmd->cmd_complete(cmd, MGMT_STATUS_SUCCESS);
5a154e6f
JH
6248 mgmt_pending_remove(cmd);
6249 }
2faade53
MH
6250
6251unlock:
6252 hci_dev_unlock(hdev);
6253 return err;
6254}
6255
8afef092
MH
6256static void device_removed(struct sock *sk, struct hci_dev *hdev,
6257 bdaddr_t *bdaddr, u8 type)
6258{
6259 struct mgmt_ev_device_removed ev;
6260
6261 bacpy(&ev.addr.bdaddr, bdaddr);
6262 ev.addr.type = type;
6263
6264 mgmt_event(MGMT_EV_DEVICE_REMOVED, hdev, &ev, sizeof(ev), sk);
6265}
6266
1904a853 6267static void remove_device_complete(struct hci_dev *hdev, u8 status, u16 opcode)
51ef3ebe 6268{
3b0602cd 6269 struct mgmt_pending_cmd *cmd;
51ef3ebe
JH
6270
6271 BT_DBG("status 0x%02x", status);
6272
6273 hci_dev_lock(hdev);
6274
333ae95d 6275 cmd = pending_find(MGMT_OP_REMOVE_DEVICE, hdev);
51ef3ebe
JH
6276 if (!cmd)
6277 goto unlock;
6278
6279 cmd->cmd_complete(cmd, mgmt_status(status));
6280 mgmt_pending_remove(cmd);
6281
6282unlock:
6283 hci_dev_unlock(hdev);
6284}
6285
2faade53
MH
6286static int remove_device(struct sock *sk, struct hci_dev *hdev,
6287 void *data, u16 len)
6288{
6289 struct mgmt_cp_remove_device *cp = data;
3b0602cd 6290 struct mgmt_pending_cmd *cmd;
51ef3ebe 6291 struct hci_request req;
2faade53
MH
6292 int err;
6293
6294 BT_DBG("%s", hdev->name);
6295
51ef3ebe
JH
6296 hci_req_init(&req, hdev);
6297
2faade53
MH
6298 hci_dev_lock(hdev);
6299
51ef3ebe
JH
6300 cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_DEVICE, hdev, data, len);
6301 if (!cmd) {
6302 err = -ENOMEM;
6303 goto unlock;
6304 }
6305
6306 cmd->cmd_complete = addr_cmd_complete;
6307
2faade53 6308 if (bacmp(&cp->addr.bdaddr, BDADDR_ANY)) {
c71593dd 6309 struct hci_conn_params *params;
2faade53
MH
6310 u8 addr_type;
6311
6659358e 6312 if (!bdaddr_type_is_valid(cp->addr.type)) {
9df74653
JH
6313 err = cmd->cmd_complete(cmd,
6314 MGMT_STATUS_INVALID_PARAMS);
51ef3ebe 6315 mgmt_pending_remove(cmd);
2faade53
MH
6316 goto unlock;
6317 }
6318
6659358e
JH
6319 if (cp->addr.type == BDADDR_BREDR) {
6320 err = hci_bdaddr_list_del(&hdev->whitelist,
6321 &cp->addr.bdaddr,
6322 cp->addr.type);
6323 if (err) {
9df74653
JH
6324 err = cmd->cmd_complete(cmd,
6325 MGMT_STATUS_INVALID_PARAMS);
51ef3ebe 6326 mgmt_pending_remove(cmd);
6659358e
JH
6327 goto unlock;
6328 }
6329
51ef3ebe 6330 __hci_update_page_scan(&req);
a397407f 6331
6659358e
JH
6332 device_removed(sk, hdev, &cp->addr.bdaddr,
6333 cp->addr.type);
6334 goto complete;
6335 }
6336
2faade53
MH
6337 if (cp->addr.type == BDADDR_LE_PUBLIC)
6338 addr_type = ADDR_LE_DEV_PUBLIC;
6339 else
6340 addr_type = ADDR_LE_DEV_RANDOM;
6341
c71593dd
JH
6342 params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr,
6343 addr_type);
6344 if (!params) {
9df74653
JH
6345 err = cmd->cmd_complete(cmd,
6346 MGMT_STATUS_INVALID_PARAMS);
51ef3ebe 6347 mgmt_pending_remove(cmd);
c71593dd
JH
6348 goto unlock;
6349 }
6350
6351 if (params->auto_connect == HCI_AUTO_CONN_DISABLED) {
9df74653
JH
6352 err = cmd->cmd_complete(cmd,
6353 MGMT_STATUS_INVALID_PARAMS);
51ef3ebe 6354 mgmt_pending_remove(cmd);
c71593dd
JH
6355 goto unlock;
6356 }
6357
d1dbf12e 6358 list_del(&params->action);
c71593dd
JH
6359 list_del(&params->list);
6360 kfree(params);
51ef3ebe 6361 __hci_update_background_scan(&req);
8afef092
MH
6362
6363 device_removed(sk, hdev, &cp->addr.bdaddr, cp->addr.type);
2faade53 6364 } else {
19de0825 6365 struct hci_conn_params *p, *tmp;
6659358e 6366 struct bdaddr_list *b, *btmp;
19de0825 6367
2faade53 6368 if (cp->addr.type) {
9df74653
JH
6369 err = cmd->cmd_complete(cmd,
6370 MGMT_STATUS_INVALID_PARAMS);
51ef3ebe 6371 mgmt_pending_remove(cmd);
2faade53
MH
6372 goto unlock;
6373 }
6374
6659358e
JH
6375 list_for_each_entry_safe(b, btmp, &hdev->whitelist, list) {
6376 device_removed(sk, hdev, &b->bdaddr, b->bdaddr_type);
6377 list_del(&b->list);
6378 kfree(b);
6379 }
6380
51ef3ebe 6381 __hci_update_page_scan(&req);
a397407f 6382
19de0825
JH
6383 list_for_each_entry_safe(p, tmp, &hdev->le_conn_params, list) {
6384 if (p->auto_connect == HCI_AUTO_CONN_DISABLED)
6385 continue;
6386 device_removed(sk, hdev, &p->addr, p->addr_type);
6387 list_del(&p->action);
6388 list_del(&p->list);
6389 kfree(p);
6390 }
6391
6392 BT_DBG("All LE connection parameters were removed");
6393
51ef3ebe 6394 __hci_update_background_scan(&req);
2faade53
MH
6395 }
6396
6659358e 6397complete:
51ef3ebe
JH
6398 err = hci_req_run(&req, remove_device_complete);
6399 if (err < 0) {
6400 /* ENODATA means no HCI commands were needed (e.g. if
6401 * the adapter is powered off).
6402 */
9df74653
JH
6403 if (err == -ENODATA)
6404 err = cmd->cmd_complete(cmd, MGMT_STATUS_SUCCESS);
51ef3ebe
JH
6405 mgmt_pending_remove(cmd);
6406 }
2faade53
MH
6407
6408unlock:
6409 hci_dev_unlock(hdev);
6410 return err;
6411}
6412
a26f3dcf
JH
6413static int load_conn_param(struct sock *sk, struct hci_dev *hdev, void *data,
6414 u16 len)
6415{
6416 struct mgmt_cp_load_conn_param *cp = data;
ba1d6936
JH
6417 const u16 max_param_count = ((U16_MAX - sizeof(*cp)) /
6418 sizeof(struct mgmt_conn_param));
a26f3dcf
JH
6419 u16 param_count, expected_len;
6420 int i;
6421
6422 if (!lmp_le_capable(hdev))
a69e8375
JH
6423 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM,
6424 MGMT_STATUS_NOT_SUPPORTED);
a26f3dcf
JH
6425
6426 param_count = __le16_to_cpu(cp->param_count);
ba1d6936
JH
6427 if (param_count > max_param_count) {
6428 BT_ERR("load_conn_param: too big param_count value %u",
6429 param_count);
a69e8375
JH
6430 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM,
6431 MGMT_STATUS_INVALID_PARAMS);
ba1d6936 6432 }
a26f3dcf
JH
6433
6434 expected_len = sizeof(*cp) + param_count *
6435 sizeof(struct mgmt_conn_param);
6436 if (expected_len != len) {
6437 BT_ERR("load_conn_param: expected %u bytes, got %u bytes",
6438 expected_len, len);
a69e8375
JH
6439 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM,
6440 MGMT_STATUS_INVALID_PARAMS);
a26f3dcf
JH
6441 }
6442
6443 BT_DBG("%s param_count %u", hdev->name, param_count);
6444
6445 hci_dev_lock(hdev);
6446
6447 hci_conn_params_clear_disabled(hdev);
6448
6449 for (i = 0; i < param_count; i++) {
6450 struct mgmt_conn_param *param = &cp->params[i];
6451 struct hci_conn_params *hci_param;
6452 u16 min, max, latency, timeout;
6453 u8 addr_type;
6454
6455 BT_DBG("Adding %pMR (type %u)", &param->addr.bdaddr,
6456 param->addr.type);
6457
6458 if (param->addr.type == BDADDR_LE_PUBLIC) {
6459 addr_type = ADDR_LE_DEV_PUBLIC;
6460 } else if (param->addr.type == BDADDR_LE_RANDOM) {
6461 addr_type = ADDR_LE_DEV_RANDOM;
6462 } else {
6463 BT_ERR("Ignoring invalid connection parameters");
6464 continue;
6465 }
6466
6467 min = le16_to_cpu(param->min_interval);
6468 max = le16_to_cpu(param->max_interval);
6469 latency = le16_to_cpu(param->latency);
6470 timeout = le16_to_cpu(param->timeout);
6471
6472 BT_DBG("min 0x%04x max 0x%04x latency 0x%04x timeout 0x%04x",
6473 min, max, latency, timeout);
6474
6475 if (hci_check_conn_params(min, max, latency, timeout) < 0) {
6476 BT_ERR("Ignoring invalid connection parameters");
6477 continue;
6478 }
6479
6480 hci_param = hci_conn_params_add(hdev, &param->addr.bdaddr,
6481 addr_type);
6482 if (!hci_param) {
6483 BT_ERR("Failed to add connection parameters");
6484 continue;
6485 }
6486
6487 hci_param->conn_min_interval = min;
6488 hci_param->conn_max_interval = max;
6489 hci_param->conn_latency = latency;
6490 hci_param->supervision_timeout = timeout;
6491 }
6492
6493 hci_dev_unlock(hdev);
6494
2a1afb5a
JH
6495 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, 0,
6496 NULL, 0);
a26f3dcf
JH
6497}
6498
dbece37a
MH
6499static int set_external_config(struct sock *sk, struct hci_dev *hdev,
6500 void *data, u16 len)
6501{
6502 struct mgmt_cp_set_external_config *cp = data;
6503 bool changed;
6504 int err;
6505
6506 BT_DBG("%s", hdev->name);
6507
6508 if (hdev_is_powered(hdev))
a69e8375
JH
6509 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG,
6510 MGMT_STATUS_REJECTED);
dbece37a
MH
6511
6512 if (cp->config != 0x00 && cp->config != 0x01)
a69e8375
JH
6513 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG,
6514 MGMT_STATUS_INVALID_PARAMS);
dbece37a
MH
6515
6516 if (!test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks))
a69e8375
JH
6517 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG,
6518 MGMT_STATUS_NOT_SUPPORTED);
dbece37a
MH
6519
6520 hci_dev_lock(hdev);
6521
6522 if (cp->config)
238be788 6523 changed = !hci_dev_test_and_set_flag(hdev, HCI_EXT_CONFIGURED);
dbece37a 6524 else
a69d8927 6525 changed = hci_dev_test_and_clear_flag(hdev, HCI_EXT_CONFIGURED);
dbece37a
MH
6526
6527 err = send_options_rsp(sk, MGMT_OP_SET_EXTERNAL_CONFIG, hdev);
6528 if (err < 0)
6529 goto unlock;
6530
6531 if (!changed)
6532 goto unlock;
6533
f4537c04
MH
6534 err = new_options(hdev, sk);
6535
d7a5a11d 6536 if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED) == is_configured(hdev)) {
dbece37a 6537 mgmt_index_removed(hdev);
d603b76b 6538
516018a9 6539 if (hci_dev_test_and_change_flag(hdev, HCI_UNCONFIGURED)) {
a1536da2
MH
6540 hci_dev_set_flag(hdev, HCI_CONFIG);
6541 hci_dev_set_flag(hdev, HCI_AUTO_OFF);
d603b76b
MH
6542
6543 queue_work(hdev->req_workqueue, &hdev->power_on);
6544 } else {
5ea234d3 6545 set_bit(HCI_RAW, &hdev->flags);
d603b76b
MH
6546 mgmt_index_added(hdev);
6547 }
dbece37a
MH
6548 }
6549
6550unlock:
6551 hci_dev_unlock(hdev);
6552 return err;
6553}
6554
9713c17b
MH
6555static int set_public_address(struct sock *sk, struct hci_dev *hdev,
6556 void *data, u16 len)
6557{
6558 struct mgmt_cp_set_public_address *cp = data;
6559 bool changed;
6560 int err;
6561
6562 BT_DBG("%s", hdev->name);
6563
6564 if (hdev_is_powered(hdev))
a69e8375
JH
6565 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS,
6566 MGMT_STATUS_REJECTED);
9713c17b
MH
6567
6568 if (!bacmp(&cp->bdaddr, BDADDR_ANY))
a69e8375
JH
6569 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS,
6570 MGMT_STATUS_INVALID_PARAMS);
9713c17b
MH
6571
6572 if (!hdev->set_bdaddr)
a69e8375
JH
6573 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS,
6574 MGMT_STATUS_NOT_SUPPORTED);
9713c17b
MH
6575
6576 hci_dev_lock(hdev);
6577
6578 changed = !!bacmp(&hdev->public_addr, &cp->bdaddr);
6579 bacpy(&hdev->public_addr, &cp->bdaddr);
6580
6581 err = send_options_rsp(sk, MGMT_OP_SET_PUBLIC_ADDRESS, hdev);
6582 if (err < 0)
6583 goto unlock;
6584
6585 if (!changed)
6586 goto unlock;
6587
d7a5a11d 6588 if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED))
9713c17b
MH
6589 err = new_options(hdev, sk);
6590
6591 if (is_configured(hdev)) {
6592 mgmt_index_removed(hdev);
6593
a358dc11 6594 hci_dev_clear_flag(hdev, HCI_UNCONFIGURED);
9713c17b 6595
a1536da2
MH
6596 hci_dev_set_flag(hdev, HCI_CONFIG);
6597 hci_dev_set_flag(hdev, HCI_AUTO_OFF);
9713c17b
MH
6598
6599 queue_work(hdev->req_workqueue, &hdev->power_on);
6600 }
6601
6602unlock:
6603 hci_dev_unlock(hdev);
6604 return err;
6605}
6606
bea41609
MH
6607static inline u16 eir_append_data(u8 *eir, u16 eir_len, u8 type, u8 *data,
6608 u8 data_len)
6609{
6610 eir[eir_len++] = sizeof(type) + data_len;
6611 eir[eir_len++] = type;
6612 memcpy(&eir[eir_len], data, data_len);
6613 eir_len += data_len;
6614
6615 return eir_len;
6616}
6617
40f66c05
JH
6618static void read_local_oob_ext_data_complete(struct hci_dev *hdev, u8 status,
6619 u16 opcode, struct sk_buff *skb)
6620{
6621 const struct mgmt_cp_read_local_oob_ext_data *mgmt_cp;
6622 struct mgmt_rp_read_local_oob_ext_data *mgmt_rp;
6623 u8 *h192, *r192, *h256, *r256;
6624 struct mgmt_pending_cmd *cmd;
6625 u16 eir_len;
6626 int err;
6627
6628 BT_DBG("%s status %u", hdev->name, status);
6629
6630 cmd = pending_find(MGMT_OP_READ_LOCAL_OOB_EXT_DATA, hdev);
6631 if (!cmd)
6632 return;
6633
6634 mgmt_cp = cmd->param;
6635
6636 if (status) {
6637 status = mgmt_status(status);
6638 eir_len = 0;
6639
6640 h192 = NULL;
6641 r192 = NULL;
6642 h256 = NULL;
6643 r256 = NULL;
6644 } else if (opcode == HCI_OP_READ_LOCAL_OOB_DATA) {
6645 struct hci_rp_read_local_oob_data *rp;
6646
6647 if (skb->len != sizeof(*rp)) {
6648 status = MGMT_STATUS_FAILED;
6649 eir_len = 0;
6650 } else {
6651 status = MGMT_STATUS_SUCCESS;
6652 rp = (void *)skb->data;
6653
6654 eir_len = 5 + 18 + 18;
6655 h192 = rp->hash;
6656 r192 = rp->rand;
6657 h256 = NULL;
6658 r256 = NULL;
6659 }
6660 } else {
6661 struct hci_rp_read_local_oob_ext_data *rp;
6662
6663 if (skb->len != sizeof(*rp)) {
6664 status = MGMT_STATUS_FAILED;
6665 eir_len = 0;
6666 } else {
6667 status = MGMT_STATUS_SUCCESS;
6668 rp = (void *)skb->data;
6669
6670 if (hci_dev_test_flag(hdev, HCI_SC_ONLY)) {
6671 eir_len = 5 + 18 + 18;
6672 h192 = NULL;
6673 r192 = NULL;
6674 } else {
6675 eir_len = 5 + 18 + 18 + 18 + 18;
6676 h192 = rp->hash192;
6677 r192 = rp->rand192;
6678 }
6679
6680 h256 = rp->hash256;
6681 r256 = rp->rand256;
6682 }
6683 }
6684
6685 mgmt_rp = kmalloc(sizeof(*mgmt_rp) + eir_len, GFP_KERNEL);
6686 if (!mgmt_rp)
6687 goto done;
6688
6689 if (status)
6690 goto send_rsp;
6691
6692 eir_len = eir_append_data(mgmt_rp->eir, 0, EIR_CLASS_OF_DEV,
6693 hdev->dev_class, 3);
6694
6695 if (h192 && r192) {
6696 eir_len = eir_append_data(mgmt_rp->eir, eir_len,
6697 EIR_SSP_HASH_C192, h192, 16);
6698 eir_len = eir_append_data(mgmt_rp->eir, eir_len,
6699 EIR_SSP_RAND_R192, r192, 16);
6700 }
6701
6702 if (h256 && r256) {
6703 eir_len = eir_append_data(mgmt_rp->eir, eir_len,
6704 EIR_SSP_HASH_C256, h256, 16);
6705 eir_len = eir_append_data(mgmt_rp->eir, eir_len,
6706 EIR_SSP_RAND_R256, r256, 16);
6707 }
6708
6709send_rsp:
6710 mgmt_rp->type = mgmt_cp->type;
6711 mgmt_rp->eir_len = cpu_to_le16(eir_len);
6712
6713 err = mgmt_cmd_complete(cmd->sk, hdev->id,
6714 MGMT_OP_READ_LOCAL_OOB_EXT_DATA, status,
6715 mgmt_rp, sizeof(*mgmt_rp) + eir_len);
6716 if (err < 0 || status)
6717 goto done;
6718
6719 hci_sock_set_flag(cmd->sk, HCI_MGMT_OOB_DATA_EVENTS);
6720
6721 err = mgmt_limited_event(MGMT_EV_LOCAL_OOB_DATA_UPDATED, hdev,
6722 mgmt_rp, sizeof(*mgmt_rp) + eir_len,
6723 HCI_MGMT_OOB_DATA_EVENTS, cmd->sk);
6724done:
6725 kfree(mgmt_rp);
6726 mgmt_pending_remove(cmd);
6727}
6728
6729static int read_local_ssp_oob_req(struct hci_dev *hdev, struct sock *sk,
6730 struct mgmt_cp_read_local_oob_ext_data *cp)
6731{
6732 struct mgmt_pending_cmd *cmd;
6733 struct hci_request req;
6734 int err;
6735
6736 cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_EXT_DATA, hdev,
6737 cp, sizeof(*cp));
6738 if (!cmd)
6739 return -ENOMEM;
6740
6741 hci_req_init(&req, hdev);
6742
6743 if (bredr_sc_enabled(hdev))
6744 hci_req_add(&req, HCI_OP_READ_LOCAL_OOB_EXT_DATA, 0, NULL);
6745 else
6746 hci_req_add(&req, HCI_OP_READ_LOCAL_OOB_DATA, 0, NULL);
6747
6748 err = hci_req_run_skb(&req, read_local_oob_ext_data_complete);
6749 if (err < 0) {
6750 mgmt_pending_remove(cmd);
6751 return err;
6752 }
6753
6754 return 0;
6755}
6756
4f0f155c
MH
6757static int read_local_oob_ext_data(struct sock *sk, struct hci_dev *hdev,
6758 void *data, u16 data_len)
6759{
6760 struct mgmt_cp_read_local_oob_ext_data *cp = data;
6761 struct mgmt_rp_read_local_oob_ext_data *rp;
6762 size_t rp_len;
6763 u16 eir_len;
0821a2c5 6764 u8 status, flags, role, addr[7], hash[16], rand[16];
4f0f155c
MH
6765 int err;
6766
6767 BT_DBG("%s", hdev->name);
6768
57b0d3e8
MH
6769 if (hdev_is_powered(hdev)) {
6770 switch (cp->type) {
6771 case BIT(BDADDR_BREDR):
6772 status = mgmt_bredr_support(hdev);
6773 if (status)
6774 eir_len = 0;
6775 else
6776 eir_len = 5;
6777 break;
6778 case (BIT(BDADDR_LE_PUBLIC) | BIT(BDADDR_LE_RANDOM)):
6779 status = mgmt_le_support(hdev);
6780 if (status)
6781 eir_len = 0;
6782 else
6783 eir_len = 9 + 3 + 18 + 18 + 3;
6784 break;
6785 default:
6786 status = MGMT_STATUS_INVALID_PARAMS;
6787 eir_len = 0;
6788 break;
6789 }
6790 } else {
6791 status = MGMT_STATUS_NOT_POWERED;
6792 eir_len = 0;
4f0f155c
MH
6793 }
6794
4f0f155c
MH
6795 rp_len = sizeof(*rp) + eir_len;
6796 rp = kmalloc(rp_len, GFP_ATOMIC);
efcd8c98 6797 if (!rp)
4f0f155c 6798 return -ENOMEM;
efcd8c98 6799
57b0d3e8
MH
6800 if (status)
6801 goto complete;
6802
efcd8c98 6803 hci_dev_lock(hdev);
4f0f155c
MH
6804
6805 eir_len = 0;
6806 switch (cp->type) {
6807 case BIT(BDADDR_BREDR):
40f66c05
JH
6808 if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
6809 err = read_local_ssp_oob_req(hdev, sk, cp);
6810 hci_dev_unlock(hdev);
6811 if (!err)
6812 goto done;
6813
6814 status = MGMT_STATUS_FAILED;
6815 goto complete;
6816 } else {
6817 eir_len = eir_append_data(rp->eir, eir_len,
6818 EIR_CLASS_OF_DEV,
6819 hdev->dev_class, 3);
6820 }
4f0f155c
MH
6821 break;
6822 case (BIT(BDADDR_LE_PUBLIC) | BIT(BDADDR_LE_RANDOM)):
5082a599
MH
6823 if (hci_dev_test_flag(hdev, HCI_SC_ENABLED) &&
6824 smp_generate_oob(hdev, hash, rand) < 0) {
0821a2c5 6825 hci_dev_unlock(hdev);
57b0d3e8
MH
6826 status = MGMT_STATUS_FAILED;
6827 goto complete;
0821a2c5
MH
6828 }
6829
e213568a
MH
6830 /* This should return the active RPA, but since the RPA
6831 * is only programmed on demand, it is really hard to fill
6832 * this in at the moment. For now disallow retrieving
6833 * local out-of-band data when privacy is in use.
6834 *
6835 * Returning the identity address will not help here since
6836 * pairing happens before the identity resolving key is
6837 * known and thus the connection establishment happens
6838 * based on the RPA and not the identity address.
6839 */
4f0f155c 6840 if (hci_dev_test_flag(hdev, HCI_PRIVACY)) {
e213568a
MH
6841 hci_dev_unlock(hdev);
6842 status = MGMT_STATUS_REJECTED;
6843 goto complete;
6844 }
6845
6846 if (hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) ||
6847 !bacmp(&hdev->bdaddr, BDADDR_ANY) ||
6848 (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) &&
6849 bacmp(&hdev->static_addr, BDADDR_ANY))) {
4f0f155c
MH
6850 memcpy(addr, &hdev->static_addr, 6);
6851 addr[6] = 0x01;
6852 } else {
6853 memcpy(addr, &hdev->bdaddr, 6);
6854 addr[6] = 0x00;
6855 }
6856
6857 eir_len = eir_append_data(rp->eir, eir_len, EIR_LE_BDADDR,
6858 addr, sizeof(addr));
6859
6860 if (hci_dev_test_flag(hdev, HCI_ADVERTISING))
6861 role = 0x02;
6862 else
6863 role = 0x01;
6864
6865 eir_len = eir_append_data(rp->eir, eir_len, EIR_LE_ROLE,
6866 &role, sizeof(role));
6867
5082a599
MH
6868 if (hci_dev_test_flag(hdev, HCI_SC_ENABLED)) {
6869 eir_len = eir_append_data(rp->eir, eir_len,
6870 EIR_LE_SC_CONFIRM,
6871 hash, sizeof(hash));
0821a2c5 6872
5082a599
MH
6873 eir_len = eir_append_data(rp->eir, eir_len,
6874 EIR_LE_SC_RANDOM,
6875 rand, sizeof(rand));
6876 }
0821a2c5 6877
4f0f155c
MH
6878 flags = get_adv_discov_flags(hdev);
6879
6880 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
6881 flags |= LE_AD_NO_BREDR;
6882
6883 eir_len = eir_append_data(rp->eir, eir_len, EIR_FLAGS,
6884 &flags, sizeof(flags));
6885 break;
6886 }
6887
4f0f155c
MH
6888 hci_dev_unlock(hdev);
6889
72000df2
MH
6890 hci_sock_set_flag(sk, HCI_MGMT_OOB_DATA_EVENTS);
6891
57b0d3e8
MH
6892 status = MGMT_STATUS_SUCCESS;
6893
6894complete:
efcd8c98
MH
6895 rp->type = cp->type;
6896 rp->eir_len = cpu_to_le16(eir_len);
6897
4f0f155c 6898 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_EXT_DATA,
57b0d3e8
MH
6899 status, rp, sizeof(*rp) + eir_len);
6900 if (err < 0 || status)
72000df2
MH
6901 goto done;
6902
6903 err = mgmt_limited_event(MGMT_EV_LOCAL_OOB_DATA_UPDATED, hdev,
6904 rp, sizeof(*rp) + eir_len,
6905 HCI_MGMT_OOB_DATA_EVENTS, sk);
4f0f155c 6906
0821a2c5 6907done:
4f0f155c
MH
6908 kfree(rp);
6909
6910 return err;
6911}
6912
089fa8c0
AU
6913static u32 get_supported_adv_flags(struct hci_dev *hdev)
6914{
6915 u32 flags = 0;
6916
6917 flags |= MGMT_ADV_FLAG_CONNECTABLE;
6918 flags |= MGMT_ADV_FLAG_DISCOV;
6919 flags |= MGMT_ADV_FLAG_LIMITED_DISCOV;
6920 flags |= MGMT_ADV_FLAG_MANAGED_FLAGS;
6921
6922 if (hdev->adv_tx_power != HCI_TX_POWER_INVALID)
6923 flags |= MGMT_ADV_FLAG_TX_POWER;
6924
6925 return flags;
6926}
6927
d3d5305b
MH
6928static int read_adv_features(struct sock *sk, struct hci_dev *hdev,
6929 void *data, u16 data_len)
6930{
6931 struct mgmt_rp_read_adv_features *rp;
6932 size_t rp_len;
286e0c83 6933 int err, i;
24b4f38f 6934 bool instance;
286e0c83 6935 struct adv_info *adv_instance;
089fa8c0 6936 u32 supported_flags;
d3d5305b
MH
6937
6938 BT_DBG("%s", hdev->name);
6939
089fa8c0
AU
6940 if (!lmp_le_capable(hdev))
6941 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES,
6942 MGMT_STATUS_REJECTED);
6943
d3d5305b
MH
6944 hci_dev_lock(hdev);
6945
6946 rp_len = sizeof(*rp);
24b4f38f 6947
24b4f38f
AU
6948 instance = hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE);
6949 if (instance)
286e0c83 6950 rp_len += hdev->adv_instance_cnt;
24b4f38f 6951
d3d5305b
MH
6952 rp = kmalloc(rp_len, GFP_ATOMIC);
6953 if (!rp) {
6954 hci_dev_unlock(hdev);
6955 return -ENOMEM;
6956 }
6957
089fa8c0
AU
6958 supported_flags = get_supported_adv_flags(hdev);
6959
6960 rp->supported_flags = cpu_to_le32(supported_flags);
dc5d82a9
MH
6961 rp->max_adv_data_len = HCI_MAX_AD_LENGTH;
6962 rp->max_scan_rsp_len = HCI_MAX_AD_LENGTH;
d2609b34 6963 rp->max_instances = HCI_MAX_ADV_INSTANCES;
24b4f38f 6964
24b4f38f 6965 if (instance) {
286e0c83
FG
6966 i = 0;
6967 list_for_each_entry(adv_instance, &hdev->adv_instances, list) {
6968 if (i >= hdev->adv_instance_cnt)
6969 break;
6970
6971 rp->instance[i] = adv_instance->instance;
6972 i++;
6973 }
6974 rp->num_instances = hdev->adv_instance_cnt;
24b4f38f
AU
6975 } else {
6976 rp->num_instances = 0;
6977 }
d3d5305b
MH
6978
6979 hci_dev_unlock(hdev);
6980
6981 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES,
6982 MGMT_STATUS_SUCCESS, rp, rp_len);
6983
6984 kfree(rp);
6985
6986 return err;
6987}
6988
4117ed70 6989static bool tlv_data_is_valid(struct hci_dev *hdev, u32 adv_flags, u8 *data,
b44133ff 6990 u8 len, bool is_adv_data)
24b4f38f 6991{
4117ed70 6992 u8 max_len = HCI_MAX_AD_LENGTH;
24b4f38f 6993 int i, cur_len;
b44133ff 6994 bool flags_managed = false;
5507e358 6995 bool tx_power_managed = false;
67e0c0cd
AU
6996 u32 flags_params = MGMT_ADV_FLAG_DISCOV | MGMT_ADV_FLAG_LIMITED_DISCOV |
6997 MGMT_ADV_FLAG_MANAGED_FLAGS;
24b4f38f 6998
807ec772 6999 if (is_adv_data && (adv_flags & flags_params)) {
b44133ff
AU
7000 flags_managed = true;
7001 max_len -= 3;
7002 }
24b4f38f 7003
5507e358
AU
7004 if (is_adv_data && (adv_flags & MGMT_ADV_FLAG_TX_POWER)) {
7005 tx_power_managed = true;
7006 max_len -= 3;
7007 }
7008
4117ed70 7009 if (len > max_len)
24b4f38f
AU
7010 return false;
7011
4117ed70
AU
7012 /* Make sure that the data is correctly formatted. */
7013 for (i = 0, cur_len = 0; i < len; i += (cur_len + 1)) {
7014 cur_len = data[i];
24b4f38f 7015
b44133ff
AU
7016 if (flags_managed && data[i + 1] == EIR_FLAGS)
7017 return false;
7018
5507e358
AU
7019 if (tx_power_managed && data[i + 1] == EIR_TX_POWER)
7020 return false;
7021
24b4f38f
AU
7022 /* If the current field length would exceed the total data
7023 * length, then it's invalid.
7024 */
4117ed70 7025 if (i + cur_len >= len)
24b4f38f
AU
7026 return false;
7027 }
7028
7029 return true;
7030}
7031
24b4f38f
AU
7032static void add_advertising_complete(struct hci_dev *hdev, u8 status,
7033 u16 opcode)
7034{
7035 struct mgmt_pending_cmd *cmd;
fffd38bc 7036 struct mgmt_cp_add_advertising *cp;
24b4f38f 7037 struct mgmt_rp_add_advertising rp;
fffd38bc
FG
7038 struct adv_info *adv_instance, *n;
7039 u8 instance;
24b4f38f
AU
7040
7041 BT_DBG("status %d", status);
7042
7043 hci_dev_lock(hdev);
7044
7045 cmd = pending_find(MGMT_OP_ADD_ADVERTISING, hdev);
7046
fffd38bc 7047 if (status)
24b4f38f 7048 hci_dev_clear_flag(hdev, HCI_ADVERTISING_INSTANCE);
fffd38bc
FG
7049
7050 list_for_each_entry_safe(adv_instance, n, &hdev->adv_instances, list) {
7051 if (!adv_instance->pending)
7052 continue;
7053
7054 if (!status) {
7055 adv_instance->pending = false;
7056 continue;
7057 }
7058
7059 instance = adv_instance->instance;
7060
7061 if (hdev->cur_adv_instance == instance)
7062 cancel_adv_timeout(hdev);
7063
7064 hci_remove_adv_instance(hdev, instance);
7065 advertising_removed(cmd ? cmd->sk : NULL, hdev, instance);
24b4f38f
AU
7066 }
7067
7068 if (!cmd)
7069 goto unlock;
7070
fffd38bc
FG
7071 cp = cmd->param;
7072 rp.instance = cp->instance;
24b4f38f
AU
7073
7074 if (status)
7075 mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode,
7076 mgmt_status(status));
7077 else
7078 mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
7079 mgmt_status(status), &rp, sizeof(rp));
7080
7081 mgmt_pending_remove(cmd);
7082
7083unlock:
7084 hci_dev_unlock(hdev);
7085}
7086
5d900e46 7087void mgmt_adv_timeout_expired(struct hci_dev *hdev)
912098a6 7088{
847818d9
FG
7089 u8 instance;
7090 struct hci_request req;
7091
5d900e46 7092 hdev->adv_instance_timeout = 0;
912098a6 7093
847818d9
FG
7094 instance = get_current_adv_instance(hdev);
7095 if (instance == 0x00)
7096 return;
7097
912098a6 7098 hci_dev_lock(hdev);
847818d9
FG
7099 hci_req_init(&req, hdev);
7100
7101 clear_adv_instance(hdev, &req, instance, false);
7102
7103 if (list_empty(&hdev->adv_instances))
7104 disable_advertising(&req);
7105
7106 if (!skb_queue_empty(&req.cmd_q))
7107 hci_req_run(&req, NULL);
7108
912098a6
AU
7109 hci_dev_unlock(hdev);
7110}
7111
24b4f38f
AU
7112static int add_advertising(struct sock *sk, struct hci_dev *hdev,
7113 void *data, u16 data_len)
7114{
7115 struct mgmt_cp_add_advertising *cp = data;
7116 struct mgmt_rp_add_advertising rp;
7117 u32 flags;
089fa8c0 7118 u32 supported_flags;
24b4f38f 7119 u8 status;
fffd38bc
FG
7120 u16 timeout, duration;
7121 unsigned int prev_instance_cnt = hdev->adv_instance_cnt;
7122 u8 schedule_instance = 0;
7123 struct adv_info *next_instance;
24b4f38f
AU
7124 int err;
7125 struct mgmt_pending_cmd *cmd;
7126 struct hci_request req;
7127
7128 BT_DBG("%s", hdev->name);
7129
7130 status = mgmt_le_support(hdev);
7131 if (status)
7132 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
7133 status);
7134
7135 flags = __le32_to_cpu(cp->flags);
912098a6 7136 timeout = __le16_to_cpu(cp->timeout);
fffd38bc 7137 duration = __le16_to_cpu(cp->duration);
24b4f38f 7138
fffd38bc
FG
7139 /* The current implementation only supports a subset of the specified
7140 * flags.
089fa8c0
AU
7141 */
7142 supported_flags = get_supported_adv_flags(hdev);
fffd38bc 7143 if (flags & ~supported_flags)
24b4f38f
AU
7144 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
7145 MGMT_STATUS_INVALID_PARAMS);
7146
7147 hci_dev_lock(hdev);
7148
912098a6
AU
7149 if (timeout && !hdev_is_powered(hdev)) {
7150 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
7151 MGMT_STATUS_REJECTED);
7152 goto unlock;
7153 }
7154
24b4f38f 7155 if (pending_find(MGMT_OP_ADD_ADVERTISING, hdev) ||
da929335 7156 pending_find(MGMT_OP_REMOVE_ADVERTISING, hdev) ||
24b4f38f
AU
7157 pending_find(MGMT_OP_SET_LE, hdev)) {
7158 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
7159 MGMT_STATUS_BUSY);
7160 goto unlock;
7161 }
7162
b44133ff 7163 if (!tlv_data_is_valid(hdev, flags, cp->data, cp->adv_data_len, true) ||
4117ed70 7164 !tlv_data_is_valid(hdev, flags, cp->data + cp->adv_data_len,
b44133ff 7165 cp->scan_rsp_len, false)) {
24b4f38f
AU
7166 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
7167 MGMT_STATUS_INVALID_PARAMS);
7168 goto unlock;
7169 }
7170
fffd38bc
FG
7171 err = hci_add_adv_instance(hdev, cp->instance, flags,
7172 cp->adv_data_len, cp->data,
7173 cp->scan_rsp_len,
7174 cp->data + cp->adv_data_len,
7175 timeout, duration);
7176 if (err < 0) {
7177 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
7178 MGMT_STATUS_FAILED);
7179 goto unlock;
7180 }
24b4f38f 7181
fffd38bc
FG
7182 /* Only trigger an advertising added event if a new instance was
7183 * actually added.
7184 */
7185 if (hdev->adv_instance_cnt > prev_instance_cnt)
7186 advertising_added(sk, hdev, cp->instance);
912098a6 7187
fffd38bc 7188 hci_dev_set_flag(hdev, HCI_ADVERTISING_INSTANCE);
912098a6 7189
fffd38bc
FG
7190 if (hdev->cur_adv_instance == cp->instance) {
7191 /* If the currently advertised instance is being changed then
7192 * cancel the current advertising and schedule the next
7193 * instance. If there is only one instance then the overridden
7194 * advertising data will be visible right away.
7195 */
7196 cancel_adv_timeout(hdev);
912098a6 7197
fffd38bc
FG
7198 next_instance = hci_get_next_instance(hdev, cp->instance);
7199 if (next_instance)
7200 schedule_instance = next_instance->instance;
7201 } else if (!hdev->adv_instance_timeout) {
7202 /* Immediately advertise the new instance if no other
7203 * instance is currently being advertised.
7204 */
7205 schedule_instance = cp->instance;
7206 }
24b4f38f 7207
fffd38bc
FG
7208 /* If the HCI_ADVERTISING flag is set or the device isn't powered or
7209 * there is no instance to be advertised then we have no HCI
7210 * communication to make. Simply return.
24b4f38f
AU
7211 */
7212 if (!hdev_is_powered(hdev) ||
fffd38bc
FG
7213 hci_dev_test_flag(hdev, HCI_ADVERTISING) ||
7214 !schedule_instance) {
7215 rp.instance = cp->instance;
24b4f38f
AU
7216 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
7217 MGMT_STATUS_SUCCESS, &rp, sizeof(rp));
7218 goto unlock;
7219 }
7220
7221 /* We're good to go, update advertising data, parameters, and start
7222 * advertising.
7223 */
7224 cmd = mgmt_pending_add(sk, MGMT_OP_ADD_ADVERTISING, hdev, data,
7225 data_len);
7226 if (!cmd) {
7227 err = -ENOMEM;
7228 goto unlock;
7229 }
7230
7231 hci_req_init(&req, hdev);
7232
fffd38bc
FG
7233 err = schedule_adv_instance(&req, schedule_instance, true);
7234
7235 if (!err)
7236 err = hci_req_run(&req, add_advertising_complete);
24b4f38f 7237
24b4f38f
AU
7238 if (err < 0)
7239 mgmt_pending_remove(cmd);
7240
7241unlock:
7242 hci_dev_unlock(hdev);
7243
7244 return err;
7245}
7246
da929335
AU
7247static void remove_advertising_complete(struct hci_dev *hdev, u8 status,
7248 u16 opcode)
7249{
7250 struct mgmt_pending_cmd *cmd;
01948331 7251 struct mgmt_cp_remove_advertising *cp;
da929335
AU
7252 struct mgmt_rp_remove_advertising rp;
7253
7254 BT_DBG("status %d", status);
7255
7256 hci_dev_lock(hdev);
7257
7258 /* A failure status here only means that we failed to disable
7259 * advertising. Otherwise, the advertising instance has been removed,
7260 * so report success.
7261 */
7262 cmd = pending_find(MGMT_OP_REMOVE_ADVERTISING, hdev);
7263 if (!cmd)
7264 goto unlock;
7265
01948331
FG
7266 cp = cmd->param;
7267 rp.instance = cp->instance;
da929335
AU
7268
7269 mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, MGMT_STATUS_SUCCESS,
7270 &rp, sizeof(rp));
7271 mgmt_pending_remove(cmd);
7272
7273unlock:
7274 hci_dev_unlock(hdev);
7275}
7276
7277static int remove_advertising(struct sock *sk, struct hci_dev *hdev,
7278 void *data, u16 data_len)
7279{
7280 struct mgmt_cp_remove_advertising *cp = data;
7281 struct mgmt_rp_remove_advertising rp;
01948331 7282 struct adv_info *adv_instance;
da929335
AU
7283 int err;
7284 struct mgmt_pending_cmd *cmd;
7285 struct hci_request req;
7286
7287 BT_DBG("%s", hdev->name);
7288
da929335
AU
7289 hci_dev_lock(hdev);
7290
01948331
FG
7291 if (cp->instance)
7292 adv_instance = hci_find_adv_instance(hdev, cp->instance);
7293
7294 if (!(cp->instance == 0x00 || adv_instance)) {
7295 err = mgmt_cmd_status(sk, hdev->id,
7296 MGMT_OP_REMOVE_ADVERTISING,
7297 MGMT_STATUS_INVALID_PARAMS);
7298 goto unlock;
7299 }
7300
da929335
AU
7301 if (pending_find(MGMT_OP_ADD_ADVERTISING, hdev) ||
7302 pending_find(MGMT_OP_REMOVE_ADVERTISING, hdev) ||
7303 pending_find(MGMT_OP_SET_LE, hdev)) {
7304 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADVERTISING,
7305 MGMT_STATUS_BUSY);
7306 goto unlock;
7307 }
7308
7309 if (!hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE)) {
7310 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADVERTISING,
7311 MGMT_STATUS_INVALID_PARAMS);
7312 goto unlock;
7313 }
7314
01948331 7315 hci_req_init(&req, hdev);
da929335 7316
01948331 7317 clear_adv_instance(hdev, &req, cp->instance, true);
da929335 7318
01948331
FG
7319 if (list_empty(&hdev->adv_instances))
7320 disable_advertising(&req);
da929335 7321
01948331
FG
7322 /* If no HCI commands have been collected so far or the HCI_ADVERTISING
7323 * flag is set or the device isn't powered then we have no HCI
7324 * communication to make. Simply return.
da929335 7325 */
01948331
FG
7326 if (skb_queue_empty(&req.cmd_q) ||
7327 !hdev_is_powered(hdev) ||
da929335 7328 hci_dev_test_flag(hdev, HCI_ADVERTISING)) {
01948331 7329 rp.instance = cp->instance;
da929335
AU
7330 err = mgmt_cmd_complete(sk, hdev->id,
7331 MGMT_OP_REMOVE_ADVERTISING,
7332 MGMT_STATUS_SUCCESS, &rp, sizeof(rp));
7333 goto unlock;
7334 }
7335
7336 cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_ADVERTISING, hdev, data,
7337 data_len);
7338 if (!cmd) {
7339 err = -ENOMEM;
7340 goto unlock;
7341 }
7342
da929335
AU
7343 err = hci_req_run(&req, remove_advertising_complete);
7344 if (err < 0)
7345 mgmt_pending_remove(cmd);
7346
7347unlock:
7348 hci_dev_unlock(hdev);
7349
7350 return err;
7351}
7352
6d785aa3 7353static const struct hci_mgmt_handler mgmt_handlers[] = {
0f4e68cf 7354 { NULL }, /* 0x0000 (no command) */
b9a245fb 7355 { read_version, MGMT_READ_VERSION_SIZE,
c91041dc
MH
7356 HCI_MGMT_NO_HDEV |
7357 HCI_MGMT_UNTRUSTED },
b9a245fb 7358 { read_commands, MGMT_READ_COMMANDS_SIZE,
c91041dc
MH
7359 HCI_MGMT_NO_HDEV |
7360 HCI_MGMT_UNTRUSTED },
b9a245fb 7361 { read_index_list, MGMT_READ_INDEX_LIST_SIZE,
c91041dc
MH
7362 HCI_MGMT_NO_HDEV |
7363 HCI_MGMT_UNTRUSTED },
7364 { read_controller_info, MGMT_READ_INFO_SIZE,
7365 HCI_MGMT_UNTRUSTED },
7aea8616
MH
7366 { set_powered, MGMT_SETTING_SIZE },
7367 { set_discoverable, MGMT_SET_DISCOVERABLE_SIZE },
7368 { set_connectable, MGMT_SETTING_SIZE },
7369 { set_fast_connectable, MGMT_SETTING_SIZE },
7370 { set_bondable, MGMT_SETTING_SIZE },
7371 { set_link_security, MGMT_SETTING_SIZE },
7372 { set_ssp, MGMT_SETTING_SIZE },
7373 { set_hs, MGMT_SETTING_SIZE },
7374 { set_le, MGMT_SETTING_SIZE },
7375 { set_dev_class, MGMT_SET_DEV_CLASS_SIZE },
7376 { set_local_name, MGMT_SET_LOCAL_NAME_SIZE },
7377 { add_uuid, MGMT_ADD_UUID_SIZE },
7378 { remove_uuid, MGMT_REMOVE_UUID_SIZE },
b9a245fb
JH
7379 { load_link_keys, MGMT_LOAD_LINK_KEYS_SIZE,
7380 HCI_MGMT_VAR_LEN },
7381 { load_long_term_keys, MGMT_LOAD_LONG_TERM_KEYS_SIZE,
7382 HCI_MGMT_VAR_LEN },
7aea8616
MH
7383 { disconnect, MGMT_DISCONNECT_SIZE },
7384 { get_connections, MGMT_GET_CONNECTIONS_SIZE },
7385 { pin_code_reply, MGMT_PIN_CODE_REPLY_SIZE },
7386 { pin_code_neg_reply, MGMT_PIN_CODE_NEG_REPLY_SIZE },
7387 { set_io_capability, MGMT_SET_IO_CAPABILITY_SIZE },
7388 { pair_device, MGMT_PAIR_DEVICE_SIZE },
7389 { cancel_pair_device, MGMT_CANCEL_PAIR_DEVICE_SIZE },
7390 { unpair_device, MGMT_UNPAIR_DEVICE_SIZE },
7391 { user_confirm_reply, MGMT_USER_CONFIRM_REPLY_SIZE },
7392 { user_confirm_neg_reply, MGMT_USER_CONFIRM_NEG_REPLY_SIZE },
7393 { user_passkey_reply, MGMT_USER_PASSKEY_REPLY_SIZE },
7394 { user_passkey_neg_reply, MGMT_USER_PASSKEY_NEG_REPLY_SIZE },
b9a245fb
JH
7395 { read_local_oob_data, MGMT_READ_LOCAL_OOB_DATA_SIZE },
7396 { add_remote_oob_data, MGMT_ADD_REMOTE_OOB_DATA_SIZE,
7397 HCI_MGMT_VAR_LEN },
7aea8616
MH
7398 { remove_remote_oob_data, MGMT_REMOVE_REMOTE_OOB_DATA_SIZE },
7399 { start_discovery, MGMT_START_DISCOVERY_SIZE },
7400 { stop_discovery, MGMT_STOP_DISCOVERY_SIZE },
7401 { confirm_name, MGMT_CONFIRM_NAME_SIZE },
7402 { block_device, MGMT_BLOCK_DEVICE_SIZE },
7403 { unblock_device, MGMT_UNBLOCK_DEVICE_SIZE },
7404 { set_device_id, MGMT_SET_DEVICE_ID_SIZE },
7405 { set_advertising, MGMT_SETTING_SIZE },
7406 { set_bredr, MGMT_SETTING_SIZE },
7407 { set_static_address, MGMT_SET_STATIC_ADDRESS_SIZE },
7408 { set_scan_params, MGMT_SET_SCAN_PARAMS_SIZE },
7409 { set_secure_conn, MGMT_SETTING_SIZE },
7410 { set_debug_keys, MGMT_SETTING_SIZE },
7411 { set_privacy, MGMT_SET_PRIVACY_SIZE },
b9a245fb
JH
7412 { load_irks, MGMT_LOAD_IRKS_SIZE,
7413 HCI_MGMT_VAR_LEN },
7aea8616
MH
7414 { get_conn_info, MGMT_GET_CONN_INFO_SIZE },
7415 { get_clock_info, MGMT_GET_CLOCK_INFO_SIZE },
7416 { add_device, MGMT_ADD_DEVICE_SIZE },
7417 { remove_device, MGMT_REMOVE_DEVICE_SIZE },
b9a245fb
JH
7418 { load_conn_param, MGMT_LOAD_CONN_PARAM_SIZE,
7419 HCI_MGMT_VAR_LEN },
7420 { read_unconf_index_list, MGMT_READ_UNCONF_INDEX_LIST_SIZE,
c91041dc
MH
7421 HCI_MGMT_NO_HDEV |
7422 HCI_MGMT_UNTRUSTED },
b9a245fb 7423 { read_config_info, MGMT_READ_CONFIG_INFO_SIZE,
c91041dc
MH
7424 HCI_MGMT_UNCONFIGURED |
7425 HCI_MGMT_UNTRUSTED },
b9a245fb
JH
7426 { set_external_config, MGMT_SET_EXTERNAL_CONFIG_SIZE,
7427 HCI_MGMT_UNCONFIGURED },
7428 { set_public_address, MGMT_SET_PUBLIC_ADDRESS_SIZE,
7429 HCI_MGMT_UNCONFIGURED },
7430 { start_service_discovery, MGMT_START_SERVICE_DISCOVERY_SIZE,
7431 HCI_MGMT_VAR_LEN },
4f0f155c 7432 { read_local_oob_ext_data, MGMT_READ_LOCAL_OOB_EXT_DATA_SIZE },
96f1474a 7433 { read_ext_index_list, MGMT_READ_EXT_INDEX_LIST_SIZE,
c91041dc
MH
7434 HCI_MGMT_NO_HDEV |
7435 HCI_MGMT_UNTRUSTED },
d3d5305b 7436 { read_adv_features, MGMT_READ_ADV_FEATURES_SIZE },
24b4f38f
AU
7437 { add_advertising, MGMT_ADD_ADVERTISING_SIZE,
7438 HCI_MGMT_VAR_LEN },
da929335 7439 { remove_advertising, MGMT_REMOVE_ADVERTISING_SIZE },
0f4e68cf
JH
7440};
7441
bf6b56db 7442void mgmt_index_added(struct hci_dev *hdev)
c71e97bf 7443{
ced85549 7444 struct mgmt_ev_ext_index ev;
bb4b2a9a 7445
0602a8ad
MH
7446 if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
7447 return;
7448
f9207338
MH
7449 switch (hdev->dev_type) {
7450 case HCI_BREDR:
7451 if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) {
7452 mgmt_index_event(MGMT_EV_UNCONF_INDEX_ADDED, hdev,
7453 NULL, 0, HCI_MGMT_UNCONF_INDEX_EVENTS);
ced85549 7454 ev.type = 0x01;
f9207338
MH
7455 } else {
7456 mgmt_index_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0,
7457 HCI_MGMT_INDEX_EVENTS);
ced85549 7458 ev.type = 0x00;
f9207338
MH
7459 }
7460 break;
ced85549
MH
7461 case HCI_AMP:
7462 ev.type = 0x02;
7463 break;
7464 default:
7465 return;
f9207338 7466 }
ced85549
MH
7467
7468 ev.bus = hdev->bus;
7469
7470 mgmt_index_event(MGMT_EV_EXT_INDEX_ADDED, hdev, &ev, sizeof(ev),
7471 HCI_MGMT_EXT_INDEX_EVENTS);
c71e97bf
JH
7472}
7473
bf6b56db 7474void mgmt_index_removed(struct hci_dev *hdev)
c71e97bf 7475{
ced85549 7476 struct mgmt_ev_ext_index ev;
5f159032 7477 u8 status = MGMT_STATUS_INVALID_INDEX;
b24752fe 7478
0602a8ad
MH
7479 if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
7480 return;
7481
f9207338
MH
7482 switch (hdev->dev_type) {
7483 case HCI_BREDR:
7484 mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &status);
b24752fe 7485
f9207338
MH
7486 if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) {
7487 mgmt_index_event(MGMT_EV_UNCONF_INDEX_REMOVED, hdev,
7488 NULL, 0, HCI_MGMT_UNCONF_INDEX_EVENTS);
ced85549 7489 ev.type = 0x01;
f9207338
MH
7490 } else {
7491 mgmt_index_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0,
7492 HCI_MGMT_INDEX_EVENTS);
ced85549 7493 ev.type = 0x00;
f9207338
MH
7494 }
7495 break;
ced85549
MH
7496 case HCI_AMP:
7497 ev.type = 0x02;
7498 break;
7499 default:
7500 return;
f9207338 7501 }
ced85549
MH
7502
7503 ev.bus = hdev->bus;
7504
7505 mgmt_index_event(MGMT_EV_EXT_INDEX_REMOVED, hdev, &ev, sizeof(ev),
7506 HCI_MGMT_EXT_INDEX_EVENTS);
eec8d2bc
JH
7507}
7508
6046dc3e 7509/* This function requires the caller holds hdev->lock */
2cf22218 7510static void restart_le_actions(struct hci_request *req)
6046dc3e 7511{
2cf22218 7512 struct hci_dev *hdev = req->hdev;
6046dc3e
AG
7513 struct hci_conn_params *p;
7514
7515 list_for_each_entry(p, &hdev->le_conn_params, list) {
d7347f3c
JH
7516 /* Needed for AUTO_OFF case where might not "really"
7517 * have been powered off.
7518 */
7519 list_del_init(&p->action);
7520
7521 switch (p->auto_connect) {
4b9e7e75 7522 case HCI_AUTO_CONN_DIRECT:
d7347f3c
JH
7523 case HCI_AUTO_CONN_ALWAYS:
7524 list_add(&p->action, &hdev->pend_le_conns);
7525 break;
7526 case HCI_AUTO_CONN_REPORT:
7527 list_add(&p->action, &hdev->pend_le_reports);
7528 break;
7529 default:
7530 break;
c83ed19d 7531 }
6046dc3e 7532 }
c83ed19d 7533
2cf22218 7534 __hci_update_background_scan(req);
6046dc3e
AG
7535}
7536
1904a853 7537static void powered_complete(struct hci_dev *hdev, u8 status, u16 opcode)
229ab39c
JH
7538{
7539 struct cmd_lookup match = { NULL, hdev };
7540
7541 BT_DBG("status 0x%02x", status);
7542
162a3bac
MH
7543 if (!status) {
7544 /* Register the available SMP channels (BR/EDR and LE) only
7545 * when successfully powering on the controller. This late
7546 * registration is required so that LE SMP can clearly
7547 * decide if the public address or static address is used.
7548 */
7549 smp_register(hdev);
7550 }
7551
229ab39c
JH
7552 hci_dev_lock(hdev);
7553
7554 mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);
7555
7556 new_settings(hdev, match.sk);
7557
7558 hci_dev_unlock(hdev);
7559
7560 if (match.sk)
7561 sock_put(match.sk);
7562}
7563
70da6243 7564static int powered_update_hci(struct hci_dev *hdev)
5add6af8 7565{
890ea898 7566 struct hci_request req;
320b3bf7 7567 struct adv_info *adv_instance;
70da6243 7568 u8 link_sec;
5add6af8 7569
890ea898
JH
7570 hci_req_init(&req, hdev);
7571
d7a5a11d 7572 if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED) &&
70da6243 7573 !lmp_host_ssp_capable(hdev)) {
574ea3c7 7574 u8 mode = 0x01;
5e5282bb 7575
574ea3c7
MH
7576 hci_req_add(&req, HCI_OP_WRITE_SSP_MODE, sizeof(mode), &mode);
7577
7578 if (bredr_sc_enabled(hdev) && !lmp_host_sc_capable(hdev)) {
7579 u8 support = 0x01;
5add6af8 7580
574ea3c7
MH
7581 hci_req_add(&req, HCI_OP_WRITE_SC_SUPPORT,
7582 sizeof(support), &support);
7583 }
ec6f99b8
JH
7584 }
7585
d7a5a11d 7586 if (hci_dev_test_flag(hdev, HCI_LE_ENABLED) &&
c73eee91 7587 lmp_bredr_capable(hdev)) {
70da6243 7588 struct hci_cp_write_le_host_supported cp;
f0ff92fb 7589
32226e4f
MH
7590 cp.le = 0x01;
7591 cp.simul = 0x00;
3d1cbdd6 7592
70da6243
JH
7593 /* Check first if we already have the right
7594 * host state (host features set)
7595 */
7596 if (cp.le != lmp_host_le_capable(hdev) ||
7597 cp.simul != lmp_host_le_br_capable(hdev))
890ea898
JH
7598 hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED,
7599 sizeof(cp), &cp);
70da6243 7600 }
3d1cbdd6 7601
d13eafce 7602 if (lmp_le_capable(hdev)) {
441ad2d0
MH
7603 /* Make sure the controller has a good default for
7604 * advertising data. This also applies to the case
7605 * where BR/EDR was toggled during the AUTO_OFF phase.
7606 */
320b3bf7
FG
7607 if (hci_dev_test_flag(hdev, HCI_LE_ENABLED) &&
7608 (hci_dev_test_flag(hdev, HCI_ADVERTISING) ||
7609 !hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE))) {
5947f4bc 7610 update_adv_data(&req);
f14d8f64
MH
7611 update_scan_rsp_data(&req);
7612 }
441ad2d0 7613
320b3bf7
FG
7614 if (hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE) &&
7615 hdev->cur_adv_instance == 0x00 &&
7616 !list_empty(&hdev->adv_instances)) {
7617 adv_instance = list_first_entry(&hdev->adv_instances,
7618 struct adv_info, list);
7619 hdev->cur_adv_instance = adv_instance->instance;
7620 }
7621
7622 if (hci_dev_test_flag(hdev, HCI_ADVERTISING))
bba3aa55 7623 enable_advertising(&req);
320b3bf7
FG
7624 else if (hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE) &&
7625 hdev->cur_adv_instance)
7626 schedule_adv_instance(&req, hdev->cur_adv_instance,
7627 true);
2cf22218
JH
7628
7629 restart_le_actions(&req);
eeca6f89
JH
7630 }
7631
d7a5a11d 7632 link_sec = hci_dev_test_flag(hdev, HCI_LINK_SECURITY);
70da6243 7633 if (link_sec != test_bit(HCI_AUTH, &hdev->flags))
890ea898
JH
7634 hci_req_add(&req, HCI_OP_WRITE_AUTH_ENABLE,
7635 sizeof(link_sec), &link_sec);
562fcc24 7636
70da6243 7637 if (lmp_bredr_capable(hdev)) {
d7a5a11d 7638 if (hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE))
406ef2a6
JH
7639 write_fast_connectable(&req, true);
7640 else
7641 write_fast_connectable(&req, false);
1d2dc5b7 7642 __hci_update_page_scan(&req);
890ea898 7643 update_class(&req);
13928971 7644 update_name(&req);
890ea898 7645 update_eir(&req);
70da6243 7646 }
562fcc24 7647
229ab39c 7648 return hci_req_run(&req, powered_complete);
70da6243 7649}
562fcc24 7650
70da6243
JH
7651int mgmt_powered(struct hci_dev *hdev, u8 powered)
7652{
7653 struct cmd_lookup match = { NULL, hdev };
9845904f 7654 u8 status, zero_cod[] = { 0, 0, 0 };
70da6243 7655 int err;
f0ff92fb 7656
d7a5a11d 7657 if (!hci_dev_test_flag(hdev, HCI_MGMT))
70da6243
JH
7658 return 0;
7659
70da6243 7660 if (powered) {
229ab39c
JH
7661 if (powered_update_hci(hdev) == 0)
7662 return 0;
fe038884 7663
229ab39c
JH
7664 mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp,
7665 &match);
7666 goto new_settings;
b24752fe
JH
7667 }
7668
229ab39c 7669 mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);
9845904f
JH
7670
7671 /* If the power off is because of hdev unregistration let
7672 * use the appropriate INVALID_INDEX status. Otherwise use
7673 * NOT_POWERED. We cover both scenarios here since later in
7674 * mgmt_index_removed() any hci_conn callbacks will have already
7675 * been triggered, potentially causing misleading DISCONNECTED
7676 * status responses.
7677 */
d7a5a11d 7678 if (hci_dev_test_flag(hdev, HCI_UNREGISTER))
9845904f
JH
7679 status = MGMT_STATUS_INVALID_INDEX;
7680 else
7681 status = MGMT_STATUS_NOT_POWERED;
7682
7683 mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &status);
229ab39c
JH
7684
7685 if (memcmp(hdev->dev_class, zero_cod, sizeof(zero_cod)) != 0)
f6b7712e
MH
7686 mgmt_generic_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev,
7687 zero_cod, sizeof(zero_cod), NULL);
229ab39c
JH
7688
7689new_settings:
beadb2bd 7690 err = new_settings(hdev, match.sk);
eec8d2bc
JH
7691
7692 if (match.sk)
7693 sock_put(match.sk);
7694
7bb895d6 7695 return err;
5add6af8 7696}
73f22f62 7697
3eec705e 7698void mgmt_set_powered_failed(struct hci_dev *hdev, int err)
96570ffc 7699{
3b0602cd 7700 struct mgmt_pending_cmd *cmd;
96570ffc
JH
7701 u8 status;
7702
333ae95d 7703 cmd = pending_find(MGMT_OP_SET_POWERED, hdev);
96570ffc 7704 if (!cmd)
3eec705e 7705 return;
96570ffc
JH
7706
7707 if (err == -ERFKILL)
7708 status = MGMT_STATUS_RFKILLED;
7709 else
7710 status = MGMT_STATUS_FAILED;
7711
a69e8375 7712 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_POWERED, status);
96570ffc
JH
7713
7714 mgmt_pending_remove(cmd);
96570ffc
JH
7715}
7716
d1967ff8
MH
7717void mgmt_discoverable_timeout(struct hci_dev *hdev)
7718{
7719 struct hci_request req;
d1967ff8
MH
7720
7721 hci_dev_lock(hdev);
7722
7723 /* When discoverable timeout triggers, then just make sure
7724 * the limited discoverable flag is cleared. Even in the case
7725 * of a timeout triggered from general discoverable, it is
7726 * safe to unconditionally clear the flag.
7727 */
a358dc11
MH
7728 hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
7729 hci_dev_clear_flag(hdev, HCI_DISCOVERABLE);
d1967ff8
MH
7730
7731 hci_req_init(&req, hdev);
d7a5a11d 7732 if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
4b580614
JH
7733 u8 scan = SCAN_PAGE;
7734 hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE,
7735 sizeof(scan), &scan);
7736 }
d1967ff8 7737 update_class(&req);
24b4f38f
AU
7738
7739 /* Advertising instances don't use the global discoverable setting, so
7740 * only update AD if advertising was enabled using Set Advertising.
7741 */
7742 if (hci_dev_test_flag(hdev, HCI_ADVERTISING))
7743 update_adv_data(&req);
7744
d1967ff8
MH
7745 hci_req_run(&req, NULL);
7746
7747 hdev->discov_timeout = 0;
7748
9a43e25f
JH
7749 new_settings(hdev, NULL);
7750
d1967ff8
MH
7751 hci_dev_unlock(hdev);
7752}
7753
dc4a5ee2
MH
7754void mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
7755 bool persistent)
55ed8ca1 7756{
86742e1e 7757 struct mgmt_ev_new_link_key ev;
55ed8ca1 7758
a492cd52 7759 memset(&ev, 0, sizeof(ev));
55ed8ca1 7760
a492cd52 7761 ev.store_hint = persistent;
d753fdc4 7762 bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
591f47f3 7763 ev.key.addr.type = BDADDR_BREDR;
a492cd52 7764 ev.key.type = key->type;
9b3b4460 7765 memcpy(ev.key.val, key->val, HCI_LINK_KEY_SIZE);
a492cd52 7766 ev.key.pin_len = key->pin_len;
55ed8ca1 7767
dc4a5ee2 7768 mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL);
55ed8ca1 7769}
f7520543 7770
d7b25450
JH
7771static u8 mgmt_ltk_type(struct smp_ltk *ltk)
7772{
23fb8de3
JH
7773 switch (ltk->type) {
7774 case SMP_LTK:
7775 case SMP_LTK_SLAVE:
7776 if (ltk->authenticated)
7777 return MGMT_LTK_AUTHENTICATED;
7778 return MGMT_LTK_UNAUTHENTICATED;
7779 case SMP_LTK_P256:
7780 if (ltk->authenticated)
7781 return MGMT_LTK_P256_AUTH;
7782 return MGMT_LTK_P256_UNAUTH;
7783 case SMP_LTK_P256_DEBUG:
7784 return MGMT_LTK_P256_DEBUG;
7785 }
d7b25450
JH
7786
7787 return MGMT_LTK_UNAUTHENTICATED;
7788}
7789
53ac6ab6 7790void mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, bool persistent)
346af67b
VCG
7791{
7792 struct mgmt_ev_new_long_term_key ev;
7793
7794 memset(&ev, 0, sizeof(ev));
7795
5192d301 7796 /* Devices using resolvable or non-resolvable random addresses
f72186d2 7797 * without providing an identity resolving key don't require
5192d301
MH
7798 * to store long term keys. Their addresses will change the
7799 * next time around.
7800 *
7801 * Only when a remote device provides an identity address
7802 * make sure the long term key is stored. If the remote
7803 * identity is known, the long term keys are internally
7804 * mapped to the identity address. So allow static random
7805 * and public addresses here.
7806 */
ba74b666
JH
7807 if (key->bdaddr_type == ADDR_LE_DEV_RANDOM &&
7808 (key->bdaddr.b[5] & 0xc0) != 0xc0)
7809 ev.store_hint = 0x00;
7810 else
53ac6ab6 7811 ev.store_hint = persistent;
ba74b666 7812
346af67b 7813 bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
57c1477c 7814 ev.key.addr.type = link_to_bdaddr(LE_LINK, key->bdaddr_type);
d7b25450 7815 ev.key.type = mgmt_ltk_type(key);
346af67b
VCG
7816 ev.key.enc_size = key->enc_size;
7817 ev.key.ediv = key->ediv;
fe39c7b2 7818 ev.key.rand = key->rand;
346af67b 7819
2ceba539 7820 if (key->type == SMP_LTK)
346af67b
VCG
7821 ev.key.master = 1;
7822
1fc62c52
JH
7823 /* Make sure we copy only the significant bytes based on the
7824 * encryption key size, and set the rest of the value to zeroes.
7825 */
7826 memcpy(ev.key.val, key->val, sizeof(key->enc_size));
7827 memset(ev.key.val + key->enc_size, 0,
7828 sizeof(ev.key.val) - key->enc_size);
346af67b 7829
083368f7 7830 mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY, hdev, &ev, sizeof(ev), NULL);
346af67b
VCG
7831}
7832
95fbac8a
JH
7833void mgmt_new_irk(struct hci_dev *hdev, struct smp_irk *irk)
7834{
7835 struct mgmt_ev_new_irk ev;
7836
7837 memset(&ev, 0, sizeof(ev));
7838
bab6d1e5
MH
7839 /* For identity resolving keys from devices that are already
7840 * using a public address or static random address, do not
7841 * ask for storing this key. The identity resolving key really
f72186d2 7842 * is only mandatory for devices using resolvable random
bab6d1e5
MH
7843 * addresses.
7844 *
7845 * Storing all identity resolving keys has the downside that
7846 * they will be also loaded on next boot of they system. More
7847 * identity resolving keys, means more time during scanning is
7848 * needed to actually resolve these addresses.
7849 */
7850 if (bacmp(&irk->rpa, BDADDR_ANY))
7851 ev.store_hint = 0x01;
7852 else
7853 ev.store_hint = 0x00;
7854
95fbac8a
JH
7855 bacpy(&ev.rpa, &irk->rpa);
7856 bacpy(&ev.irk.addr.bdaddr, &irk->bdaddr);
7857 ev.irk.addr.type = link_to_bdaddr(LE_LINK, irk->addr_type);
7858 memcpy(ev.irk.val, irk->val, sizeof(irk->val));
7859
7860 mgmt_event(MGMT_EV_NEW_IRK, hdev, &ev, sizeof(ev), NULL);
7861}
7862
53ac6ab6
MH
7863void mgmt_new_csrk(struct hci_dev *hdev, struct smp_csrk *csrk,
7864 bool persistent)
7ee4ea36
MH
7865{
7866 struct mgmt_ev_new_csrk ev;
7867
7868 memset(&ev, 0, sizeof(ev));
7869
7870 /* Devices using resolvable or non-resolvable random addresses
f72186d2 7871 * without providing an identity resolving key don't require
7ee4ea36
MH
7872 * to store signature resolving keys. Their addresses will change
7873 * the next time around.
7874 *
7875 * Only when a remote device provides an identity address
7876 * make sure the signature resolving key is stored. So allow
7877 * static random and public addresses here.
7878 */
7879 if (csrk->bdaddr_type == ADDR_LE_DEV_RANDOM &&
7880 (csrk->bdaddr.b[5] & 0xc0) != 0xc0)
7881 ev.store_hint = 0x00;
7882 else
53ac6ab6 7883 ev.store_hint = persistent;
7ee4ea36
MH
7884
7885 bacpy(&ev.key.addr.bdaddr, &csrk->bdaddr);
7886 ev.key.addr.type = link_to_bdaddr(LE_LINK, csrk->bdaddr_type);
4cd3928a 7887 ev.key.type = csrk->type;
7ee4ea36
MH
7888 memcpy(ev.key.val, csrk->val, sizeof(csrk->val));
7889
7890 mgmt_event(MGMT_EV_NEW_CSRK, hdev, &ev, sizeof(ev), NULL);
7891}
7892
ffb5a827 7893void mgmt_new_conn_param(struct hci_dev *hdev, bdaddr_t *bdaddr,
f4869e2a
JH
7894 u8 bdaddr_type, u8 store_hint, u16 min_interval,
7895 u16 max_interval, u16 latency, u16 timeout)
ffb5a827
AG
7896{
7897 struct mgmt_ev_new_conn_param ev;
7898
c103aea6
JH
7899 if (!hci_is_identity_address(bdaddr, bdaddr_type))
7900 return;
7901
ffb5a827
AG
7902 memset(&ev, 0, sizeof(ev));
7903 bacpy(&ev.addr.bdaddr, bdaddr);
7904 ev.addr.type = link_to_bdaddr(LE_LINK, bdaddr_type);
f4869e2a 7905 ev.store_hint = store_hint;
ffb5a827
AG
7906 ev.min_interval = cpu_to_le16(min_interval);
7907 ev.max_interval = cpu_to_le16(max_interval);
7908 ev.latency = cpu_to_le16(latency);
7909 ev.timeout = cpu_to_le16(timeout);
7910
7911 mgmt_event(MGMT_EV_NEW_CONN_PARAM, hdev, &ev, sizeof(ev), NULL);
7912}
7913
48ec92fa
AA
7914void mgmt_device_connected(struct hci_dev *hdev, struct hci_conn *conn,
7915 u32 flags, u8 *name, u8 name_len)
f7520543 7916{
b644ba33
JH
7917 char buf[512];
7918 struct mgmt_ev_device_connected *ev = (void *) buf;
7919 u16 eir_len = 0;
f7520543 7920
48ec92fa
AA
7921 bacpy(&ev->addr.bdaddr, &conn->dst);
7922 ev->addr.type = link_to_bdaddr(conn->type, conn->dst_type);
f7520543 7923
c95f0ba7 7924 ev->flags = __cpu_to_le32(flags);
08c79b61 7925
fd45ada9
AA
7926 /* We must ensure that the EIR Data fields are ordered and
7927 * unique. Keep it simple for now and avoid the problem by not
7928 * adding any BR/EDR data to the LE adv.
7929 */
7930 if (conn->le_adv_data_len > 0) {
7931 memcpy(&ev->eir[eir_len],
7932 conn->le_adv_data, conn->le_adv_data_len);
7933 eir_len = conn->le_adv_data_len;
7934 } else {
7935 if (name_len > 0)
7936 eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE,
7937 name, name_len);
b644ba33 7938
ddbea5cf 7939 if (memcmp(conn->dev_class, "\0\0\0", 3) != 0)
fd45ada9
AA
7940 eir_len = eir_append_data(ev->eir, eir_len,
7941 EIR_CLASS_OF_DEV,
7942 conn->dev_class, 3);
7943 }
b644ba33 7944
eb55ef07 7945 ev->eir_len = cpu_to_le16(eir_len);
b644ba33 7946
ecd90ae7
MH
7947 mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf,
7948 sizeof(*ev) + eir_len, NULL);
f7520543
JH
7949}
7950
3b0602cd 7951static void disconnect_rsp(struct mgmt_pending_cmd *cmd, void *data)
8962ee74 7952{
8962ee74 7953 struct sock **sk = data;
8962ee74 7954
f5818c22 7955 cmd->cmd_complete(cmd, 0);
8962ee74
JH
7956
7957 *sk = cmd->sk;
7958 sock_hold(*sk);
7959
a664b5bc 7960 mgmt_pending_remove(cmd);
8962ee74
JH
7961}
7962
3b0602cd 7963static void unpair_device_rsp(struct mgmt_pending_cmd *cmd, void *data)
a8a1d19e 7964{
b1078ad0 7965 struct hci_dev *hdev = data;
124f6e35 7966 struct mgmt_cp_unpair_device *cp = cmd->param;
a8a1d19e 7967
b1078ad0
JH
7968 device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, cmd->sk);
7969
d8b7b1e4 7970 cmd->cmd_complete(cmd, 0);
a8a1d19e
JH
7971 mgmt_pending_remove(cmd);
7972}
7973
84c61d92
JH
7974bool mgmt_powering_down(struct hci_dev *hdev)
7975{
3b0602cd 7976 struct mgmt_pending_cmd *cmd;
84c61d92
JH
7977 struct mgmt_mode *cp;
7978
333ae95d 7979 cmd = pending_find(MGMT_OP_SET_POWERED, hdev);
84c61d92
JH
7980 if (!cmd)
7981 return false;
7982
7983 cp = cmd->param;
7984 if (!cp->val)
7985 return true;
7986
7987 return false;
7988}
7989
9b80ec5e 7990void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
12d4a3b2
JH
7991 u8 link_type, u8 addr_type, u8 reason,
7992 bool mgmt_connected)
f7520543 7993{
f0d6a0ea 7994 struct mgmt_ev_device_disconnected ev;
8962ee74 7995 struct sock *sk = NULL;
8962ee74 7996
84c61d92
JH
7997 /* The connection is still in hci_conn_hash so test for 1
7998 * instead of 0 to know if this is the last one.
7999 */
8000 if (mgmt_powering_down(hdev) && hci_conn_count(hdev) == 1) {
8001 cancel_delayed_work(&hdev->power_off);
8002 queue_work(hdev->req_workqueue, &hdev->power_off.work);
8b064a3a
JH
8003 }
8004
12d4a3b2
JH
8005 if (!mgmt_connected)
8006 return;
8007
57eb776f
AG
8008 if (link_type != ACL_LINK && link_type != LE_LINK)
8009 return;
8010
744cf19e 8011 mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk);
f7520543 8012
f0d6a0ea
MA
8013 bacpy(&ev.addr.bdaddr, bdaddr);
8014 ev.addr.type = link_to_bdaddr(link_type, addr_type);
8015 ev.reason = reason;
f7520543 8016
9b80ec5e 8017 mgmt_event(MGMT_EV_DEVICE_DISCONNECTED, hdev, &ev, sizeof(ev), sk);
8962ee74
JH
8018
8019 if (sk)
d97dcb66 8020 sock_put(sk);
8962ee74 8021
124f6e35 8022 mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
04124681 8023 hdev);
8962ee74
JH
8024}
8025
7892924c
MH
8026void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
8027 u8 link_type, u8 addr_type, u8 status)
8962ee74 8028{
3655bba8
AG
8029 u8 bdaddr_type = link_to_bdaddr(link_type, addr_type);
8030 struct mgmt_cp_disconnect *cp;
3b0602cd 8031 struct mgmt_pending_cmd *cmd;
8962ee74 8032
36a75f1b
JD
8033 mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
8034 hdev);
8035
333ae95d 8036 cmd = pending_find(MGMT_OP_DISCONNECT, hdev);
8962ee74 8037 if (!cmd)
7892924c 8038 return;
8962ee74 8039
3655bba8
AG
8040 cp = cmd->param;
8041
8042 if (bacmp(bdaddr, &cp->addr.bdaddr))
8043 return;
8044
8045 if (cp->addr.type != bdaddr_type)
8046 return;
8047
f5818c22 8048 cmd->cmd_complete(cmd, mgmt_status(status));
a664b5bc 8049 mgmt_pending_remove(cmd);
f7520543 8050}
17d5c04c 8051
445608d0
MH
8052void mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
8053 u8 addr_type, u8 status)
17d5c04c
JH
8054{
8055 struct mgmt_ev_connect_failed ev;
c9910d0f 8056
84c61d92
JH
8057 /* The connection is still in hci_conn_hash so test for 1
8058 * instead of 0 to know if this is the last one.
8059 */
8060 if (mgmt_powering_down(hdev) && hci_conn_count(hdev) == 1) {
8061 cancel_delayed_work(&hdev->power_off);
8062 queue_work(hdev->req_workqueue, &hdev->power_off.work);
c9910d0f 8063 }
17d5c04c 8064
4c659c39 8065 bacpy(&ev.addr.bdaddr, bdaddr);
57c1477c 8066 ev.addr.type = link_to_bdaddr(link_type, addr_type);
ca69b795 8067 ev.status = mgmt_status(status);
17d5c04c 8068
445608d0 8069 mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL);
17d5c04c 8070}
980e1a53 8071
ce0e4a0d 8072void mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
980e1a53
JH
8073{
8074 struct mgmt_ev_pin_code_request ev;
8075
d8457698 8076 bacpy(&ev.addr.bdaddr, bdaddr);
591f47f3 8077 ev.addr.type = BDADDR_BREDR;
a770bb5a 8078 ev.secure = secure;
980e1a53 8079
ce0e4a0d 8080 mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev), NULL);
980e1a53
JH
8081}
8082
e669cf80
MH
8083void mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
8084 u8 status)
980e1a53 8085{
3b0602cd 8086 struct mgmt_pending_cmd *cmd;
980e1a53 8087
333ae95d 8088 cmd = pending_find(MGMT_OP_PIN_CODE_REPLY, hdev);
980e1a53 8089 if (!cmd)
e669cf80 8090 return;
980e1a53 8091
7776d1d8 8092 cmd->cmd_complete(cmd, mgmt_status(status));
a664b5bc 8093 mgmt_pending_remove(cmd);
980e1a53
JH
8094}
8095
3eb38528
MH
8096void mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
8097 u8 status)
980e1a53 8098{
3b0602cd 8099 struct mgmt_pending_cmd *cmd;
980e1a53 8100
333ae95d 8101 cmd = pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev);
980e1a53 8102 if (!cmd)
3eb38528 8103 return;
980e1a53 8104
7776d1d8 8105 cmd->cmd_complete(cmd, mgmt_status(status));
a664b5bc 8106 mgmt_pending_remove(cmd);
980e1a53 8107}
a5c29683 8108
744cf19e 8109int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
39adbffe 8110 u8 link_type, u8 addr_type, u32 value,
04124681 8111 u8 confirm_hint)
a5c29683
JH
8112{
8113 struct mgmt_ev_user_confirm_request ev;
8114
744cf19e 8115 BT_DBG("%s", hdev->name);
a5c29683 8116
272d90df 8117 bacpy(&ev.addr.bdaddr, bdaddr);
57c1477c 8118 ev.addr.type = link_to_bdaddr(link_type, addr_type);
55bc1a37 8119 ev.confirm_hint = confirm_hint;
39adbffe 8120 ev.value = cpu_to_le32(value);
a5c29683 8121
744cf19e 8122 return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev),
04124681 8123 NULL);
a5c29683
JH
8124}
8125
272d90df 8126int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
8ce8e2b5 8127 u8 link_type, u8 addr_type)
604086b7
BG
8128{
8129 struct mgmt_ev_user_passkey_request ev;
8130
8131 BT_DBG("%s", hdev->name);
8132
272d90df 8133 bacpy(&ev.addr.bdaddr, bdaddr);
57c1477c 8134 ev.addr.type = link_to_bdaddr(link_type, addr_type);
604086b7
BG
8135
8136 return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev),
04124681 8137 NULL);
604086b7
BG
8138}
8139
0df4c185 8140static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
8ce8e2b5
GP
8141 u8 link_type, u8 addr_type, u8 status,
8142 u8 opcode)
a5c29683 8143{
3b0602cd 8144 struct mgmt_pending_cmd *cmd;
a5c29683 8145
333ae95d 8146 cmd = pending_find(opcode, hdev);
a5c29683
JH
8147 if (!cmd)
8148 return -ENOENT;
8149
7776d1d8 8150 cmd->cmd_complete(cmd, mgmt_status(status));
a664b5bc 8151 mgmt_pending_remove(cmd);
a5c29683 8152
7776d1d8 8153 return 0;
a5c29683
JH
8154}
8155
744cf19e 8156int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 8157 u8 link_type, u8 addr_type, u8 status)
a5c29683 8158{
272d90df 8159 return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
04124681 8160 status, MGMT_OP_USER_CONFIRM_REPLY);
a5c29683
JH
8161}
8162
272d90df 8163int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 8164 u8 link_type, u8 addr_type, u8 status)
a5c29683 8165{
272d90df 8166 return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
8fc9ced3
GP
8167 status,
8168 MGMT_OP_USER_CONFIRM_NEG_REPLY);
a5c29683 8169}
2a611692 8170
604086b7 8171int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 8172 u8 link_type, u8 addr_type, u8 status)
604086b7 8173{
272d90df 8174 return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
04124681 8175 status, MGMT_OP_USER_PASSKEY_REPLY);
604086b7
BG
8176}
8177
272d90df 8178int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 8179 u8 link_type, u8 addr_type, u8 status)
604086b7 8180{
272d90df 8181 return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
8fc9ced3
GP
8182 status,
8183 MGMT_OP_USER_PASSKEY_NEG_REPLY);
604086b7
BG
8184}
8185
92a25256
JH
8186int mgmt_user_passkey_notify(struct hci_dev *hdev, bdaddr_t *bdaddr,
8187 u8 link_type, u8 addr_type, u32 passkey,
8188 u8 entered)
8189{
8190 struct mgmt_ev_passkey_notify ev;
8191
8192 BT_DBG("%s", hdev->name);
8193
8194 bacpy(&ev.addr.bdaddr, bdaddr);
8195 ev.addr.type = link_to_bdaddr(link_type, addr_type);
8196 ev.passkey = __cpu_to_le32(passkey);
8197 ev.entered = entered;
8198
8199 return mgmt_event(MGMT_EV_PASSKEY_NOTIFY, hdev, &ev, sizeof(ev), NULL);
8200}
8201
e1e930f5 8202void mgmt_auth_failed(struct hci_conn *conn, u8 hci_status)
2a611692
JH
8203{
8204 struct mgmt_ev_auth_failed ev;
3b0602cd 8205 struct mgmt_pending_cmd *cmd;
e1e930f5 8206 u8 status = mgmt_status(hci_status);
2a611692 8207
e1e930f5
JH
8208 bacpy(&ev.addr.bdaddr, &conn->dst);
8209 ev.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
8210 ev.status = status;
2a611692 8211
e1e930f5
JH
8212 cmd = find_pairing(conn);
8213
8214 mgmt_event(MGMT_EV_AUTH_FAILED, conn->hdev, &ev, sizeof(ev),
8215 cmd ? cmd->sk : NULL);
8216
a511b35b
JH
8217 if (cmd) {
8218 cmd->cmd_complete(cmd, status);
8219 mgmt_pending_remove(cmd);
8220 }
2a611692 8221}
b312b161 8222
464996ae 8223void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
33ef95ed
JH
8224{
8225 struct cmd_lookup match = { NULL, hdev };
464996ae 8226 bool changed;
33ef95ed
JH
8227
8228 if (status) {
8229 u8 mgmt_err = mgmt_status(status);
8230 mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev,
04124681 8231 cmd_status_rsp, &mgmt_err);
464996ae 8232 return;
33ef95ed
JH
8233 }
8234
464996ae 8235 if (test_bit(HCI_AUTH, &hdev->flags))
238be788 8236 changed = !hci_dev_test_and_set_flag(hdev, HCI_LINK_SECURITY);
464996ae 8237 else
a69d8927 8238 changed = hci_dev_test_and_clear_flag(hdev, HCI_LINK_SECURITY);
47990ea0 8239
33ef95ed 8240 mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp,
04124681 8241 &match);
33ef95ed 8242
47990ea0 8243 if (changed)
464996ae 8244 new_settings(hdev, match.sk);
33ef95ed
JH
8245
8246 if (match.sk)
8247 sock_put(match.sk);
33ef95ed
JH
8248}
8249
890ea898 8250static void clear_eir(struct hci_request *req)
cacaf52f 8251{
890ea898 8252 struct hci_dev *hdev = req->hdev;
cacaf52f
JH
8253 struct hci_cp_write_eir cp;
8254
976eb20e 8255 if (!lmp_ext_inq_capable(hdev))
890ea898 8256 return;
cacaf52f 8257
c80da27e
JH
8258 memset(hdev->eir, 0, sizeof(hdev->eir));
8259
cacaf52f
JH
8260 memset(&cp, 0, sizeof(cp));
8261
890ea898 8262 hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
cacaf52f
JH
8263}
8264
3e248560 8265void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
ed2c4ee3
JH
8266{
8267 struct cmd_lookup match = { NULL, hdev };
890ea898 8268 struct hci_request req;
c0ecddc2 8269 bool changed = false;
ed2c4ee3
JH
8270
8271 if (status) {
8272 u8 mgmt_err = mgmt_status(status);
c0ecddc2 8273
a69d8927
MH
8274 if (enable && hci_dev_test_and_clear_flag(hdev,
8275 HCI_SSP_ENABLED)) {
a358dc11 8276 hci_dev_clear_flag(hdev, HCI_HS_ENABLED);
3e248560 8277 new_settings(hdev, NULL);
9ecb3e24 8278 }
c0ecddc2 8279
04124681
GP
8280 mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp,
8281 &mgmt_err);
3e248560 8282 return;
c0ecddc2
JH
8283 }
8284
8285 if (enable) {
238be788 8286 changed = !hci_dev_test_and_set_flag(hdev, HCI_SSP_ENABLED);
c0ecddc2 8287 } else {
a69d8927 8288 changed = hci_dev_test_and_clear_flag(hdev, HCI_SSP_ENABLED);
9ecb3e24 8289 if (!changed)
a69d8927
MH
8290 changed = hci_dev_test_and_clear_flag(hdev,
8291 HCI_HS_ENABLED);
9ecb3e24 8292 else
a358dc11 8293 hci_dev_clear_flag(hdev, HCI_HS_ENABLED);
ed2c4ee3
JH
8294 }
8295
8296 mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, settings_rsp, &match);
8297
c0ecddc2 8298 if (changed)
3e248560 8299 new_settings(hdev, match.sk);
ed2c4ee3 8300
5fc6ebb1 8301 if (match.sk)
ed2c4ee3
JH
8302 sock_put(match.sk);
8303
890ea898
JH
8304 hci_req_init(&req, hdev);
8305
d7a5a11d
MH
8306 if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
8307 if (hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS))
3769972b
JH
8308 hci_req_add(&req, HCI_OP_WRITE_SSP_DEBUG_MODE,
8309 sizeof(enable), &enable);
890ea898 8310 update_eir(&req);
3769972b 8311 } else {
890ea898 8312 clear_eir(&req);
3769972b 8313 }
890ea898
JH
8314
8315 hci_req_run(&req, NULL);
ed2c4ee3
JH
8316}
8317
3b0602cd 8318static void sk_lookup(struct mgmt_pending_cmd *cmd, void *data)
90e70454
JH
8319{
8320 struct cmd_lookup *match = data;
8321
90e70454
JH
8322 if (match->sk == NULL) {
8323 match->sk = cmd->sk;
8324 sock_hold(match->sk);
8325 }
90e70454
JH
8326}
8327
4e1b0245
MH
8328void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
8329 u8 status)
7f9a903c 8330{
90e70454 8331 struct cmd_lookup match = { NULL, hdev, mgmt_status(status) };
7f9a903c 8332
92da6097
JH
8333 mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, sk_lookup, &match);
8334 mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, sk_lookup, &match);
8335 mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, sk_lookup, &match);
90e70454
JH
8336
8337 if (!status)
f6b7712e
MH
8338 mgmt_generic_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev,
8339 dev_class, 3, NULL);
90e70454
JH
8340
8341 if (match.sk)
8342 sock_put(match.sk);
7f9a903c
MH
8343}
8344
7667da34 8345void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
b312b161 8346{
b312b161 8347 struct mgmt_cp_set_local_name ev;
3b0602cd 8348 struct mgmt_pending_cmd *cmd;
28cc7bde 8349
13928971 8350 if (status)
7667da34 8351 return;
b312b161
JH
8352
8353 memset(&ev, 0, sizeof(ev));
8354 memcpy(ev.name, name, HCI_MAX_NAME_LENGTH);
28cc7bde 8355 memcpy(ev.short_name, hdev->short_name, HCI_MAX_SHORT_NAME_LENGTH);
b312b161 8356
333ae95d 8357 cmd = pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
13928971
JH
8358 if (!cmd) {
8359 memcpy(hdev->dev_name, name, sizeof(hdev->dev_name));
28cc7bde 8360
13928971
JH
8361 /* If this is a HCI command related to powering on the
8362 * HCI dev don't send any mgmt signals.
8363 */
333ae95d 8364 if (pending_find(MGMT_OP_SET_POWERED, hdev))
7667da34 8365 return;
890ea898 8366 }
b312b161 8367
f6b7712e
MH
8368 mgmt_generic_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev, sizeof(ev),
8369 cmd ? cmd->sk : NULL);
b312b161 8370}
c35938b2 8371
799ce93d
JP
8372static inline bool has_uuid(u8 *uuid, u16 uuid_count, u8 (*uuids)[16])
8373{
8374 int i;
8375
8376 for (i = 0; i < uuid_count; i++) {
8377 if (!memcmp(uuid, uuids[i], 16))
8378 return true;
8379 }
8380
8381 return false;
8382}
8383
b487b9ce
MH
8384static bool eir_has_uuids(u8 *eir, u16 eir_len, u16 uuid_count, u8 (*uuids)[16])
8385{
799ce93d
JP
8386 u16 parsed = 0;
8387
8388 while (parsed < eir_len) {
8389 u8 field_len = eir[0];
8390 u8 uuid[16];
8391 int i;
8392
8393 if (field_len == 0)
8394 break;
8395
8396 if (eir_len - parsed < field_len + 1)
8397 break;
8398
8399 switch (eir[1]) {
8400 case EIR_UUID16_ALL:
8401 case EIR_UUID16_SOME:
8402 for (i = 0; i + 3 <= field_len; i += 2) {
189f6ad2 8403 memcpy(uuid, bluetooth_base_uuid, 16);
799ce93d
JP
8404 uuid[13] = eir[i + 3];
8405 uuid[12] = eir[i + 2];
8406 if (has_uuid(uuid, uuid_count, uuids))
8407 return true;
8408 }
8409 break;
8410 case EIR_UUID32_ALL:
8411 case EIR_UUID32_SOME:
8412 for (i = 0; i + 5 <= field_len; i += 4) {
189f6ad2 8413 memcpy(uuid, bluetooth_base_uuid, 16);
799ce93d
JP
8414 uuid[15] = eir[i + 5];
8415 uuid[14] = eir[i + 4];
8416 uuid[13] = eir[i + 3];
8417 uuid[12] = eir[i + 2];
8418 if (has_uuid(uuid, uuid_count, uuids))
8419 return true;
8420 }
8421 break;
8422 case EIR_UUID128_ALL:
8423 case EIR_UUID128_SOME:
8424 for (i = 0; i + 17 <= field_len; i += 16) {
8425 memcpy(uuid, eir + i + 2, 16);
8426 if (has_uuid(uuid, uuid_count, uuids))
8427 return true;
8428 }
8429 break;
8430 }
8431
8432 parsed += field_len + 1;
8433 eir += field_len + 1;
8434 }
8435
b487b9ce
MH
8436 return false;
8437}
8438
4b0e0ced
JP
8439static void restart_le_scan(struct hci_dev *hdev)
8440{
8441 /* If controller is not scanning we are done. */
d7a5a11d 8442 if (!hci_dev_test_flag(hdev, HCI_LE_SCAN))
4b0e0ced
JP
8443 return;
8444
8445 if (time_after(jiffies + DISCOV_LE_RESTART_DELAY,
8446 hdev->discovery.scan_start +
8447 hdev->discovery.scan_duration))
8448 return;
8449
8450 queue_delayed_work(hdev->workqueue, &hdev->le_scan_restart,
8451 DISCOV_LE_RESTART_DELAY);
8452}
8453
48f86b7f
JP
8454static bool is_filter_match(struct hci_dev *hdev, s8 rssi, u8 *eir,
8455 u16 eir_len, u8 *scan_rsp, u8 scan_rsp_len)
e17acd40 8456{
48f86b7f
JP
8457 /* If a RSSI threshold has been specified, and
8458 * HCI_QUIRK_STRICT_DUPLICATE_FILTER is not set, then all results with
8459 * a RSSI smaller than the RSSI threshold will be dropped. If the quirk
8460 * is set, let it through for further processing, as we might need to
8461 * restart the scan.
efb2513f
MH
8462 *
8463 * For BR/EDR devices (pre 1.2) providing no RSSI during inquiry,
8464 * the results are also dropped.
bda157a4
MH
8465 */
8466 if (hdev->discovery.rssi != HCI_RSSI_INVALID &&
4b0e0ced
JP
8467 (rssi == HCI_RSSI_INVALID ||
8468 (rssi < hdev->discovery.rssi &&
8469 !test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks))))
48f86b7f 8470 return false;
efb2513f 8471
2976cdeb
JP
8472 if (hdev->discovery.uuid_count != 0) {
8473 /* If a list of UUIDs is provided in filter, results with no
8474 * matching UUID should be dropped.
b487b9ce 8475 */
2976cdeb
JP
8476 if (!eir_has_uuids(eir, eir_len, hdev->discovery.uuid_count,
8477 hdev->discovery.uuids) &&
8478 !eir_has_uuids(scan_rsp, scan_rsp_len,
8479 hdev->discovery.uuid_count,
8480 hdev->discovery.uuids))
8481 return false;
b487b9ce 8482 }
5d2e9fad 8483
2976cdeb
JP
8484 /* If duplicate filtering does not report RSSI changes, then restart
8485 * scanning to ensure updated result with updated RSSI values.
4b0e0ced 8486 */
2976cdeb
JP
8487 if (test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks)) {
8488 restart_le_scan(hdev);
8489
8490 /* Validate RSSI value against the RSSI threshold once more. */
8491 if (hdev->discovery.rssi != HCI_RSSI_INVALID &&
8492 rssi < hdev->discovery.rssi)
8493 return false;
8494 }
48f86b7f
JP
8495
8496 return true;
8497}
8498
8499void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
8500 u8 addr_type, u8 *dev_class, s8 rssi, u32 flags,
8501 u8 *eir, u16 eir_len, u8 *scan_rsp, u8 scan_rsp_len)
8502{
8503 char buf[512];
8504 struct mgmt_ev_device_found *ev = (void *)buf;
8505 size_t ev_size;
8506
8507 /* Don't send events for a non-kernel initiated discovery. With
8508 * LE one exception is if we have pend_le_reports > 0 in which
8509 * case we're doing passive scanning and want these events.
8510 */
8511 if (!hci_discovery_active(hdev)) {
8512 if (link_type == ACL_LINK)
8513 return;
8514 if (link_type == LE_LINK && list_empty(&hdev->pend_le_reports))
8515 return;
8516 }
8517
82f8b651 8518 if (hdev->discovery.result_filtering) {
48f86b7f
JP
8519 /* We are using service discovery */
8520 if (!is_filter_match(hdev, rssi, eir, eir_len, scan_rsp,
8521 scan_rsp_len))
8522 return;
8523 }
8524
8525 /* Make sure that the buffer is big enough. The 5 extra bytes
8526 * are for the potential CoD field.
8527 */
8528 if (sizeof(*ev) + eir_len + scan_rsp_len + 5 > sizeof(buf))
4b0e0ced
JP
8529 return;
8530
48f86b7f
JP
8531 memset(buf, 0, sizeof(buf));
8532
8533 /* In case of device discovery with BR/EDR devices (pre 1.2), the
8534 * RSSI value was reported as 0 when not available. This behavior
8535 * is kept when using device discovery. This is required for full
8536 * backwards compatibility with the API.
8537 *
8538 * However when using service discovery, the value 127 will be
8539 * returned when the RSSI is not available.
8540 */
8541 if (rssi == HCI_RSSI_INVALID && !hdev->discovery.report_invalid_rssi &&
8542 link_type == ACL_LINK)
8543 rssi = 0;
8544
8545 bacpy(&ev->addr.bdaddr, bdaddr);
8546 ev->addr.type = link_to_bdaddr(link_type, addr_type);
8547 ev->rssi = rssi;
8548 ev->flags = cpu_to_le32(flags);
8549
8550 if (eir_len > 0)
8551 /* Copy EIR or advertising data into event */
8552 memcpy(ev->eir, eir, eir_len);
8553
8554 if (dev_class && !eir_has_data_type(ev->eir, eir_len, EIR_CLASS_OF_DEV))
8555 eir_len = eir_append_data(ev->eir, eir_len, EIR_CLASS_OF_DEV,
8556 dev_class, 3);
8557
8558 if (scan_rsp_len > 0)
8559 /* Append scan response data to event */
8560 memcpy(ev->eir + eir_len, scan_rsp, scan_rsp_len);
8561
5d2e9fad
JH
8562 ev->eir_len = cpu_to_le16(eir_len + scan_rsp_len);
8563 ev_size = sizeof(*ev) + eir_len + scan_rsp_len;
f8523598 8564
901801b9 8565 mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL);
e17acd40 8566}
a88a9652 8567
9cf12aee
MH
8568void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
8569 u8 addr_type, s8 rssi, u8 *name, u8 name_len)
a88a9652 8570{
b644ba33
JH
8571 struct mgmt_ev_device_found *ev;
8572 char buf[sizeof(*ev) + HCI_MAX_NAME_LENGTH + 2];
8573 u16 eir_len;
a88a9652 8574
b644ba33 8575 ev = (struct mgmt_ev_device_found *) buf;
a88a9652 8576
b644ba33
JH
8577 memset(buf, 0, sizeof(buf));
8578
8579 bacpy(&ev->addr.bdaddr, bdaddr);
57c1477c 8580 ev->addr.type = link_to_bdaddr(link_type, addr_type);
b644ba33
JH
8581 ev->rssi = rssi;
8582
8583 eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name,
04124681 8584 name_len);
b644ba33 8585
eb55ef07 8586 ev->eir_len = cpu_to_le16(eir_len);
a88a9652 8587
9cf12aee 8588 mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, sizeof(*ev) + eir_len, NULL);
a88a9652 8589}
314b2381 8590
2f1e063b 8591void mgmt_discovering(struct hci_dev *hdev, u8 discovering)
314b2381 8592{
f963e8e9 8593 struct mgmt_ev_discovering ev;
164a6e78 8594
343fb145
AG
8595 BT_DBG("%s discovering %u", hdev->name, discovering);
8596
f963e8e9
JH
8597 memset(&ev, 0, sizeof(ev));
8598 ev.type = hdev->discovery.type;
8599 ev.discovering = discovering;
8600
2f1e063b 8601 mgmt_event(MGMT_EV_DISCOVERING, hdev, &ev, sizeof(ev), NULL);
314b2381 8602}
5e762444 8603
1904a853 8604static void adv_enable_complete(struct hci_dev *hdev, u8 status, u16 opcode)
5976e608
MH
8605{
8606 BT_DBG("%s status %u", hdev->name, status);
5976e608
MH
8607}
8608
8609void mgmt_reenable_advertising(struct hci_dev *hdev)
8610{
8611 struct hci_request req;
8612
24b4f38f
AU
8613 if (!hci_dev_test_flag(hdev, HCI_ADVERTISING) &&
8614 !hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE))
5976e608
MH
8615 return;
8616
8617 hci_req_init(&req, hdev);
8618 enable_advertising(&req);
0ec5ae84 8619 hci_req_run(&req, adv_enable_complete);
5976e608 8620}
6d785aa3
JH
8621
8622static struct hci_mgmt_chan chan = {
8623 .channel = HCI_CHANNEL_CONTROL,
8624 .handler_count = ARRAY_SIZE(mgmt_handlers),
8625 .handlers = mgmt_handlers,
88b94ce9 8626 .hdev_init = mgmt_init_hdev,
6d785aa3
JH
8627};
8628
8629int mgmt_init(void)
8630{
8631 return hci_mgmt_chan_register(&chan);
8632}
8633
8634void mgmt_exit(void)
8635{
8636 hci_mgmt_chan_unregister(&chan);
8637}
This page took 2.255009 seconds and 5 git commands to generate.