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/uaccess.h>
26 #include <asm/unaligned.h>
28 #include <net/bluetooth/bluetooth.h>
29 #include <net/bluetooth/hci_core.h>
30 #include <net/bluetooth/mgmt.h>
32 #define MGMT_VERSION 0
33 #define MGMT_REVISION 1
36 struct list_head list
;
46 static int cmd_status(struct sock
*sk
, u16 index
, u16 cmd
, u8 status
)
50 struct mgmt_ev_cmd_status
*ev
;
52 BT_DBG("sock %p, index %u, cmd %u, status %u", sk
, index
, cmd
, status
);
54 skb
= alloc_skb(sizeof(*hdr
) + sizeof(*ev
), GFP_ATOMIC
);
58 hdr
= (void *) skb_put(skb
, sizeof(*hdr
));
60 hdr
->opcode
= cpu_to_le16(MGMT_EV_CMD_STATUS
);
61 hdr
->index
= cpu_to_le16(index
);
62 hdr
->len
= cpu_to_le16(sizeof(*ev
));
64 ev
= (void *) skb_put(skb
, sizeof(*ev
));
66 put_unaligned_le16(cmd
, &ev
->opcode
);
68 if (sock_queue_rcv_skb(sk
, skb
) < 0)
74 static int cmd_complete(struct sock
*sk
, u16 index
, u16 cmd
, void *rp
,
79 struct mgmt_ev_cmd_complete
*ev
;
81 BT_DBG("sock %p", sk
);
83 skb
= alloc_skb(sizeof(*hdr
) + sizeof(*ev
) + rp_len
, GFP_ATOMIC
);
87 hdr
= (void *) skb_put(skb
, sizeof(*hdr
));
89 hdr
->opcode
= cpu_to_le16(MGMT_EV_CMD_COMPLETE
);
90 hdr
->index
= cpu_to_le16(index
);
91 hdr
->len
= cpu_to_le16(sizeof(*ev
) + rp_len
);
93 ev
= (void *) skb_put(skb
, sizeof(*ev
) + rp_len
);
94 put_unaligned_le16(cmd
, &ev
->opcode
);
97 memcpy(ev
->data
, rp
, rp_len
);
99 if (sock_queue_rcv_skb(sk
, skb
) < 0)
105 static int read_version(struct sock
*sk
)
107 struct mgmt_rp_read_version rp
;
109 BT_DBG("sock %p", sk
);
111 rp
.version
= MGMT_VERSION
;
112 put_unaligned_le16(MGMT_REVISION
, &rp
.revision
);
114 return cmd_complete(sk
, MGMT_INDEX_NONE
, MGMT_OP_READ_VERSION
, &rp
,
118 static int read_index_list(struct sock
*sk
)
120 struct mgmt_rp_read_index_list
*rp
;
126 BT_DBG("sock %p", sk
);
128 read_lock(&hci_dev_list_lock
);
131 list_for_each(p
, &hci_dev_list
) {
135 rp_len
= sizeof(*rp
) + (2 * count
);
136 rp
= kmalloc(rp_len
, GFP_ATOMIC
);
138 read_unlock(&hci_dev_list_lock
);
142 put_unaligned_le16(count
, &rp
->num_controllers
);
145 list_for_each(p
, &hci_dev_list
) {
146 struct hci_dev
*d
= list_entry(p
, struct hci_dev
, list
);
148 hci_del_off_timer(d
);
150 set_bit(HCI_MGMT
, &d
->flags
);
152 if (test_bit(HCI_SETUP
, &d
->flags
))
155 put_unaligned_le16(d
->id
, &rp
->index
[i
++]);
156 BT_DBG("Added hci%u", d
->id
);
159 read_unlock(&hci_dev_list_lock
);
161 err
= cmd_complete(sk
, MGMT_INDEX_NONE
, MGMT_OP_READ_INDEX_LIST
, rp
,
169 static int read_controller_info(struct sock
*sk
, u16 index
)
171 struct mgmt_rp_read_info rp
;
172 struct hci_dev
*hdev
;
174 BT_DBG("sock %p hci%u", sk
, index
);
176 hdev
= hci_dev_get(index
);
178 return cmd_status(sk
, index
, MGMT_OP_READ_INFO
, ENODEV
);
180 hci_del_off_timer(hdev
);
182 hci_dev_lock_bh(hdev
);
184 set_bit(HCI_MGMT
, &hdev
->flags
);
186 memset(&rp
, 0, sizeof(rp
));
188 rp
.type
= hdev
->dev_type
;
190 rp
.powered
= test_bit(HCI_UP
, &hdev
->flags
);
191 rp
.connectable
= test_bit(HCI_PSCAN
, &hdev
->flags
);
192 rp
.discoverable
= test_bit(HCI_ISCAN
, &hdev
->flags
);
193 rp
.pairable
= test_bit(HCI_PSCAN
, &hdev
->flags
);
195 if (test_bit(HCI_AUTH
, &hdev
->flags
))
197 else if (hdev
->ssp_mode
> 0)
202 bacpy(&rp
.bdaddr
, &hdev
->bdaddr
);
203 memcpy(rp
.features
, hdev
->features
, 8);
204 memcpy(rp
.dev_class
, hdev
->dev_class
, 3);
205 put_unaligned_le16(hdev
->manufacturer
, &rp
.manufacturer
);
206 rp
.hci_ver
= hdev
->hci_ver
;
207 put_unaligned_le16(hdev
->hci_rev
, &rp
.hci_rev
);
209 memcpy(rp
.name
, hdev
->dev_name
, sizeof(hdev
->dev_name
));
211 hci_dev_unlock_bh(hdev
);
214 return cmd_complete(sk
, index
, MGMT_OP_READ_INFO
, &rp
, sizeof(rp
));
217 static void mgmt_pending_free(struct pending_cmd
*cmd
)
224 static struct pending_cmd
*mgmt_pending_add(struct sock
*sk
, u16 opcode
,
225 u16 index
, void *data
, u16 len
)
227 struct pending_cmd
*cmd
;
229 cmd
= kmalloc(sizeof(*cmd
), GFP_ATOMIC
);
233 cmd
->opcode
= opcode
;
236 cmd
->param
= kmalloc(len
, GFP_ATOMIC
);
243 memcpy(cmd
->param
, data
, len
);
248 list_add(&cmd
->list
, &cmd_list
);
253 static void mgmt_pending_foreach(u16 opcode
, int index
,
254 void (*cb
)(struct pending_cmd
*cmd
, void *data
),
257 struct list_head
*p
, *n
;
259 list_for_each_safe(p
, n
, &cmd_list
) {
260 struct pending_cmd
*cmd
;
262 cmd
= list_entry(p
, struct pending_cmd
, list
);
264 if (cmd
->opcode
!= opcode
)
267 if (index
>= 0 && cmd
->index
!= index
)
274 static struct pending_cmd
*mgmt_pending_find(u16 opcode
, int index
)
278 list_for_each(p
, &cmd_list
) {
279 struct pending_cmd
*cmd
;
281 cmd
= list_entry(p
, struct pending_cmd
, list
);
283 if (cmd
->opcode
!= opcode
)
286 if (index
>= 0 && cmd
->index
!= index
)
295 static void mgmt_pending_remove(struct pending_cmd
*cmd
)
297 list_del(&cmd
->list
);
298 mgmt_pending_free(cmd
);
301 static int set_powered(struct sock
*sk
, u16 index
, unsigned char *data
, u16 len
)
303 struct mgmt_mode
*cp
;
304 struct hci_dev
*hdev
;
305 struct pending_cmd
*cmd
;
310 BT_DBG("request for hci%u", index
);
312 if (len
!= sizeof(*cp
))
313 return cmd_status(sk
, index
, MGMT_OP_SET_POWERED
, EINVAL
);
315 hdev
= hci_dev_get(index
);
317 return cmd_status(sk
, index
, MGMT_OP_SET_POWERED
, ENODEV
);
319 hci_dev_lock_bh(hdev
);
321 up
= test_bit(HCI_UP
, &hdev
->flags
);
322 if ((cp
->val
&& up
) || (!cp
->val
&& !up
)) {
323 err
= cmd_status(sk
, index
, MGMT_OP_SET_POWERED
, EALREADY
);
327 if (mgmt_pending_find(MGMT_OP_SET_POWERED
, index
)) {
328 err
= cmd_status(sk
, index
, MGMT_OP_SET_POWERED
, EBUSY
);
332 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_POWERED
, index
, data
, len
);
339 queue_work(hdev
->workqueue
, &hdev
->power_on
);
341 queue_work(hdev
->workqueue
, &hdev
->power_off
);
346 hci_dev_unlock_bh(hdev
);
351 static int set_discoverable(struct sock
*sk
, u16 index
, unsigned char *data
,
354 struct mgmt_mode
*cp
;
355 struct hci_dev
*hdev
;
356 struct pending_cmd
*cmd
;
362 BT_DBG("request for hci%u", index
);
364 if (len
!= sizeof(*cp
))
365 return cmd_status(sk
, index
, MGMT_OP_SET_DISCOVERABLE
, EINVAL
);
367 hdev
= hci_dev_get(index
);
369 return cmd_status(sk
, index
, MGMT_OP_SET_DISCOVERABLE
, ENODEV
);
371 hci_dev_lock_bh(hdev
);
373 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
374 err
= cmd_status(sk
, index
, MGMT_OP_SET_DISCOVERABLE
, ENETDOWN
);
378 if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE
, index
) ||
379 mgmt_pending_find(MGMT_OP_SET_CONNECTABLE
, index
)) {
380 err
= cmd_status(sk
, index
, MGMT_OP_SET_DISCOVERABLE
, EBUSY
);
384 if (cp
->val
== test_bit(HCI_ISCAN
, &hdev
->flags
) &&
385 test_bit(HCI_PSCAN
, &hdev
->flags
)) {
386 err
= cmd_status(sk
, index
, MGMT_OP_SET_DISCOVERABLE
, EALREADY
);
390 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_DISCOVERABLE
, index
, data
, len
);
399 scan
|= SCAN_INQUIRY
;
401 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_SCAN_ENABLE
, 1, &scan
);
403 mgmt_pending_remove(cmd
);
406 hci_dev_unlock_bh(hdev
);
412 static int set_connectable(struct sock
*sk
, u16 index
, unsigned char *data
,
415 struct mgmt_mode
*cp
;
416 struct hci_dev
*hdev
;
417 struct pending_cmd
*cmd
;
423 BT_DBG("request for hci%u", index
);
425 if (len
!= sizeof(*cp
))
426 return cmd_status(sk
, index
, MGMT_OP_SET_CONNECTABLE
, EINVAL
);
428 hdev
= hci_dev_get(index
);
430 return cmd_status(sk
, index
, MGMT_OP_SET_CONNECTABLE
, ENODEV
);
432 hci_dev_lock_bh(hdev
);
434 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
435 err
= cmd_status(sk
, index
, MGMT_OP_SET_CONNECTABLE
, ENETDOWN
);
439 if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE
, index
) ||
440 mgmt_pending_find(MGMT_OP_SET_CONNECTABLE
, index
)) {
441 err
= cmd_status(sk
, index
, MGMT_OP_SET_CONNECTABLE
, EBUSY
);
445 if (cp
->val
== test_bit(HCI_PSCAN
, &hdev
->flags
)) {
446 err
= cmd_status(sk
, index
, MGMT_OP_SET_CONNECTABLE
, EALREADY
);
450 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_CONNECTABLE
, index
, data
, len
);
461 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_SCAN_ENABLE
, 1, &scan
);
463 mgmt_pending_remove(cmd
);
466 hci_dev_unlock_bh(hdev
);
472 static int mgmt_event(u16 event
, u16 index
, void *data
, u16 data_len
,
473 struct sock
*skip_sk
)
476 struct mgmt_hdr
*hdr
;
478 skb
= alloc_skb(sizeof(*hdr
) + data_len
, GFP_ATOMIC
);
482 bt_cb(skb
)->channel
= HCI_CHANNEL_CONTROL
;
484 hdr
= (void *) skb_put(skb
, sizeof(*hdr
));
485 hdr
->opcode
= cpu_to_le16(event
);
486 hdr
->index
= cpu_to_le16(index
);
487 hdr
->len
= cpu_to_le16(data_len
);
490 memcpy(skb_put(skb
, data_len
), data
, data_len
);
492 hci_send_to_sock(NULL
, skb
, skip_sk
);
498 static int send_mode_rsp(struct sock
*sk
, u16 opcode
, u16 index
, u8 val
)
504 return cmd_complete(sk
, index
, opcode
, &rp
, sizeof(rp
));
507 static int set_pairable(struct sock
*sk
, u16 index
, unsigned char *data
,
510 struct mgmt_mode
*cp
, ev
;
511 struct hci_dev
*hdev
;
516 BT_DBG("request for hci%u", index
);
518 if (len
!= sizeof(*cp
))
519 return cmd_status(sk
, index
, MGMT_OP_SET_PAIRABLE
, EINVAL
);
521 hdev
= hci_dev_get(index
);
523 return cmd_status(sk
, index
, MGMT_OP_SET_PAIRABLE
, ENODEV
);
525 hci_dev_lock_bh(hdev
);
528 set_bit(HCI_PAIRABLE
, &hdev
->flags
);
530 clear_bit(HCI_PAIRABLE
, &hdev
->flags
);
532 err
= send_mode_rsp(sk
, MGMT_OP_SET_PAIRABLE
, index
, cp
->val
);
538 err
= mgmt_event(MGMT_EV_PAIRABLE
, index
, &ev
, sizeof(ev
), sk
);
541 hci_dev_unlock_bh(hdev
);
547 static u8
get_service_classes(struct hci_dev
*hdev
)
552 list_for_each(p
, &hdev
->uuids
) {
553 struct bt_uuid
*uuid
= list_entry(p
, struct bt_uuid
, list
);
555 val
|= uuid
->svc_hint
;
561 static int update_class(struct hci_dev
*hdev
)
565 BT_DBG("%s", hdev
->name
);
567 if (test_bit(HCI_SERVICE_CACHE
, &hdev
->flags
))
570 cod
[0] = hdev
->minor_class
;
571 cod
[1] = hdev
->major_class
;
572 cod
[2] = get_service_classes(hdev
);
574 if (memcmp(cod
, hdev
->dev_class
, 3) == 0)
577 return hci_send_cmd(hdev
, HCI_OP_WRITE_CLASS_OF_DEV
, sizeof(cod
), cod
);
580 static int add_uuid(struct sock
*sk
, u16 index
, unsigned char *data
, u16 len
)
582 struct mgmt_cp_add_uuid
*cp
;
583 struct hci_dev
*hdev
;
584 struct bt_uuid
*uuid
;
589 BT_DBG("request for hci%u", index
);
591 if (len
!= sizeof(*cp
))
592 return cmd_status(sk
, index
, MGMT_OP_ADD_UUID
, EINVAL
);
594 hdev
= hci_dev_get(index
);
596 return cmd_status(sk
, index
, MGMT_OP_ADD_UUID
, ENODEV
);
598 hci_dev_lock_bh(hdev
);
600 uuid
= kmalloc(sizeof(*uuid
), GFP_ATOMIC
);
606 memcpy(uuid
->uuid
, cp
->uuid
, 16);
607 uuid
->svc_hint
= cp
->svc_hint
;
609 list_add(&uuid
->list
, &hdev
->uuids
);
611 err
= update_class(hdev
);
615 err
= cmd_complete(sk
, index
, MGMT_OP_ADD_UUID
, NULL
, 0);
618 hci_dev_unlock_bh(hdev
);
624 static int remove_uuid(struct sock
*sk
, u16 index
, unsigned char *data
, u16 len
)
626 struct list_head
*p
, *n
;
627 struct mgmt_cp_remove_uuid
*cp
;
628 struct hci_dev
*hdev
;
629 u8 bt_uuid_any
[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
634 BT_DBG("request for hci%u", index
);
636 if (len
!= sizeof(*cp
))
637 return cmd_status(sk
, index
, MGMT_OP_REMOVE_UUID
, EINVAL
);
639 hdev
= hci_dev_get(index
);
641 return cmd_status(sk
, index
, MGMT_OP_REMOVE_UUID
, ENODEV
);
643 hci_dev_lock_bh(hdev
);
645 if (memcmp(cp
->uuid
, bt_uuid_any
, 16) == 0) {
646 err
= hci_uuids_clear(hdev
);
652 list_for_each_safe(p
, n
, &hdev
->uuids
) {
653 struct bt_uuid
*match
= list_entry(p
, struct bt_uuid
, list
);
655 if (memcmp(match
->uuid
, cp
->uuid
, 16) != 0)
658 list_del(&match
->list
);
663 err
= cmd_status(sk
, index
, MGMT_OP_REMOVE_UUID
, ENOENT
);
667 err
= update_class(hdev
);
671 err
= cmd_complete(sk
, index
, MGMT_OP_REMOVE_UUID
, NULL
, 0);
674 hci_dev_unlock_bh(hdev
);
680 static int set_dev_class(struct sock
*sk
, u16 index
, unsigned char *data
,
683 struct hci_dev
*hdev
;
684 struct mgmt_cp_set_dev_class
*cp
;
689 BT_DBG("request for hci%u", index
);
691 if (len
!= sizeof(*cp
))
692 return cmd_status(sk
, index
, MGMT_OP_SET_DEV_CLASS
, EINVAL
);
694 hdev
= hci_dev_get(index
);
696 return cmd_status(sk
, index
, MGMT_OP_SET_DEV_CLASS
, ENODEV
);
698 hci_dev_lock_bh(hdev
);
700 hdev
->major_class
= cp
->major
;
701 hdev
->minor_class
= cp
->minor
;
703 err
= update_class(hdev
);
706 err
= cmd_complete(sk
, index
, MGMT_OP_SET_DEV_CLASS
, NULL
, 0);
708 hci_dev_unlock_bh(hdev
);
714 static int set_service_cache(struct sock
*sk
, u16 index
, unsigned char *data
,
717 struct hci_dev
*hdev
;
718 struct mgmt_cp_set_service_cache
*cp
;
723 if (len
!= sizeof(*cp
))
724 return cmd_status(sk
, index
, MGMT_OP_SET_SERVICE_CACHE
, EINVAL
);
726 hdev
= hci_dev_get(index
);
728 return cmd_status(sk
, index
, MGMT_OP_SET_SERVICE_CACHE
, ENODEV
);
730 hci_dev_lock_bh(hdev
);
732 BT_DBG("hci%u enable %d", index
, cp
->enable
);
735 set_bit(HCI_SERVICE_CACHE
, &hdev
->flags
);
738 clear_bit(HCI_SERVICE_CACHE
, &hdev
->flags
);
739 err
= update_class(hdev
);
743 err
= cmd_complete(sk
, index
, MGMT_OP_SET_SERVICE_CACHE
, NULL
,
746 hci_dev_unlock_bh(hdev
);
752 static int load_keys(struct sock
*sk
, u16 index
, unsigned char *data
, u16 len
)
754 struct hci_dev
*hdev
;
755 struct mgmt_cp_load_keys
*cp
;
756 u16 key_count
, expected_len
;
761 if (len
< sizeof(*cp
))
764 key_count
= get_unaligned_le16(&cp
->key_count
);
766 expected_len
= sizeof(*cp
) + key_count
* sizeof(struct mgmt_key_info
);
767 if (expected_len
!= len
) {
768 BT_ERR("load_keys: expected %u bytes, got %u bytes",
773 hdev
= hci_dev_get(index
);
775 return cmd_status(sk
, index
, MGMT_OP_LOAD_KEYS
, ENODEV
);
777 BT_DBG("hci%u debug_keys %u key_count %u", index
, cp
->debug_keys
,
780 hci_dev_lock_bh(hdev
);
782 hci_link_keys_clear(hdev
);
784 set_bit(HCI_LINK_KEYS
, &hdev
->flags
);
787 set_bit(HCI_DEBUG_KEYS
, &hdev
->flags
);
789 clear_bit(HCI_DEBUG_KEYS
, &hdev
->flags
);
791 for (i
= 0; i
< key_count
; i
++) {
792 struct mgmt_key_info
*key
= &cp
->keys
[i
];
794 hci_add_link_key(hdev
, 0, &key
->bdaddr
, key
->val
, key
->type
,
798 hci_dev_unlock_bh(hdev
);
804 static int remove_key(struct sock
*sk
, u16 index
, unsigned char *data
, u16 len
)
806 struct hci_dev
*hdev
;
807 struct mgmt_cp_remove_key
*cp
;
808 struct hci_conn
*conn
;
813 if (len
!= sizeof(*cp
))
814 return cmd_status(sk
, index
, MGMT_OP_REMOVE_KEY
, EINVAL
);
816 hdev
= hci_dev_get(index
);
818 return cmd_status(sk
, index
, MGMT_OP_REMOVE_KEY
, ENODEV
);
820 hci_dev_lock_bh(hdev
);
822 err
= hci_remove_link_key(hdev
, &cp
->bdaddr
);
824 err
= cmd_status(sk
, index
, MGMT_OP_REMOVE_KEY
, -err
);
830 if (!test_bit(HCI_UP
, &hdev
->flags
) || !cp
->disconnect
)
833 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
, &cp
->bdaddr
);
835 struct hci_cp_disconnect dc
;
837 put_unaligned_le16(conn
->handle
, &dc
.handle
);
838 dc
.reason
= 0x13; /* Remote User Terminated Connection */
839 err
= hci_send_cmd(hdev
, HCI_OP_DISCONNECT
, 0, NULL
);
843 hci_dev_unlock_bh(hdev
);
849 static int disconnect(struct sock
*sk
, u16 index
, unsigned char *data
, u16 len
)
851 struct hci_dev
*hdev
;
852 struct mgmt_cp_disconnect
*cp
;
853 struct hci_cp_disconnect dc
;
854 struct pending_cmd
*cmd
;
855 struct hci_conn
*conn
;
862 if (len
!= sizeof(*cp
))
863 return cmd_status(sk
, index
, MGMT_OP_DISCONNECT
, EINVAL
);
865 hdev
= hci_dev_get(index
);
867 return cmd_status(sk
, index
, MGMT_OP_DISCONNECT
, ENODEV
);
869 hci_dev_lock_bh(hdev
);
871 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
872 err
= cmd_status(sk
, index
, MGMT_OP_DISCONNECT
, ENETDOWN
);
876 if (mgmt_pending_find(MGMT_OP_DISCONNECT
, index
)) {
877 err
= cmd_status(sk
, index
, MGMT_OP_DISCONNECT
, EBUSY
);
881 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
, &cp
->bdaddr
);
883 err
= cmd_status(sk
, index
, MGMT_OP_DISCONNECT
, ENOTCONN
);
887 cmd
= mgmt_pending_add(sk
, MGMT_OP_DISCONNECT
, index
, data
, len
);
893 put_unaligned_le16(conn
->handle
, &dc
.handle
);
894 dc
.reason
= 0x13; /* Remote User Terminated Connection */
896 err
= hci_send_cmd(hdev
, HCI_OP_DISCONNECT
, sizeof(dc
), &dc
);
898 mgmt_pending_remove(cmd
);
901 hci_dev_unlock_bh(hdev
);
907 static int get_connections(struct sock
*sk
, u16 index
)
909 struct mgmt_rp_get_connections
*rp
;
910 struct hci_dev
*hdev
;
918 hdev
= hci_dev_get(index
);
920 return cmd_status(sk
, index
, MGMT_OP_GET_CONNECTIONS
, ENODEV
);
922 hci_dev_lock_bh(hdev
);
925 list_for_each(p
, &hdev
->conn_hash
.list
) {
929 rp_len
= sizeof(*rp
) + (count
* sizeof(bdaddr_t
));
930 rp
= kmalloc(rp_len
, GFP_ATOMIC
);
936 put_unaligned_le16(count
, &rp
->conn_count
);
938 read_lock(&hci_dev_list_lock
);
941 list_for_each(p
, &hdev
->conn_hash
.list
) {
942 struct hci_conn
*c
= list_entry(p
, struct hci_conn
, list
);
944 bacpy(&rp
->conn
[i
++], &c
->dst
);
947 read_unlock(&hci_dev_list_lock
);
949 err
= cmd_complete(sk
, index
, MGMT_OP_GET_CONNECTIONS
, rp
, rp_len
);
953 hci_dev_unlock_bh(hdev
);
958 static int pin_code_reply(struct sock
*sk
, u16 index
, unsigned char *data
,
961 struct hci_dev
*hdev
;
962 struct mgmt_cp_pin_code_reply
*cp
;
963 struct hci_cp_pin_code_reply reply
;
964 struct pending_cmd
*cmd
;
971 if (len
!= sizeof(*cp
))
972 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
, EINVAL
);
974 hdev
= hci_dev_get(index
);
976 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
, ENODEV
);
978 hci_dev_lock_bh(hdev
);
980 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
981 err
= cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
, ENETDOWN
);
985 cmd
= mgmt_pending_add(sk
, MGMT_OP_PIN_CODE_REPLY
, index
, data
, len
);
991 bacpy(&reply
.bdaddr
, &cp
->bdaddr
);
992 reply
.pin_len
= cp
->pin_len
;
993 memcpy(reply
.pin_code
, cp
->pin_code
, 16);
995 err
= hci_send_cmd(hdev
, HCI_OP_PIN_CODE_REPLY
, sizeof(reply
), &reply
);
997 mgmt_pending_remove(cmd
);
1000 hci_dev_unlock_bh(hdev
);
1006 static int pin_code_neg_reply(struct sock
*sk
, u16 index
, unsigned char *data
,
1009 struct hci_dev
*hdev
;
1010 struct mgmt_cp_pin_code_neg_reply
*cp
;
1011 struct pending_cmd
*cmd
;
1018 if (len
!= sizeof(*cp
))
1019 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_NEG_REPLY
,
1022 hdev
= hci_dev_get(index
);
1024 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_NEG_REPLY
,
1027 hci_dev_lock_bh(hdev
);
1029 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1030 err
= cmd_status(sk
, index
, MGMT_OP_PIN_CODE_NEG_REPLY
,
1035 cmd
= mgmt_pending_add(sk
, MGMT_OP_PIN_CODE_NEG_REPLY
, index
,
1042 err
= hci_send_cmd(hdev
, HCI_OP_PIN_CODE_NEG_REPLY
, sizeof(cp
->bdaddr
),
1045 mgmt_pending_remove(cmd
);
1048 hci_dev_unlock_bh(hdev
);
1054 static int set_io_capability(struct sock
*sk
, u16 index
, unsigned char *data
,
1057 struct hci_dev
*hdev
;
1058 struct mgmt_cp_set_io_capability
*cp
;
1064 if (len
!= sizeof(*cp
))
1065 return cmd_status(sk
, index
, MGMT_OP_SET_IO_CAPABILITY
, EINVAL
);
1067 hdev
= hci_dev_get(index
);
1069 return cmd_status(sk
, index
, MGMT_OP_SET_IO_CAPABILITY
, ENODEV
);
1071 hci_dev_lock_bh(hdev
);
1073 hdev
->io_capability
= cp
->io_capability
;
1075 BT_DBG("%s IO capability set to 0x%02x", hdev
->name
,
1076 hdev
->io_capability
);
1078 hci_dev_unlock_bh(hdev
);
1081 return cmd_complete(sk
, index
, MGMT_OP_SET_IO_CAPABILITY
, NULL
, 0);
1084 static inline struct pending_cmd
*find_pairing(struct hci_conn
*conn
)
1086 struct hci_dev
*hdev
= conn
->hdev
;
1087 struct list_head
*p
;
1089 list_for_each(p
, &cmd_list
) {
1090 struct pending_cmd
*cmd
;
1092 cmd
= list_entry(p
, struct pending_cmd
, list
);
1094 if (cmd
->opcode
!= MGMT_OP_PAIR_DEVICE
)
1097 if (cmd
->index
!= hdev
->id
)
1100 if (cmd
->user_data
!= conn
)
1109 static void pairing_complete(struct pending_cmd
*cmd
, u8 status
)
1111 struct mgmt_rp_pair_device rp
;
1112 struct hci_conn
*conn
= cmd
->user_data
;
1114 bacpy(&rp
.bdaddr
, &conn
->dst
);
1117 cmd_complete(cmd
->sk
, cmd
->index
, MGMT_OP_PAIR_DEVICE
, &rp
, sizeof(rp
));
1119 /* So we don't get further callbacks for this connection */
1120 conn
->connect_cfm_cb
= NULL
;
1121 conn
->security_cfm_cb
= NULL
;
1122 conn
->disconn_cfm_cb
= NULL
;
1126 mgmt_pending_remove(cmd
);
1129 static void pairing_complete_cb(struct hci_conn
*conn
, u8 status
)
1131 struct pending_cmd
*cmd
;
1133 BT_DBG("status %u", status
);
1135 cmd
= find_pairing(conn
);
1137 BT_DBG("Unable to find a pending command");
1141 pairing_complete(cmd
, status
);
1144 static int pair_device(struct sock
*sk
, u16 index
, unsigned char *data
, u16 len
)
1146 struct hci_dev
*hdev
;
1147 struct mgmt_cp_pair_device
*cp
;
1148 struct pending_cmd
*cmd
;
1149 u8 sec_level
, auth_type
;
1150 struct hci_conn
*conn
;
1157 if (len
!= sizeof(*cp
))
1158 return cmd_status(sk
, index
, MGMT_OP_PAIR_DEVICE
, EINVAL
);
1160 hdev
= hci_dev_get(index
);
1162 return cmd_status(sk
, index
, MGMT_OP_PAIR_DEVICE
, ENODEV
);
1164 hci_dev_lock_bh(hdev
);
1166 if (cp
->io_cap
== 0x03) {
1167 sec_level
= BT_SECURITY_MEDIUM
;
1168 auth_type
= HCI_AT_DEDICATED_BONDING
;
1170 sec_level
= BT_SECURITY_HIGH
;
1171 auth_type
= HCI_AT_DEDICATED_BONDING_MITM
;
1174 conn
= hci_connect(hdev
, ACL_LINK
, &cp
->bdaddr
, sec_level
, auth_type
);
1176 err
= PTR_ERR(conn
);
1180 if (conn
->connect_cfm_cb
) {
1182 err
= cmd_status(sk
, index
, MGMT_OP_PAIR_DEVICE
, EBUSY
);
1186 cmd
= mgmt_pending_add(sk
, MGMT_OP_PAIR_DEVICE
, index
, data
, len
);
1193 conn
->connect_cfm_cb
= pairing_complete_cb
;
1194 conn
->security_cfm_cb
= pairing_complete_cb
;
1195 conn
->disconn_cfm_cb
= pairing_complete_cb
;
1196 conn
->io_capability
= cp
->io_cap
;
1197 cmd
->user_data
= conn
;
1199 if (conn
->state
== BT_CONNECTED
&&
1200 hci_conn_security(conn
, sec_level
, auth_type
))
1201 pairing_complete(cmd
, 0);
1206 hci_dev_unlock_bh(hdev
);
1212 static int user_confirm_reply(struct sock
*sk
, u16 index
, unsigned char *data
,
1213 u16 len
, int success
)
1215 struct mgmt_cp_user_confirm_reply
*cp
= (void *) data
;
1216 u16 mgmt_op
, hci_op
;
1217 struct pending_cmd
*cmd
;
1218 struct hci_dev
*hdev
;
1224 mgmt_op
= MGMT_OP_USER_CONFIRM_REPLY
;
1225 hci_op
= HCI_OP_USER_CONFIRM_REPLY
;
1227 mgmt_op
= MGMT_OP_USER_CONFIRM_NEG_REPLY
;
1228 hci_op
= HCI_OP_USER_CONFIRM_NEG_REPLY
;
1231 if (len
!= sizeof(*cp
))
1232 return cmd_status(sk
, index
, mgmt_op
, EINVAL
);
1234 hdev
= hci_dev_get(index
);
1236 return cmd_status(sk
, index
, mgmt_op
, ENODEV
);
1238 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1239 err
= cmd_status(sk
, index
, mgmt_op
, ENETDOWN
);
1243 cmd
= mgmt_pending_add(sk
, mgmt_op
, index
, data
, len
);
1249 err
= hci_send_cmd(hdev
, hci_op
, sizeof(cp
->bdaddr
), &cp
->bdaddr
);
1251 mgmt_pending_remove(cmd
);
1254 hci_dev_unlock_bh(hdev
);
1260 static int set_local_name(struct sock
*sk
, u16 index
, unsigned char *data
,
1263 struct mgmt_cp_set_local_name
*mgmt_cp
= (void *) data
;
1264 struct hci_cp_write_local_name hci_cp
;
1265 struct hci_dev
*hdev
;
1266 struct pending_cmd
*cmd
;
1271 if (len
!= sizeof(*mgmt_cp
))
1272 return cmd_status(sk
, index
, MGMT_OP_SET_LOCAL_NAME
, EINVAL
);
1274 hdev
= hci_dev_get(index
);
1276 return cmd_status(sk
, index
, MGMT_OP_SET_LOCAL_NAME
, ENODEV
);
1278 hci_dev_lock_bh(hdev
);
1280 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_LOCAL_NAME
, index
, data
, len
);
1286 memcpy(hci_cp
.name
, mgmt_cp
->name
, sizeof(hci_cp
.name
));
1287 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_LOCAL_NAME
, sizeof(hci_cp
),
1290 mgmt_pending_remove(cmd
);
1293 hci_dev_unlock_bh(hdev
);
1299 static int read_local_oob_data(struct sock
*sk
, u16 index
)
1301 struct hci_dev
*hdev
;
1302 struct pending_cmd
*cmd
;
1305 BT_DBG("hci%u", index
);
1307 hdev
= hci_dev_get(index
);
1309 return cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
1312 hci_dev_lock_bh(hdev
);
1314 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1315 err
= cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
1320 if (!(hdev
->features
[6] & LMP_SIMPLE_PAIR
)) {
1321 err
= cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
1326 if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA
, index
)) {
1327 err
= cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
, EBUSY
);
1331 cmd
= mgmt_pending_add(sk
, MGMT_OP_READ_LOCAL_OOB_DATA
, index
, NULL
, 0);
1337 err
= hci_send_cmd(hdev
, HCI_OP_READ_LOCAL_OOB_DATA
, 0, NULL
);
1339 mgmt_pending_remove(cmd
);
1342 hci_dev_unlock_bh(hdev
);
1348 static int add_remote_oob_data(struct sock
*sk
, u16 index
, unsigned char *data
,
1351 struct hci_dev
*hdev
;
1352 struct mgmt_cp_add_remote_oob_data
*cp
= (void *) data
;
1355 BT_DBG("hci%u ", index
);
1357 if (len
!= sizeof(*cp
))
1358 return cmd_status(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
,
1361 hdev
= hci_dev_get(index
);
1363 return cmd_status(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
,
1366 hci_dev_lock_bh(hdev
);
1368 err
= hci_add_remote_oob_data(hdev
, &cp
->bdaddr
, cp
->hash
,
1371 err
= cmd_status(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
, -err
);
1373 err
= cmd_complete(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
, NULL
,
1376 hci_dev_unlock_bh(hdev
);
1382 static int remove_remote_oob_data(struct sock
*sk
, u16 index
,
1383 unsigned char *data
, u16 len
)
1385 struct hci_dev
*hdev
;
1386 struct mgmt_cp_remove_remote_oob_data
*cp
= (void *) data
;
1389 BT_DBG("hci%u ", index
);
1391 if (len
!= sizeof(*cp
))
1392 return cmd_status(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
1395 hdev
= hci_dev_get(index
);
1397 return cmd_status(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
1400 hci_dev_lock_bh(hdev
);
1402 err
= hci_remove_remote_oob_data(hdev
, &cp
->bdaddr
);
1404 err
= cmd_status(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
1407 err
= cmd_complete(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
1410 hci_dev_unlock_bh(hdev
);
1416 int mgmt_control(struct sock
*sk
, struct msghdr
*msg
, size_t msglen
)
1419 struct mgmt_hdr
*hdr
;
1420 u16 opcode
, index
, len
;
1423 BT_DBG("got %zu bytes", msglen
);
1425 if (msglen
< sizeof(*hdr
))
1428 buf
= kmalloc(msglen
, GFP_ATOMIC
);
1432 if (memcpy_fromiovec(buf
, msg
->msg_iov
, msglen
)) {
1437 hdr
= (struct mgmt_hdr
*) buf
;
1438 opcode
= get_unaligned_le16(&hdr
->opcode
);
1439 index
= get_unaligned_le16(&hdr
->index
);
1440 len
= get_unaligned_le16(&hdr
->len
);
1442 if (len
!= msglen
- sizeof(*hdr
)) {
1448 case MGMT_OP_READ_VERSION
:
1449 err
= read_version(sk
);
1451 case MGMT_OP_READ_INDEX_LIST
:
1452 err
= read_index_list(sk
);
1454 case MGMT_OP_READ_INFO
:
1455 err
= read_controller_info(sk
, index
);
1457 case MGMT_OP_SET_POWERED
:
1458 err
= set_powered(sk
, index
, buf
+ sizeof(*hdr
), len
);
1460 case MGMT_OP_SET_DISCOVERABLE
:
1461 err
= set_discoverable(sk
, index
, buf
+ sizeof(*hdr
), len
);
1463 case MGMT_OP_SET_CONNECTABLE
:
1464 err
= set_connectable(sk
, index
, buf
+ sizeof(*hdr
), len
);
1466 case MGMT_OP_SET_PAIRABLE
:
1467 err
= set_pairable(sk
, index
, buf
+ sizeof(*hdr
), len
);
1469 case MGMT_OP_ADD_UUID
:
1470 err
= add_uuid(sk
, index
, buf
+ sizeof(*hdr
), len
);
1472 case MGMT_OP_REMOVE_UUID
:
1473 err
= remove_uuid(sk
, index
, buf
+ sizeof(*hdr
), len
);
1475 case MGMT_OP_SET_DEV_CLASS
:
1476 err
= set_dev_class(sk
, index
, buf
+ sizeof(*hdr
), len
);
1478 case MGMT_OP_SET_SERVICE_CACHE
:
1479 err
= set_service_cache(sk
, index
, buf
+ sizeof(*hdr
), len
);
1481 case MGMT_OP_LOAD_KEYS
:
1482 err
= load_keys(sk
, index
, buf
+ sizeof(*hdr
), len
);
1484 case MGMT_OP_REMOVE_KEY
:
1485 err
= remove_key(sk
, index
, buf
+ sizeof(*hdr
), len
);
1487 case MGMT_OP_DISCONNECT
:
1488 err
= disconnect(sk
, index
, buf
+ sizeof(*hdr
), len
);
1490 case MGMT_OP_GET_CONNECTIONS
:
1491 err
= get_connections(sk
, index
);
1493 case MGMT_OP_PIN_CODE_REPLY
:
1494 err
= pin_code_reply(sk
, index
, buf
+ sizeof(*hdr
), len
);
1496 case MGMT_OP_PIN_CODE_NEG_REPLY
:
1497 err
= pin_code_neg_reply(sk
, index
, buf
+ sizeof(*hdr
), len
);
1499 case MGMT_OP_SET_IO_CAPABILITY
:
1500 err
= set_io_capability(sk
, index
, buf
+ sizeof(*hdr
), len
);
1502 case MGMT_OP_PAIR_DEVICE
:
1503 err
= pair_device(sk
, index
, buf
+ sizeof(*hdr
), len
);
1505 case MGMT_OP_USER_CONFIRM_REPLY
:
1506 err
= user_confirm_reply(sk
, index
, buf
+ sizeof(*hdr
), len
, 1);
1508 case MGMT_OP_USER_CONFIRM_NEG_REPLY
:
1509 err
= user_confirm_reply(sk
, index
, buf
+ sizeof(*hdr
), len
, 0);
1511 case MGMT_OP_SET_LOCAL_NAME
:
1512 err
= set_local_name(sk
, index
, buf
+ sizeof(*hdr
), len
);
1514 case MGMT_OP_READ_LOCAL_OOB_DATA
:
1515 err
= read_local_oob_data(sk
, index
);
1517 case MGMT_OP_ADD_REMOTE_OOB_DATA
:
1518 err
= add_remote_oob_data(sk
, index
, buf
+ sizeof(*hdr
), len
);
1520 case MGMT_OP_REMOVE_REMOTE_OOB_DATA
:
1521 err
= remove_remote_oob_data(sk
, index
, buf
+ sizeof(*hdr
),
1526 BT_DBG("Unknown op %u", opcode
);
1527 err
= cmd_status(sk
, index
, opcode
, 0x01);
1541 int mgmt_index_added(u16 index
)
1543 return mgmt_event(MGMT_EV_INDEX_ADDED
, index
, NULL
, 0, NULL
);
1546 int mgmt_index_removed(u16 index
)
1548 return mgmt_event(MGMT_EV_INDEX_REMOVED
, index
, NULL
, 0, NULL
);
1556 static void mode_rsp(struct pending_cmd
*cmd
, void *data
)
1558 struct mgmt_mode
*cp
= cmd
->param
;
1559 struct cmd_lookup
*match
= data
;
1561 if (cp
->val
!= match
->val
)
1564 send_mode_rsp(cmd
->sk
, cmd
->opcode
, cmd
->index
, cp
->val
);
1566 list_del(&cmd
->list
);
1568 if (match
->sk
== NULL
) {
1569 match
->sk
= cmd
->sk
;
1570 sock_hold(match
->sk
);
1573 mgmt_pending_free(cmd
);
1576 int mgmt_powered(u16 index
, u8 powered
)
1578 struct mgmt_mode ev
;
1579 struct cmd_lookup match
= { powered
, NULL
};
1582 mgmt_pending_foreach(MGMT_OP_SET_POWERED
, index
, mode_rsp
, &match
);
1586 ret
= mgmt_event(MGMT_EV_POWERED
, index
, &ev
, sizeof(ev
), match
.sk
);
1594 int mgmt_discoverable(u16 index
, u8 discoverable
)
1596 struct mgmt_mode ev
;
1597 struct cmd_lookup match
= { discoverable
, NULL
};
1600 mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE
, index
, mode_rsp
, &match
);
1602 ev
.val
= discoverable
;
1604 ret
= mgmt_event(MGMT_EV_DISCOVERABLE
, index
, &ev
, sizeof(ev
),
1613 int mgmt_connectable(u16 index
, u8 connectable
)
1615 struct mgmt_mode ev
;
1616 struct cmd_lookup match
= { connectable
, NULL
};
1619 mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE
, index
, mode_rsp
, &match
);
1621 ev
.val
= connectable
;
1623 ret
= mgmt_event(MGMT_EV_CONNECTABLE
, index
, &ev
, sizeof(ev
), match
.sk
);
1631 int mgmt_new_key(u16 index
, struct link_key
*key
, u8 old_key_type
)
1633 struct mgmt_ev_new_key ev
;
1635 memset(&ev
, 0, sizeof(ev
));
1637 bacpy(&ev
.key
.bdaddr
, &key
->bdaddr
);
1638 ev
.key
.type
= key
->type
;
1639 memcpy(ev
.key
.val
, key
->val
, 16);
1640 ev
.key
.pin_len
= key
->pin_len
;
1641 ev
.old_key_type
= old_key_type
;
1643 return mgmt_event(MGMT_EV_NEW_KEY
, index
, &ev
, sizeof(ev
), NULL
);
1646 int mgmt_connected(u16 index
, bdaddr_t
*bdaddr
)
1648 struct mgmt_ev_connected ev
;
1650 bacpy(&ev
.bdaddr
, bdaddr
);
1652 return mgmt_event(MGMT_EV_CONNECTED
, index
, &ev
, sizeof(ev
), NULL
);
1655 static void disconnect_rsp(struct pending_cmd
*cmd
, void *data
)
1657 struct mgmt_cp_disconnect
*cp
= cmd
->param
;
1658 struct sock
**sk
= data
;
1659 struct mgmt_rp_disconnect rp
;
1661 bacpy(&rp
.bdaddr
, &cp
->bdaddr
);
1663 cmd_complete(cmd
->sk
, cmd
->index
, MGMT_OP_DISCONNECT
, &rp
, sizeof(rp
));
1668 mgmt_pending_remove(cmd
);
1671 int mgmt_disconnected(u16 index
, bdaddr_t
*bdaddr
)
1673 struct mgmt_ev_disconnected ev
;
1674 struct sock
*sk
= NULL
;
1677 mgmt_pending_foreach(MGMT_OP_DISCONNECT
, index
, disconnect_rsp
, &sk
);
1679 bacpy(&ev
.bdaddr
, bdaddr
);
1681 err
= mgmt_event(MGMT_EV_DISCONNECTED
, index
, &ev
, sizeof(ev
), sk
);
1689 int mgmt_disconnect_failed(u16 index
)
1691 struct pending_cmd
*cmd
;
1694 cmd
= mgmt_pending_find(MGMT_OP_DISCONNECT
, index
);
1698 err
= cmd_status(cmd
->sk
, index
, MGMT_OP_DISCONNECT
, EIO
);
1700 mgmt_pending_remove(cmd
);
1705 int mgmt_connect_failed(u16 index
, bdaddr_t
*bdaddr
, u8 status
)
1707 struct mgmt_ev_connect_failed ev
;
1709 bacpy(&ev
.bdaddr
, bdaddr
);
1712 return mgmt_event(MGMT_EV_CONNECT_FAILED
, index
, &ev
, sizeof(ev
), NULL
);
1715 int mgmt_pin_code_request(u16 index
, bdaddr_t
*bdaddr
)
1717 struct mgmt_ev_pin_code_request ev
;
1719 bacpy(&ev
.bdaddr
, bdaddr
);
1721 return mgmt_event(MGMT_EV_PIN_CODE_REQUEST
, index
, &ev
, sizeof(ev
),
1725 int mgmt_pin_code_reply_complete(u16 index
, bdaddr_t
*bdaddr
, u8 status
)
1727 struct pending_cmd
*cmd
;
1728 struct mgmt_rp_pin_code_reply rp
;
1731 cmd
= mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY
, index
);
1735 bacpy(&rp
.bdaddr
, bdaddr
);
1738 err
= cmd_complete(cmd
->sk
, index
, MGMT_OP_PIN_CODE_REPLY
, &rp
,
1741 mgmt_pending_remove(cmd
);
1746 int mgmt_pin_code_neg_reply_complete(u16 index
, bdaddr_t
*bdaddr
, u8 status
)
1748 struct pending_cmd
*cmd
;
1749 struct mgmt_rp_pin_code_reply rp
;
1752 cmd
= mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY
, index
);
1756 bacpy(&rp
.bdaddr
, bdaddr
);
1759 err
= cmd_complete(cmd
->sk
, index
, MGMT_OP_PIN_CODE_NEG_REPLY
, &rp
,
1762 mgmt_pending_remove(cmd
);
1767 int mgmt_user_confirm_request(u16 index
, bdaddr_t
*bdaddr
, __le32 value
)
1769 struct mgmt_ev_user_confirm_request ev
;
1771 BT_DBG("hci%u", index
);
1773 bacpy(&ev
.bdaddr
, bdaddr
);
1774 put_unaligned_le32(value
, &ev
.value
);
1776 return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST
, index
, &ev
, sizeof(ev
),
1780 static int confirm_reply_complete(u16 index
, bdaddr_t
*bdaddr
, u8 status
,
1783 struct pending_cmd
*cmd
;
1784 struct mgmt_rp_user_confirm_reply rp
;
1787 cmd
= mgmt_pending_find(opcode
, index
);
1791 bacpy(&rp
.bdaddr
, bdaddr
);
1793 err
= cmd_complete(cmd
->sk
, index
, opcode
, &rp
, sizeof(rp
));
1795 mgmt_pending_remove(cmd
);
1800 int mgmt_user_confirm_reply_complete(u16 index
, bdaddr_t
*bdaddr
, u8 status
)
1802 return confirm_reply_complete(index
, bdaddr
, status
,
1803 MGMT_OP_USER_CONFIRM_REPLY
);
1806 int mgmt_user_confirm_neg_reply_complete(u16 index
, bdaddr_t
*bdaddr
, u8 status
)
1808 return confirm_reply_complete(index
, bdaddr
, status
,
1809 MGMT_OP_USER_CONFIRM_NEG_REPLY
);
1812 int mgmt_auth_failed(u16 index
, bdaddr_t
*bdaddr
, u8 status
)
1814 struct mgmt_ev_auth_failed ev
;
1816 bacpy(&ev
.bdaddr
, bdaddr
);
1819 return mgmt_event(MGMT_EV_AUTH_FAILED
, index
, &ev
, sizeof(ev
), NULL
);
1822 int mgmt_set_local_name_complete(u16 index
, u8
*name
, u8 status
)
1824 struct pending_cmd
*cmd
;
1825 struct mgmt_cp_set_local_name ev
;
1828 memset(&ev
, 0, sizeof(ev
));
1829 memcpy(ev
.name
, name
, HCI_MAX_NAME_LENGTH
);
1831 cmd
= mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME
, index
);
1836 err
= cmd_status(cmd
->sk
, index
, MGMT_OP_SET_LOCAL_NAME
, EIO
);
1840 err
= cmd_complete(cmd
->sk
, index
, MGMT_OP_SET_LOCAL_NAME
, &ev
,
1846 err
= mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED
, index
, &ev
, sizeof(ev
),
1847 cmd
? cmd
->sk
: NULL
);
1851 mgmt_pending_remove(cmd
);
1855 int mgmt_read_local_oob_data_reply_complete(u16 index
, u8
*hash
, u8
*randomizer
,
1858 struct pending_cmd
*cmd
;
1861 BT_DBG("hci%u status %u", index
, status
);
1863 cmd
= mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA
, index
);
1868 err
= cmd_status(cmd
->sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
1871 struct mgmt_rp_read_local_oob_data rp
;
1873 memcpy(rp
.hash
, hash
, sizeof(rp
.hash
));
1874 memcpy(rp
.randomizer
, randomizer
, sizeof(rp
.randomizer
));
1876 err
= cmd_complete(cmd
->sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
1880 mgmt_pending_remove(cmd
);