2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2010 Nokia Corporation
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License version 2 as
7 published by the Free Software Foundation;
9 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
10 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
11 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
12 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
13 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
19 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
20 SOFTWARE IS DISCLAIMED.
23 /* Bluetooth HCI Management interface */
25 #include <linux/kernel.h>
26 #include <linux/uaccess.h>
27 #include <asm/unaligned.h>
29 #include <net/bluetooth/bluetooth.h>
30 #include <net/bluetooth/hci_core.h>
31 #include <net/bluetooth/mgmt.h>
33 #define MGMT_VERSION 0
34 #define MGMT_REVISION 1
36 #define INQUIRY_LEN_BREDR 0x08 /* TGAP(100) */
39 struct list_head list;
47 /* HCI to MGMT error code conversion table */
48 static u8 mgmt_status_table[] = {
50 MGMT_STATUS_UNKNOWN_COMMAND, /* Unknown Command */
51 MGMT_STATUS_NOT_CONNECTED, /* No Connection */
52 MGMT_STATUS_FAILED, /* Hardware Failure */
53 MGMT_STATUS_CONNECT_FAILED, /* Page Timeout */
54 MGMT_STATUS_AUTH_FAILED, /* Authentication Failed */
55 MGMT_STATUS_NOT_PAIRED, /* PIN or Key Missing */
56 MGMT_STATUS_NO_RESOURCES, /* Memory Full */
57 MGMT_STATUS_TIMEOUT, /* Connection Timeout */
58 MGMT_STATUS_NO_RESOURCES, /* Max Number of Connections */
59 MGMT_STATUS_NO_RESOURCES, /* Max Number of SCO Connections */
60 MGMT_STATUS_ALREADY_CONNECTED, /* ACL Connection Exists */
61 MGMT_STATUS_BUSY, /* Command Disallowed */
62 MGMT_STATUS_NO_RESOURCES, /* Rejected Limited Resources */
63 MGMT_STATUS_REJECTED, /* Rejected Security */
64 MGMT_STATUS_REJECTED, /* Rejected Personal */
65 MGMT_STATUS_TIMEOUT, /* Host Timeout */
66 MGMT_STATUS_NOT_SUPPORTED, /* Unsupported Feature */
67 MGMT_STATUS_INVALID_PARAMS, /* Invalid Parameters */
68 MGMT_STATUS_DISCONNECTED, /* OE User Ended Connection */
69 MGMT_STATUS_NO_RESOURCES, /* OE Low Resources */
70 MGMT_STATUS_DISCONNECTED, /* OE Power Off */
71 MGMT_STATUS_DISCONNECTED, /* Connection Terminated */
72 MGMT_STATUS_BUSY, /* Repeated Attempts */
73 MGMT_STATUS_REJECTED, /* Pairing Not Allowed */
74 MGMT_STATUS_FAILED, /* Unknown LMP PDU */
75 MGMT_STATUS_NOT_SUPPORTED, /* Unsupported Remote Feature */
76 MGMT_STATUS_REJECTED, /* SCO Offset Rejected */
77 MGMT_STATUS_REJECTED, /* SCO Interval Rejected */
78 MGMT_STATUS_REJECTED, /* Air Mode Rejected */
79 MGMT_STATUS_INVALID_PARAMS, /* Invalid LMP Parameters */
80 MGMT_STATUS_FAILED, /* Unspecified Error */
81 MGMT_STATUS_NOT_SUPPORTED, /* Unsupported LMP Parameter Value */
82 MGMT_STATUS_FAILED, /* Role Change Not Allowed */
83 MGMT_STATUS_TIMEOUT, /* LMP Response Timeout */
84 MGMT_STATUS_FAILED, /* LMP Error Transaction Collision */
85 MGMT_STATUS_FAILED, /* LMP PDU Not Allowed */
86 MGMT_STATUS_REJECTED, /* Encryption Mode Not Accepted */
87 MGMT_STATUS_FAILED, /* Unit Link Key Used */
88 MGMT_STATUS_NOT_SUPPORTED, /* QoS Not Supported */
89 MGMT_STATUS_TIMEOUT, /* Instant Passed */
90 MGMT_STATUS_NOT_SUPPORTED, /* Pairing Not Supported */
91 MGMT_STATUS_FAILED, /* Transaction Collision */
92 MGMT_STATUS_INVALID_PARAMS, /* Unacceptable Parameter */
93 MGMT_STATUS_REJECTED, /* QoS Rejected */
94 MGMT_STATUS_NOT_SUPPORTED, /* Classification Not Supported */
95 MGMT_STATUS_REJECTED, /* Insufficient Security */
96 MGMT_STATUS_INVALID_PARAMS, /* Parameter Out Of Range */
97 MGMT_STATUS_BUSY, /* Role Switch Pending */
98 MGMT_STATUS_FAILED, /* Slot Violation */
99 MGMT_STATUS_FAILED, /* Role Switch Failed */
100 MGMT_STATUS_INVALID_PARAMS, /* EIR Too Large */
101 MGMT_STATUS_NOT_SUPPORTED, /* Simple Pairing Not Supported */
102 MGMT_STATUS_BUSY, /* Host Busy Pairing */
103 MGMT_STATUS_REJECTED, /* Rejected, No Suitable Channel */
104 MGMT_STATUS_BUSY, /* Controller Busy */
105 MGMT_STATUS_INVALID_PARAMS, /* Unsuitable Connection Interval */
106 MGMT_STATUS_TIMEOUT, /* Directed Advertising Timeout */
107 MGMT_STATUS_AUTH_FAILED, /* Terminated Due to MIC Failure */
108 MGMT_STATUS_CONNECT_FAILED, /* Connection Establishment Failed */
109 MGMT_STATUS_CONNECT_FAILED, /* MAC Connection Failed */
112 static u8 mgmt_status(u8 hci_status)
114 if (hci_status < ARRAY_SIZE(mgmt_status_table))
115 return mgmt_status_table[hci_status];
117 return MGMT_STATUS_FAILED;
120 static int cmd_status(struct sock *sk, u16 index, u16 cmd, u8 status)
123 struct mgmt_hdr *hdr;
124 struct mgmt_ev_cmd_status *ev;
127 BT_DBG("sock %p, index %u, cmd %u, status %u", sk, index, cmd, status);
129 skb = alloc_skb(sizeof(*hdr) + sizeof(*ev), GFP_ATOMIC);
133 hdr = (void *) skb_put(skb, sizeof(*hdr));
135 hdr->opcode = cpu_to_le16(MGMT_EV_CMD_STATUS);
136 hdr->index = cpu_to_le16(index);
137 hdr->len = cpu_to_le16(sizeof(*ev));
139 ev = (void *) skb_put(skb, sizeof(*ev));
141 put_unaligned_le16(cmd, &ev->opcode);
143 err = sock_queue_rcv_skb(sk, skb);
150 static int cmd_complete(struct sock *sk, u16 index, u16 cmd, void *rp,
154 struct mgmt_hdr *hdr;
155 struct mgmt_ev_cmd_complete *ev;
158 BT_DBG("sock %p", sk);
160 skb = alloc_skb(sizeof(*hdr) + sizeof(*ev) + rp_len, GFP_ATOMIC);
164 hdr = (void *) skb_put(skb, sizeof(*hdr));
166 hdr->opcode = cpu_to_le16(MGMT_EV_CMD_COMPLETE);
167 hdr->index = cpu_to_le16(index);
168 hdr->len = cpu_to_le16(sizeof(*ev) + rp_len);
170 ev = (void *) skb_put(skb, sizeof(*ev) + rp_len);
171 put_unaligned_le16(cmd, &ev->opcode);
174 memcpy(ev->data, rp, rp_len);
176 err = sock_queue_rcv_skb(sk, skb);
183 static int read_version(struct sock *sk)
185 struct mgmt_rp_read_version rp;
187 BT_DBG("sock %p", sk);
189 rp.version = MGMT_VERSION;
190 put_unaligned_le16(MGMT_REVISION, &rp.revision);
192 return cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_VERSION, &rp,
196 static int read_index_list(struct sock *sk)
198 struct mgmt_rp_read_index_list *rp;
205 BT_DBG("sock %p", sk);
207 read_lock(&hci_dev_list_lock);
210 list_for_each(p, &hci_dev_list) {
214 rp_len = sizeof(*rp) + (2 * count);
215 rp = kmalloc(rp_len, GFP_ATOMIC);
217 read_unlock(&hci_dev_list_lock);
221 put_unaligned_le16(count, &rp->num_controllers);
224 list_for_each_entry(d, &hci_dev_list, list) {
225 if (test_and_clear_bit(HCI_AUTO_OFF, &d->flags))
226 cancel_delayed_work(&d->power_off);
228 if (test_bit(HCI_SETUP, &d->flags))
231 put_unaligned_le16(d->id, &rp->index[i++]);
232 BT_DBG("Added hci%u", d->id);
235 read_unlock(&hci_dev_list_lock);
237 err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_INDEX_LIST, rp,
245 static int read_controller_info(struct sock *sk, u16 index)
247 struct mgmt_rp_read_info rp;
248 struct hci_dev *hdev;
250 BT_DBG("sock %p hci%u", sk, index);
252 hdev = hci_dev_get(index);
254 return cmd_status(sk, index, MGMT_OP_READ_INFO,
255 MGMT_STATUS_INVALID_PARAMS);
257 if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->flags))
258 cancel_delayed_work_sync(&hdev->power_off);
262 set_bit(HCI_MGMT, &hdev->flags);
264 memset(&rp, 0, sizeof(rp));
266 rp.type = hdev->dev_type;
268 rp.powered = test_bit(HCI_UP, &hdev->flags);
269 rp.connectable = test_bit(HCI_PSCAN, &hdev->flags);
270 rp.discoverable = test_bit(HCI_ISCAN, &hdev->flags);
271 rp.pairable = test_bit(HCI_PSCAN, &hdev->flags);
273 if (test_bit(HCI_AUTH, &hdev->flags))
275 else if (hdev->ssp_mode > 0)
280 bacpy(&rp.bdaddr, &hdev->bdaddr);
281 memcpy(rp.features, hdev->features, 8);
282 memcpy(rp.dev_class, hdev->dev_class, 3);
283 put_unaligned_le16(hdev->manufacturer, &rp.manufacturer);
284 rp.hci_ver = hdev->hci_ver;
285 put_unaligned_le16(hdev->hci_rev, &rp.hci_rev);
287 memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name));
289 hci_dev_unlock(hdev);
292 return cmd_complete(sk, index, MGMT_OP_READ_INFO, &rp, sizeof(rp));
295 static void mgmt_pending_free(struct pending_cmd *cmd)
302 static struct pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode,
303 struct hci_dev *hdev,
306 struct pending_cmd *cmd;
308 cmd = kmalloc(sizeof(*cmd), GFP_ATOMIC);
312 cmd->opcode = opcode;
313 cmd->index = hdev->id;
315 cmd->param = kmalloc(len, GFP_ATOMIC);
322 memcpy(cmd->param, data, len);
327 list_add(&cmd->list, &hdev->mgmt_pending);
332 static void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev,
333 void (*cb)(struct pending_cmd *cmd, void *data),
336 struct list_head *p, *n;
338 list_for_each_safe(p, n, &hdev->mgmt_pending) {
339 struct pending_cmd *cmd;
341 cmd = list_entry(p, struct pending_cmd, list);
343 if (opcode > 0 && cmd->opcode != opcode)
350 static struct pending_cmd *mgmt_pending_find(u16 opcode, struct hci_dev *hdev)
352 struct pending_cmd *cmd;
354 list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
355 if (cmd->opcode == opcode)
362 static void mgmt_pending_remove(struct pending_cmd *cmd)
364 list_del(&cmd->list);
365 mgmt_pending_free(cmd);
368 static int send_mode_rsp(struct sock *sk, u16 opcode, u16 index, u8 val)
374 return cmd_complete(sk, index, opcode, &rp, sizeof(rp));
377 static int set_powered(struct sock *sk, u16 index, unsigned char *data, u16 len)
379 struct mgmt_mode *cp;
380 struct hci_dev *hdev;
381 struct pending_cmd *cmd;
386 BT_DBG("request for hci%u", index);
388 if (len != sizeof(*cp))
389 return cmd_status(sk, index, MGMT_OP_SET_POWERED,
390 MGMT_STATUS_INVALID_PARAMS);
392 hdev = hci_dev_get(index);
394 return cmd_status(sk, index, MGMT_OP_SET_POWERED,
395 MGMT_STATUS_INVALID_PARAMS);
399 up = test_bit(HCI_UP, &hdev->flags);
400 if ((cp->val && up) || (!cp->val && !up)) {
401 err = send_mode_rsp(sk, index, MGMT_OP_SET_POWERED, cp->val);
405 if (mgmt_pending_find(MGMT_OP_SET_POWERED, hdev)) {
406 err = cmd_status(sk, index, MGMT_OP_SET_POWERED,
411 cmd = mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev, data, len);
418 schedule_work(&hdev->power_on);
420 schedule_work(&hdev->power_off.work);
425 hci_dev_unlock(hdev);
430 static int set_discoverable(struct sock *sk, u16 index, unsigned char *data,
433 struct mgmt_cp_set_discoverable *cp;
434 struct hci_dev *hdev;
435 struct pending_cmd *cmd;
441 BT_DBG("request for hci%u", index);
443 if (len != sizeof(*cp))
444 return cmd_status(sk, index, MGMT_OP_SET_DISCOVERABLE,
445 MGMT_STATUS_INVALID_PARAMS);
447 hdev = hci_dev_get(index);
449 return cmd_status(sk, index, MGMT_OP_SET_DISCOVERABLE,
450 MGMT_STATUS_INVALID_PARAMS);
454 if (!test_bit(HCI_UP, &hdev->flags)) {
455 err = cmd_status(sk, index, MGMT_OP_SET_DISCOVERABLE,
456 MGMT_STATUS_NOT_POWERED);
460 if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
461 mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
462 err = cmd_status(sk, index, MGMT_OP_SET_DISCOVERABLE,
467 if (cp->val == test_bit(HCI_ISCAN, &hdev->flags) &&
468 test_bit(HCI_PSCAN, &hdev->flags)) {
469 err = send_mode_rsp(sk, index, MGMT_OP_SET_DISCOVERABLE,
474 cmd = mgmt_pending_add(sk, MGMT_OP_SET_DISCOVERABLE, hdev, data, len);
483 scan |= SCAN_INQUIRY;
485 cancel_delayed_work(&hdev->discov_off);
487 err = hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
489 mgmt_pending_remove(cmd);
492 hdev->discov_timeout = get_unaligned_le16(&cp->timeout);
495 hci_dev_unlock(hdev);
501 static int set_connectable(struct sock *sk, u16 index, unsigned char *data,
504 struct mgmt_mode *cp;
505 struct hci_dev *hdev;
506 struct pending_cmd *cmd;
512 BT_DBG("request for hci%u", index);
514 if (len != sizeof(*cp))
515 return cmd_status(sk, index, MGMT_OP_SET_CONNECTABLE,
516 MGMT_STATUS_INVALID_PARAMS);
518 hdev = hci_dev_get(index);
520 return cmd_status(sk, index, MGMT_OP_SET_CONNECTABLE,
521 MGMT_STATUS_INVALID_PARAMS);
525 if (!test_bit(HCI_UP, &hdev->flags)) {
526 err = cmd_status(sk, index, MGMT_OP_SET_CONNECTABLE,
527 MGMT_STATUS_NOT_POWERED);
531 if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
532 mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
533 err = cmd_status(sk, index, MGMT_OP_SET_CONNECTABLE,
538 if (cp->val == test_bit(HCI_PSCAN, &hdev->flags)) {
539 err = send_mode_rsp(sk, index, MGMT_OP_SET_CONNECTABLE,
544 cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, hdev, data, len);
555 err = hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
557 mgmt_pending_remove(cmd);
560 hci_dev_unlock(hdev);
566 static int mgmt_event(u16 event, struct hci_dev *hdev, void *data,
567 u16 data_len, struct sock *skip_sk)
570 struct mgmt_hdr *hdr;
572 skb = alloc_skb(sizeof(*hdr) + data_len, GFP_ATOMIC);
576 bt_cb(skb)->channel = HCI_CHANNEL_CONTROL;
578 hdr = (void *) skb_put(skb, sizeof(*hdr));
579 hdr->opcode = cpu_to_le16(event);
581 hdr->index = cpu_to_le16(hdev->id);
583 hdr->index = cpu_to_le16(MGMT_INDEX_NONE);
584 hdr->len = cpu_to_le16(data_len);
587 memcpy(skb_put(skb, data_len), data, data_len);
589 hci_send_to_sock(NULL, skb, skip_sk);
595 static int set_pairable(struct sock *sk, u16 index, unsigned char *data,
598 struct mgmt_mode *cp, ev;
599 struct hci_dev *hdev;
604 BT_DBG("request for hci%u", index);
606 if (len != sizeof(*cp))
607 return cmd_status(sk, index, MGMT_OP_SET_PAIRABLE,
608 MGMT_STATUS_INVALID_PARAMS);
610 hdev = hci_dev_get(index);
612 return cmd_status(sk, index, MGMT_OP_SET_PAIRABLE,
613 MGMT_STATUS_INVALID_PARAMS);
618 set_bit(HCI_PAIRABLE, &hdev->flags);
620 clear_bit(HCI_PAIRABLE, &hdev->flags);
622 err = send_mode_rsp(sk, MGMT_OP_SET_PAIRABLE, index, cp->val);
628 err = mgmt_event(MGMT_EV_PAIRABLE, hdev, &ev, sizeof(ev), sk);
631 hci_dev_unlock(hdev);
637 #define EIR_FLAGS 0x01 /* flags */
638 #define EIR_UUID16_SOME 0x02 /* 16-bit UUID, more available */
639 #define EIR_UUID16_ALL 0x03 /* 16-bit UUID, all listed */
640 #define EIR_UUID32_SOME 0x04 /* 32-bit UUID, more available */
641 #define EIR_UUID32_ALL 0x05 /* 32-bit UUID, all listed */
642 #define EIR_UUID128_SOME 0x06 /* 128-bit UUID, more available */
643 #define EIR_UUID128_ALL 0x07 /* 128-bit UUID, all listed */
644 #define EIR_NAME_SHORT 0x08 /* shortened local name */
645 #define EIR_NAME_COMPLETE 0x09 /* complete local name */
646 #define EIR_TX_POWER 0x0A /* transmit power level */
647 #define EIR_DEVICE_ID 0x10 /* device ID */
649 #define PNP_INFO_SVCLASS_ID 0x1200
651 static u8 bluetooth_base_uuid[] = {
652 0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80,
653 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
656 static u16 get_uuid16(u8 *uuid128)
661 for (i = 0; i < 12; i++) {
662 if (bluetooth_base_uuid[i] != uuid128[i])
666 memcpy(&val, &uuid128[12], 4);
668 val = le32_to_cpu(val);
675 static void create_eir(struct hci_dev *hdev, u8 *data)
679 u16 uuid16_list[HCI_MAX_EIR_LENGTH / sizeof(u16)];
680 int i, truncated = 0;
681 struct bt_uuid *uuid;
684 name_len = strlen(hdev->dev_name);
690 ptr[1] = EIR_NAME_SHORT;
692 ptr[1] = EIR_NAME_COMPLETE;
694 /* EIR Data length */
695 ptr[0] = name_len + 1;
697 memcpy(ptr + 2, hdev->dev_name, name_len);
699 eir_len += (name_len + 2);
700 ptr += (name_len + 2);
703 memset(uuid16_list, 0, sizeof(uuid16_list));
705 /* Group all UUID16 types */
706 list_for_each_entry(uuid, &hdev->uuids, list) {
709 uuid16 = get_uuid16(uuid->uuid);
716 if (uuid16 == PNP_INFO_SVCLASS_ID)
719 /* Stop if not enough space to put next UUID */
720 if (eir_len + 2 + sizeof(u16) > HCI_MAX_EIR_LENGTH) {
725 /* Check for duplicates */
726 for (i = 0; uuid16_list[i] != 0; i++)
727 if (uuid16_list[i] == uuid16)
730 if (uuid16_list[i] == 0) {
731 uuid16_list[i] = uuid16;
732 eir_len += sizeof(u16);
736 if (uuid16_list[0] != 0) {
740 ptr[1] = truncated ? EIR_UUID16_SOME : EIR_UUID16_ALL;
745 for (i = 0; uuid16_list[i] != 0; i++) {
746 *ptr++ = (uuid16_list[i] & 0x00ff);
747 *ptr++ = (uuid16_list[i] & 0xff00) >> 8;
750 /* EIR Data length */
751 *length = (i * sizeof(u16)) + 1;
755 static int update_eir(struct hci_dev *hdev)
757 struct hci_cp_write_eir cp;
759 if (!(hdev->features[6] & LMP_EXT_INQ))
762 if (hdev->ssp_mode == 0)
765 if (test_bit(HCI_SERVICE_CACHE, &hdev->flags))
768 memset(&cp, 0, sizeof(cp));
770 create_eir(hdev, cp.data);
772 if (memcmp(cp.data, hdev->eir, sizeof(cp.data)) == 0)
775 memcpy(hdev->eir, cp.data, sizeof(cp.data));
777 return hci_send_cmd(hdev, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
780 static u8 get_service_classes(struct hci_dev *hdev)
782 struct bt_uuid *uuid;
785 list_for_each_entry(uuid, &hdev->uuids, list)
786 val |= uuid->svc_hint;
791 static int update_class(struct hci_dev *hdev)
795 BT_DBG("%s", hdev->name);
797 if (test_bit(HCI_SERVICE_CACHE, &hdev->flags))
800 cod[0] = hdev->minor_class;
801 cod[1] = hdev->major_class;
802 cod[2] = get_service_classes(hdev);
804 if (memcmp(cod, hdev->dev_class, 3) == 0)
807 return hci_send_cmd(hdev, HCI_OP_WRITE_CLASS_OF_DEV, sizeof(cod), cod);
810 static int add_uuid(struct sock *sk, u16 index, unsigned char *data, u16 len)
812 struct mgmt_cp_add_uuid *cp;
813 struct hci_dev *hdev;
814 struct bt_uuid *uuid;
819 BT_DBG("request for hci%u", index);
821 if (len != sizeof(*cp))
822 return cmd_status(sk, index, MGMT_OP_ADD_UUID,
823 MGMT_STATUS_INVALID_PARAMS);
825 hdev = hci_dev_get(index);
827 return cmd_status(sk, index, MGMT_OP_ADD_UUID,
828 MGMT_STATUS_INVALID_PARAMS);
832 uuid = kmalloc(sizeof(*uuid), GFP_ATOMIC);
838 memcpy(uuid->uuid, cp->uuid, 16);
839 uuid->svc_hint = cp->svc_hint;
841 list_add(&uuid->list, &hdev->uuids);
843 err = update_class(hdev);
847 err = update_eir(hdev);
851 err = cmd_complete(sk, index, MGMT_OP_ADD_UUID, NULL, 0);
854 hci_dev_unlock(hdev);
860 static int remove_uuid(struct sock *sk, u16 index, unsigned char *data, u16 len)
862 struct list_head *p, *n;
863 struct mgmt_cp_remove_uuid *cp;
864 struct hci_dev *hdev;
865 u8 bt_uuid_any[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
870 BT_DBG("request for hci%u", index);
872 if (len != sizeof(*cp))
873 return cmd_status(sk, index, MGMT_OP_REMOVE_UUID,
874 MGMT_STATUS_INVALID_PARAMS);
876 hdev = hci_dev_get(index);
878 return cmd_status(sk, index, MGMT_OP_REMOVE_UUID,
879 MGMT_STATUS_INVALID_PARAMS);
883 if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
884 err = hci_uuids_clear(hdev);
890 list_for_each_safe(p, n, &hdev->uuids) {
891 struct bt_uuid *match = list_entry(p, struct bt_uuid, list);
893 if (memcmp(match->uuid, cp->uuid, 16) != 0)
896 list_del(&match->list);
901 err = cmd_status(sk, index, MGMT_OP_REMOVE_UUID,
902 MGMT_STATUS_INVALID_PARAMS);
906 err = update_class(hdev);
910 err = update_eir(hdev);
914 err = cmd_complete(sk, index, MGMT_OP_REMOVE_UUID, NULL, 0);
917 hci_dev_unlock(hdev);
923 static int set_dev_class(struct sock *sk, u16 index, unsigned char *data,
926 struct hci_dev *hdev;
927 struct mgmt_cp_set_dev_class *cp;
932 BT_DBG("request for hci%u", index);
934 if (len != sizeof(*cp))
935 return cmd_status(sk, index, MGMT_OP_SET_DEV_CLASS,
936 MGMT_STATUS_INVALID_PARAMS);
938 hdev = hci_dev_get(index);
940 return cmd_status(sk, index, MGMT_OP_SET_DEV_CLASS,
941 MGMT_STATUS_INVALID_PARAMS);
945 hdev->major_class = cp->major;
946 hdev->minor_class = cp->minor;
948 err = update_class(hdev);
951 err = cmd_complete(sk, index, MGMT_OP_SET_DEV_CLASS, NULL, 0);
953 hci_dev_unlock(hdev);
959 static int set_service_cache(struct sock *sk, u16 index, unsigned char *data,
962 struct hci_dev *hdev;
963 struct mgmt_cp_set_service_cache *cp;
968 if (len != sizeof(*cp))
969 return cmd_status(sk, index, MGMT_OP_SET_SERVICE_CACHE,
970 MGMT_STATUS_INVALID_PARAMS);
972 hdev = hci_dev_get(index);
974 return cmd_status(sk, index, MGMT_OP_SET_SERVICE_CACHE,
975 MGMT_STATUS_INVALID_PARAMS);
979 BT_DBG("hci%u enable %d", index, cp->enable);
982 set_bit(HCI_SERVICE_CACHE, &hdev->flags);
985 clear_bit(HCI_SERVICE_CACHE, &hdev->flags);
986 err = update_class(hdev);
988 err = update_eir(hdev);
992 err = cmd_complete(sk, index, MGMT_OP_SET_SERVICE_CACHE, NULL,
995 cmd_status(sk, index, MGMT_OP_SET_SERVICE_CACHE, -err);
998 hci_dev_unlock(hdev);
1004 static int load_link_keys(struct sock *sk, u16 index, unsigned char *data,
1007 struct hci_dev *hdev;
1008 struct mgmt_cp_load_link_keys *cp;
1009 u16 key_count, expected_len;
1014 if (len < sizeof(*cp))
1015 return cmd_status(sk, index, MGMT_OP_LOAD_LINK_KEYS,
1016 MGMT_STATUS_INVALID_PARAMS);
1018 key_count = get_unaligned_le16(&cp->key_count);
1020 expected_len = sizeof(*cp) + key_count *
1021 sizeof(struct mgmt_link_key_info);
1022 if (expected_len != len) {
1023 BT_ERR("load_link_keys: expected %u bytes, got %u bytes",
1025 return cmd_status(sk, index, MGMT_OP_LOAD_LINK_KEYS,
1026 MGMT_STATUS_INVALID_PARAMS);
1029 hdev = hci_dev_get(index);
1031 return cmd_status(sk, index, MGMT_OP_LOAD_LINK_KEYS,
1032 MGMT_STATUS_INVALID_PARAMS);
1034 BT_DBG("hci%u debug_keys %u key_count %u", index, cp->debug_keys,
1039 hci_link_keys_clear(hdev);
1041 set_bit(HCI_LINK_KEYS, &hdev->flags);
1044 set_bit(HCI_DEBUG_KEYS, &hdev->flags);
1046 clear_bit(HCI_DEBUG_KEYS, &hdev->flags);
1048 for (i = 0; i < key_count; i++) {
1049 struct mgmt_link_key_info *key = &cp->keys[i];
1051 hci_add_link_key(hdev, NULL, 0, &key->bdaddr, key->val, key->type,
1055 cmd_complete(sk, index, MGMT_OP_LOAD_LINK_KEYS, NULL, 0);
1057 hci_dev_unlock(hdev);
1063 static int remove_keys(struct sock *sk, u16 index, unsigned char *data,
1066 struct hci_dev *hdev;
1067 struct mgmt_cp_remove_keys *cp;
1068 struct mgmt_rp_remove_keys rp;
1069 struct hci_cp_disconnect dc;
1070 struct pending_cmd *cmd;
1071 struct hci_conn *conn;
1076 if (len != sizeof(*cp))
1077 return cmd_status(sk, index, MGMT_OP_REMOVE_KEYS,
1078 MGMT_STATUS_INVALID_PARAMS);
1080 hdev = hci_dev_get(index);
1082 return cmd_status(sk, index, MGMT_OP_REMOVE_KEYS,
1083 MGMT_STATUS_INVALID_PARAMS);
1087 memset(&rp, 0, sizeof(rp));
1088 bacpy(&rp.bdaddr, &cp->bdaddr);
1089 rp.status = MGMT_STATUS_FAILED;
1091 err = hci_remove_link_key(hdev, &cp->bdaddr);
1093 rp.status = MGMT_STATUS_NOT_PAIRED;
1097 if (!test_bit(HCI_UP, &hdev->flags) || !cp->disconnect) {
1098 err = cmd_complete(sk, index, MGMT_OP_REMOVE_KEYS, &rp,
1103 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1105 err = cmd_complete(sk, index, MGMT_OP_REMOVE_KEYS, &rp,
1110 cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_KEYS, hdev, cp, sizeof(*cp));
1116 put_unaligned_le16(conn->handle, &dc.handle);
1117 dc.reason = 0x13; /* Remote User Terminated Connection */
1118 err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
1120 mgmt_pending_remove(cmd);
1124 err = cmd_complete(sk, index, MGMT_OP_REMOVE_KEYS, &rp,
1126 hci_dev_unlock(hdev);
1132 static int disconnect(struct sock *sk, u16 index, unsigned char *data, u16 len)
1134 struct hci_dev *hdev;
1135 struct mgmt_cp_disconnect *cp;
1136 struct hci_cp_disconnect dc;
1137 struct pending_cmd *cmd;
1138 struct hci_conn *conn;
1145 if (len != sizeof(*cp))
1146 return cmd_status(sk, index, MGMT_OP_DISCONNECT,
1147 MGMT_STATUS_INVALID_PARAMS);
1149 hdev = hci_dev_get(index);
1151 return cmd_status(sk, index, MGMT_OP_DISCONNECT,
1152 MGMT_STATUS_INVALID_PARAMS);
1156 if (!test_bit(HCI_UP, &hdev->flags)) {
1157 err = cmd_status(sk, index, MGMT_OP_DISCONNECT,
1158 MGMT_STATUS_NOT_POWERED);
1162 if (mgmt_pending_find(MGMT_OP_DISCONNECT, hdev)) {
1163 err = cmd_status(sk, index, MGMT_OP_DISCONNECT,
1168 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1170 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->bdaddr);
1173 err = cmd_status(sk, index, MGMT_OP_DISCONNECT,
1174 MGMT_STATUS_NOT_CONNECTED);
1178 cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len);
1184 put_unaligned_le16(conn->handle, &dc.handle);
1185 dc.reason = 0x13; /* Remote User Terminated Connection */
1187 err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
1189 mgmt_pending_remove(cmd);
1192 hci_dev_unlock(hdev);
1198 static u8 link_to_mgmt(u8 link_type, u8 addr_type)
1200 switch (link_type) {
1202 switch (addr_type) {
1203 case ADDR_LE_DEV_PUBLIC:
1204 return MGMT_ADDR_LE_PUBLIC;
1205 case ADDR_LE_DEV_RANDOM:
1206 return MGMT_ADDR_LE_RANDOM;
1208 return MGMT_ADDR_INVALID;
1211 return MGMT_ADDR_BREDR;
1213 return MGMT_ADDR_INVALID;
1217 static int get_connections(struct sock *sk, u16 index)
1219 struct mgmt_rp_get_connections *rp;
1220 struct hci_dev *hdev;
1222 struct list_head *p;
1229 hdev = hci_dev_get(index);
1231 return cmd_status(sk, index, MGMT_OP_GET_CONNECTIONS,
1232 MGMT_STATUS_INVALID_PARAMS);
1237 list_for_each(p, &hdev->conn_hash.list) {
1241 rp_len = sizeof(*rp) + (count * sizeof(struct mgmt_addr_info));
1242 rp = kmalloc(rp_len, GFP_ATOMIC);
1248 put_unaligned_le16(count, &rp->conn_count);
1251 list_for_each_entry(c, &hdev->conn_hash.list, list) {
1252 bacpy(&rp->addr[i].bdaddr, &c->dst);
1253 rp->addr[i].type = link_to_mgmt(c->type, c->dst_type);
1254 if (rp->addr[i].type == MGMT_ADDR_INVALID)
1259 /* Recalculate length in case of filtered SCO connections, etc */
1260 rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
1262 err = cmd_complete(sk, index, MGMT_OP_GET_CONNECTIONS, rp, rp_len);
1266 hci_dev_unlock(hdev);
1271 static int send_pin_code_neg_reply(struct sock *sk, u16 index,
1272 struct hci_dev *hdev, struct mgmt_cp_pin_code_neg_reply *cp)
1274 struct pending_cmd *cmd;
1277 cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp,
1282 err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY, sizeof(cp->bdaddr),
1285 mgmt_pending_remove(cmd);
1290 static int pin_code_reply(struct sock *sk, u16 index, unsigned char *data,
1293 struct hci_dev *hdev;
1294 struct hci_conn *conn;
1295 struct mgmt_cp_pin_code_reply *cp;
1296 struct mgmt_cp_pin_code_neg_reply ncp;
1297 struct hci_cp_pin_code_reply reply;
1298 struct pending_cmd *cmd;
1305 if (len != sizeof(*cp))
1306 return cmd_status(sk, index, MGMT_OP_PIN_CODE_REPLY,
1307 MGMT_STATUS_INVALID_PARAMS);
1309 hdev = hci_dev_get(index);
1311 return cmd_status(sk, index, MGMT_OP_PIN_CODE_REPLY,
1312 MGMT_STATUS_INVALID_PARAMS);
1316 if (!test_bit(HCI_UP, &hdev->flags)) {
1317 err = cmd_status(sk, index, MGMT_OP_PIN_CODE_REPLY,
1318 MGMT_STATUS_NOT_POWERED);
1322 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1324 err = cmd_status(sk, index, MGMT_OP_PIN_CODE_REPLY,
1325 MGMT_STATUS_NOT_CONNECTED);
1329 if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) {
1330 bacpy(&ncp.bdaddr, &cp->bdaddr);
1332 BT_ERR("PIN code is not 16 bytes long");
1334 err = send_pin_code_neg_reply(sk, index, hdev, &ncp);
1336 err = cmd_status(sk, index, MGMT_OP_PIN_CODE_REPLY,
1337 MGMT_STATUS_INVALID_PARAMS);
1342 cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len);
1348 bacpy(&reply.bdaddr, &cp->bdaddr);
1349 reply.pin_len = cp->pin_len;
1350 memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code));
1352 err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
1354 mgmt_pending_remove(cmd);
1357 hci_dev_unlock(hdev);
1363 static int pin_code_neg_reply(struct sock *sk, u16 index, unsigned char *data,
1366 struct hci_dev *hdev;
1367 struct mgmt_cp_pin_code_neg_reply *cp;
1374 if (len != sizeof(*cp))
1375 return cmd_status(sk, index, MGMT_OP_PIN_CODE_NEG_REPLY,
1376 MGMT_STATUS_INVALID_PARAMS);
1378 hdev = hci_dev_get(index);
1380 return cmd_status(sk, index, MGMT_OP_PIN_CODE_NEG_REPLY,
1381 MGMT_STATUS_INVALID_PARAMS);
1385 if (!test_bit(HCI_UP, &hdev->flags)) {
1386 err = cmd_status(sk, index, MGMT_OP_PIN_CODE_NEG_REPLY,
1387 MGMT_STATUS_NOT_POWERED);
1391 err = send_pin_code_neg_reply(sk, index, hdev, cp);
1394 hci_dev_unlock(hdev);
1400 static int set_io_capability(struct sock *sk, u16 index, unsigned char *data,
1403 struct hci_dev *hdev;
1404 struct mgmt_cp_set_io_capability *cp;
1410 if (len != sizeof(*cp))
1411 return cmd_status(sk, index, MGMT_OP_SET_IO_CAPABILITY,
1412 MGMT_STATUS_INVALID_PARAMS);
1414 hdev = hci_dev_get(index);
1416 return cmd_status(sk, index, MGMT_OP_SET_IO_CAPABILITY,
1417 MGMT_STATUS_INVALID_PARAMS);
1421 hdev->io_capability = cp->io_capability;
1423 BT_DBG("%s IO capability set to 0x%02x", hdev->name,
1424 hdev->io_capability);
1426 hci_dev_unlock(hdev);
1429 return cmd_complete(sk, index, MGMT_OP_SET_IO_CAPABILITY, NULL, 0);
1432 static inline struct pending_cmd *find_pairing(struct hci_conn *conn)
1434 struct hci_dev *hdev = conn->hdev;
1435 struct pending_cmd *cmd;
1437 list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
1438 if (cmd->opcode != MGMT_OP_PAIR_DEVICE)
1441 if (cmd->user_data != conn)
1450 static void pairing_complete(struct pending_cmd *cmd, u8 status)
1452 struct mgmt_rp_pair_device rp;
1453 struct hci_conn *conn = cmd->user_data;
1455 bacpy(&rp.addr.bdaddr, &conn->dst);
1456 rp.addr.type = link_to_mgmt(conn->type, conn->dst_type);
1459 cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE, &rp, sizeof(rp));
1461 /* So we don't get further callbacks for this connection */
1462 conn->connect_cfm_cb = NULL;
1463 conn->security_cfm_cb = NULL;
1464 conn->disconn_cfm_cb = NULL;
1468 mgmt_pending_remove(cmd);
1471 static void pairing_complete_cb(struct hci_conn *conn, u8 status)
1473 struct pending_cmd *cmd;
1475 BT_DBG("status %u", status);
1477 cmd = find_pairing(conn);
1479 BT_DBG("Unable to find a pending command");
1481 pairing_complete(cmd, status);
1484 static int pair_device(struct sock *sk, u16 index, unsigned char *data, u16 len)
1486 struct hci_dev *hdev;
1487 struct mgmt_cp_pair_device *cp;
1488 struct mgmt_rp_pair_device rp;
1489 struct pending_cmd *cmd;
1490 u8 sec_level, auth_type;
1491 struct hci_conn *conn;
1498 if (len != sizeof(*cp))
1499 return cmd_status(sk, index, MGMT_OP_PAIR_DEVICE,
1500 MGMT_STATUS_INVALID_PARAMS);
1502 hdev = hci_dev_get(index);
1504 return cmd_status(sk, index, MGMT_OP_PAIR_DEVICE,
1505 MGMT_STATUS_INVALID_PARAMS);
1509 sec_level = BT_SECURITY_MEDIUM;
1510 if (cp->io_cap == 0x03)
1511 auth_type = HCI_AT_DEDICATED_BONDING;
1513 auth_type = HCI_AT_DEDICATED_BONDING_MITM;
1515 if (cp->addr.type == MGMT_ADDR_BREDR)
1516 conn = hci_connect(hdev, ACL_LINK, &cp->addr.bdaddr, sec_level,
1519 conn = hci_connect(hdev, LE_LINK, &cp->addr.bdaddr, sec_level,
1522 memset(&rp, 0, sizeof(rp));
1523 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
1524 rp.addr.type = cp->addr.type;
1527 rp.status = -PTR_ERR(conn);
1528 err = cmd_complete(sk, index, MGMT_OP_PAIR_DEVICE,
1533 if (conn->connect_cfm_cb) {
1536 err = cmd_complete(sk, index, MGMT_OP_PAIR_DEVICE,
1541 cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len);
1548 /* For LE, just connecting isn't a proof that the pairing finished */
1549 if (cp->addr.type == MGMT_ADDR_BREDR)
1550 conn->connect_cfm_cb = pairing_complete_cb;
1552 conn->security_cfm_cb = pairing_complete_cb;
1553 conn->disconn_cfm_cb = pairing_complete_cb;
1554 conn->io_capability = cp->io_cap;
1555 cmd->user_data = conn;
1557 if (conn->state == BT_CONNECTED &&
1558 hci_conn_security(conn, sec_level, auth_type))
1559 pairing_complete(cmd, 0);
1564 hci_dev_unlock(hdev);
1570 static int user_pairing_resp(struct sock *sk, u16 index, bdaddr_t *bdaddr,
1571 u16 mgmt_op, u16 hci_op, __le32 passkey)
1573 struct pending_cmd *cmd;
1574 struct hci_dev *hdev;
1575 struct hci_conn *conn;
1578 hdev = hci_dev_get(index);
1580 return cmd_status(sk, index, mgmt_op,
1581 MGMT_STATUS_INVALID_PARAMS);
1585 if (!test_bit(HCI_UP, &hdev->flags)) {
1586 err = cmd_status(sk, index, mgmt_op, MGMT_STATUS_NOT_POWERED);
1591 * Check for an existing ACL link, if present pair via
1594 * If no ACL link is present, check for an LE link and if
1595 * present, pair via the SMP engine.
1597 * If neither ACL nor LE links are present, fail with error.
1599 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, bdaddr);
1601 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, bdaddr);
1603 err = cmd_status(sk, index, mgmt_op,
1604 MGMT_STATUS_NOT_CONNECTED);
1608 /* Continue with pairing via SMP */
1610 err = cmd_status(sk, index, mgmt_op, MGMT_STATUS_SUCCESS);
1614 cmd = mgmt_pending_add(sk, mgmt_op, hdev, bdaddr, sizeof(*bdaddr));
1620 /* Continue with pairing via HCI */
1621 if (hci_op == HCI_OP_USER_PASSKEY_REPLY) {
1622 struct hci_cp_user_passkey_reply cp;
1624 bacpy(&cp.bdaddr, bdaddr);
1625 cp.passkey = passkey;
1626 err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp);
1628 err = hci_send_cmd(hdev, hci_op, sizeof(*bdaddr), bdaddr);
1631 mgmt_pending_remove(cmd);
1634 hci_dev_unlock(hdev);
1640 static int user_confirm_reply(struct sock *sk, u16 index, void *data, u16 len)
1642 struct mgmt_cp_user_confirm_reply *cp = (void *) data;
1646 if (len != sizeof(*cp))
1647 return cmd_status(sk, index, MGMT_OP_USER_CONFIRM_REPLY,
1648 MGMT_STATUS_INVALID_PARAMS);
1650 return user_pairing_resp(sk, index, &cp->bdaddr,
1651 MGMT_OP_USER_CONFIRM_REPLY,
1652 HCI_OP_USER_CONFIRM_REPLY, 0);
1655 static int user_confirm_neg_reply(struct sock *sk, u16 index, void *data,
1658 struct mgmt_cp_user_confirm_reply *cp = (void *) data;
1662 if (len != sizeof(*cp))
1663 return cmd_status(sk, index, MGMT_OP_USER_CONFIRM_NEG_REPLY,
1664 MGMT_STATUS_INVALID_PARAMS);
1666 return user_pairing_resp(sk, index, &cp->bdaddr,
1667 MGMT_OP_USER_CONFIRM_NEG_REPLY,
1668 HCI_OP_USER_CONFIRM_NEG_REPLY, 0);
1671 static int user_passkey_reply(struct sock *sk, u16 index, void *data, u16 len)
1673 struct mgmt_cp_user_passkey_reply *cp = (void *) data;
1677 if (len != sizeof(*cp))
1678 return cmd_status(sk, index, MGMT_OP_USER_PASSKEY_REPLY,
1681 return user_pairing_resp(sk, index, &cp->bdaddr,
1682 MGMT_OP_USER_PASSKEY_REPLY,
1683 HCI_OP_USER_PASSKEY_REPLY, cp->passkey);
1686 static int user_passkey_neg_reply(struct sock *sk, u16 index, void *data,
1689 struct mgmt_cp_user_passkey_neg_reply *cp = (void *) data;
1693 if (len != sizeof(*cp))
1694 return cmd_status(sk, index, MGMT_OP_USER_PASSKEY_NEG_REPLY,
1697 return user_pairing_resp(sk, index, &cp->bdaddr,
1698 MGMT_OP_USER_PASSKEY_NEG_REPLY,
1699 HCI_OP_USER_PASSKEY_NEG_REPLY, 0);
1702 static int set_local_name(struct sock *sk, u16 index, unsigned char *data,
1705 struct mgmt_cp_set_local_name *mgmt_cp = (void *) data;
1706 struct hci_cp_write_local_name hci_cp;
1707 struct hci_dev *hdev;
1708 struct pending_cmd *cmd;
1713 if (len != sizeof(*mgmt_cp))
1714 return cmd_status(sk, index, MGMT_OP_SET_LOCAL_NAME,
1715 MGMT_STATUS_INVALID_PARAMS);
1717 hdev = hci_dev_get(index);
1719 return cmd_status(sk, index, MGMT_OP_SET_LOCAL_NAME,
1720 MGMT_STATUS_INVALID_PARAMS);
1724 cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len);
1730 memcpy(hci_cp.name, mgmt_cp->name, sizeof(hci_cp.name));
1731 err = hci_send_cmd(hdev, HCI_OP_WRITE_LOCAL_NAME, sizeof(hci_cp),
1734 mgmt_pending_remove(cmd);
1737 hci_dev_unlock(hdev);
1743 static int read_local_oob_data(struct sock *sk, u16 index)
1745 struct hci_dev *hdev;
1746 struct pending_cmd *cmd;
1749 BT_DBG("hci%u", index);
1751 hdev = hci_dev_get(index);
1753 return cmd_status(sk, index, MGMT_OP_READ_LOCAL_OOB_DATA,
1754 MGMT_STATUS_INVALID_PARAMS);
1758 if (!test_bit(HCI_UP, &hdev->flags)) {
1759 err = cmd_status(sk, index, MGMT_OP_READ_LOCAL_OOB_DATA,
1760 MGMT_STATUS_NOT_POWERED);
1764 if (!(hdev->features[6] & LMP_SIMPLE_PAIR)) {
1765 err = cmd_status(sk, index, MGMT_OP_READ_LOCAL_OOB_DATA,
1766 MGMT_STATUS_NOT_SUPPORTED);
1770 if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) {
1771 err = cmd_status(sk, index, MGMT_OP_READ_LOCAL_OOB_DATA,
1776 cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0);
1782 err = hci_send_cmd(hdev, HCI_OP_READ_LOCAL_OOB_DATA, 0, NULL);
1784 mgmt_pending_remove(cmd);
1787 hci_dev_unlock(hdev);
1793 static int add_remote_oob_data(struct sock *sk, u16 index, unsigned char *data,
1796 struct hci_dev *hdev;
1797 struct mgmt_cp_add_remote_oob_data *cp = (void *) data;
1800 BT_DBG("hci%u ", index);
1802 if (len != sizeof(*cp))
1803 return cmd_status(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA,
1804 MGMT_STATUS_INVALID_PARAMS);
1806 hdev = hci_dev_get(index);
1808 return cmd_status(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA,
1809 MGMT_STATUS_INVALID_PARAMS);
1813 err = hci_add_remote_oob_data(hdev, &cp->bdaddr, cp->hash,
1816 err = cmd_status(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA,
1817 MGMT_STATUS_FAILED);
1819 err = cmd_complete(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA, NULL,
1822 hci_dev_unlock(hdev);
1828 static int remove_remote_oob_data(struct sock *sk, u16 index,
1829 unsigned char *data, u16 len)
1831 struct hci_dev *hdev;
1832 struct mgmt_cp_remove_remote_oob_data *cp = (void *) data;
1835 BT_DBG("hci%u ", index);
1837 if (len != sizeof(*cp))
1838 return cmd_status(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
1839 MGMT_STATUS_INVALID_PARAMS);
1841 hdev = hci_dev_get(index);
1843 return cmd_status(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
1844 MGMT_STATUS_INVALID_PARAMS);
1848 err = hci_remove_remote_oob_data(hdev, &cp->bdaddr);
1850 err = cmd_status(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
1851 MGMT_STATUS_INVALID_PARAMS);
1853 err = cmd_complete(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
1856 hci_dev_unlock(hdev);
1862 static int start_discovery(struct sock *sk, u16 index,
1863 unsigned char *data, u16 len)
1865 struct mgmt_cp_start_discovery *cp = (void *) data;
1866 struct pending_cmd *cmd;
1867 struct hci_dev *hdev;
1870 BT_DBG("hci%u", index);
1872 if (len != sizeof(*cp))
1873 return cmd_status(sk, index, MGMT_OP_START_DISCOVERY,
1874 MGMT_STATUS_INVALID_PARAMS);
1876 hdev = hci_dev_get(index);
1878 return cmd_status(sk, index, MGMT_OP_START_DISCOVERY,
1879 MGMT_STATUS_INVALID_PARAMS);
1883 if (!test_bit(HCI_UP, &hdev->flags)) {
1884 err = cmd_status(sk, index, MGMT_OP_START_DISCOVERY,
1885 MGMT_STATUS_NOT_POWERED);
1889 cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, hdev, NULL, 0);
1895 err = hci_do_inquiry(hdev, INQUIRY_LEN_BREDR);
1897 mgmt_pending_remove(cmd);
1900 hci_dev_unlock(hdev);
1906 static int stop_discovery(struct sock *sk, u16 index)
1908 struct hci_dev *hdev;
1909 struct pending_cmd *cmd;
1912 BT_DBG("hci%u", index);
1914 hdev = hci_dev_get(index);
1916 return cmd_status(sk, index, MGMT_OP_STOP_DISCOVERY,
1917 MGMT_STATUS_INVALID_PARAMS);
1921 cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, NULL, 0);
1927 err = hci_cancel_inquiry(hdev);
1929 mgmt_pending_remove(cmd);
1932 hci_dev_unlock(hdev);
1938 static int block_device(struct sock *sk, u16 index, unsigned char *data,
1941 struct hci_dev *hdev;
1942 struct mgmt_cp_block_device *cp = (void *) data;
1945 BT_DBG("hci%u", index);
1947 if (len != sizeof(*cp))
1948 return cmd_status(sk, index, MGMT_OP_BLOCK_DEVICE,
1949 MGMT_STATUS_INVALID_PARAMS);
1951 hdev = hci_dev_get(index);
1953 return cmd_status(sk, index, MGMT_OP_BLOCK_DEVICE,
1954 MGMT_STATUS_INVALID_PARAMS);
1958 err = hci_blacklist_add(hdev, &cp->bdaddr);
1960 err = cmd_status(sk, index, MGMT_OP_BLOCK_DEVICE,
1961 MGMT_STATUS_FAILED);
1963 err = cmd_complete(sk, index, MGMT_OP_BLOCK_DEVICE,
1966 hci_dev_unlock(hdev);
1972 static int unblock_device(struct sock *sk, u16 index, unsigned char *data,
1975 struct hci_dev *hdev;
1976 struct mgmt_cp_unblock_device *cp = (void *) data;
1979 BT_DBG("hci%u", index);
1981 if (len != sizeof(*cp))
1982 return cmd_status(sk, index, MGMT_OP_UNBLOCK_DEVICE,
1983 MGMT_STATUS_INVALID_PARAMS);
1985 hdev = hci_dev_get(index);
1987 return cmd_status(sk, index, MGMT_OP_UNBLOCK_DEVICE,
1988 MGMT_STATUS_INVALID_PARAMS);
1992 err = hci_blacklist_del(hdev, &cp->bdaddr);
1995 err = cmd_status(sk, index, MGMT_OP_UNBLOCK_DEVICE,
1996 MGMT_STATUS_INVALID_PARAMS);
1998 err = cmd_complete(sk, index, MGMT_OP_UNBLOCK_DEVICE,
2001 hci_dev_unlock(hdev);
2007 static int set_fast_connectable(struct sock *sk, u16 index,
2008 unsigned char *data, u16 len)
2010 struct hci_dev *hdev;
2011 struct mgmt_cp_set_fast_connectable *cp = (void *) data;
2012 struct hci_cp_write_page_scan_activity acp;
2016 BT_DBG("hci%u", index);
2018 if (len != sizeof(*cp))
2019 return cmd_status(sk, index, MGMT_OP_SET_FAST_CONNECTABLE,
2020 MGMT_STATUS_INVALID_PARAMS);
2022 hdev = hci_dev_get(index);
2024 return cmd_status(sk, index, MGMT_OP_SET_FAST_CONNECTABLE,
2025 MGMT_STATUS_INVALID_PARAMS);
2030 type = PAGE_SCAN_TYPE_INTERLACED;
2031 acp.interval = 0x0024; /* 22.5 msec page scan interval */
2033 type = PAGE_SCAN_TYPE_STANDARD; /* default */
2034 acp.interval = 0x0800; /* default 1.28 sec page scan */
2037 acp.window = 0x0012; /* default 11.25 msec page scan window */
2039 err = hci_send_cmd(hdev, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY,
2042 err = cmd_status(sk, index, MGMT_OP_SET_FAST_CONNECTABLE,
2043 MGMT_STATUS_FAILED);
2047 err = hci_send_cmd(hdev, HCI_OP_WRITE_PAGE_SCAN_TYPE, 1, &type);
2049 err = cmd_status(sk, index, MGMT_OP_SET_FAST_CONNECTABLE,
2050 MGMT_STATUS_FAILED);
2054 err = cmd_complete(sk, index, MGMT_OP_SET_FAST_CONNECTABLE,
2057 hci_dev_unlock(hdev);
2063 int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
2066 struct mgmt_hdr *hdr;
2067 u16 opcode, index, len;
2070 BT_DBG("got %zu bytes", msglen);
2072 if (msglen < sizeof(*hdr))
2075 buf = kmalloc(msglen, GFP_KERNEL);
2079 if (memcpy_fromiovec(buf, msg->msg_iov, msglen)) {
2084 hdr = (struct mgmt_hdr *) buf;
2085 opcode = get_unaligned_le16(&hdr->opcode);
2086 index = get_unaligned_le16(&hdr->index);
2087 len = get_unaligned_le16(&hdr->len);
2089 if (len != msglen - sizeof(*hdr)) {
2095 case MGMT_OP_READ_VERSION:
2096 err = read_version(sk);
2098 case MGMT_OP_READ_INDEX_LIST:
2099 err = read_index_list(sk);
2101 case MGMT_OP_READ_INFO:
2102 err = read_controller_info(sk, index);
2104 case MGMT_OP_SET_POWERED:
2105 err = set_powered(sk, index, buf + sizeof(*hdr), len);
2107 case MGMT_OP_SET_DISCOVERABLE:
2108 err = set_discoverable(sk, index, buf + sizeof(*hdr), len);
2110 case MGMT_OP_SET_CONNECTABLE:
2111 err = set_connectable(sk, index, buf + sizeof(*hdr), len);
2113 case MGMT_OP_SET_PAIRABLE:
2114 err = set_pairable(sk, index, buf + sizeof(*hdr), len);
2116 case MGMT_OP_ADD_UUID:
2117 err = add_uuid(sk, index, buf + sizeof(*hdr), len);
2119 case MGMT_OP_REMOVE_UUID:
2120 err = remove_uuid(sk, index, buf + sizeof(*hdr), len);
2122 case MGMT_OP_SET_DEV_CLASS:
2123 err = set_dev_class(sk, index, buf + sizeof(*hdr), len);
2125 case MGMT_OP_SET_SERVICE_CACHE:
2126 err = set_service_cache(sk, index, buf + sizeof(*hdr), len);
2128 case MGMT_OP_LOAD_LINK_KEYS:
2129 err = load_link_keys(sk, index, buf + sizeof(*hdr), len);
2131 case MGMT_OP_REMOVE_KEYS:
2132 err = remove_keys(sk, index, buf + sizeof(*hdr), len);
2134 case MGMT_OP_DISCONNECT:
2135 err = disconnect(sk, index, buf + sizeof(*hdr), len);
2137 case MGMT_OP_GET_CONNECTIONS:
2138 err = get_connections(sk, index);
2140 case MGMT_OP_PIN_CODE_REPLY:
2141 err = pin_code_reply(sk, index, buf + sizeof(*hdr), len);
2143 case MGMT_OP_PIN_CODE_NEG_REPLY:
2144 err = pin_code_neg_reply(sk, index, buf + sizeof(*hdr), len);
2146 case MGMT_OP_SET_IO_CAPABILITY:
2147 err = set_io_capability(sk, index, buf + sizeof(*hdr), len);
2149 case MGMT_OP_PAIR_DEVICE:
2150 err = pair_device(sk, index, buf + sizeof(*hdr), len);
2152 case MGMT_OP_USER_CONFIRM_REPLY:
2153 err = user_confirm_reply(sk, index, buf + sizeof(*hdr), len);
2155 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
2156 err = user_confirm_neg_reply(sk, index, buf + sizeof(*hdr),
2159 case MGMT_OP_USER_PASSKEY_REPLY:
2160 err = user_passkey_reply(sk, index, buf + sizeof(*hdr), len);
2162 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
2163 err = user_passkey_neg_reply(sk, index, buf + sizeof(*hdr),
2166 case MGMT_OP_SET_LOCAL_NAME:
2167 err = set_local_name(sk, index, buf + sizeof(*hdr), len);
2169 case MGMT_OP_READ_LOCAL_OOB_DATA:
2170 err = read_local_oob_data(sk, index);
2172 case MGMT_OP_ADD_REMOTE_OOB_DATA:
2173 err = add_remote_oob_data(sk, index, buf + sizeof(*hdr), len);
2175 case MGMT_OP_REMOVE_REMOTE_OOB_DATA:
2176 err = remove_remote_oob_data(sk, index, buf + sizeof(*hdr),
2179 case MGMT_OP_START_DISCOVERY:
2180 err = start_discovery(sk, index, buf + sizeof(*hdr), len);
2182 case MGMT_OP_STOP_DISCOVERY:
2183 err = stop_discovery(sk, index);
2185 case MGMT_OP_BLOCK_DEVICE:
2186 err = block_device(sk, index, buf + sizeof(*hdr), len);
2188 case MGMT_OP_UNBLOCK_DEVICE:
2189 err = unblock_device(sk, index, buf + sizeof(*hdr), len);
2191 case MGMT_OP_SET_FAST_CONNECTABLE:
2192 err = set_fast_connectable(sk, index, buf + sizeof(*hdr),
2196 BT_DBG("Unknown op %u", opcode);
2197 err = cmd_status(sk, index, opcode,
2198 MGMT_STATUS_UNKNOWN_COMMAND);
2212 static void cmd_status_rsp(struct pending_cmd *cmd, void *data)
2216 cmd_status(cmd->sk, cmd->index, cmd->opcode, *status);
2217 mgmt_pending_remove(cmd);
2220 int mgmt_index_added(struct hci_dev *hdev)
2222 return mgmt_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0, NULL);
2225 int mgmt_index_removed(struct hci_dev *hdev)
2229 mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);
2231 return mgmt_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0, NULL);
2239 static void mode_rsp(struct pending_cmd *cmd, void *data)
2241 struct mgmt_mode *cp = cmd->param;
2242 struct cmd_lookup *match = data;
2244 if (cp->val != match->val)
2247 send_mode_rsp(cmd->sk, cmd->opcode, cmd->index, cp->val);
2249 list_del(&cmd->list);
2251 if (match->sk == NULL) {
2252 match->sk = cmd->sk;
2253 sock_hold(match->sk);
2256 mgmt_pending_free(cmd);
2259 int mgmt_powered(struct hci_dev *hdev, u8 powered)
2261 struct mgmt_mode ev;
2262 struct cmd_lookup match = { powered, NULL };
2265 mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, mode_rsp, &match);
2268 u8 status = ENETDOWN;
2269 mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);
2274 ret = mgmt_event(MGMT_EV_POWERED, hdev, &ev, sizeof(ev), match.sk);
2282 int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable)
2284 struct mgmt_mode ev;
2285 struct cmd_lookup match = { discoverable, NULL };
2288 mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev, mode_rsp, &match);
2290 ev.val = discoverable;
2292 ret = mgmt_event(MGMT_EV_DISCOVERABLE, hdev, &ev, sizeof(ev),
2301 int mgmt_connectable(struct hci_dev *hdev, u8 connectable)
2303 struct mgmt_mode ev;
2304 struct cmd_lookup match = { connectable, NULL };
2307 mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev, mode_rsp, &match);
2309 ev.val = connectable;
2311 ret = mgmt_event(MGMT_EV_CONNECTABLE, hdev, &ev, sizeof(ev), match.sk);
2319 int mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status)
2321 u8 mgmt_err = mgmt_status(status);
2323 if (scan & SCAN_PAGE)
2324 mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev,
2325 cmd_status_rsp, &mgmt_err);
2327 if (scan & SCAN_INQUIRY)
2328 mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev,
2329 cmd_status_rsp, &mgmt_err);
2334 int mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
2337 struct mgmt_ev_new_link_key ev;
2339 memset(&ev, 0, sizeof(ev));
2341 ev.store_hint = persistent;
2342 bacpy(&ev.key.bdaddr, &key->bdaddr);
2343 ev.key.type = key->type;
2344 memcpy(ev.key.val, key->val, 16);
2345 ev.key.pin_len = key->pin_len;
2347 return mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL);
2350 int mgmt_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
2353 struct mgmt_addr_info ev;
2355 bacpy(&ev.bdaddr, bdaddr);
2356 ev.type = link_to_mgmt(link_type, addr_type);
2358 return mgmt_event(MGMT_EV_CONNECTED, hdev, &ev, sizeof(ev), NULL);
2361 static void disconnect_rsp(struct pending_cmd *cmd, void *data)
2363 struct mgmt_cp_disconnect *cp = cmd->param;
2364 struct sock **sk = data;
2365 struct mgmt_rp_disconnect rp;
2367 bacpy(&rp.bdaddr, &cp->bdaddr);
2370 cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT, &rp, sizeof(rp));
2375 mgmt_pending_remove(cmd);
2378 static void remove_keys_rsp(struct pending_cmd *cmd, void *data)
2381 struct mgmt_cp_remove_keys *cp = cmd->param;
2382 struct mgmt_rp_remove_keys rp;
2384 memset(&rp, 0, sizeof(rp));
2385 bacpy(&rp.bdaddr, &cp->bdaddr);
2387 rp.status = *status;
2389 cmd_complete(cmd->sk, cmd->index, MGMT_OP_REMOVE_KEYS, &rp,
2392 mgmt_pending_remove(cmd);
2395 int mgmt_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
2398 struct mgmt_addr_info ev;
2399 struct sock *sk = NULL;
2402 mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk);
2404 bacpy(&ev.bdaddr, bdaddr);
2405 ev.type = link_to_mgmt(link_type, addr_type);
2407 err = mgmt_event(MGMT_EV_DISCONNECTED, hdev, &ev, sizeof(ev), sk);
2412 mgmt_pending_foreach(MGMT_OP_REMOVE_KEYS, hdev, remove_keys_rsp, NULL);
2417 int mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 status)
2419 struct pending_cmd *cmd;
2420 u8 mgmt_err = mgmt_status(status);
2423 cmd = mgmt_pending_find(MGMT_OP_DISCONNECT, hdev);
2428 struct mgmt_rp_disconnect rp;
2430 bacpy(&rp.bdaddr, bdaddr);
2433 err = cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT,
2436 err = cmd_status(cmd->sk, hdev->id, MGMT_OP_DISCONNECT,
2439 mgmt_pending_remove(cmd);
2444 int mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
2445 u8 addr_type, u8 status)
2447 struct mgmt_ev_connect_failed ev;
2449 bacpy(&ev.addr.bdaddr, bdaddr);
2450 ev.addr.type = link_to_mgmt(link_type, addr_type);
2451 ev.status = mgmt_status(status);
2453 return mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL);
2456 int mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
2458 struct mgmt_ev_pin_code_request ev;
2460 bacpy(&ev.bdaddr, bdaddr);
2463 return mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev),
2467 int mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
2470 struct pending_cmd *cmd;
2471 struct mgmt_rp_pin_code_reply rp;
2474 cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY, hdev);
2478 bacpy(&rp.bdaddr, bdaddr);
2479 rp.status = mgmt_status(status);
2481 err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_REPLY, &rp,
2484 mgmt_pending_remove(cmd);
2489 int mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
2492 struct pending_cmd *cmd;
2493 struct mgmt_rp_pin_code_reply rp;
2496 cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev);
2500 bacpy(&rp.bdaddr, bdaddr);
2501 rp.status = mgmt_status(status);
2503 err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_NEG_REPLY, &rp,
2506 mgmt_pending_remove(cmd);
2511 int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
2512 __le32 value, u8 confirm_hint)
2514 struct mgmt_ev_user_confirm_request ev;
2516 BT_DBG("%s", hdev->name);
2518 bacpy(&ev.bdaddr, bdaddr);
2519 ev.confirm_hint = confirm_hint;
2520 put_unaligned_le32(value, &ev.value);
2522 return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev),
2526 int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr)
2528 struct mgmt_ev_user_passkey_request ev;
2530 BT_DBG("%s", hdev->name);
2532 bacpy(&ev.bdaddr, bdaddr);
2534 return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev),
2538 static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
2539 u8 status, u8 opcode)
2541 struct pending_cmd *cmd;
2542 struct mgmt_rp_user_confirm_reply rp;
2545 cmd = mgmt_pending_find(opcode, hdev);
2549 bacpy(&rp.bdaddr, bdaddr);
2550 rp.status = mgmt_status(status);
2551 err = cmd_complete(cmd->sk, hdev->id, opcode, &rp, sizeof(rp));
2553 mgmt_pending_remove(cmd);
2558 int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
2561 return user_pairing_resp_complete(hdev, bdaddr, status,
2562 MGMT_OP_USER_CONFIRM_REPLY);
2565 int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev,
2566 bdaddr_t *bdaddr, u8 status)
2568 return user_pairing_resp_complete(hdev, bdaddr, status,
2569 MGMT_OP_USER_CONFIRM_NEG_REPLY);
2572 int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
2575 return user_pairing_resp_complete(hdev, bdaddr, status,
2576 MGMT_OP_USER_PASSKEY_REPLY);
2579 int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev,
2580 bdaddr_t *bdaddr, u8 status)
2582 return user_pairing_resp_complete(hdev, bdaddr, status,
2583 MGMT_OP_USER_PASSKEY_NEG_REPLY);
2586 int mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 status)
2588 struct mgmt_ev_auth_failed ev;
2590 bacpy(&ev.bdaddr, bdaddr);
2591 ev.status = mgmt_status(status);
2593 return mgmt_event(MGMT_EV_AUTH_FAILED, hdev, &ev, sizeof(ev), NULL);
2596 int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
2598 struct pending_cmd *cmd;
2599 struct mgmt_cp_set_local_name ev;
2602 memset(&ev, 0, sizeof(ev));
2603 memcpy(ev.name, name, HCI_MAX_NAME_LENGTH);
2605 cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
2610 err = cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME,
2611 mgmt_status(status));
2617 err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, &ev,
2623 err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev, sizeof(ev),
2624 cmd ? cmd->sk : NULL);
2628 mgmt_pending_remove(cmd);
2632 int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
2633 u8 *randomizer, u8 status)
2635 struct pending_cmd *cmd;
2638 BT_DBG("%s status %u", hdev->name, status);
2640 cmd = mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev);
2645 err = cmd_status(cmd->sk, hdev->id,
2646 MGMT_OP_READ_LOCAL_OOB_DATA,
2647 mgmt_status(status));
2649 struct mgmt_rp_read_local_oob_data rp;
2651 memcpy(rp.hash, hash, sizeof(rp.hash));
2652 memcpy(rp.randomizer, randomizer, sizeof(rp.randomizer));
2654 err = cmd_complete(cmd->sk, hdev->id,
2655 MGMT_OP_READ_LOCAL_OOB_DATA,
2659 mgmt_pending_remove(cmd);
2664 int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
2665 u8 addr_type, u8 *dev_class, s8 rssi, u8 *eir)
2667 struct mgmt_ev_device_found ev;
2669 memset(&ev, 0, sizeof(ev));
2671 bacpy(&ev.addr.bdaddr, bdaddr);
2672 ev.addr.type = link_to_mgmt(link_type, addr_type);
2676 memcpy(ev.eir, eir, sizeof(ev.eir));
2679 memcpy(ev.dev_class, dev_class, sizeof(ev.dev_class));
2681 return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, &ev, sizeof(ev), NULL);
2684 int mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *name)
2686 struct mgmt_ev_remote_name ev;
2688 memset(&ev, 0, sizeof(ev));
2690 bacpy(&ev.bdaddr, bdaddr);
2691 memcpy(ev.name, name, HCI_MAX_NAME_LENGTH);
2693 return mgmt_event(MGMT_EV_REMOTE_NAME, hdev, &ev, sizeof(ev), NULL);
2696 int mgmt_start_discovery_failed(struct hci_dev *hdev, u8 status)
2698 struct pending_cmd *cmd;
2701 cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
2705 err = cmd_status(cmd->sk, hdev->id, cmd->opcode, mgmt_status(status));
2706 mgmt_pending_remove(cmd);
2711 int mgmt_stop_discovery_failed(struct hci_dev *hdev, u8 status)
2713 struct pending_cmd *cmd;
2716 cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
2720 err = cmd_status(cmd->sk, hdev->id, cmd->opcode, status);
2721 mgmt_pending_remove(cmd);
2726 int mgmt_discovering(struct hci_dev *hdev, u8 discovering)
2728 struct pending_cmd *cmd;
2731 cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
2733 cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
2736 cmd_complete(cmd->sk, hdev->id, cmd->opcode, NULL, 0);
2737 mgmt_pending_remove(cmd);
2740 return mgmt_event(MGMT_EV_DISCOVERING, hdev, &discovering,
2741 sizeof(discovering), NULL);
2744 int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr)
2746 struct pending_cmd *cmd;
2747 struct mgmt_ev_device_blocked ev;
2749 cmd = mgmt_pending_find(MGMT_OP_BLOCK_DEVICE, hdev);
2751 bacpy(&ev.bdaddr, bdaddr);
2753 return mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &ev, sizeof(ev),
2754 cmd ? cmd->sk : NULL);
2757 int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr)
2759 struct pending_cmd *cmd;
2760 struct mgmt_ev_device_unblocked ev;
2762 cmd = mgmt_pending_find(MGMT_OP_UNBLOCK_DEVICE, hdev);
2764 bacpy(&ev.bdaddr, bdaddr);
2766 return mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &ev, sizeof(ev),
2767 cmd ? cmd->sk : NULL);