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