]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blob - net/bluetooth/mgmt.c
Merge branch 'x86-platform-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[mirror_ubuntu-zesty-kernel.git] / net / bluetooth / mgmt.c
1 /*
2 BlueZ - Bluetooth protocol stack for Linux
3
4 Copyright (C) 2010 Nokia Corporation
5 Copyright (C) 2011-2012 Intel Corporation
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
27 #include <linux/kernel.h>
28 #include <linux/uaccess.h>
29 #include <linux/module.h>
30 #include <asm/unaligned.h>
31
32 #include <net/bluetooth/bluetooth.h>
33 #include <net/bluetooth/hci_core.h>
34 #include <net/bluetooth/mgmt.h>
35 #include <net/bluetooth/smp.h>
36
37 bool enable_hs;
38 bool enable_le;
39
40 #define MGMT_VERSION 1
41 #define MGMT_REVISION 0
42
43 static const u16 mgmt_commands[] = {
44 MGMT_OP_READ_INDEX_LIST,
45 MGMT_OP_READ_INFO,
46 MGMT_OP_SET_POWERED,
47 MGMT_OP_SET_DISCOVERABLE,
48 MGMT_OP_SET_CONNECTABLE,
49 MGMT_OP_SET_FAST_CONNECTABLE,
50 MGMT_OP_SET_PAIRABLE,
51 MGMT_OP_SET_LINK_SECURITY,
52 MGMT_OP_SET_SSP,
53 MGMT_OP_SET_HS,
54 MGMT_OP_SET_LE,
55 MGMT_OP_SET_DEV_CLASS,
56 MGMT_OP_SET_LOCAL_NAME,
57 MGMT_OP_ADD_UUID,
58 MGMT_OP_REMOVE_UUID,
59 MGMT_OP_LOAD_LINK_KEYS,
60 MGMT_OP_LOAD_LONG_TERM_KEYS,
61 MGMT_OP_DISCONNECT,
62 MGMT_OP_GET_CONNECTIONS,
63 MGMT_OP_PIN_CODE_REPLY,
64 MGMT_OP_PIN_CODE_NEG_REPLY,
65 MGMT_OP_SET_IO_CAPABILITY,
66 MGMT_OP_PAIR_DEVICE,
67 MGMT_OP_CANCEL_PAIR_DEVICE,
68 MGMT_OP_UNPAIR_DEVICE,
69 MGMT_OP_USER_CONFIRM_REPLY,
70 MGMT_OP_USER_CONFIRM_NEG_REPLY,
71 MGMT_OP_USER_PASSKEY_REPLY,
72 MGMT_OP_USER_PASSKEY_NEG_REPLY,
73 MGMT_OP_READ_LOCAL_OOB_DATA,
74 MGMT_OP_ADD_REMOTE_OOB_DATA,
75 MGMT_OP_REMOVE_REMOTE_OOB_DATA,
76 MGMT_OP_START_DISCOVERY,
77 MGMT_OP_STOP_DISCOVERY,
78 MGMT_OP_CONFIRM_NAME,
79 MGMT_OP_BLOCK_DEVICE,
80 MGMT_OP_UNBLOCK_DEVICE,
81 };
82
83 static const u16 mgmt_events[] = {
84 MGMT_EV_CONTROLLER_ERROR,
85 MGMT_EV_INDEX_ADDED,
86 MGMT_EV_INDEX_REMOVED,
87 MGMT_EV_NEW_SETTINGS,
88 MGMT_EV_CLASS_OF_DEV_CHANGED,
89 MGMT_EV_LOCAL_NAME_CHANGED,
90 MGMT_EV_NEW_LINK_KEY,
91 MGMT_EV_NEW_LONG_TERM_KEY,
92 MGMT_EV_DEVICE_CONNECTED,
93 MGMT_EV_DEVICE_DISCONNECTED,
94 MGMT_EV_CONNECT_FAILED,
95 MGMT_EV_PIN_CODE_REQUEST,
96 MGMT_EV_USER_CONFIRM_REQUEST,
97 MGMT_EV_USER_PASSKEY_REQUEST,
98 MGMT_EV_AUTH_FAILED,
99 MGMT_EV_DEVICE_FOUND,
100 MGMT_EV_DISCOVERING,
101 MGMT_EV_DEVICE_BLOCKED,
102 MGMT_EV_DEVICE_UNBLOCKED,
103 MGMT_EV_DEVICE_UNPAIRED,
104 };
105
106 /*
107 * These LE scan and inquiry parameters were chosen according to LE General
108 * Discovery Procedure specification.
109 */
110 #define LE_SCAN_TYPE 0x01
111 #define LE_SCAN_WIN 0x12
112 #define LE_SCAN_INT 0x12
113 #define LE_SCAN_TIMEOUT_LE_ONLY 10240 /* TGAP(gen_disc_scan_min) */
114 #define LE_SCAN_TIMEOUT_BREDR_LE 5120 /* TGAP(100)/2 */
115
116 #define INQUIRY_LEN_BREDR 0x08 /* TGAP(100) */
117 #define INQUIRY_LEN_BREDR_LE 0x04 /* TGAP(100)/2 */
118
119 #define CACHE_TIMEOUT msecs_to_jiffies(2 * 1000)
120
121 #define hdev_is_powered(hdev) (test_bit(HCI_UP, &hdev->flags) && \
122 !test_bit(HCI_AUTO_OFF, &hdev->dev_flags))
123
124 struct pending_cmd {
125 struct list_head list;
126 u16 opcode;
127 int index;
128 void *param;
129 struct sock *sk;
130 void *user_data;
131 };
132
133 /* HCI to MGMT error code conversion table */
134 static u8 mgmt_status_table[] = {
135 MGMT_STATUS_SUCCESS,
136 MGMT_STATUS_UNKNOWN_COMMAND, /* Unknown Command */
137 MGMT_STATUS_NOT_CONNECTED, /* No Connection */
138 MGMT_STATUS_FAILED, /* Hardware Failure */
139 MGMT_STATUS_CONNECT_FAILED, /* Page Timeout */
140 MGMT_STATUS_AUTH_FAILED, /* Authentication Failed */
141 MGMT_STATUS_NOT_PAIRED, /* PIN or Key Missing */
142 MGMT_STATUS_NO_RESOURCES, /* Memory Full */
143 MGMT_STATUS_TIMEOUT, /* Connection Timeout */
144 MGMT_STATUS_NO_RESOURCES, /* Max Number of Connections */
145 MGMT_STATUS_NO_RESOURCES, /* Max Number of SCO Connections */
146 MGMT_STATUS_ALREADY_CONNECTED, /* ACL Connection Exists */
147 MGMT_STATUS_BUSY, /* Command Disallowed */
148 MGMT_STATUS_NO_RESOURCES, /* Rejected Limited Resources */
149 MGMT_STATUS_REJECTED, /* Rejected Security */
150 MGMT_STATUS_REJECTED, /* Rejected Personal */
151 MGMT_STATUS_TIMEOUT, /* Host Timeout */
152 MGMT_STATUS_NOT_SUPPORTED, /* Unsupported Feature */
153 MGMT_STATUS_INVALID_PARAMS, /* Invalid Parameters */
154 MGMT_STATUS_DISCONNECTED, /* OE User Ended Connection */
155 MGMT_STATUS_NO_RESOURCES, /* OE Low Resources */
156 MGMT_STATUS_DISCONNECTED, /* OE Power Off */
157 MGMT_STATUS_DISCONNECTED, /* Connection Terminated */
158 MGMT_STATUS_BUSY, /* Repeated Attempts */
159 MGMT_STATUS_REJECTED, /* Pairing Not Allowed */
160 MGMT_STATUS_FAILED, /* Unknown LMP PDU */
161 MGMT_STATUS_NOT_SUPPORTED, /* Unsupported Remote Feature */
162 MGMT_STATUS_REJECTED, /* SCO Offset Rejected */
163 MGMT_STATUS_REJECTED, /* SCO Interval Rejected */
164 MGMT_STATUS_REJECTED, /* Air Mode Rejected */
165 MGMT_STATUS_INVALID_PARAMS, /* Invalid LMP Parameters */
166 MGMT_STATUS_FAILED, /* Unspecified Error */
167 MGMT_STATUS_NOT_SUPPORTED, /* Unsupported LMP Parameter Value */
168 MGMT_STATUS_FAILED, /* Role Change Not Allowed */
169 MGMT_STATUS_TIMEOUT, /* LMP Response Timeout */
170 MGMT_STATUS_FAILED, /* LMP Error Transaction Collision */
171 MGMT_STATUS_FAILED, /* LMP PDU Not Allowed */
172 MGMT_STATUS_REJECTED, /* Encryption Mode Not Accepted */
173 MGMT_STATUS_FAILED, /* Unit Link Key Used */
174 MGMT_STATUS_NOT_SUPPORTED, /* QoS Not Supported */
175 MGMT_STATUS_TIMEOUT, /* Instant Passed */
176 MGMT_STATUS_NOT_SUPPORTED, /* Pairing Not Supported */
177 MGMT_STATUS_FAILED, /* Transaction Collision */
178 MGMT_STATUS_INVALID_PARAMS, /* Unacceptable Parameter */
179 MGMT_STATUS_REJECTED, /* QoS Rejected */
180 MGMT_STATUS_NOT_SUPPORTED, /* Classification Not Supported */
181 MGMT_STATUS_REJECTED, /* Insufficient Security */
182 MGMT_STATUS_INVALID_PARAMS, /* Parameter Out Of Range */
183 MGMT_STATUS_BUSY, /* Role Switch Pending */
184 MGMT_STATUS_FAILED, /* Slot Violation */
185 MGMT_STATUS_FAILED, /* Role Switch Failed */
186 MGMT_STATUS_INVALID_PARAMS, /* EIR Too Large */
187 MGMT_STATUS_NOT_SUPPORTED, /* Simple Pairing Not Supported */
188 MGMT_STATUS_BUSY, /* Host Busy Pairing */
189 MGMT_STATUS_REJECTED, /* Rejected, No Suitable Channel */
190 MGMT_STATUS_BUSY, /* Controller Busy */
191 MGMT_STATUS_INVALID_PARAMS, /* Unsuitable Connection Interval */
192 MGMT_STATUS_TIMEOUT, /* Directed Advertising Timeout */
193 MGMT_STATUS_AUTH_FAILED, /* Terminated Due to MIC Failure */
194 MGMT_STATUS_CONNECT_FAILED, /* Connection Establishment Failed */
195 MGMT_STATUS_CONNECT_FAILED, /* MAC Connection Failed */
196 };
197
198 static u8 mgmt_status(u8 hci_status)
199 {
200 if (hci_status < ARRAY_SIZE(mgmt_status_table))
201 return mgmt_status_table[hci_status];
202
203 return MGMT_STATUS_FAILED;
204 }
205
206 static int cmd_status(struct sock *sk, u16 index, u16 cmd, u8 status)
207 {
208 struct sk_buff *skb;
209 struct mgmt_hdr *hdr;
210 struct mgmt_ev_cmd_status *ev;
211 int err;
212
213 BT_DBG("sock %p, index %u, cmd %u, status %u", sk, index, cmd, status);
214
215 skb = alloc_skb(sizeof(*hdr) + sizeof(*ev), GFP_ATOMIC);
216 if (!skb)
217 return -ENOMEM;
218
219 hdr = (void *) skb_put(skb, sizeof(*hdr));
220
221 hdr->opcode = cpu_to_le16(MGMT_EV_CMD_STATUS);
222 hdr->index = cpu_to_le16(index);
223 hdr->len = cpu_to_le16(sizeof(*ev));
224
225 ev = (void *) skb_put(skb, sizeof(*ev));
226 ev->status = status;
227 put_unaligned_le16(cmd, &ev->opcode);
228
229 err = sock_queue_rcv_skb(sk, skb);
230 if (err < 0)
231 kfree_skb(skb);
232
233 return err;
234 }
235
236 static int cmd_complete(struct sock *sk, u16 index, u16 cmd, u8 status,
237 void *rp, size_t rp_len)
238 {
239 struct sk_buff *skb;
240 struct mgmt_hdr *hdr;
241 struct mgmt_ev_cmd_complete *ev;
242 int err;
243
244 BT_DBG("sock %p", sk);
245
246 skb = alloc_skb(sizeof(*hdr) + sizeof(*ev) + rp_len, GFP_ATOMIC);
247 if (!skb)
248 return -ENOMEM;
249
250 hdr = (void *) skb_put(skb, sizeof(*hdr));
251
252 hdr->opcode = cpu_to_le16(MGMT_EV_CMD_COMPLETE);
253 hdr->index = cpu_to_le16(index);
254 hdr->len = cpu_to_le16(sizeof(*ev) + rp_len);
255
256 ev = (void *) skb_put(skb, sizeof(*ev) + rp_len);
257 put_unaligned_le16(cmd, &ev->opcode);
258 ev->status = status;
259
260 if (rp)
261 memcpy(ev->data, rp, rp_len);
262
263 err = sock_queue_rcv_skb(sk, skb);
264 if (err < 0)
265 kfree_skb(skb);
266
267 return err;
268 }
269
270 static int read_version(struct sock *sk, struct hci_dev *hdev, void *data,
271 u16 data_len)
272 {
273 struct mgmt_rp_read_version rp;
274
275 BT_DBG("sock %p", sk);
276
277 rp.version = MGMT_VERSION;
278 put_unaligned_le16(MGMT_REVISION, &rp.revision);
279
280 return cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_VERSION, 0, &rp,
281 sizeof(rp));
282 }
283
284 static int read_commands(struct sock *sk, struct hci_dev *hdev, void *data,
285 u16 data_len)
286 {
287 struct mgmt_rp_read_commands *rp;
288 u16 num_commands = ARRAY_SIZE(mgmt_commands);
289 u16 num_events = ARRAY_SIZE(mgmt_events);
290 u16 *opcode;
291 size_t rp_size;
292 int i, err;
293
294 BT_DBG("sock %p", sk);
295
296 rp_size = sizeof(*rp) + ((num_commands + num_events) * sizeof(u16));
297
298 rp = kmalloc(rp_size, GFP_KERNEL);
299 if (!rp)
300 return -ENOMEM;
301
302 put_unaligned_le16(num_commands, &rp->num_commands);
303 put_unaligned_le16(num_events, &rp->num_events);
304
305 for (i = 0, opcode = rp->opcodes; i < num_commands; i++, opcode++)
306 put_unaligned_le16(mgmt_commands[i], opcode);
307
308 for (i = 0; i < num_events; i++, opcode++)
309 put_unaligned_le16(mgmt_events[i], opcode);
310
311 err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_COMMANDS, 0, rp,
312 rp_size);
313 kfree(rp);
314
315 return err;
316 }
317
318 static int read_index_list(struct sock *sk, struct hci_dev *hdev, void *data,
319 u16 data_len)
320 {
321 struct mgmt_rp_read_index_list *rp;
322 struct list_head *p;
323 struct hci_dev *d;
324 size_t rp_len;
325 u16 count;
326 int i, err;
327
328 BT_DBG("sock %p", sk);
329
330 read_lock(&hci_dev_list_lock);
331
332 count = 0;
333 list_for_each(p, &hci_dev_list) {
334 count++;
335 }
336
337 rp_len = sizeof(*rp) + (2 * count);
338 rp = kmalloc(rp_len, GFP_ATOMIC);
339 if (!rp) {
340 read_unlock(&hci_dev_list_lock);
341 return -ENOMEM;
342 }
343
344 put_unaligned_le16(count, &rp->num_controllers);
345
346 i = 0;
347 list_for_each_entry(d, &hci_dev_list, list) {
348 if (test_bit(HCI_SETUP, &d->dev_flags))
349 continue;
350
351 put_unaligned_le16(d->id, &rp->index[i++]);
352 BT_DBG("Added hci%u", d->id);
353 }
354
355 read_unlock(&hci_dev_list_lock);
356
357 err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_INDEX_LIST, 0, rp,
358 rp_len);
359
360 kfree(rp);
361
362 return err;
363 }
364
365 static u32 get_supported_settings(struct hci_dev *hdev)
366 {
367 u32 settings = 0;
368
369 settings |= MGMT_SETTING_POWERED;
370 settings |= MGMT_SETTING_CONNECTABLE;
371 settings |= MGMT_SETTING_FAST_CONNECTABLE;
372 settings |= MGMT_SETTING_DISCOVERABLE;
373 settings |= MGMT_SETTING_PAIRABLE;
374
375 if (hdev->features[6] & LMP_SIMPLE_PAIR)
376 settings |= MGMT_SETTING_SSP;
377
378 if (!(hdev->features[4] & LMP_NO_BREDR)) {
379 settings |= MGMT_SETTING_BREDR;
380 settings |= MGMT_SETTING_LINK_SECURITY;
381 }
382
383 if (enable_hs)
384 settings |= MGMT_SETTING_HS;
385
386 if (enable_le) {
387 if (hdev->features[4] & LMP_LE)
388 settings |= MGMT_SETTING_LE;
389 }
390
391 return settings;
392 }
393
394 static u32 get_current_settings(struct hci_dev *hdev)
395 {
396 u32 settings = 0;
397
398 if (hdev_is_powered(hdev))
399 settings |= MGMT_SETTING_POWERED;
400
401 if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
402 settings |= MGMT_SETTING_CONNECTABLE;
403
404 if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
405 settings |= MGMT_SETTING_DISCOVERABLE;
406
407 if (test_bit(HCI_PAIRABLE, &hdev->dev_flags))
408 settings |= MGMT_SETTING_PAIRABLE;
409
410 if (!(hdev->features[4] & LMP_NO_BREDR))
411 settings |= MGMT_SETTING_BREDR;
412
413 if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
414 settings |= MGMT_SETTING_LE;
415
416 if (test_bit(HCI_LINK_SECURITY, &hdev->dev_flags))
417 settings |= MGMT_SETTING_LINK_SECURITY;
418
419 if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
420 settings |= MGMT_SETTING_SSP;
421
422 if (test_bit(HCI_HS_ENABLED, &hdev->dev_flags))
423 settings |= MGMT_SETTING_HS;
424
425 return settings;
426 }
427
428 #define PNP_INFO_SVCLASS_ID 0x1200
429
430 static u8 bluetooth_base_uuid[] = {
431 0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80,
432 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
433 };
434
435 static u16 get_uuid16(u8 *uuid128)
436 {
437 u32 val;
438 int i;
439
440 for (i = 0; i < 12; i++) {
441 if (bluetooth_base_uuid[i] != uuid128[i])
442 return 0;
443 }
444
445 memcpy(&val, &uuid128[12], 4);
446
447 val = le32_to_cpu(val);
448 if (val > 0xffff)
449 return 0;
450
451 return (u16) val;
452 }
453
454 static void create_eir(struct hci_dev *hdev, u8 *data)
455 {
456 u8 *ptr = data;
457 u16 eir_len = 0;
458 u16 uuid16_list[HCI_MAX_EIR_LENGTH / sizeof(u16)];
459 int i, truncated = 0;
460 struct bt_uuid *uuid;
461 size_t name_len;
462
463 name_len = strlen(hdev->dev_name);
464
465 if (name_len > 0) {
466 /* EIR Data type */
467 if (name_len > 48) {
468 name_len = 48;
469 ptr[1] = EIR_NAME_SHORT;
470 } else
471 ptr[1] = EIR_NAME_COMPLETE;
472
473 /* EIR Data length */
474 ptr[0] = name_len + 1;
475
476 memcpy(ptr + 2, hdev->dev_name, name_len);
477
478 eir_len += (name_len + 2);
479 ptr += (name_len + 2);
480 }
481
482 memset(uuid16_list, 0, sizeof(uuid16_list));
483
484 /* Group all UUID16 types */
485 list_for_each_entry(uuid, &hdev->uuids, list) {
486 u16 uuid16;
487
488 uuid16 = get_uuid16(uuid->uuid);
489 if (uuid16 == 0)
490 return;
491
492 if (uuid16 < 0x1100)
493 continue;
494
495 if (uuid16 == PNP_INFO_SVCLASS_ID)
496 continue;
497
498 /* Stop if not enough space to put next UUID */
499 if (eir_len + 2 + sizeof(u16) > HCI_MAX_EIR_LENGTH) {
500 truncated = 1;
501 break;
502 }
503
504 /* Check for duplicates */
505 for (i = 0; uuid16_list[i] != 0; i++)
506 if (uuid16_list[i] == uuid16)
507 break;
508
509 if (uuid16_list[i] == 0) {
510 uuid16_list[i] = uuid16;
511 eir_len += sizeof(u16);
512 }
513 }
514
515 if (uuid16_list[0] != 0) {
516 u8 *length = ptr;
517
518 /* EIR Data type */
519 ptr[1] = truncated ? EIR_UUID16_SOME : EIR_UUID16_ALL;
520
521 ptr += 2;
522 eir_len += 2;
523
524 for (i = 0; uuid16_list[i] != 0; i++) {
525 *ptr++ = (uuid16_list[i] & 0x00ff);
526 *ptr++ = (uuid16_list[i] & 0xff00) >> 8;
527 }
528
529 /* EIR Data length */
530 *length = (i * sizeof(u16)) + 1;
531 }
532 }
533
534 static int update_eir(struct hci_dev *hdev)
535 {
536 struct hci_cp_write_eir cp;
537
538 if (!hdev_is_powered(hdev))
539 return 0;
540
541 if (!(hdev->features[6] & LMP_EXT_INQ))
542 return 0;
543
544 if (!test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
545 return 0;
546
547 if (test_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
548 return 0;
549
550 memset(&cp, 0, sizeof(cp));
551
552 create_eir(hdev, cp.data);
553
554 if (memcmp(cp.data, hdev->eir, sizeof(cp.data)) == 0)
555 return 0;
556
557 memcpy(hdev->eir, cp.data, sizeof(cp.data));
558
559 return hci_send_cmd(hdev, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
560 }
561
562 static u8 get_service_classes(struct hci_dev *hdev)
563 {
564 struct bt_uuid *uuid;
565 u8 val = 0;
566
567 list_for_each_entry(uuid, &hdev->uuids, list)
568 val |= uuid->svc_hint;
569
570 return val;
571 }
572
573 static int update_class(struct hci_dev *hdev)
574 {
575 u8 cod[3];
576 int err;
577
578 BT_DBG("%s", hdev->name);
579
580 if (!hdev_is_powered(hdev))
581 return 0;
582
583 if (test_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
584 return 0;
585
586 cod[0] = hdev->minor_class;
587 cod[1] = hdev->major_class;
588 cod[2] = get_service_classes(hdev);
589
590 if (memcmp(cod, hdev->dev_class, 3) == 0)
591 return 0;
592
593 err = hci_send_cmd(hdev, HCI_OP_WRITE_CLASS_OF_DEV, sizeof(cod), cod);
594 if (err == 0)
595 set_bit(HCI_PENDING_CLASS, &hdev->dev_flags);
596
597 return err;
598 }
599
600 static void service_cache_off(struct work_struct *work)
601 {
602 struct hci_dev *hdev = container_of(work, struct hci_dev,
603 service_cache.work);
604
605 if (!test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
606 return;
607
608 hci_dev_lock(hdev);
609
610 update_eir(hdev);
611 update_class(hdev);
612
613 hci_dev_unlock(hdev);
614 }
615
616 static void mgmt_init_hdev(struct sock *sk, struct hci_dev *hdev)
617 {
618 if (test_and_set_bit(HCI_MGMT, &hdev->dev_flags))
619 return;
620
621 INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off);
622
623 /* Non-mgmt controlled devices get this bit set
624 * implicitly so that pairing works for them, however
625 * for mgmt we require user-space to explicitly enable
626 * it
627 */
628 clear_bit(HCI_PAIRABLE, &hdev->dev_flags);
629 }
630
631 static int read_controller_info(struct sock *sk, struct hci_dev *hdev,
632 void *data, u16 data_len)
633 {
634 struct mgmt_rp_read_info rp;
635
636 BT_DBG("sock %p %s", sk, hdev->name);
637
638 hci_dev_lock(hdev);
639
640 memset(&rp, 0, sizeof(rp));
641
642 bacpy(&rp.bdaddr, &hdev->bdaddr);
643
644 rp.version = hdev->hci_ver;
645
646 put_unaligned_le16(hdev->manufacturer, &rp.manufacturer);
647
648 rp.supported_settings = cpu_to_le32(get_supported_settings(hdev));
649 rp.current_settings = cpu_to_le32(get_current_settings(hdev));
650
651 memcpy(rp.dev_class, hdev->dev_class, 3);
652
653 memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name));
654 memcpy(rp.short_name, hdev->short_name, sizeof(hdev->short_name));
655
656 hci_dev_unlock(hdev);
657
658 return cmd_complete(sk, hdev->id, MGMT_OP_READ_INFO, 0, &rp,
659 sizeof(rp));
660 }
661
662 static void mgmt_pending_free(struct pending_cmd *cmd)
663 {
664 sock_put(cmd->sk);
665 kfree(cmd->param);
666 kfree(cmd);
667 }
668
669 static struct pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode,
670 struct hci_dev *hdev, void *data,
671 u16 len)
672 {
673 struct pending_cmd *cmd;
674
675 cmd = kmalloc(sizeof(*cmd), GFP_ATOMIC);
676 if (!cmd)
677 return NULL;
678
679 cmd->opcode = opcode;
680 cmd->index = hdev->id;
681
682 cmd->param = kmalloc(len, GFP_ATOMIC);
683 if (!cmd->param) {
684 kfree(cmd);
685 return NULL;
686 }
687
688 if (data)
689 memcpy(cmd->param, data, len);
690
691 cmd->sk = sk;
692 sock_hold(sk);
693
694 list_add(&cmd->list, &hdev->mgmt_pending);
695
696 return cmd;
697 }
698
699 static void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev,
700 void (*cb)(struct pending_cmd *cmd, void *data),
701 void *data)
702 {
703 struct list_head *p, *n;
704
705 list_for_each_safe(p, n, &hdev->mgmt_pending) {
706 struct pending_cmd *cmd;
707
708 cmd = list_entry(p, struct pending_cmd, list);
709
710 if (opcode > 0 && cmd->opcode != opcode)
711 continue;
712
713 cb(cmd, data);
714 }
715 }
716
717 static struct pending_cmd *mgmt_pending_find(u16 opcode, struct hci_dev *hdev)
718 {
719 struct pending_cmd *cmd;
720
721 list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
722 if (cmd->opcode == opcode)
723 return cmd;
724 }
725
726 return NULL;
727 }
728
729 static void mgmt_pending_remove(struct pending_cmd *cmd)
730 {
731 list_del(&cmd->list);
732 mgmt_pending_free(cmd);
733 }
734
735 static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
736 {
737 __le32 settings = cpu_to_le32(get_current_settings(hdev));
738
739 return cmd_complete(sk, hdev->id, opcode, 0, &settings,
740 sizeof(settings));
741 }
742
743 static int set_powered(struct sock *sk, struct hci_dev *hdev, void *data,
744 u16 len)
745 {
746 struct mgmt_mode *cp = data;
747 struct pending_cmd *cmd;
748 int err;
749
750 BT_DBG("request for %s", hdev->name);
751
752 hci_dev_lock(hdev);
753
754 if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {
755 cancel_delayed_work(&hdev->power_off);
756
757 if (cp->val) {
758 err = send_settings_rsp(sk, MGMT_OP_SET_POWERED, hdev);
759 mgmt_powered(hdev, 1);
760 goto failed;
761 }
762 }
763
764 if (!!cp->val == hdev_is_powered(hdev)) {
765 err = send_settings_rsp(sk, MGMT_OP_SET_POWERED, hdev);
766 goto failed;
767 }
768
769 if (mgmt_pending_find(MGMT_OP_SET_POWERED, hdev)) {
770 err = cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
771 MGMT_STATUS_BUSY);
772 goto failed;
773 }
774
775 cmd = mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev, data, len);
776 if (!cmd) {
777 err = -ENOMEM;
778 goto failed;
779 }
780
781 if (cp->val)
782 schedule_work(&hdev->power_on);
783 else
784 schedule_work(&hdev->power_off.work);
785
786 err = 0;
787
788 failed:
789 hci_dev_unlock(hdev);
790 return err;
791 }
792
793 static int mgmt_event(u16 event, struct hci_dev *hdev, void *data, u16 data_len,
794 struct sock *skip_sk)
795 {
796 struct sk_buff *skb;
797 struct mgmt_hdr *hdr;
798
799 skb = alloc_skb(sizeof(*hdr) + data_len, GFP_ATOMIC);
800 if (!skb)
801 return -ENOMEM;
802
803 hdr = (void *) skb_put(skb, sizeof(*hdr));
804 hdr->opcode = cpu_to_le16(event);
805 if (hdev)
806 hdr->index = cpu_to_le16(hdev->id);
807 else
808 hdr->index = cpu_to_le16(MGMT_INDEX_NONE);
809 hdr->len = cpu_to_le16(data_len);
810
811 if (data)
812 memcpy(skb_put(skb, data_len), data, data_len);
813
814 /* Time stamp */
815 __net_timestamp(skb);
816
817 hci_send_to_control(skb, skip_sk);
818 kfree_skb(skb);
819
820 return 0;
821 }
822
823 static int new_settings(struct hci_dev *hdev, struct sock *skip)
824 {
825 __le32 ev;
826
827 ev = cpu_to_le32(get_current_settings(hdev));
828
829 return mgmt_event(MGMT_EV_NEW_SETTINGS, hdev, &ev, sizeof(ev), skip);
830 }
831
832 static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
833 u16 len)
834 {
835 struct mgmt_cp_set_discoverable *cp = data;
836 struct pending_cmd *cmd;
837 u16 timeout;
838 u8 scan;
839 int err;
840
841 BT_DBG("request for %s", hdev->name);
842
843 timeout = get_unaligned_le16(&cp->timeout);
844 if (!cp->val && timeout > 0)
845 return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
846 MGMT_STATUS_INVALID_PARAMS);
847
848 hci_dev_lock(hdev);
849
850 if (!hdev_is_powered(hdev) && timeout > 0) {
851 err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
852 MGMT_STATUS_NOT_POWERED);
853 goto failed;
854 }
855
856 if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
857 mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
858 err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
859 MGMT_STATUS_BUSY);
860 goto failed;
861 }
862
863 if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags)) {
864 err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
865 MGMT_STATUS_REJECTED);
866 goto failed;
867 }
868
869 if (!hdev_is_powered(hdev)) {
870 bool changed = false;
871
872 if (!!cp->val != test_bit(HCI_DISCOVERABLE, &hdev->dev_flags)) {
873 change_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
874 changed = true;
875 }
876
877 err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
878 if (err < 0)
879 goto failed;
880
881 if (changed)
882 err = new_settings(hdev, sk);
883
884 goto failed;
885 }
886
887 if (!!cp->val == test_bit(HCI_DISCOVERABLE, &hdev->dev_flags)) {
888 if (hdev->discov_timeout > 0) {
889 cancel_delayed_work(&hdev->discov_off);
890 hdev->discov_timeout = 0;
891 }
892
893 if (cp->val && timeout > 0) {
894 hdev->discov_timeout = timeout;
895 queue_delayed_work(hdev->workqueue, &hdev->discov_off,
896 msecs_to_jiffies(hdev->discov_timeout * 1000));
897 }
898
899 err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
900 goto failed;
901 }
902
903 cmd = mgmt_pending_add(sk, MGMT_OP_SET_DISCOVERABLE, hdev, data, len);
904 if (!cmd) {
905 err = -ENOMEM;
906 goto failed;
907 }
908
909 scan = SCAN_PAGE;
910
911 if (cp->val)
912 scan |= SCAN_INQUIRY;
913 else
914 cancel_delayed_work(&hdev->discov_off);
915
916 err = hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
917 if (err < 0)
918 mgmt_pending_remove(cmd);
919
920 if (cp->val)
921 hdev->discov_timeout = timeout;
922
923 failed:
924 hci_dev_unlock(hdev);
925 return err;
926 }
927
928 static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
929 u16 len)
930 {
931 struct mgmt_mode *cp = data;
932 struct pending_cmd *cmd;
933 u8 scan;
934 int err;
935
936 BT_DBG("request for %s", hdev->name);
937
938 hci_dev_lock(hdev);
939
940 if (!hdev_is_powered(hdev)) {
941 bool changed = false;
942
943 if (!!cp->val != test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
944 changed = true;
945
946 if (cp->val) {
947 set_bit(HCI_CONNECTABLE, &hdev->dev_flags);
948 } else {
949 clear_bit(HCI_CONNECTABLE, &hdev->dev_flags);
950 clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
951 }
952
953 err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
954 if (err < 0)
955 goto failed;
956
957 if (changed)
958 err = new_settings(hdev, sk);
959
960 goto failed;
961 }
962
963 if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
964 mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
965 err = cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
966 MGMT_STATUS_BUSY);
967 goto failed;
968 }
969
970 if (!!cp->val == test_bit(HCI_PSCAN, &hdev->flags)) {
971 err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
972 goto failed;
973 }
974
975 cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, hdev, data, len);
976 if (!cmd) {
977 err = -ENOMEM;
978 goto failed;
979 }
980
981 if (cp->val) {
982 scan = SCAN_PAGE;
983 } else {
984 scan = 0;
985
986 if (test_bit(HCI_ISCAN, &hdev->flags) &&
987 hdev->discov_timeout > 0)
988 cancel_delayed_work(&hdev->discov_off);
989 }
990
991 err = hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
992 if (err < 0)
993 mgmt_pending_remove(cmd);
994
995 failed:
996 hci_dev_unlock(hdev);
997 return err;
998 }
999
1000 static int set_pairable(struct sock *sk, struct hci_dev *hdev, void *data,
1001 u16 len)
1002 {
1003 struct mgmt_mode *cp = data;
1004 int err;
1005
1006 BT_DBG("request for %s", hdev->name);
1007
1008 hci_dev_lock(hdev);
1009
1010 if (cp->val)
1011 set_bit(HCI_PAIRABLE, &hdev->dev_flags);
1012 else
1013 clear_bit(HCI_PAIRABLE, &hdev->dev_flags);
1014
1015 err = send_settings_rsp(sk, MGMT_OP_SET_PAIRABLE, hdev);
1016 if (err < 0)
1017 goto failed;
1018
1019 err = new_settings(hdev, sk);
1020
1021 failed:
1022 hci_dev_unlock(hdev);
1023 return err;
1024 }
1025
1026 static int set_link_security(struct sock *sk, struct hci_dev *hdev, void *data,
1027 u16 len)
1028 {
1029 struct mgmt_mode *cp = data;
1030 struct pending_cmd *cmd;
1031 u8 val;
1032 int err;
1033
1034 BT_DBG("request for %s", hdev->name);
1035
1036 hci_dev_lock(hdev);
1037
1038 if (!hdev_is_powered(hdev)) {
1039 bool changed = false;
1040
1041 if (!!cp->val != test_bit(HCI_LINK_SECURITY,
1042 &hdev->dev_flags)) {
1043 change_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
1044 changed = true;
1045 }
1046
1047 err = send_settings_rsp(sk, MGMT_OP_SET_LINK_SECURITY, hdev);
1048 if (err < 0)
1049 goto failed;
1050
1051 if (changed)
1052 err = new_settings(hdev, sk);
1053
1054 goto failed;
1055 }
1056
1057 if (mgmt_pending_find(MGMT_OP_SET_LINK_SECURITY, hdev)) {
1058 err = cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
1059 MGMT_STATUS_BUSY);
1060 goto failed;
1061 }
1062
1063 val = !!cp->val;
1064
1065 if (test_bit(HCI_AUTH, &hdev->flags) == val) {
1066 err = send_settings_rsp(sk, MGMT_OP_SET_LINK_SECURITY, hdev);
1067 goto failed;
1068 }
1069
1070 cmd = mgmt_pending_add(sk, MGMT_OP_SET_LINK_SECURITY, hdev, data, len);
1071 if (!cmd) {
1072 err = -ENOMEM;
1073 goto failed;
1074 }
1075
1076 err = hci_send_cmd(hdev, HCI_OP_WRITE_AUTH_ENABLE, sizeof(val), &val);
1077 if (err < 0) {
1078 mgmt_pending_remove(cmd);
1079 goto failed;
1080 }
1081
1082 failed:
1083 hci_dev_unlock(hdev);
1084 return err;
1085 }
1086
1087 static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1088 {
1089 struct mgmt_mode *cp = data;
1090 struct pending_cmd *cmd;
1091 u8 val;
1092 int err;
1093
1094 BT_DBG("request for %s", hdev->name);
1095
1096 hci_dev_lock(hdev);
1097
1098 if (!(hdev->features[6] & LMP_SIMPLE_PAIR)) {
1099 err = cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
1100 MGMT_STATUS_NOT_SUPPORTED);
1101 goto failed;
1102 }
1103
1104 val = !!cp->val;
1105
1106 if (!hdev_is_powered(hdev)) {
1107 bool changed = false;
1108
1109 if (val != test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) {
1110 change_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
1111 changed = true;
1112 }
1113
1114 err = send_settings_rsp(sk, MGMT_OP_SET_SSP, hdev);
1115 if (err < 0)
1116 goto failed;
1117
1118 if (changed)
1119 err = new_settings(hdev, sk);
1120
1121 goto failed;
1122 }
1123
1124 if (mgmt_pending_find(MGMT_OP_SET_SSP, hdev)) {
1125 err = cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
1126 MGMT_STATUS_BUSY);
1127 goto failed;
1128 }
1129
1130 if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) == val) {
1131 err = send_settings_rsp(sk, MGMT_OP_SET_SSP, hdev);
1132 goto failed;
1133 }
1134
1135 cmd = mgmt_pending_add(sk, MGMT_OP_SET_SSP, hdev, data, len);
1136 if (!cmd) {
1137 err = -ENOMEM;
1138 goto failed;
1139 }
1140
1141 err = hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, sizeof(val), &val);
1142 if (err < 0) {
1143 mgmt_pending_remove(cmd);
1144 goto failed;
1145 }
1146
1147 failed:
1148 hci_dev_unlock(hdev);
1149 return err;
1150 }
1151
1152 static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1153 {
1154 struct mgmt_mode *cp = data;
1155
1156 BT_DBG("request for %s", hdev->name);
1157
1158 if (!enable_hs)
1159 return cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
1160 MGMT_STATUS_NOT_SUPPORTED);
1161
1162 if (cp->val)
1163 set_bit(HCI_HS_ENABLED, &hdev->dev_flags);
1164 else
1165 clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);
1166
1167 return send_settings_rsp(sk, MGMT_OP_SET_HS, hdev);
1168 }
1169
1170 static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1171 {
1172 struct mgmt_mode *cp = data;
1173 struct hci_cp_write_le_host_supported hci_cp;
1174 struct pending_cmd *cmd;
1175 int err;
1176 u8 val, enabled;
1177
1178 BT_DBG("request for %s", hdev->name);
1179
1180 hci_dev_lock(hdev);
1181
1182 if (!enable_le || !(hdev->features[4] & LMP_LE)) {
1183 err = cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
1184 MGMT_STATUS_NOT_SUPPORTED);
1185 goto unlock;
1186 }
1187
1188 val = !!cp->val;
1189 enabled = !!(hdev->host_features[0] & LMP_HOST_LE);
1190
1191 if (!hdev_is_powered(hdev) || val == enabled) {
1192 bool changed = false;
1193
1194 if (val != test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) {
1195 change_bit(HCI_LE_ENABLED, &hdev->dev_flags);
1196 changed = true;
1197 }
1198
1199 err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
1200 if (err < 0)
1201 goto unlock;
1202
1203 if (changed)
1204 err = new_settings(hdev, sk);
1205
1206 goto unlock;
1207 }
1208
1209 if (mgmt_pending_find(MGMT_OP_SET_LE, hdev)) {
1210 err = cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
1211 MGMT_STATUS_BUSY);
1212 goto unlock;
1213 }
1214
1215 cmd = mgmt_pending_add(sk, MGMT_OP_SET_LE, hdev, data, len);
1216 if (!cmd) {
1217 err = -ENOMEM;
1218 goto unlock;
1219 }
1220
1221 memset(&hci_cp, 0, sizeof(hci_cp));
1222
1223 if (val) {
1224 hci_cp.le = val;
1225 hci_cp.simul = !!(hdev->features[6] & LMP_SIMUL_LE_BR);
1226 }
1227
1228 err = hci_send_cmd(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),
1229 &hci_cp);
1230 if (err < 0) {
1231 mgmt_pending_remove(cmd);
1232 goto unlock;
1233 }
1234
1235 unlock:
1236 hci_dev_unlock(hdev);
1237 return err;
1238 }
1239
1240 static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1241 {
1242 struct mgmt_cp_add_uuid *cp = data;
1243 struct pending_cmd *cmd;
1244 struct bt_uuid *uuid;
1245 int err;
1246
1247 BT_DBG("request for %s", hdev->name);
1248
1249 hci_dev_lock(hdev);
1250
1251 if (test_bit(HCI_PENDING_CLASS, &hdev->dev_flags)) {
1252 err = cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID,
1253 MGMT_STATUS_BUSY);
1254 goto failed;
1255 }
1256
1257 uuid = kmalloc(sizeof(*uuid), GFP_ATOMIC);
1258 if (!uuid) {
1259 err = -ENOMEM;
1260 goto failed;
1261 }
1262
1263 memcpy(uuid->uuid, cp->uuid, 16);
1264 uuid->svc_hint = cp->svc_hint;
1265
1266 list_add(&uuid->list, &hdev->uuids);
1267
1268 err = update_class(hdev);
1269 if (err < 0)
1270 goto failed;
1271
1272 err = update_eir(hdev);
1273 if (err < 0)
1274 goto failed;
1275
1276 if (!test_bit(HCI_PENDING_CLASS, &hdev->dev_flags)) {
1277 err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0,
1278 hdev->dev_class, 3);
1279 goto failed;
1280 }
1281
1282 cmd = mgmt_pending_add(sk, MGMT_OP_ADD_UUID, hdev, data, len);
1283 if (!cmd) {
1284 err = -ENOMEM;
1285 goto failed;
1286 }
1287
1288 failed:
1289 hci_dev_unlock(hdev);
1290 return err;
1291 }
1292
1293 static bool enable_service_cache(struct hci_dev *hdev)
1294 {
1295 if (!hdev_is_powered(hdev))
1296 return false;
1297
1298 if (!test_and_set_bit(HCI_SERVICE_CACHE, &hdev->dev_flags)) {
1299 schedule_delayed_work(&hdev->service_cache, CACHE_TIMEOUT);
1300 return true;
1301 }
1302
1303 return false;
1304 }
1305
1306 static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
1307 u16 len)
1308 {
1309 struct mgmt_cp_remove_uuid *cp = data;
1310 struct pending_cmd *cmd;
1311 struct list_head *p, *n;
1312 u8 bt_uuid_any[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1313 int err, found;
1314
1315 BT_DBG("request for %s", hdev->name);
1316
1317 hci_dev_lock(hdev);
1318
1319 if (test_bit(HCI_PENDING_CLASS, &hdev->dev_flags)) {
1320 err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1321 MGMT_STATUS_BUSY);
1322 goto unlock;
1323 }
1324
1325 if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
1326 err = hci_uuids_clear(hdev);
1327
1328 if (enable_service_cache(hdev)) {
1329 err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1330 0, hdev->dev_class, 3);
1331 goto unlock;
1332 }
1333
1334 goto update_class;
1335 }
1336
1337 found = 0;
1338
1339 list_for_each_safe(p, n, &hdev->uuids) {
1340 struct bt_uuid *match = list_entry(p, struct bt_uuid, list);
1341
1342 if (memcmp(match->uuid, cp->uuid, 16) != 0)
1343 continue;
1344
1345 list_del(&match->list);
1346 found++;
1347 }
1348
1349 if (found == 0) {
1350 err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1351 MGMT_STATUS_INVALID_PARAMS);
1352 goto unlock;
1353 }
1354
1355 update_class:
1356 err = update_class(hdev);
1357 if (err < 0)
1358 goto unlock;
1359
1360 err = update_eir(hdev);
1361 if (err < 0)
1362 goto unlock;
1363
1364 if (!test_bit(HCI_PENDING_CLASS, &hdev->dev_flags)) {
1365 err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0,
1366 hdev->dev_class, 3);
1367 goto unlock;
1368 }
1369
1370 cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_UUID, hdev, data, len);
1371 if (!cmd) {
1372 err = -ENOMEM;
1373 goto unlock;
1374 }
1375
1376 unlock:
1377 hci_dev_unlock(hdev);
1378 return err;
1379 }
1380
1381 static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
1382 u16 len)
1383 {
1384 struct mgmt_cp_set_dev_class *cp = data;
1385 struct pending_cmd *cmd;
1386 int err;
1387
1388 BT_DBG("request for %s", hdev->name);
1389
1390 hci_dev_lock(hdev);
1391
1392 if (test_bit(HCI_PENDING_CLASS, &hdev->dev_flags)) {
1393 err = cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
1394 MGMT_STATUS_BUSY);
1395 goto unlock;
1396 }
1397
1398 hdev->major_class = cp->major;
1399 hdev->minor_class = cp->minor;
1400
1401 if (!hdev_is_powered(hdev)) {
1402 err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
1403 hdev->dev_class, 3);
1404 goto unlock;
1405 }
1406
1407 if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags)) {
1408 hci_dev_unlock(hdev);
1409 cancel_delayed_work_sync(&hdev->service_cache);
1410 hci_dev_lock(hdev);
1411 update_eir(hdev);
1412 }
1413
1414 err = update_class(hdev);
1415 if (err < 0)
1416 goto unlock;
1417
1418 if (!test_bit(HCI_PENDING_CLASS, &hdev->dev_flags)) {
1419 err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
1420 hdev->dev_class, 3);
1421 goto unlock;
1422 }
1423
1424 cmd = mgmt_pending_add(sk, MGMT_OP_SET_DEV_CLASS, hdev, data, len);
1425 if (!cmd) {
1426 err = -ENOMEM;
1427 goto unlock;
1428 }
1429
1430 unlock:
1431 hci_dev_unlock(hdev);
1432 return err;
1433 }
1434
1435 static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
1436 u16 len)
1437 {
1438 struct mgmt_cp_load_link_keys *cp = data;
1439 u16 key_count, expected_len;
1440 int i;
1441
1442 key_count = get_unaligned_le16(&cp->key_count);
1443
1444 expected_len = sizeof(*cp) + key_count *
1445 sizeof(struct mgmt_link_key_info);
1446 if (expected_len != len) {
1447 BT_ERR("load_link_keys: expected %u bytes, got %u bytes",
1448 len, expected_len);
1449 return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
1450 MGMT_STATUS_INVALID_PARAMS);
1451 }
1452
1453 BT_DBG("%s debug_keys %u key_count %u", hdev->name, cp->debug_keys,
1454 key_count);
1455
1456 hci_dev_lock(hdev);
1457
1458 hci_link_keys_clear(hdev);
1459
1460 set_bit(HCI_LINK_KEYS, &hdev->dev_flags);
1461
1462 if (cp->debug_keys)
1463 set_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
1464 else
1465 clear_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
1466
1467 for (i = 0; i < key_count; i++) {
1468 struct mgmt_link_key_info *key = &cp->keys[i];
1469
1470 hci_add_link_key(hdev, NULL, 0, &key->addr.bdaddr, key->val,
1471 key->type, key->pin_len);
1472 }
1473
1474 cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0);
1475
1476 hci_dev_unlock(hdev);
1477
1478 return 0;
1479 }
1480
1481 static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr,
1482 u8 addr_type, struct sock *skip_sk)
1483 {
1484 struct mgmt_ev_device_unpaired ev;
1485
1486 bacpy(&ev.addr.bdaddr, bdaddr);
1487 ev.addr.type = addr_type;
1488
1489 return mgmt_event(MGMT_EV_DEVICE_UNPAIRED, hdev, &ev, sizeof(ev),
1490 skip_sk);
1491 }
1492
1493 static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
1494 u16 len)
1495 {
1496 struct mgmt_cp_unpair_device *cp = data;
1497 struct mgmt_rp_unpair_device rp;
1498 struct hci_cp_disconnect dc;
1499 struct pending_cmd *cmd;
1500 struct hci_conn *conn;
1501 int err;
1502
1503 hci_dev_lock(hdev);
1504
1505 memset(&rp, 0, sizeof(rp));
1506 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
1507 rp.addr.type = cp->addr.type;
1508
1509 if (!hdev_is_powered(hdev)) {
1510 err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
1511 MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
1512 goto unlock;
1513 }
1514
1515 if (cp->addr.type == MGMT_ADDR_BREDR)
1516 err = hci_remove_link_key(hdev, &cp->addr.bdaddr);
1517 else
1518 err = hci_remove_ltk(hdev, &cp->addr.bdaddr);
1519
1520 if (err < 0) {
1521 err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
1522 MGMT_STATUS_NOT_PAIRED, &rp, sizeof(rp));
1523 goto unlock;
1524 }
1525
1526 if (cp->disconnect) {
1527 if (cp->addr.type == MGMT_ADDR_BREDR)
1528 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
1529 &cp->addr.bdaddr);
1530 else
1531 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK,
1532 &cp->addr.bdaddr);
1533 } else {
1534 conn = NULL;
1535 }
1536
1537 if (!conn) {
1538 err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0,
1539 &rp, sizeof(rp));
1540 device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk);
1541 goto unlock;
1542 }
1543
1544 cmd = mgmt_pending_add(sk, MGMT_OP_UNPAIR_DEVICE, hdev, cp,
1545 sizeof(*cp));
1546 if (!cmd) {
1547 err = -ENOMEM;
1548 goto unlock;
1549 }
1550
1551 put_unaligned_le16(conn->handle, &dc.handle);
1552 dc.reason = 0x13; /* Remote User Terminated Connection */
1553 err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
1554 if (err < 0)
1555 mgmt_pending_remove(cmd);
1556
1557 unlock:
1558 hci_dev_unlock(hdev);
1559 return err;
1560 }
1561
1562 static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
1563 u16 len)
1564 {
1565 struct mgmt_cp_disconnect *cp = data;
1566 struct hci_cp_disconnect dc;
1567 struct pending_cmd *cmd;
1568 struct hci_conn *conn;
1569 int err;
1570
1571 BT_DBG("");
1572
1573 hci_dev_lock(hdev);
1574
1575 if (!test_bit(HCI_UP, &hdev->flags)) {
1576 err = cmd_status(sk, hdev->id, MGMT_OP_DISCONNECT,
1577 MGMT_STATUS_NOT_POWERED);
1578 goto failed;
1579 }
1580
1581 if (mgmt_pending_find(MGMT_OP_DISCONNECT, hdev)) {
1582 err = cmd_status(sk, hdev->id, MGMT_OP_DISCONNECT,
1583 MGMT_STATUS_BUSY);
1584 goto failed;
1585 }
1586
1587 if (cp->addr.type == MGMT_ADDR_BREDR)
1588 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr);
1589 else
1590 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
1591
1592 if (!conn) {
1593 err = cmd_status(sk, hdev->id, MGMT_OP_DISCONNECT,
1594 MGMT_STATUS_NOT_CONNECTED);
1595 goto failed;
1596 }
1597
1598 cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len);
1599 if (!cmd) {
1600 err = -ENOMEM;
1601 goto failed;
1602 }
1603
1604 put_unaligned_le16(conn->handle, &dc.handle);
1605 dc.reason = 0x13; /* Remote User Terminated Connection */
1606
1607 err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
1608 if (err < 0)
1609 mgmt_pending_remove(cmd);
1610
1611 failed:
1612 hci_dev_unlock(hdev);
1613 return err;
1614 }
1615
1616 static u8 link_to_mgmt(u8 link_type, u8 addr_type)
1617 {
1618 switch (link_type) {
1619 case LE_LINK:
1620 switch (addr_type) {
1621 case ADDR_LE_DEV_PUBLIC:
1622 return MGMT_ADDR_LE_PUBLIC;
1623 case ADDR_LE_DEV_RANDOM:
1624 return MGMT_ADDR_LE_RANDOM;
1625 default:
1626 return MGMT_ADDR_INVALID;
1627 }
1628 case ACL_LINK:
1629 return MGMT_ADDR_BREDR;
1630 default:
1631 return MGMT_ADDR_INVALID;
1632 }
1633 }
1634
1635 static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data,
1636 u16 data_len)
1637 {
1638 struct mgmt_rp_get_connections *rp;
1639 struct hci_conn *c;
1640 size_t rp_len;
1641 int err;
1642 u16 i;
1643
1644 BT_DBG("");
1645
1646 hci_dev_lock(hdev);
1647
1648 if (!hdev_is_powered(hdev)) {
1649 err = cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS,
1650 MGMT_STATUS_NOT_POWERED);
1651 goto unlock;
1652 }
1653
1654 i = 0;
1655 list_for_each_entry(c, &hdev->conn_hash.list, list) {
1656 if (test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
1657 i++;
1658 }
1659
1660 rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
1661 rp = kmalloc(rp_len, GFP_ATOMIC);
1662 if (!rp) {
1663 err = -ENOMEM;
1664 goto unlock;
1665 }
1666
1667 i = 0;
1668 list_for_each_entry(c, &hdev->conn_hash.list, list) {
1669 if (!test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
1670 continue;
1671 bacpy(&rp->addr[i].bdaddr, &c->dst);
1672 rp->addr[i].type = link_to_mgmt(c->type, c->dst_type);
1673 if (rp->addr[i].type == MGMT_ADDR_INVALID)
1674 continue;
1675 i++;
1676 }
1677
1678 put_unaligned_le16(i, &rp->conn_count);
1679
1680 /* Recalculate length in case of filtered SCO connections, etc */
1681 rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
1682
1683 err = cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp,
1684 rp_len);
1685
1686 kfree(rp);
1687
1688 unlock:
1689 hci_dev_unlock(hdev);
1690 return err;
1691 }
1692
1693 static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
1694 struct mgmt_cp_pin_code_neg_reply *cp)
1695 {
1696 struct pending_cmd *cmd;
1697 int err;
1698
1699 cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp,
1700 sizeof(*cp));
1701 if (!cmd)
1702 return -ENOMEM;
1703
1704 err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
1705 sizeof(cp->addr.bdaddr), &cp->addr.bdaddr);
1706 if (err < 0)
1707 mgmt_pending_remove(cmd);
1708
1709 return err;
1710 }
1711
1712 static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
1713 u16 len)
1714 {
1715 struct hci_conn *conn;
1716 struct mgmt_cp_pin_code_reply *cp = data;
1717 struct hci_cp_pin_code_reply reply;
1718 struct pending_cmd *cmd;
1719 int err;
1720
1721 BT_DBG("");
1722
1723 hci_dev_lock(hdev);
1724
1725 if (!hdev_is_powered(hdev)) {
1726 err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
1727 MGMT_STATUS_NOT_POWERED);
1728 goto failed;
1729 }
1730
1731 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr);
1732 if (!conn) {
1733 err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
1734 MGMT_STATUS_NOT_CONNECTED);
1735 goto failed;
1736 }
1737
1738 if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) {
1739 struct mgmt_cp_pin_code_neg_reply ncp;
1740
1741 memcpy(&ncp.addr, &cp->addr, sizeof(ncp.addr));
1742
1743 BT_ERR("PIN code is not 16 bytes long");
1744
1745 err = send_pin_code_neg_reply(sk, hdev, &ncp);
1746 if (err >= 0)
1747 err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
1748 MGMT_STATUS_INVALID_PARAMS);
1749
1750 goto failed;
1751 }
1752
1753 cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len);
1754 if (!cmd) {
1755 err = -ENOMEM;
1756 goto failed;
1757 }
1758
1759 bacpy(&reply.bdaddr, &cp->addr.bdaddr);
1760 reply.pin_len = cp->pin_len;
1761 memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code));
1762
1763 err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
1764 if (err < 0)
1765 mgmt_pending_remove(cmd);
1766
1767 failed:
1768 hci_dev_unlock(hdev);
1769 return err;
1770 }
1771
1772 static int pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
1773 void *data, u16 len)
1774 {
1775 struct mgmt_cp_pin_code_neg_reply *cp = data;
1776 int err;
1777
1778 BT_DBG("");
1779
1780 hci_dev_lock(hdev);
1781
1782 if (!hdev_is_powered(hdev)) {
1783 err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_NEG_REPLY,
1784 MGMT_STATUS_NOT_POWERED);
1785 goto failed;
1786 }
1787
1788 err = send_pin_code_neg_reply(sk, hdev, cp);
1789
1790 failed:
1791 hci_dev_unlock(hdev);
1792 return err;
1793 }
1794
1795 static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data,
1796 u16 len)
1797 {
1798 struct mgmt_cp_set_io_capability *cp = data;
1799
1800 BT_DBG("");
1801
1802 hci_dev_lock(hdev);
1803
1804 hdev->io_capability = cp->io_capability;
1805
1806 BT_DBG("%s IO capability set to 0x%02x", hdev->name,
1807 hdev->io_capability);
1808
1809 hci_dev_unlock(hdev);
1810
1811 return cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0, NULL,
1812 0);
1813 }
1814
1815 static inline struct pending_cmd *find_pairing(struct hci_conn *conn)
1816 {
1817 struct hci_dev *hdev = conn->hdev;
1818 struct pending_cmd *cmd;
1819
1820 list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
1821 if (cmd->opcode != MGMT_OP_PAIR_DEVICE)
1822 continue;
1823
1824 if (cmd->user_data != conn)
1825 continue;
1826
1827 return cmd;
1828 }
1829
1830 return NULL;
1831 }
1832
1833 static void pairing_complete(struct pending_cmd *cmd, u8 status)
1834 {
1835 struct mgmt_rp_pair_device rp;
1836 struct hci_conn *conn = cmd->user_data;
1837
1838 bacpy(&rp.addr.bdaddr, &conn->dst);
1839 rp.addr.type = link_to_mgmt(conn->type, conn->dst_type);
1840
1841 cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE, status,
1842 &rp, sizeof(rp));
1843
1844 /* So we don't get further callbacks for this connection */
1845 conn->connect_cfm_cb = NULL;
1846 conn->security_cfm_cb = NULL;
1847 conn->disconn_cfm_cb = NULL;
1848
1849 hci_conn_put(conn);
1850
1851 mgmt_pending_remove(cmd);
1852 }
1853
1854 static void pairing_complete_cb(struct hci_conn *conn, u8 status)
1855 {
1856 struct pending_cmd *cmd;
1857
1858 BT_DBG("status %u", status);
1859
1860 cmd = find_pairing(conn);
1861 if (!cmd)
1862 BT_DBG("Unable to find a pending command");
1863 else
1864 pairing_complete(cmd, mgmt_status(status));
1865 }
1866
1867 static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
1868 u16 len)
1869 {
1870 struct mgmt_cp_pair_device *cp = data;
1871 struct mgmt_rp_pair_device rp;
1872 struct pending_cmd *cmd;
1873 u8 sec_level, auth_type;
1874 struct hci_conn *conn;
1875 int err;
1876
1877 BT_DBG("");
1878
1879 hci_dev_lock(hdev);
1880
1881 if (!hdev_is_powered(hdev)) {
1882 err = cmd_status(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
1883 MGMT_STATUS_NOT_POWERED);
1884 goto unlock;
1885 }
1886
1887 sec_level = BT_SECURITY_MEDIUM;
1888 if (cp->io_cap == 0x03)
1889 auth_type = HCI_AT_DEDICATED_BONDING;
1890 else
1891 auth_type = HCI_AT_DEDICATED_BONDING_MITM;
1892
1893 if (cp->addr.type == MGMT_ADDR_BREDR)
1894 conn = hci_connect(hdev, ACL_LINK, &cp->addr.bdaddr, sec_level,
1895 auth_type);
1896 else
1897 conn = hci_connect(hdev, LE_LINK, &cp->addr.bdaddr, sec_level,
1898 auth_type);
1899
1900 memset(&rp, 0, sizeof(rp));
1901 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
1902 rp.addr.type = cp->addr.type;
1903
1904 if (IS_ERR(conn)) {
1905 err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
1906 MGMT_STATUS_CONNECT_FAILED, &rp,
1907 sizeof(rp));
1908 goto unlock;
1909 }
1910
1911 if (conn->connect_cfm_cb) {
1912 hci_conn_put(conn);
1913 err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
1914 MGMT_STATUS_BUSY, &rp, sizeof(rp));
1915 goto unlock;
1916 }
1917
1918 cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len);
1919 if (!cmd) {
1920 err = -ENOMEM;
1921 hci_conn_put(conn);
1922 goto unlock;
1923 }
1924
1925 /* For LE, just connecting isn't a proof that the pairing finished */
1926 if (cp->addr.type == MGMT_ADDR_BREDR)
1927 conn->connect_cfm_cb = pairing_complete_cb;
1928
1929 conn->security_cfm_cb = pairing_complete_cb;
1930 conn->disconn_cfm_cb = pairing_complete_cb;
1931 conn->io_capability = cp->io_cap;
1932 cmd->user_data = conn;
1933
1934 if (conn->state == BT_CONNECTED &&
1935 hci_conn_security(conn, sec_level, auth_type))
1936 pairing_complete(cmd, 0);
1937
1938 err = 0;
1939
1940 unlock:
1941 hci_dev_unlock(hdev);
1942 return err;
1943 }
1944
1945 static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
1946 u16 len)
1947 {
1948 struct mgmt_addr_info *addr = data;
1949 struct pending_cmd *cmd;
1950 struct hci_conn *conn;
1951 int err;
1952
1953 BT_DBG("");
1954
1955 hci_dev_lock(hdev);
1956
1957 if (!hdev_is_powered(hdev)) {
1958 err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
1959 MGMT_STATUS_NOT_POWERED);
1960 goto unlock;
1961 }
1962
1963 cmd = mgmt_pending_find(MGMT_OP_PAIR_DEVICE, hdev);
1964 if (!cmd) {
1965 err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
1966 MGMT_STATUS_INVALID_PARAMS);
1967 goto unlock;
1968 }
1969
1970 conn = cmd->user_data;
1971
1972 if (bacmp(&addr->bdaddr, &conn->dst) != 0) {
1973 err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
1974 MGMT_STATUS_INVALID_PARAMS);
1975 goto unlock;
1976 }
1977
1978 pairing_complete(cmd, MGMT_STATUS_CANCELLED);
1979
1980 err = cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0,
1981 addr, sizeof(*addr));
1982 unlock:
1983 hci_dev_unlock(hdev);
1984 return err;
1985 }
1986
1987 static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
1988 bdaddr_t *bdaddr, u8 type, u16 mgmt_op,
1989 u16 hci_op, __le32 passkey)
1990 {
1991 struct pending_cmd *cmd;
1992 struct hci_conn *conn;
1993 int err;
1994
1995 hci_dev_lock(hdev);
1996
1997 if (!hdev_is_powered(hdev)) {
1998 err = cmd_status(sk, hdev->id, mgmt_op,
1999 MGMT_STATUS_NOT_POWERED);
2000 goto done;
2001 }
2002
2003 if (type == MGMT_ADDR_BREDR)
2004 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, bdaddr);
2005 else
2006 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, bdaddr);
2007
2008 if (!conn) {
2009 err = cmd_status(sk, hdev->id, mgmt_op,
2010 MGMT_STATUS_NOT_CONNECTED);
2011 goto done;
2012 }
2013
2014 if (type == MGMT_ADDR_LE_PUBLIC || type == MGMT_ADDR_LE_RANDOM) {
2015 /* Continue with pairing via SMP */
2016 err = smp_user_confirm_reply(conn, mgmt_op, passkey);
2017
2018 if (!err)
2019 err = cmd_status(sk, hdev->id, mgmt_op,
2020 MGMT_STATUS_SUCCESS);
2021 else
2022 err = cmd_status(sk, hdev->id, mgmt_op,
2023 MGMT_STATUS_FAILED);
2024
2025 goto done;
2026 }
2027
2028 cmd = mgmt_pending_add(sk, mgmt_op, hdev, bdaddr, sizeof(*bdaddr));
2029 if (!cmd) {
2030 err = -ENOMEM;
2031 goto done;
2032 }
2033
2034 /* Continue with pairing via HCI */
2035 if (hci_op == HCI_OP_USER_PASSKEY_REPLY) {
2036 struct hci_cp_user_passkey_reply cp;
2037
2038 bacpy(&cp.bdaddr, bdaddr);
2039 cp.passkey = passkey;
2040 err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp);
2041 } else
2042 err = hci_send_cmd(hdev, hci_op, sizeof(*bdaddr), bdaddr);
2043
2044 if (err < 0)
2045 mgmt_pending_remove(cmd);
2046
2047 done:
2048 hci_dev_unlock(hdev);
2049 return err;
2050 }
2051
2052 static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data,
2053 u16 len)
2054 {
2055 struct mgmt_cp_user_confirm_reply *cp = data;
2056
2057 BT_DBG("");
2058
2059 if (len != sizeof(*cp))
2060 return cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY,
2061 MGMT_STATUS_INVALID_PARAMS);
2062
2063 return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
2064 MGMT_OP_USER_CONFIRM_REPLY,
2065 HCI_OP_USER_CONFIRM_REPLY, 0);
2066 }
2067
2068 static int user_confirm_neg_reply(struct sock *sk, struct hci_dev *hdev,
2069 void *data, u16 len)
2070 {
2071 struct mgmt_cp_user_confirm_neg_reply *cp = data;
2072
2073 BT_DBG("");
2074
2075 return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
2076 MGMT_OP_USER_CONFIRM_NEG_REPLY,
2077 HCI_OP_USER_CONFIRM_NEG_REPLY, 0);
2078 }
2079
2080 static int user_passkey_reply(struct sock *sk, struct hci_dev *hdev, void *data,
2081 u16 len)
2082 {
2083 struct mgmt_cp_user_passkey_reply *cp = data;
2084
2085 BT_DBG("");
2086
2087 return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
2088 MGMT_OP_USER_PASSKEY_REPLY,
2089 HCI_OP_USER_PASSKEY_REPLY, cp->passkey);
2090 }
2091
2092 static int user_passkey_neg_reply(struct sock *sk, struct hci_dev *hdev,
2093 void *data, u16 len)
2094 {
2095 struct mgmt_cp_user_passkey_neg_reply *cp = data;
2096
2097 BT_DBG("");
2098
2099 return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
2100 MGMT_OP_USER_PASSKEY_NEG_REPLY,
2101 HCI_OP_USER_PASSKEY_NEG_REPLY, 0);
2102 }
2103
2104 static int update_name(struct hci_dev *hdev, const char *name)
2105 {
2106 struct hci_cp_write_local_name cp;
2107
2108 memcpy(cp.name, name, sizeof(cp.name));
2109
2110 return hci_send_cmd(hdev, HCI_OP_WRITE_LOCAL_NAME, sizeof(cp), &cp);
2111 }
2112
2113 static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
2114 u16 len)
2115 {
2116 struct mgmt_cp_set_local_name *cp = data;
2117 struct pending_cmd *cmd;
2118 int err;
2119
2120 BT_DBG("");
2121
2122 hci_dev_lock(hdev);
2123
2124 memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name));
2125
2126 if (!hdev_is_powered(hdev)) {
2127 memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));
2128
2129 err = cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
2130 data, len);
2131 if (err < 0)
2132 goto failed;
2133
2134 err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, data, len,
2135 sk);
2136
2137 goto failed;
2138 }
2139
2140 cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len);
2141 if (!cmd) {
2142 err = -ENOMEM;
2143 goto failed;
2144 }
2145
2146 err = update_name(hdev, cp->name);
2147 if (err < 0)
2148 mgmt_pending_remove(cmd);
2149
2150 failed:
2151 hci_dev_unlock(hdev);
2152 return err;
2153 }
2154
2155 static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev,
2156 void *data, u16 data_len)
2157 {
2158 struct pending_cmd *cmd;
2159 int err;
2160
2161 BT_DBG("%s", hdev->name);
2162
2163 hci_dev_lock(hdev);
2164
2165 if (!hdev_is_powered(hdev)) {
2166 err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2167 MGMT_STATUS_NOT_POWERED);
2168 goto unlock;
2169 }
2170
2171 if (!(hdev->features[6] & LMP_SIMPLE_PAIR)) {
2172 err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2173 MGMT_STATUS_NOT_SUPPORTED);
2174 goto unlock;
2175 }
2176
2177 if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) {
2178 err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2179 MGMT_STATUS_BUSY);
2180 goto unlock;
2181 }
2182
2183 cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0);
2184 if (!cmd) {
2185 err = -ENOMEM;
2186 goto unlock;
2187 }
2188
2189 err = hci_send_cmd(hdev, HCI_OP_READ_LOCAL_OOB_DATA, 0, NULL);
2190 if (err < 0)
2191 mgmt_pending_remove(cmd);
2192
2193 unlock:
2194 hci_dev_unlock(hdev);
2195 return err;
2196 }
2197
2198 static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2199 void *data, u16 len)
2200 {
2201 struct mgmt_cp_add_remote_oob_data *cp = data;
2202 u8 status;
2203 int err;
2204
2205 BT_DBG("%s ", hdev->name);
2206
2207 hci_dev_lock(hdev);
2208
2209 if (!hdev_is_powered(hdev)) {
2210 err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA,
2211 MGMT_STATUS_NOT_POWERED, &cp->addr,
2212 sizeof(cp->addr));
2213 goto unlock;
2214 }
2215
2216 err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, cp->hash,
2217 cp->randomizer);
2218 if (err < 0)
2219 status = MGMT_STATUS_FAILED;
2220 else
2221 status = 0;
2222
2223 err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA, status,
2224 &cp->addr, sizeof(cp->addr));
2225
2226 unlock:
2227 hci_dev_unlock(hdev);
2228 return err;
2229 }
2230
2231 static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2232 void *data, u16 len)
2233 {
2234 struct mgmt_cp_remove_remote_oob_data *cp = data;
2235 u8 status;
2236 int err;
2237
2238 BT_DBG("%s", hdev->name);
2239
2240 hci_dev_lock(hdev);
2241
2242 if (!hdev_is_powered(hdev)) {
2243 err = cmd_complete(sk, hdev->id,
2244 MGMT_OP_REMOVE_REMOTE_OOB_DATA,
2245 MGMT_STATUS_NOT_POWERED, &cp->addr,
2246 sizeof(cp->addr));
2247 goto unlock;
2248 }
2249
2250 err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr);
2251 if (err < 0)
2252 status = MGMT_STATUS_INVALID_PARAMS;
2253 else
2254 status = 0;
2255
2256 err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
2257 status, &cp->addr, sizeof(cp->addr));
2258
2259 unlock:
2260 hci_dev_unlock(hdev);
2261 return err;
2262 }
2263
2264 int mgmt_interleaved_discovery(struct hci_dev *hdev)
2265 {
2266 int err;
2267
2268 BT_DBG("%s", hdev->name);
2269
2270 hci_dev_lock(hdev);
2271
2272 err = hci_do_inquiry(hdev, INQUIRY_LEN_BREDR_LE);
2273 if (err < 0)
2274 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
2275
2276 hci_dev_unlock(hdev);
2277
2278 return err;
2279 }
2280
2281 static int start_discovery(struct sock *sk, struct hci_dev *hdev,
2282 void *data, u16 len)
2283 {
2284 struct mgmt_cp_start_discovery *cp = data;
2285 struct pending_cmd *cmd;
2286 int err;
2287
2288 BT_DBG("%s", hdev->name);
2289
2290 hci_dev_lock(hdev);
2291
2292 if (!hdev_is_powered(hdev)) {
2293 err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2294 MGMT_STATUS_NOT_POWERED);
2295 goto failed;
2296 }
2297
2298 if (hdev->discovery.state != DISCOVERY_STOPPED) {
2299 err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2300 MGMT_STATUS_BUSY);
2301 goto failed;
2302 }
2303
2304 cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, hdev, NULL, 0);
2305 if (!cmd) {
2306 err = -ENOMEM;
2307 goto failed;
2308 }
2309
2310 hdev->discovery.type = cp->type;
2311
2312 switch (hdev->discovery.type) {
2313 case DISCOV_TYPE_BREDR:
2314 if (lmp_bredr_capable(hdev))
2315 err = hci_do_inquiry(hdev, INQUIRY_LEN_BREDR);
2316 else
2317 err = -ENOTSUPP;
2318 break;
2319
2320 case DISCOV_TYPE_LE:
2321 if (lmp_host_le_capable(hdev))
2322 err = hci_le_scan(hdev, LE_SCAN_TYPE, LE_SCAN_INT,
2323 LE_SCAN_WIN, LE_SCAN_TIMEOUT_LE_ONLY);
2324 else
2325 err = -ENOTSUPP;
2326 break;
2327
2328 case DISCOV_TYPE_INTERLEAVED:
2329 if (lmp_host_le_capable(hdev) && lmp_bredr_capable(hdev))
2330 err = hci_le_scan(hdev, LE_SCAN_TYPE, LE_SCAN_INT,
2331 LE_SCAN_WIN,
2332 LE_SCAN_TIMEOUT_BREDR_LE);
2333 else
2334 err = -ENOTSUPP;
2335 break;
2336
2337 default:
2338 err = -EINVAL;
2339 }
2340
2341 if (err < 0)
2342 mgmt_pending_remove(cmd);
2343 else
2344 hci_discovery_set_state(hdev, DISCOVERY_STARTING);
2345
2346 failed:
2347 hci_dev_unlock(hdev);
2348 return err;
2349 }
2350
2351 static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
2352 u16 len)
2353 {
2354 struct mgmt_cp_stop_discovery *mgmt_cp = data;
2355 struct pending_cmd *cmd;
2356 struct hci_cp_remote_name_req_cancel cp;
2357 struct inquiry_entry *e;
2358 int err;
2359
2360 BT_DBG("%s", hdev->name);
2361
2362 hci_dev_lock(hdev);
2363
2364 if (!hci_discovery_active(hdev)) {
2365 err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
2366 MGMT_STATUS_REJECTED, &mgmt_cp->type,
2367 sizeof(mgmt_cp->type));
2368 goto unlock;
2369 }
2370
2371 if (hdev->discovery.type != mgmt_cp->type) {
2372 err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
2373 MGMT_STATUS_INVALID_PARAMS, &mgmt_cp->type,
2374 sizeof(mgmt_cp->type));
2375 goto unlock;
2376 }
2377
2378 cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, NULL, 0);
2379 if (!cmd) {
2380 err = -ENOMEM;
2381 goto unlock;
2382 }
2383
2384 if (hdev->discovery.state == DISCOVERY_FINDING) {
2385 err = hci_cancel_inquiry(hdev);
2386 if (err < 0)
2387 mgmt_pending_remove(cmd);
2388 else
2389 hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
2390 goto unlock;
2391 }
2392
2393 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_PENDING);
2394 if (!e) {
2395 mgmt_pending_remove(cmd);
2396 err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY, 0,
2397 &mgmt_cp->type, sizeof(mgmt_cp->type));
2398 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
2399 goto unlock;
2400 }
2401
2402 bacpy(&cp.bdaddr, &e->data.bdaddr);
2403 err = hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ_CANCEL, sizeof(cp),
2404 &cp);
2405 if (err < 0)
2406 mgmt_pending_remove(cmd);
2407 else
2408 hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
2409
2410 unlock:
2411 hci_dev_unlock(hdev);
2412 return err;
2413 }
2414
2415 static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
2416 u16 len)
2417 {
2418 struct mgmt_cp_confirm_name *cp = data;
2419 struct inquiry_entry *e;
2420 int err;
2421
2422 BT_DBG("%s", hdev->name);
2423
2424 hci_dev_lock(hdev);
2425
2426 if (!hci_discovery_active(hdev)) {
2427 err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
2428 MGMT_STATUS_FAILED);
2429 goto failed;
2430 }
2431
2432 e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr);
2433 if (!e) {
2434 err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
2435 MGMT_STATUS_INVALID_PARAMS);
2436 goto failed;
2437 }
2438
2439 if (cp->name_known) {
2440 e->name_state = NAME_KNOWN;
2441 list_del(&e->list);
2442 } else {
2443 e->name_state = NAME_NEEDED;
2444 hci_inquiry_cache_update_resolve(hdev, e);
2445 }
2446
2447 err = 0;
2448
2449 failed:
2450 hci_dev_unlock(hdev);
2451 return err;
2452 }
2453
2454 static int block_device(struct sock *sk, struct hci_dev *hdev, void *data,
2455 u16 len)
2456 {
2457 struct mgmt_cp_block_device *cp = data;
2458 u8 status;
2459 int err;
2460
2461 BT_DBG("%s", hdev->name);
2462
2463 hci_dev_lock(hdev);
2464
2465 err = hci_blacklist_add(hdev, &cp->addr.bdaddr, cp->addr.type);
2466 if (err < 0)
2467 status = MGMT_STATUS_FAILED;
2468 else
2469 status = 0;
2470
2471 err = cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status,
2472 &cp->addr, sizeof(cp->addr));
2473
2474 hci_dev_unlock(hdev);
2475
2476 return err;
2477 }
2478
2479 static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data,
2480 u16 len)
2481 {
2482 struct mgmt_cp_unblock_device *cp = data;
2483 u8 status;
2484 int err;
2485
2486 BT_DBG("%s", hdev->name);
2487
2488 hci_dev_lock(hdev);
2489
2490 err = hci_blacklist_del(hdev, &cp->addr.bdaddr, cp->addr.type);
2491 if (err < 0)
2492 status = MGMT_STATUS_INVALID_PARAMS;
2493 else
2494 status = 0;
2495
2496 err = cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status,
2497 &cp->addr, sizeof(cp->addr));
2498
2499 hci_dev_unlock(hdev);
2500
2501 return err;
2502 }
2503
2504 static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
2505 void *data, u16 len)
2506 {
2507 struct mgmt_mode *cp = data;
2508 struct hci_cp_write_page_scan_activity acp;
2509 u8 type;
2510 int err;
2511
2512 BT_DBG("%s", hdev->name);
2513
2514 if (!hdev_is_powered(hdev))
2515 return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
2516 MGMT_STATUS_NOT_POWERED);
2517
2518 if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
2519 return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
2520 MGMT_STATUS_REJECTED);
2521
2522 hci_dev_lock(hdev);
2523
2524 if (cp->val) {
2525 type = PAGE_SCAN_TYPE_INTERLACED;
2526
2527 /* 22.5 msec page scan interval */
2528 acp.interval = __constant_cpu_to_le16(0x0024);
2529 } else {
2530 type = PAGE_SCAN_TYPE_STANDARD; /* default */
2531
2532 /* default 1.28 sec page scan */
2533 acp.interval = __constant_cpu_to_le16(0x0800);
2534 }
2535
2536 /* default 11.25 msec page scan window */
2537 acp.window = __constant_cpu_to_le16(0x0012);
2538
2539 err = hci_send_cmd(hdev, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY, sizeof(acp),
2540 &acp);
2541 if (err < 0) {
2542 err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
2543 MGMT_STATUS_FAILED);
2544 goto done;
2545 }
2546
2547 err = hci_send_cmd(hdev, HCI_OP_WRITE_PAGE_SCAN_TYPE, 1, &type);
2548 if (err < 0) {
2549 err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
2550 MGMT_STATUS_FAILED);
2551 goto done;
2552 }
2553
2554 err = cmd_complete(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, 0,
2555 NULL, 0);
2556 done:
2557 hci_dev_unlock(hdev);
2558 return err;
2559 }
2560
2561 static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
2562 void *cp_data, u16 len)
2563 {
2564 struct mgmt_cp_load_long_term_keys *cp = cp_data;
2565 u16 key_count, expected_len;
2566 int i;
2567
2568 key_count = get_unaligned_le16(&cp->key_count);
2569
2570 expected_len = sizeof(*cp) + key_count *
2571 sizeof(struct mgmt_ltk_info);
2572 if (expected_len != len) {
2573 BT_ERR("load_keys: expected %u bytes, got %u bytes",
2574 len, expected_len);
2575 return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
2576 EINVAL);
2577 }
2578
2579 BT_DBG("%s key_count %u", hdev->name, key_count);
2580
2581 hci_dev_lock(hdev);
2582
2583 hci_smp_ltks_clear(hdev);
2584
2585 for (i = 0; i < key_count; i++) {
2586 struct mgmt_ltk_info *key = &cp->keys[i];
2587 u8 type;
2588
2589 if (key->master)
2590 type = HCI_SMP_LTK;
2591 else
2592 type = HCI_SMP_LTK_SLAVE;
2593
2594 hci_add_ltk(hdev, &key->addr.bdaddr, key->addr.type,
2595 type, 0, key->authenticated, key->val,
2596 key->enc_size, key->ediv, key->rand);
2597 }
2598
2599 hci_dev_unlock(hdev);
2600
2601 return 0;
2602 }
2603
2604 struct mgmt_handler {
2605 int (*func) (struct sock *sk, struct hci_dev *hdev, void *data,
2606 u16 data_len);
2607 bool var_len;
2608 size_t data_len;
2609 } mgmt_handlers[] = {
2610 { NULL }, /* 0x0000 (no command) */
2611 { read_version, false, MGMT_READ_VERSION_SIZE },
2612 { read_commands, false, MGMT_READ_COMMANDS_SIZE },
2613 { read_index_list, false, MGMT_READ_INDEX_LIST_SIZE },
2614 { read_controller_info, false, MGMT_READ_INFO_SIZE },
2615 { set_powered, false, MGMT_SETTING_SIZE },
2616 { set_discoverable, false, MGMT_SET_DISCOVERABLE_SIZE },
2617 { set_connectable, false, MGMT_SETTING_SIZE },
2618 { set_fast_connectable, false, MGMT_SETTING_SIZE },
2619 { set_pairable, false, MGMT_SETTING_SIZE },
2620 { set_link_security, false, MGMT_SETTING_SIZE },
2621 { set_ssp, false, MGMT_SETTING_SIZE },
2622 { set_hs, false, MGMT_SETTING_SIZE },
2623 { set_le, false, MGMT_SETTING_SIZE },
2624 { set_dev_class, false, MGMT_SET_DEV_CLASS_SIZE },
2625 { set_local_name, false, MGMT_SET_LOCAL_NAME_SIZE },
2626 { add_uuid, false, MGMT_ADD_UUID_SIZE },
2627 { remove_uuid, false, MGMT_REMOVE_UUID_SIZE },
2628 { load_link_keys, true, MGMT_LOAD_LINK_KEYS_SIZE },
2629 { load_long_term_keys, true, MGMT_LOAD_LONG_TERM_KEYS_SIZE },
2630 { disconnect, false, MGMT_DISCONNECT_SIZE },
2631 { get_connections, false, MGMT_GET_CONNECTIONS_SIZE },
2632 { pin_code_reply, false, MGMT_PIN_CODE_REPLY_SIZE },
2633 { pin_code_neg_reply, false, MGMT_PIN_CODE_NEG_REPLY_SIZE },
2634 { set_io_capability, false, MGMT_SET_IO_CAPABILITY_SIZE },
2635 { pair_device, false, MGMT_PAIR_DEVICE_SIZE },
2636 { cancel_pair_device, false, MGMT_CANCEL_PAIR_DEVICE_SIZE },
2637 { unpair_device, false, MGMT_UNPAIR_DEVICE_SIZE },
2638 { user_confirm_reply, false, MGMT_USER_CONFIRM_REPLY_SIZE },
2639 { user_confirm_neg_reply, false, MGMT_USER_CONFIRM_NEG_REPLY_SIZE },
2640 { user_passkey_reply, false, MGMT_USER_PASSKEY_REPLY_SIZE },
2641 { user_passkey_neg_reply, false, MGMT_USER_PASSKEY_NEG_REPLY_SIZE },
2642 { read_local_oob_data, false, MGMT_READ_LOCAL_OOB_DATA_SIZE },
2643 { add_remote_oob_data, false, MGMT_ADD_REMOTE_OOB_DATA_SIZE },
2644 { remove_remote_oob_data, false, MGMT_REMOVE_REMOTE_OOB_DATA_SIZE },
2645 { start_discovery, false, MGMT_START_DISCOVERY_SIZE },
2646 { stop_discovery, false, MGMT_STOP_DISCOVERY_SIZE },
2647 { confirm_name, false, MGMT_CONFIRM_NAME_SIZE },
2648 { block_device, false, MGMT_BLOCK_DEVICE_SIZE },
2649 { unblock_device, false, MGMT_UNBLOCK_DEVICE_SIZE },
2650 };
2651
2652
2653 int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
2654 {
2655 void *buf;
2656 u8 *cp;
2657 struct mgmt_hdr *hdr;
2658 u16 opcode, index, len;
2659 struct hci_dev *hdev = NULL;
2660 struct mgmt_handler *handler;
2661 int err;
2662
2663 BT_DBG("got %zu bytes", msglen);
2664
2665 if (msglen < sizeof(*hdr))
2666 return -EINVAL;
2667
2668 buf = kmalloc(msglen, GFP_KERNEL);
2669 if (!buf)
2670 return -ENOMEM;
2671
2672 if (memcpy_fromiovec(buf, msg->msg_iov, msglen)) {
2673 err = -EFAULT;
2674 goto done;
2675 }
2676
2677 hdr = buf;
2678 opcode = get_unaligned_le16(&hdr->opcode);
2679 index = get_unaligned_le16(&hdr->index);
2680 len = get_unaligned_le16(&hdr->len);
2681
2682 if (len != msglen - sizeof(*hdr)) {
2683 err = -EINVAL;
2684 goto done;
2685 }
2686
2687 if (index != MGMT_INDEX_NONE) {
2688 hdev = hci_dev_get(index);
2689 if (!hdev) {
2690 err = cmd_status(sk, index, opcode,
2691 MGMT_STATUS_INVALID_INDEX);
2692 goto done;
2693 }
2694 }
2695
2696 if (opcode >= ARRAY_SIZE(mgmt_handlers) ||
2697 mgmt_handlers[opcode].func == NULL) {
2698 BT_DBG("Unknown op %u", opcode);
2699 err = cmd_status(sk, index, opcode,
2700 MGMT_STATUS_UNKNOWN_COMMAND);
2701 goto done;
2702 }
2703
2704 if ((hdev && opcode < MGMT_OP_READ_INFO) ||
2705 (!hdev && opcode >= MGMT_OP_READ_INFO)) {
2706 err = cmd_status(sk, index, opcode,
2707 MGMT_STATUS_INVALID_INDEX);
2708 goto done;
2709 }
2710
2711 handler = &mgmt_handlers[opcode];
2712
2713 if ((handler->var_len && len < handler->data_len) ||
2714 (!handler->var_len && len != handler->data_len)) {
2715 err = cmd_status(sk, index, opcode,
2716 MGMT_STATUS_INVALID_PARAMS);
2717 goto done;
2718 }
2719
2720 if (hdev)
2721 mgmt_init_hdev(sk, hdev);
2722
2723 cp = buf + sizeof(*hdr);
2724
2725 err = handler->func(sk, hdev, cp, len);
2726 if (err < 0)
2727 goto done;
2728
2729 err = msglen;
2730
2731 done:
2732 if (hdev)
2733 hci_dev_put(hdev);
2734
2735 kfree(buf);
2736 return err;
2737 }
2738
2739 static void cmd_status_rsp(struct pending_cmd *cmd, void *data)
2740 {
2741 u8 *status = data;
2742
2743 cmd_status(cmd->sk, cmd->index, cmd->opcode, *status);
2744 mgmt_pending_remove(cmd);
2745 }
2746
2747 int mgmt_index_added(struct hci_dev *hdev)
2748 {
2749 return mgmt_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0, NULL);
2750 }
2751
2752 int mgmt_index_removed(struct hci_dev *hdev)
2753 {
2754 u8 status = MGMT_STATUS_INVALID_INDEX;
2755
2756 mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);
2757
2758 return mgmt_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0, NULL);
2759 }
2760
2761 struct cmd_lookup {
2762 struct sock *sk;
2763 struct hci_dev *hdev;
2764 u8 mgmt_status;
2765 };
2766
2767 static void settings_rsp(struct pending_cmd *cmd, void *data)
2768 {
2769 struct cmd_lookup *match = data;
2770
2771 send_settings_rsp(cmd->sk, cmd->opcode, match->hdev);
2772
2773 list_del(&cmd->list);
2774
2775 if (match->sk == NULL) {
2776 match->sk = cmd->sk;
2777 sock_hold(match->sk);
2778 }
2779
2780 mgmt_pending_free(cmd);
2781 }
2782
2783 int mgmt_powered(struct hci_dev *hdev, u8 powered)
2784 {
2785 struct cmd_lookup match = { NULL, hdev };
2786 int err;
2787
2788 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
2789 return 0;
2790
2791 mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);
2792
2793 if (powered) {
2794 u8 scan = 0;
2795
2796 if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
2797 scan |= SCAN_PAGE;
2798 if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
2799 scan |= SCAN_INQUIRY;
2800
2801 if (scan)
2802 hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
2803
2804 update_class(hdev);
2805 update_name(hdev, hdev->dev_name);
2806 update_eir(hdev);
2807 } else {
2808 u8 status = MGMT_STATUS_NOT_POWERED;
2809 mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);
2810 }
2811
2812 err = new_settings(hdev, match.sk);
2813
2814 if (match.sk)
2815 sock_put(match.sk);
2816
2817 return err;
2818 }
2819
2820 int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable)
2821 {
2822 struct cmd_lookup match = { NULL, hdev };
2823 bool changed = false;
2824 int err = 0;
2825
2826 if (discoverable) {
2827 if (!test_and_set_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
2828 changed = true;
2829 } else {
2830 if (test_and_clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
2831 changed = true;
2832 }
2833
2834 mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev, settings_rsp,
2835 &match);
2836
2837 if (changed)
2838 err = new_settings(hdev, match.sk);
2839
2840 if (match.sk)
2841 sock_put(match.sk);
2842
2843 return err;
2844 }
2845
2846 int mgmt_connectable(struct hci_dev *hdev, u8 connectable)
2847 {
2848 struct cmd_lookup match = { NULL, hdev };
2849 bool changed = false;
2850 int err = 0;
2851
2852 if (connectable) {
2853 if (!test_and_set_bit(HCI_CONNECTABLE, &hdev->dev_flags))
2854 changed = true;
2855 } else {
2856 if (test_and_clear_bit(HCI_CONNECTABLE, &hdev->dev_flags))
2857 changed = true;
2858 }
2859
2860 mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev, settings_rsp,
2861 &match);
2862
2863 if (changed)
2864 err = new_settings(hdev, match.sk);
2865
2866 if (match.sk)
2867 sock_put(match.sk);
2868
2869 return err;
2870 }
2871
2872 int mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status)
2873 {
2874 u8 mgmt_err = mgmt_status(status);
2875
2876 if (scan & SCAN_PAGE)
2877 mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev,
2878 cmd_status_rsp, &mgmt_err);
2879
2880 if (scan & SCAN_INQUIRY)
2881 mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev,
2882 cmd_status_rsp, &mgmt_err);
2883
2884 return 0;
2885 }
2886
2887 int mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key, bool persistent)
2888 {
2889 struct mgmt_ev_new_link_key ev;
2890
2891 memset(&ev, 0, sizeof(ev));
2892
2893 ev.store_hint = persistent;
2894 bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
2895 ev.key.addr.type = MGMT_ADDR_BREDR;
2896 ev.key.type = key->type;
2897 memcpy(ev.key.val, key->val, 16);
2898 ev.key.pin_len = key->pin_len;
2899
2900 return mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL);
2901 }
2902
2903 int mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, u8 persistent)
2904 {
2905 struct mgmt_ev_new_long_term_key ev;
2906
2907 memset(&ev, 0, sizeof(ev));
2908
2909 ev.store_hint = persistent;
2910 bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
2911 ev.key.addr.type = key->bdaddr_type;
2912 ev.key.authenticated = key->authenticated;
2913 ev.key.enc_size = key->enc_size;
2914 ev.key.ediv = key->ediv;
2915
2916 if (key->type == HCI_SMP_LTK)
2917 ev.key.master = 1;
2918
2919 memcpy(ev.key.rand, key->rand, sizeof(key->rand));
2920 memcpy(ev.key.val, key->val, sizeof(key->val));
2921
2922 return mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY, hdev, &ev, sizeof(ev),
2923 NULL);
2924 }
2925
2926 int mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
2927 u8 addr_type, u32 flags, u8 *name, u8 name_len,
2928 u8 *dev_class)
2929 {
2930 char buf[512];
2931 struct mgmt_ev_device_connected *ev = (void *) buf;
2932 u16 eir_len = 0;
2933
2934 bacpy(&ev->addr.bdaddr, bdaddr);
2935 ev->addr.type = link_to_mgmt(link_type, addr_type);
2936
2937 ev->flags = __cpu_to_le32(flags);
2938
2939 if (name_len > 0)
2940 eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE,
2941 name, name_len);
2942
2943 if (dev_class && memcmp(dev_class, "\0\0\0", 3) != 0)
2944 eir_len = eir_append_data(ev->eir, eir_len,
2945 EIR_CLASS_OF_DEV, dev_class, 3);
2946
2947 put_unaligned_le16(eir_len, &ev->eir_len);
2948
2949 return mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf,
2950 sizeof(*ev) + eir_len, NULL);
2951 }
2952
2953 static void disconnect_rsp(struct pending_cmd *cmd, void *data)
2954 {
2955 struct mgmt_cp_disconnect *cp = cmd->param;
2956 struct sock **sk = data;
2957 struct mgmt_rp_disconnect rp;
2958
2959 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
2960 rp.addr.type = cp->addr.type;
2961
2962 cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT, 0, &rp,
2963 sizeof(rp));
2964
2965 *sk = cmd->sk;
2966 sock_hold(*sk);
2967
2968 mgmt_pending_remove(cmd);
2969 }
2970
2971 static void unpair_device_rsp(struct pending_cmd *cmd, void *data)
2972 {
2973 struct hci_dev *hdev = data;
2974 struct mgmt_cp_unpair_device *cp = cmd->param;
2975 struct mgmt_rp_unpair_device rp;
2976
2977 memset(&rp, 0, sizeof(rp));
2978 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
2979 rp.addr.type = cp->addr.type;
2980
2981 device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, cmd->sk);
2982
2983 cmd_complete(cmd->sk, cmd->index, cmd->opcode, 0, &rp, sizeof(rp));
2984
2985 mgmt_pending_remove(cmd);
2986 }
2987
2988 int mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
2989 u8 link_type, u8 addr_type)
2990 {
2991 struct mgmt_addr_info ev;
2992 struct sock *sk = NULL;
2993 int err;
2994
2995 mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk);
2996
2997 bacpy(&ev.bdaddr, bdaddr);
2998 ev.type = link_to_mgmt(link_type, addr_type);
2999
3000 err = mgmt_event(MGMT_EV_DEVICE_DISCONNECTED, hdev, &ev, sizeof(ev),
3001 sk);
3002
3003 if (sk)
3004 sock_put(sk);
3005
3006 mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
3007 hdev);
3008
3009 return err;
3010 }
3011
3012 int mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
3013 u8 link_type, u8 addr_type, u8 status)
3014 {
3015 struct mgmt_rp_disconnect rp;
3016 struct pending_cmd *cmd;
3017 int err;
3018
3019 cmd = mgmt_pending_find(MGMT_OP_DISCONNECT, hdev);
3020 if (!cmd)
3021 return -ENOENT;
3022
3023 bacpy(&rp.addr.bdaddr, bdaddr);
3024 rp.addr.type = link_to_mgmt(link_type, addr_type);
3025
3026 err = cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT,
3027 mgmt_status(status), &rp, sizeof(rp));
3028
3029 mgmt_pending_remove(cmd);
3030
3031 mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
3032 hdev);
3033 return err;
3034 }
3035
3036 int mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3037 u8 addr_type, u8 status)
3038 {
3039 struct mgmt_ev_connect_failed ev;
3040
3041 bacpy(&ev.addr.bdaddr, bdaddr);
3042 ev.addr.type = link_to_mgmt(link_type, addr_type);
3043 ev.status = mgmt_status(status);
3044
3045 return mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL);
3046 }
3047
3048 int mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
3049 {
3050 struct mgmt_ev_pin_code_request ev;
3051
3052 bacpy(&ev.addr.bdaddr, bdaddr);
3053 ev.addr.type = MGMT_ADDR_BREDR;
3054 ev.secure = secure;
3055
3056 return mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev),
3057 NULL);
3058 }
3059
3060 int mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3061 u8 status)
3062 {
3063 struct pending_cmd *cmd;
3064 struct mgmt_rp_pin_code_reply rp;
3065 int err;
3066
3067 cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY, hdev);
3068 if (!cmd)
3069 return -ENOENT;
3070
3071 bacpy(&rp.addr.bdaddr, bdaddr);
3072 rp.addr.type = MGMT_ADDR_BREDR;
3073
3074 err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
3075 mgmt_status(status), &rp, sizeof(rp));
3076
3077 mgmt_pending_remove(cmd);
3078
3079 return err;
3080 }
3081
3082 int mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3083 u8 status)
3084 {
3085 struct pending_cmd *cmd;
3086 struct mgmt_rp_pin_code_reply rp;
3087 int err;
3088
3089 cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev);
3090 if (!cmd)
3091 return -ENOENT;
3092
3093 bacpy(&rp.addr.bdaddr, bdaddr);
3094 rp.addr.type = MGMT_ADDR_BREDR;
3095
3096 err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_NEG_REPLY,
3097 mgmt_status(status), &rp, sizeof(rp));
3098
3099 mgmt_pending_remove(cmd);
3100
3101 return err;
3102 }
3103
3104 int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
3105 u8 link_type, u8 addr_type, __le32 value,
3106 u8 confirm_hint)
3107 {
3108 struct mgmt_ev_user_confirm_request ev;
3109
3110 BT_DBG("%s", hdev->name);
3111
3112 bacpy(&ev.addr.bdaddr, bdaddr);
3113 ev.addr.type = link_to_mgmt(link_type, addr_type);
3114 ev.confirm_hint = confirm_hint;
3115 put_unaligned_le32(value, &ev.value);
3116
3117 return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev),
3118 NULL);
3119 }
3120
3121 int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
3122 u8 link_type, u8 addr_type)
3123 {
3124 struct mgmt_ev_user_passkey_request ev;
3125
3126 BT_DBG("%s", hdev->name);
3127
3128 bacpy(&ev.addr.bdaddr, bdaddr);
3129 ev.addr.type = link_to_mgmt(link_type, addr_type);
3130
3131 return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev),
3132 NULL);
3133 }
3134
3135 static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3136 u8 link_type, u8 addr_type, u8 status,
3137 u8 opcode)
3138 {
3139 struct pending_cmd *cmd;
3140 struct mgmt_rp_user_confirm_reply rp;
3141 int err;
3142
3143 cmd = mgmt_pending_find(opcode, hdev);
3144 if (!cmd)
3145 return -ENOENT;
3146
3147 bacpy(&rp.addr.bdaddr, bdaddr);
3148 rp.addr.type = link_to_mgmt(link_type, addr_type);
3149 err = cmd_complete(cmd->sk, hdev->id, opcode, mgmt_status(status),
3150 &rp, sizeof(rp));
3151
3152 mgmt_pending_remove(cmd);
3153
3154 return err;
3155 }
3156
3157 int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3158 u8 link_type, u8 addr_type, u8 status)
3159 {
3160 return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
3161 status, MGMT_OP_USER_CONFIRM_REPLY);
3162 }
3163
3164 int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3165 u8 link_type, u8 addr_type, u8 status)
3166 {
3167 return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
3168 status, MGMT_OP_USER_CONFIRM_NEG_REPLY);
3169 }
3170
3171 int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3172 u8 link_type, u8 addr_type, u8 status)
3173 {
3174 return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
3175 status, MGMT_OP_USER_PASSKEY_REPLY);
3176 }
3177
3178 int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3179 u8 link_type, u8 addr_type, u8 status)
3180 {
3181 return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
3182 status, MGMT_OP_USER_PASSKEY_NEG_REPLY);
3183 }
3184
3185 int mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3186 u8 addr_type, u8 status)
3187 {
3188 struct mgmt_ev_auth_failed ev;
3189
3190 bacpy(&ev.addr.bdaddr, bdaddr);
3191 ev.addr.type = link_to_mgmt(link_type, addr_type);
3192 ev.status = mgmt_status(status);
3193
3194 return mgmt_event(MGMT_EV_AUTH_FAILED, hdev, &ev, sizeof(ev), NULL);
3195 }
3196
3197 int mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
3198 {
3199 struct cmd_lookup match = { NULL, hdev };
3200 bool changed = false;
3201 int err = 0;
3202
3203 if (status) {
3204 u8 mgmt_err = mgmt_status(status);
3205 mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev,
3206 cmd_status_rsp, &mgmt_err);
3207 return 0;
3208 }
3209
3210 if (test_bit(HCI_AUTH, &hdev->flags)) {
3211 if (!test_and_set_bit(HCI_LINK_SECURITY, &hdev->dev_flags))
3212 changed = true;
3213 } else {
3214 if (test_and_clear_bit(HCI_LINK_SECURITY, &hdev->dev_flags))
3215 changed = true;
3216 }
3217
3218 mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp,
3219 &match);
3220
3221 if (changed)
3222 err = new_settings(hdev, match.sk);
3223
3224 if (match.sk)
3225 sock_put(match.sk);
3226
3227 return err;
3228 }
3229
3230 static int clear_eir(struct hci_dev *hdev)
3231 {
3232 struct hci_cp_write_eir cp;
3233
3234 if (!(hdev->features[6] & LMP_EXT_INQ))
3235 return 0;
3236
3237 memset(hdev->eir, 0, sizeof(hdev->eir));
3238
3239 memset(&cp, 0, sizeof(cp));
3240
3241 return hci_send_cmd(hdev, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
3242 }
3243
3244 int mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
3245 {
3246 struct cmd_lookup match = { NULL, hdev };
3247 bool changed = false;
3248 int err = 0;
3249
3250 if (status) {
3251 u8 mgmt_err = mgmt_status(status);
3252
3253 if (enable && test_and_clear_bit(HCI_SSP_ENABLED,
3254 &hdev->dev_flags))
3255 err = new_settings(hdev, NULL);
3256
3257 mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp,
3258 &mgmt_err);
3259
3260 return err;
3261 }
3262
3263 if (enable) {
3264 if (!test_and_set_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
3265 changed = true;
3266 } else {
3267 if (test_and_clear_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
3268 changed = true;
3269 }
3270
3271 mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, settings_rsp, &match);
3272
3273 if (changed)
3274 err = new_settings(hdev, match.sk);
3275
3276 if (match.sk)
3277 sock_put(match.sk);
3278
3279 if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
3280 update_eir(hdev);
3281 else
3282 clear_eir(hdev);
3283
3284 return err;
3285 }
3286
3287 static void class_rsp(struct pending_cmd *cmd, void *data)
3288 {
3289 struct cmd_lookup *match = data;
3290
3291 cmd_complete(cmd->sk, cmd->index, cmd->opcode, match->mgmt_status,
3292 match->hdev->dev_class, 3);
3293
3294 list_del(&cmd->list);
3295
3296 if (match->sk == NULL) {
3297 match->sk = cmd->sk;
3298 sock_hold(match->sk);
3299 }
3300
3301 mgmt_pending_free(cmd);
3302 }
3303
3304 int mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
3305 u8 status)
3306 {
3307 struct cmd_lookup match = { NULL, hdev, mgmt_status(status) };
3308 int err = 0;
3309
3310 clear_bit(HCI_PENDING_CLASS, &hdev->dev_flags);
3311
3312 mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, class_rsp, &match);
3313 mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, class_rsp, &match);
3314 mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, class_rsp, &match);
3315
3316 if (!status)
3317 err = mgmt_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class,
3318 3, NULL);
3319
3320 if (match.sk)
3321 sock_put(match.sk);
3322
3323 return err;
3324 }
3325
3326 int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
3327 {
3328 struct pending_cmd *cmd;
3329 struct mgmt_cp_set_local_name ev;
3330 bool changed = false;
3331 int err = 0;
3332
3333 if (memcmp(name, hdev->dev_name, sizeof(hdev->dev_name)) != 0) {
3334 memcpy(hdev->dev_name, name, sizeof(hdev->dev_name));
3335 changed = true;
3336 }
3337
3338 memset(&ev, 0, sizeof(ev));
3339 memcpy(ev.name, name, HCI_MAX_NAME_LENGTH);
3340 memcpy(ev.short_name, hdev->short_name, HCI_MAX_SHORT_NAME_LENGTH);
3341
3342 cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
3343 if (!cmd)
3344 goto send_event;
3345
3346 /* Always assume that either the short or the complete name has
3347 * changed if there was a pending mgmt command */
3348 changed = true;
3349
3350 if (status) {
3351 err = cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME,
3352 mgmt_status(status));
3353 goto failed;
3354 }
3355
3356 err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0, &ev,
3357 sizeof(ev));
3358 if (err < 0)
3359 goto failed;
3360
3361 send_event:
3362 if (changed)
3363 err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev,
3364 sizeof(ev), cmd ? cmd->sk : NULL);
3365
3366 update_eir(hdev);
3367
3368 failed:
3369 if (cmd)
3370 mgmt_pending_remove(cmd);
3371 return err;
3372 }
3373
3374 int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
3375 u8 *randomizer, u8 status)
3376 {
3377 struct pending_cmd *cmd;
3378 int err;
3379
3380 BT_DBG("%s status %u", hdev->name, status);
3381
3382 cmd = mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev);
3383 if (!cmd)
3384 return -ENOENT;
3385
3386 if (status) {
3387 err = cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
3388 mgmt_status(status));
3389 } else {
3390 struct mgmt_rp_read_local_oob_data rp;
3391
3392 memcpy(rp.hash, hash, sizeof(rp.hash));
3393 memcpy(rp.randomizer, randomizer, sizeof(rp.randomizer));
3394
3395 err = cmd_complete(cmd->sk, hdev->id,
3396 MGMT_OP_READ_LOCAL_OOB_DATA, 0, &rp,
3397 sizeof(rp));
3398 }
3399
3400 mgmt_pending_remove(cmd);
3401
3402 return err;
3403 }
3404
3405 int mgmt_le_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
3406 {
3407 struct cmd_lookup match = { NULL, hdev };
3408 bool changed = false;
3409 int err = 0;
3410
3411 if (status) {
3412 u8 mgmt_err = mgmt_status(status);
3413
3414 if (enable && test_and_clear_bit(HCI_LE_ENABLED,
3415 &hdev->dev_flags))
3416 err = new_settings(hdev, NULL);
3417
3418 mgmt_pending_foreach(MGMT_OP_SET_LE, hdev,
3419 cmd_status_rsp, &mgmt_err);
3420
3421 return err;
3422 }
3423
3424 if (enable) {
3425 if (!test_and_set_bit(HCI_LE_ENABLED, &hdev->dev_flags))
3426 changed = true;
3427 } else {
3428 if (test_and_clear_bit(HCI_LE_ENABLED, &hdev->dev_flags))
3429 changed = true;
3430 }
3431
3432 mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, settings_rsp, &match);
3433
3434 if (changed)
3435 err = new_settings(hdev, match.sk);
3436
3437 if (match.sk)
3438 sock_put(match.sk);
3439
3440 return err;
3441 }
3442
3443 int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3444 u8 addr_type, u8 *dev_class, s8 rssi, u8 cfm_name, u8
3445 ssp, u8 *eir, u16 eir_len)
3446 {
3447 char buf[512];
3448 struct mgmt_ev_device_found *ev = (void *) buf;
3449 size_t ev_size;
3450
3451 /* Leave 5 bytes for a potential CoD field */
3452 if (sizeof(*ev) + eir_len + 5 > sizeof(buf))
3453 return -EINVAL;
3454
3455 memset(buf, 0, sizeof(buf));
3456
3457 bacpy(&ev->addr.bdaddr, bdaddr);
3458 ev->addr.type = link_to_mgmt(link_type, addr_type);
3459 ev->rssi = rssi;
3460 if (cfm_name)
3461 ev->flags[0] |= MGMT_DEV_FOUND_CONFIRM_NAME;
3462 if (!ssp)
3463 ev->flags[0] |= MGMT_DEV_FOUND_LEGACY_PAIRING;
3464
3465 if (eir_len > 0)
3466 memcpy(ev->eir, eir, eir_len);
3467
3468 if (dev_class && !eir_has_data_type(ev->eir, eir_len, EIR_CLASS_OF_DEV))
3469 eir_len = eir_append_data(ev->eir, eir_len, EIR_CLASS_OF_DEV,
3470 dev_class, 3);
3471
3472 put_unaligned_le16(eir_len, &ev->eir_len);
3473
3474 ev_size = sizeof(*ev) + eir_len;
3475
3476 return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL);
3477 }
3478
3479 int mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3480 u8 addr_type, s8 rssi, u8 *name, u8 name_len)
3481 {
3482 struct mgmt_ev_device_found *ev;
3483 char buf[sizeof(*ev) + HCI_MAX_NAME_LENGTH + 2];
3484 u16 eir_len;
3485
3486 ev = (struct mgmt_ev_device_found *) buf;
3487
3488 memset(buf, 0, sizeof(buf));
3489
3490 bacpy(&ev->addr.bdaddr, bdaddr);
3491 ev->addr.type = link_to_mgmt(link_type, addr_type);
3492 ev->rssi = rssi;
3493
3494 eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name,
3495 name_len);
3496
3497 put_unaligned_le16(eir_len, &ev->eir_len);
3498
3499 return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev,
3500 sizeof(*ev) + eir_len, NULL);
3501 }
3502
3503 int mgmt_start_discovery_failed(struct hci_dev *hdev, u8 status)
3504 {
3505 struct pending_cmd *cmd;
3506 u8 type;
3507 int err;
3508
3509 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
3510
3511 cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
3512 if (!cmd)
3513 return -ENOENT;
3514
3515 type = hdev->discovery.type;
3516
3517 err = cmd_complete(cmd->sk, hdev->id, cmd->opcode, mgmt_status(status),
3518 &type, sizeof(type));
3519 mgmt_pending_remove(cmd);
3520
3521 return err;
3522 }
3523
3524 int mgmt_stop_discovery_failed(struct hci_dev *hdev, u8 status)
3525 {
3526 struct pending_cmd *cmd;
3527 int err;
3528
3529 cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
3530 if (!cmd)
3531 return -ENOENT;
3532
3533 err = cmd_complete(cmd->sk, hdev->id, cmd->opcode, mgmt_status(status),
3534 &hdev->discovery.type, sizeof(hdev->discovery.type));
3535 mgmt_pending_remove(cmd);
3536
3537 return err;
3538 }
3539
3540 int mgmt_discovering(struct hci_dev *hdev, u8 discovering)
3541 {
3542 struct mgmt_ev_discovering ev;
3543 struct pending_cmd *cmd;
3544
3545 BT_DBG("%s discovering %u", hdev->name, discovering);
3546
3547 if (discovering)
3548 cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
3549 else
3550 cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
3551
3552 if (cmd != NULL) {
3553 u8 type = hdev->discovery.type;
3554
3555 cmd_complete(cmd->sk, hdev->id, cmd->opcode, 0, &type,
3556 sizeof(type));
3557 mgmt_pending_remove(cmd);
3558 }
3559
3560 memset(&ev, 0, sizeof(ev));
3561 ev.type = hdev->discovery.type;
3562 ev.discovering = discovering;
3563
3564 return mgmt_event(MGMT_EV_DISCOVERING, hdev, &ev, sizeof(ev), NULL);
3565 }
3566
3567 int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
3568 {
3569 struct pending_cmd *cmd;
3570 struct mgmt_ev_device_blocked ev;
3571
3572 cmd = mgmt_pending_find(MGMT_OP_BLOCK_DEVICE, hdev);
3573
3574 bacpy(&ev.addr.bdaddr, bdaddr);
3575 ev.addr.type = type;
3576
3577 return mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &ev, sizeof(ev),
3578 cmd ? cmd->sk : NULL);
3579 }
3580
3581 int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
3582 {
3583 struct pending_cmd *cmd;
3584 struct mgmt_ev_device_unblocked ev;
3585
3586 cmd = mgmt_pending_find(MGMT_OP_UNBLOCK_DEVICE, hdev);
3587
3588 bacpy(&ev.addr.bdaddr, bdaddr);
3589 ev.addr.type = type;
3590
3591 return mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &ev, sizeof(ev),
3592 cmd ? cmd->sk : NULL);
3593 }
3594
3595 module_param(enable_hs, bool, 0644);
3596 MODULE_PARM_DESC(enable_hs, "Enable High Speed support");
3597
3598 module_param(enable_le, bool, 0644);
3599 MODULE_PARM_DESC(enable_le, "Enable Low Energy support");