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
);
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(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
);
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(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
);
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(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
);
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(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
);
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(hdev
);
547 #define EIR_FLAGS 0x01 /* flags */
548 #define EIR_UUID16_SOME 0x02 /* 16-bit UUID, more available */
549 #define EIR_UUID16_ALL 0x03 /* 16-bit UUID, all listed */
550 #define EIR_UUID32_SOME 0x04 /* 32-bit UUID, more available */
551 #define EIR_UUID32_ALL 0x05 /* 32-bit UUID, all listed */
552 #define EIR_UUID128_SOME 0x06 /* 128-bit UUID, more available */
553 #define EIR_UUID128_ALL 0x07 /* 128-bit UUID, all listed */
554 #define EIR_NAME_SHORT 0x08 /* shortened local name */
555 #define EIR_NAME_COMPLETE 0x09 /* complete local name */
556 #define EIR_TX_POWER 0x0A /* transmit power level */
557 #define EIR_DEVICE_ID 0x10 /* device ID */
559 #define PNP_INFO_SVCLASS_ID 0x1200
561 static u8 bluetooth_base_uuid
[] = {
562 0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80,
563 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
566 static u16
get_uuid16(u8
*uuid128
)
571 for (i
= 0; i
< 12; i
++) {
572 if (bluetooth_base_uuid
[i
] != uuid128
[i
])
576 memcpy(&val
, &uuid128
[12], 4);
578 val
= le32_to_cpu(val
);
585 static void create_eir(struct hci_dev
*hdev
, u8
*data
)
589 u16 uuid16_list
[HCI_MAX_EIR_LENGTH
/ sizeof(u16
)];
590 int i
, truncated
= 0;
594 name_len
= strlen(hdev
->dev_name
);
600 ptr
[1] = EIR_NAME_SHORT
;
602 ptr
[1] = EIR_NAME_COMPLETE
;
604 /* EIR Data length */
605 ptr
[0] = name_len
+ 1;
607 memcpy(ptr
+ 2, hdev
->dev_name
, name_len
);
609 eir_len
+= (name_len
+ 2);
610 ptr
+= (name_len
+ 2);
613 memset(uuid16_list
, 0, sizeof(uuid16_list
));
615 /* Group all UUID16 types */
616 list_for_each(p
, &hdev
->uuids
) {
617 struct bt_uuid
*uuid
= list_entry(p
, struct bt_uuid
, list
);
620 uuid16
= get_uuid16(uuid
->uuid
);
627 if (uuid16
== PNP_INFO_SVCLASS_ID
)
630 /* Stop if not enough space to put next UUID */
631 if (eir_len
+ 2 + sizeof(u16
) > HCI_MAX_EIR_LENGTH
) {
636 /* Check for duplicates */
637 for (i
= 0; uuid16_list
[i
] != 0; i
++)
638 if (uuid16_list
[i
] == uuid16
)
641 if (uuid16_list
[i
] == 0) {
642 uuid16_list
[i
] = uuid16
;
643 eir_len
+= sizeof(u16
);
647 if (uuid16_list
[0] != 0) {
651 ptr
[1] = truncated
? EIR_UUID16_SOME
: EIR_UUID16_ALL
;
656 for (i
= 0; uuid16_list
[i
] != 0; i
++) {
657 *ptr
++ = (uuid16_list
[i
] & 0x00ff);
658 *ptr
++ = (uuid16_list
[i
] & 0xff00) >> 8;
661 /* EIR Data length */
662 *length
= (i
* sizeof(u16
)) + 1;
666 static int update_eir(struct hci_dev
*hdev
)
668 struct hci_cp_write_eir cp
;
670 if (!(hdev
->features
[6] & LMP_EXT_INQ
))
673 if (hdev
->ssp_mode
== 0)
676 if (test_bit(HCI_SERVICE_CACHE
, &hdev
->flags
))
679 memset(&cp
, 0, sizeof(cp
));
681 create_eir(hdev
, cp
.data
);
683 if (memcmp(cp
.data
, hdev
->eir
, sizeof(cp
.data
)) == 0)
686 memcpy(hdev
->eir
, cp
.data
, sizeof(cp
.data
));
688 return hci_send_cmd(hdev
, HCI_OP_WRITE_EIR
, sizeof(cp
), &cp
);
691 static u8
get_service_classes(struct hci_dev
*hdev
)
696 list_for_each(p
, &hdev
->uuids
) {
697 struct bt_uuid
*uuid
= list_entry(p
, struct bt_uuid
, list
);
699 val
|= uuid
->svc_hint
;
705 static int update_class(struct hci_dev
*hdev
)
709 BT_DBG("%s", hdev
->name
);
711 if (test_bit(HCI_SERVICE_CACHE
, &hdev
->flags
))
714 cod
[0] = hdev
->minor_class
;
715 cod
[1] = hdev
->major_class
;
716 cod
[2] = get_service_classes(hdev
);
718 if (memcmp(cod
, hdev
->dev_class
, 3) == 0)
721 return hci_send_cmd(hdev
, HCI_OP_WRITE_CLASS_OF_DEV
, sizeof(cod
), cod
);
724 static int add_uuid(struct sock
*sk
, u16 index
, unsigned char *data
, u16 len
)
726 struct mgmt_cp_add_uuid
*cp
;
727 struct hci_dev
*hdev
;
728 struct bt_uuid
*uuid
;
733 BT_DBG("request for hci%u", index
);
735 if (len
!= sizeof(*cp
))
736 return cmd_status(sk
, index
, MGMT_OP_ADD_UUID
, EINVAL
);
738 hdev
= hci_dev_get(index
);
740 return cmd_status(sk
, index
, MGMT_OP_ADD_UUID
, ENODEV
);
744 uuid
= kmalloc(sizeof(*uuid
), GFP_ATOMIC
);
750 memcpy(uuid
->uuid
, cp
->uuid
, 16);
751 uuid
->svc_hint
= cp
->svc_hint
;
753 list_add(&uuid
->list
, &hdev
->uuids
);
755 err
= update_class(hdev
);
759 err
= update_eir(hdev
);
763 err
= cmd_complete(sk
, index
, MGMT_OP_ADD_UUID
, NULL
, 0);
766 hci_dev_unlock(hdev
);
772 static int remove_uuid(struct sock
*sk
, u16 index
, unsigned char *data
, u16 len
)
774 struct list_head
*p
, *n
;
775 struct mgmt_cp_remove_uuid
*cp
;
776 struct hci_dev
*hdev
;
777 u8 bt_uuid_any
[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
782 BT_DBG("request for hci%u", index
);
784 if (len
!= sizeof(*cp
))
785 return cmd_status(sk
, index
, MGMT_OP_REMOVE_UUID
, EINVAL
);
787 hdev
= hci_dev_get(index
);
789 return cmd_status(sk
, index
, MGMT_OP_REMOVE_UUID
, ENODEV
);
793 if (memcmp(cp
->uuid
, bt_uuid_any
, 16) == 0) {
794 err
= hci_uuids_clear(hdev
);
800 list_for_each_safe(p
, n
, &hdev
->uuids
) {
801 struct bt_uuid
*match
= list_entry(p
, struct bt_uuid
, list
);
803 if (memcmp(match
->uuid
, cp
->uuid
, 16) != 0)
806 list_del(&match
->list
);
811 err
= cmd_status(sk
, index
, MGMT_OP_REMOVE_UUID
, ENOENT
);
815 err
= update_class(hdev
);
819 err
= update_eir(hdev
);
823 err
= cmd_complete(sk
, index
, MGMT_OP_REMOVE_UUID
, NULL
, 0);
826 hci_dev_unlock(hdev
);
832 static int set_dev_class(struct sock
*sk
, u16 index
, unsigned char *data
,
835 struct hci_dev
*hdev
;
836 struct mgmt_cp_set_dev_class
*cp
;
841 BT_DBG("request for hci%u", index
);
843 if (len
!= sizeof(*cp
))
844 return cmd_status(sk
, index
, MGMT_OP_SET_DEV_CLASS
, EINVAL
);
846 hdev
= hci_dev_get(index
);
848 return cmd_status(sk
, index
, MGMT_OP_SET_DEV_CLASS
, ENODEV
);
852 hdev
->major_class
= cp
->major
;
853 hdev
->minor_class
= cp
->minor
;
855 err
= update_class(hdev
);
858 err
= cmd_complete(sk
, index
, MGMT_OP_SET_DEV_CLASS
, NULL
, 0);
860 hci_dev_unlock(hdev
);
866 static int set_service_cache(struct sock
*sk
, u16 index
, unsigned char *data
,
869 struct hci_dev
*hdev
;
870 struct mgmt_cp_set_service_cache
*cp
;
875 if (len
!= sizeof(*cp
))
876 return cmd_status(sk
, index
, MGMT_OP_SET_SERVICE_CACHE
, EINVAL
);
878 hdev
= hci_dev_get(index
);
880 return cmd_status(sk
, index
, MGMT_OP_SET_SERVICE_CACHE
, ENODEV
);
884 BT_DBG("hci%u enable %d", index
, cp
->enable
);
887 set_bit(HCI_SERVICE_CACHE
, &hdev
->flags
);
890 clear_bit(HCI_SERVICE_CACHE
, &hdev
->flags
);
891 err
= update_class(hdev
);
893 err
= update_eir(hdev
);
897 err
= cmd_complete(sk
, index
, MGMT_OP_SET_SERVICE_CACHE
, NULL
,
900 hci_dev_unlock(hdev
);
906 static int load_keys(struct sock
*sk
, u16 index
, unsigned char *data
, u16 len
)
908 struct hci_dev
*hdev
;
909 struct mgmt_cp_load_keys
*cp
;
910 u16 key_count
, expected_len
;
915 if (len
< sizeof(*cp
))
918 key_count
= get_unaligned_le16(&cp
->key_count
);
920 expected_len
= sizeof(*cp
) + key_count
* sizeof(struct mgmt_key_info
);
921 if (expected_len
!= len
) {
922 BT_ERR("load_keys: expected %u bytes, got %u bytes",
927 hdev
= hci_dev_get(index
);
929 return cmd_status(sk
, index
, MGMT_OP_LOAD_KEYS
, ENODEV
);
931 BT_DBG("hci%u debug_keys %u key_count %u", index
, cp
->debug_keys
,
936 hci_link_keys_clear(hdev
);
938 set_bit(HCI_LINK_KEYS
, &hdev
->flags
);
941 set_bit(HCI_DEBUG_KEYS
, &hdev
->flags
);
943 clear_bit(HCI_DEBUG_KEYS
, &hdev
->flags
);
945 for (i
= 0; i
< key_count
; i
++) {
946 struct mgmt_key_info
*key
= &cp
->keys
[i
];
948 hci_add_link_key(hdev
, NULL
, 0, &key
->bdaddr
, key
->val
, key
->type
,
952 hci_dev_unlock(hdev
);
958 static int remove_key(struct sock
*sk
, u16 index
, unsigned char *data
, u16 len
)
960 struct hci_dev
*hdev
;
961 struct mgmt_cp_remove_key
*cp
;
962 struct hci_conn
*conn
;
967 if (len
!= sizeof(*cp
))
968 return cmd_status(sk
, index
, MGMT_OP_REMOVE_KEY
, EINVAL
);
970 hdev
= hci_dev_get(index
);
972 return cmd_status(sk
, index
, MGMT_OP_REMOVE_KEY
, ENODEV
);
976 err
= hci_remove_link_key(hdev
, &cp
->bdaddr
);
978 err
= cmd_status(sk
, index
, MGMT_OP_REMOVE_KEY
, -err
);
984 if (!test_bit(HCI_UP
, &hdev
->flags
) || !cp
->disconnect
)
987 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
, &cp
->bdaddr
);
989 struct hci_cp_disconnect dc
;
991 put_unaligned_le16(conn
->handle
, &dc
.handle
);
992 dc
.reason
= 0x13; /* Remote User Terminated Connection */
993 err
= hci_send_cmd(hdev
, HCI_OP_DISCONNECT
, 0, NULL
);
997 hci_dev_unlock(hdev
);
1003 static int disconnect(struct sock
*sk
, u16 index
, unsigned char *data
, u16 len
)
1005 struct hci_dev
*hdev
;
1006 struct mgmt_cp_disconnect
*cp
;
1007 struct hci_cp_disconnect dc
;
1008 struct pending_cmd
*cmd
;
1009 struct hci_conn
*conn
;
1016 if (len
!= sizeof(*cp
))
1017 return cmd_status(sk
, index
, MGMT_OP_DISCONNECT
, EINVAL
);
1019 hdev
= hci_dev_get(index
);
1021 return cmd_status(sk
, index
, MGMT_OP_DISCONNECT
, ENODEV
);
1025 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1026 err
= cmd_status(sk
, index
, MGMT_OP_DISCONNECT
, ENETDOWN
);
1030 if (mgmt_pending_find(MGMT_OP_DISCONNECT
, index
)) {
1031 err
= cmd_status(sk
, index
, MGMT_OP_DISCONNECT
, EBUSY
);
1035 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
, &cp
->bdaddr
);
1037 conn
= hci_conn_hash_lookup_ba(hdev
, LE_LINK
, &cp
->bdaddr
);
1040 err
= cmd_status(sk
, index
, MGMT_OP_DISCONNECT
, ENOTCONN
);
1044 cmd
= mgmt_pending_add(sk
, MGMT_OP_DISCONNECT
, index
, data
, len
);
1050 put_unaligned_le16(conn
->handle
, &dc
.handle
);
1051 dc
.reason
= 0x13; /* Remote User Terminated Connection */
1053 err
= hci_send_cmd(hdev
, HCI_OP_DISCONNECT
, sizeof(dc
), &dc
);
1055 mgmt_pending_remove(cmd
);
1058 hci_dev_unlock(hdev
);
1064 static int get_connections(struct sock
*sk
, u16 index
)
1066 struct mgmt_rp_get_connections
*rp
;
1067 struct hci_dev
*hdev
;
1068 struct list_head
*p
;
1075 hdev
= hci_dev_get(index
);
1077 return cmd_status(sk
, index
, MGMT_OP_GET_CONNECTIONS
, ENODEV
);
1082 list_for_each(p
, &hdev
->conn_hash
.list
) {
1086 rp_len
= sizeof(*rp
) + (count
* sizeof(bdaddr_t
));
1087 rp
= kmalloc(rp_len
, GFP_ATOMIC
);
1093 put_unaligned_le16(count
, &rp
->conn_count
);
1095 read_lock(&hci_dev_list_lock
);
1098 list_for_each(p
, &hdev
->conn_hash
.list
) {
1099 struct hci_conn
*c
= list_entry(p
, struct hci_conn
, list
);
1101 bacpy(&rp
->conn
[i
++], &c
->dst
);
1104 read_unlock(&hci_dev_list_lock
);
1106 err
= cmd_complete(sk
, index
, MGMT_OP_GET_CONNECTIONS
, rp
, rp_len
);
1110 hci_dev_unlock(hdev
);
1115 static int pin_code_reply(struct sock
*sk
, u16 index
, unsigned char *data
,
1118 struct hci_dev
*hdev
;
1119 struct mgmt_cp_pin_code_reply
*cp
;
1120 struct hci_cp_pin_code_reply reply
;
1121 struct pending_cmd
*cmd
;
1128 if (len
!= sizeof(*cp
))
1129 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
, EINVAL
);
1131 hdev
= hci_dev_get(index
);
1133 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
, ENODEV
);
1137 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1138 err
= cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
, ENETDOWN
);
1142 cmd
= mgmt_pending_add(sk
, MGMT_OP_PIN_CODE_REPLY
, index
, data
, len
);
1148 bacpy(&reply
.bdaddr
, &cp
->bdaddr
);
1149 reply
.pin_len
= cp
->pin_len
;
1150 memcpy(reply
.pin_code
, cp
->pin_code
, 16);
1152 err
= hci_send_cmd(hdev
, HCI_OP_PIN_CODE_REPLY
, sizeof(reply
), &reply
);
1154 mgmt_pending_remove(cmd
);
1157 hci_dev_unlock(hdev
);
1163 static int pin_code_neg_reply(struct sock
*sk
, u16 index
, unsigned char *data
,
1166 struct hci_dev
*hdev
;
1167 struct mgmt_cp_pin_code_neg_reply
*cp
;
1168 struct pending_cmd
*cmd
;
1175 if (len
!= sizeof(*cp
))
1176 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_NEG_REPLY
,
1179 hdev
= hci_dev_get(index
);
1181 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_NEG_REPLY
,
1186 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1187 err
= cmd_status(sk
, index
, MGMT_OP_PIN_CODE_NEG_REPLY
,
1192 cmd
= mgmt_pending_add(sk
, MGMT_OP_PIN_CODE_NEG_REPLY
, index
,
1199 err
= hci_send_cmd(hdev
, HCI_OP_PIN_CODE_NEG_REPLY
, sizeof(cp
->bdaddr
),
1202 mgmt_pending_remove(cmd
);
1205 hci_dev_unlock(hdev
);
1211 static int set_io_capability(struct sock
*sk
, u16 index
, unsigned char *data
,
1214 struct hci_dev
*hdev
;
1215 struct mgmt_cp_set_io_capability
*cp
;
1221 if (len
!= sizeof(*cp
))
1222 return cmd_status(sk
, index
, MGMT_OP_SET_IO_CAPABILITY
, EINVAL
);
1224 hdev
= hci_dev_get(index
);
1226 return cmd_status(sk
, index
, MGMT_OP_SET_IO_CAPABILITY
, ENODEV
);
1230 hdev
->io_capability
= cp
->io_capability
;
1232 BT_DBG("%s IO capability set to 0x%02x", hdev
->name
,
1233 hdev
->io_capability
);
1235 hci_dev_unlock(hdev
);
1238 return cmd_complete(sk
, index
, MGMT_OP_SET_IO_CAPABILITY
, NULL
, 0);
1241 static inline struct pending_cmd
*find_pairing(struct hci_conn
*conn
)
1243 struct hci_dev
*hdev
= conn
->hdev
;
1244 struct list_head
*p
;
1246 list_for_each(p
, &cmd_list
) {
1247 struct pending_cmd
*cmd
;
1249 cmd
= list_entry(p
, struct pending_cmd
, list
);
1251 if (cmd
->opcode
!= MGMT_OP_PAIR_DEVICE
)
1254 if (cmd
->index
!= hdev
->id
)
1257 if (cmd
->user_data
!= conn
)
1266 static void pairing_complete(struct pending_cmd
*cmd
, u8 status
)
1268 struct mgmt_rp_pair_device rp
;
1269 struct hci_conn
*conn
= cmd
->user_data
;
1271 bacpy(&rp
.bdaddr
, &conn
->dst
);
1274 cmd_complete(cmd
->sk
, cmd
->index
, MGMT_OP_PAIR_DEVICE
, &rp
, sizeof(rp
));
1276 /* So we don't get further callbacks for this connection */
1277 conn
->connect_cfm_cb
= NULL
;
1278 conn
->security_cfm_cb
= NULL
;
1279 conn
->disconn_cfm_cb
= NULL
;
1283 mgmt_pending_remove(cmd
);
1286 static void pairing_complete_cb(struct hci_conn
*conn
, u8 status
)
1288 struct pending_cmd
*cmd
;
1290 BT_DBG("status %u", status
);
1292 cmd
= find_pairing(conn
);
1294 BT_DBG("Unable to find a pending command");
1298 pairing_complete(cmd
, status
);
1301 static int pair_device(struct sock
*sk
, u16 index
, unsigned char *data
, u16 len
)
1303 struct hci_dev
*hdev
;
1304 struct mgmt_cp_pair_device
*cp
;
1305 struct pending_cmd
*cmd
;
1306 u8 sec_level
, auth_type
;
1307 struct hci_conn
*conn
;
1314 if (len
!= sizeof(*cp
))
1315 return cmd_status(sk
, index
, MGMT_OP_PAIR_DEVICE
, EINVAL
);
1317 hdev
= hci_dev_get(index
);
1319 return cmd_status(sk
, index
, MGMT_OP_PAIR_DEVICE
, ENODEV
);
1323 if (cp
->io_cap
== 0x03) {
1324 sec_level
= BT_SECURITY_MEDIUM
;
1325 auth_type
= HCI_AT_DEDICATED_BONDING
;
1327 sec_level
= BT_SECURITY_HIGH
;
1328 auth_type
= HCI_AT_DEDICATED_BONDING_MITM
;
1331 conn
= hci_connect(hdev
, ACL_LINK
, &cp
->bdaddr
, sec_level
, auth_type
);
1333 err
= PTR_ERR(conn
);
1337 if (conn
->connect_cfm_cb
) {
1339 err
= cmd_status(sk
, index
, MGMT_OP_PAIR_DEVICE
, EBUSY
);
1343 cmd
= mgmt_pending_add(sk
, MGMT_OP_PAIR_DEVICE
, index
, data
, len
);
1350 conn
->connect_cfm_cb
= pairing_complete_cb
;
1351 conn
->security_cfm_cb
= pairing_complete_cb
;
1352 conn
->disconn_cfm_cb
= pairing_complete_cb
;
1353 conn
->io_capability
= cp
->io_cap
;
1354 cmd
->user_data
= conn
;
1356 if (conn
->state
== BT_CONNECTED
&&
1357 hci_conn_security(conn
, sec_level
, auth_type
))
1358 pairing_complete(cmd
, 0);
1363 hci_dev_unlock(hdev
);
1369 static int user_confirm_reply(struct sock
*sk
, u16 index
, unsigned char *data
,
1370 u16 len
, int success
)
1372 struct mgmt_cp_user_confirm_reply
*cp
= (void *) data
;
1373 u16 mgmt_op
, hci_op
;
1374 struct pending_cmd
*cmd
;
1375 struct hci_dev
*hdev
;
1381 mgmt_op
= MGMT_OP_USER_CONFIRM_REPLY
;
1382 hci_op
= HCI_OP_USER_CONFIRM_REPLY
;
1384 mgmt_op
= MGMT_OP_USER_CONFIRM_NEG_REPLY
;
1385 hci_op
= HCI_OP_USER_CONFIRM_NEG_REPLY
;
1388 if (len
!= sizeof(*cp
))
1389 return cmd_status(sk
, index
, mgmt_op
, EINVAL
);
1391 hdev
= hci_dev_get(index
);
1393 return cmd_status(sk
, index
, mgmt_op
, ENODEV
);
1397 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1398 err
= cmd_status(sk
, index
, mgmt_op
, ENETDOWN
);
1402 cmd
= mgmt_pending_add(sk
, mgmt_op
, index
, data
, len
);
1408 err
= hci_send_cmd(hdev
, hci_op
, sizeof(cp
->bdaddr
), &cp
->bdaddr
);
1410 mgmt_pending_remove(cmd
);
1413 hci_dev_unlock(hdev
);
1419 static int set_local_name(struct sock
*sk
, u16 index
, unsigned char *data
,
1422 struct mgmt_cp_set_local_name
*mgmt_cp
= (void *) data
;
1423 struct hci_cp_write_local_name hci_cp
;
1424 struct hci_dev
*hdev
;
1425 struct pending_cmd
*cmd
;
1430 if (len
!= sizeof(*mgmt_cp
))
1431 return cmd_status(sk
, index
, MGMT_OP_SET_LOCAL_NAME
, EINVAL
);
1433 hdev
= hci_dev_get(index
);
1435 return cmd_status(sk
, index
, MGMT_OP_SET_LOCAL_NAME
, ENODEV
);
1439 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_LOCAL_NAME
, index
, data
, len
);
1445 memcpy(hci_cp
.name
, mgmt_cp
->name
, sizeof(hci_cp
.name
));
1446 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_LOCAL_NAME
, sizeof(hci_cp
),
1449 mgmt_pending_remove(cmd
);
1452 hci_dev_unlock(hdev
);
1458 static int read_local_oob_data(struct sock
*sk
, u16 index
)
1460 struct hci_dev
*hdev
;
1461 struct pending_cmd
*cmd
;
1464 BT_DBG("hci%u", index
);
1466 hdev
= hci_dev_get(index
);
1468 return cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
1473 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1474 err
= cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
1479 if (!(hdev
->features
[6] & LMP_SIMPLE_PAIR
)) {
1480 err
= cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
1485 if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA
, index
)) {
1486 err
= cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
, EBUSY
);
1490 cmd
= mgmt_pending_add(sk
, MGMT_OP_READ_LOCAL_OOB_DATA
, index
, NULL
, 0);
1496 err
= hci_send_cmd(hdev
, HCI_OP_READ_LOCAL_OOB_DATA
, 0, NULL
);
1498 mgmt_pending_remove(cmd
);
1501 hci_dev_unlock(hdev
);
1507 static int add_remote_oob_data(struct sock
*sk
, u16 index
, unsigned char *data
,
1510 struct hci_dev
*hdev
;
1511 struct mgmt_cp_add_remote_oob_data
*cp
= (void *) data
;
1514 BT_DBG("hci%u ", index
);
1516 if (len
!= sizeof(*cp
))
1517 return cmd_status(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
,
1520 hdev
= hci_dev_get(index
);
1522 return cmd_status(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
,
1527 err
= hci_add_remote_oob_data(hdev
, &cp
->bdaddr
, cp
->hash
,
1530 err
= cmd_status(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
, -err
);
1532 err
= cmd_complete(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
, NULL
,
1535 hci_dev_unlock(hdev
);
1541 static int remove_remote_oob_data(struct sock
*sk
, u16 index
,
1542 unsigned char *data
, u16 len
)
1544 struct hci_dev
*hdev
;
1545 struct mgmt_cp_remove_remote_oob_data
*cp
= (void *) data
;
1548 BT_DBG("hci%u ", index
);
1550 if (len
!= sizeof(*cp
))
1551 return cmd_status(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
1554 hdev
= hci_dev_get(index
);
1556 return cmd_status(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
1561 err
= hci_remove_remote_oob_data(hdev
, &cp
->bdaddr
);
1563 err
= cmd_status(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
1566 err
= cmd_complete(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
1569 hci_dev_unlock(hdev
);
1575 static int start_discovery(struct sock
*sk
, u16 index
)
1577 u8 lap
[3] = { 0x33, 0x8b, 0x9e };
1578 struct hci_cp_inquiry cp
;
1579 struct pending_cmd
*cmd
;
1580 struct hci_dev
*hdev
;
1583 BT_DBG("hci%u", index
);
1585 hdev
= hci_dev_get(index
);
1587 return cmd_status(sk
, index
, MGMT_OP_START_DISCOVERY
, ENODEV
);
1589 hci_dev_lock_bh(hdev
);
1591 cmd
= mgmt_pending_add(sk
, MGMT_OP_START_DISCOVERY
, index
, NULL
, 0);
1597 memset(&cp
, 0, sizeof(cp
));
1598 memcpy(&cp
.lap
, lap
, 3);
1602 err
= hci_send_cmd(hdev
, HCI_OP_INQUIRY
, sizeof(cp
), &cp
);
1604 mgmt_pending_remove(cmd
);
1607 hci_dev_unlock_bh(hdev
);
1613 static int stop_discovery(struct sock
*sk
, u16 index
)
1615 struct hci_dev
*hdev
;
1616 struct pending_cmd
*cmd
;
1619 BT_DBG("hci%u", index
);
1621 hdev
= hci_dev_get(index
);
1623 return cmd_status(sk
, index
, MGMT_OP_STOP_DISCOVERY
, ENODEV
);
1625 hci_dev_lock_bh(hdev
);
1627 cmd
= mgmt_pending_add(sk
, MGMT_OP_STOP_DISCOVERY
, index
, NULL
, 0);
1633 err
= hci_send_cmd(hdev
, HCI_OP_INQUIRY_CANCEL
, 0, NULL
);
1635 mgmt_pending_remove(cmd
);
1638 hci_dev_unlock_bh(hdev
);
1644 int mgmt_control(struct sock
*sk
, struct msghdr
*msg
, size_t msglen
)
1647 struct mgmt_hdr
*hdr
;
1648 u16 opcode
, index
, len
;
1651 BT_DBG("got %zu bytes", msglen
);
1653 if (msglen
< sizeof(*hdr
))
1656 buf
= kmalloc(msglen
, GFP_KERNEL
);
1660 if (memcpy_fromiovec(buf
, msg
->msg_iov
, msglen
)) {
1665 hdr
= (struct mgmt_hdr
*) buf
;
1666 opcode
= get_unaligned_le16(&hdr
->opcode
);
1667 index
= get_unaligned_le16(&hdr
->index
);
1668 len
= get_unaligned_le16(&hdr
->len
);
1670 if (len
!= msglen
- sizeof(*hdr
)) {
1676 case MGMT_OP_READ_VERSION
:
1677 err
= read_version(sk
);
1679 case MGMT_OP_READ_INDEX_LIST
:
1680 err
= read_index_list(sk
);
1682 case MGMT_OP_READ_INFO
:
1683 err
= read_controller_info(sk
, index
);
1685 case MGMT_OP_SET_POWERED
:
1686 err
= set_powered(sk
, index
, buf
+ sizeof(*hdr
), len
);
1688 case MGMT_OP_SET_DISCOVERABLE
:
1689 err
= set_discoverable(sk
, index
, buf
+ sizeof(*hdr
), len
);
1691 case MGMT_OP_SET_CONNECTABLE
:
1692 err
= set_connectable(sk
, index
, buf
+ sizeof(*hdr
), len
);
1694 case MGMT_OP_SET_PAIRABLE
:
1695 err
= set_pairable(sk
, index
, buf
+ sizeof(*hdr
), len
);
1697 case MGMT_OP_ADD_UUID
:
1698 err
= add_uuid(sk
, index
, buf
+ sizeof(*hdr
), len
);
1700 case MGMT_OP_REMOVE_UUID
:
1701 err
= remove_uuid(sk
, index
, buf
+ sizeof(*hdr
), len
);
1703 case MGMT_OP_SET_DEV_CLASS
:
1704 err
= set_dev_class(sk
, index
, buf
+ sizeof(*hdr
), len
);
1706 case MGMT_OP_SET_SERVICE_CACHE
:
1707 err
= set_service_cache(sk
, index
, buf
+ sizeof(*hdr
), len
);
1709 case MGMT_OP_LOAD_KEYS
:
1710 err
= load_keys(sk
, index
, buf
+ sizeof(*hdr
), len
);
1712 case MGMT_OP_REMOVE_KEY
:
1713 err
= remove_key(sk
, index
, buf
+ sizeof(*hdr
), len
);
1715 case MGMT_OP_DISCONNECT
:
1716 err
= disconnect(sk
, index
, buf
+ sizeof(*hdr
), len
);
1718 case MGMT_OP_GET_CONNECTIONS
:
1719 err
= get_connections(sk
, index
);
1721 case MGMT_OP_PIN_CODE_REPLY
:
1722 err
= pin_code_reply(sk
, index
, buf
+ sizeof(*hdr
), len
);
1724 case MGMT_OP_PIN_CODE_NEG_REPLY
:
1725 err
= pin_code_neg_reply(sk
, index
, buf
+ sizeof(*hdr
), len
);
1727 case MGMT_OP_SET_IO_CAPABILITY
:
1728 err
= set_io_capability(sk
, index
, buf
+ sizeof(*hdr
), len
);
1730 case MGMT_OP_PAIR_DEVICE
:
1731 err
= pair_device(sk
, index
, buf
+ sizeof(*hdr
), len
);
1733 case MGMT_OP_USER_CONFIRM_REPLY
:
1734 err
= user_confirm_reply(sk
, index
, buf
+ sizeof(*hdr
), len
, 1);
1736 case MGMT_OP_USER_CONFIRM_NEG_REPLY
:
1737 err
= user_confirm_reply(sk
, index
, buf
+ sizeof(*hdr
), len
, 0);
1739 case MGMT_OP_SET_LOCAL_NAME
:
1740 err
= set_local_name(sk
, index
, buf
+ sizeof(*hdr
), len
);
1742 case MGMT_OP_READ_LOCAL_OOB_DATA
:
1743 err
= read_local_oob_data(sk
, index
);
1745 case MGMT_OP_ADD_REMOTE_OOB_DATA
:
1746 err
= add_remote_oob_data(sk
, index
, buf
+ sizeof(*hdr
), len
);
1748 case MGMT_OP_REMOVE_REMOTE_OOB_DATA
:
1749 err
= remove_remote_oob_data(sk
, index
, buf
+ sizeof(*hdr
),
1752 case MGMT_OP_START_DISCOVERY
:
1753 err
= start_discovery(sk
, index
);
1755 case MGMT_OP_STOP_DISCOVERY
:
1756 err
= stop_discovery(sk
, index
);
1759 BT_DBG("Unknown op %u", opcode
);
1760 err
= cmd_status(sk
, index
, opcode
, 0x01);
1774 int mgmt_index_added(u16 index
)
1776 return mgmt_event(MGMT_EV_INDEX_ADDED
, index
, NULL
, 0, NULL
);
1779 int mgmt_index_removed(u16 index
)
1781 return mgmt_event(MGMT_EV_INDEX_REMOVED
, index
, NULL
, 0, NULL
);
1789 static void mode_rsp(struct pending_cmd
*cmd
, void *data
)
1791 struct mgmt_mode
*cp
= cmd
->param
;
1792 struct cmd_lookup
*match
= data
;
1794 if (cp
->val
!= match
->val
)
1797 send_mode_rsp(cmd
->sk
, cmd
->opcode
, cmd
->index
, cp
->val
);
1799 list_del(&cmd
->list
);
1801 if (match
->sk
== NULL
) {
1802 match
->sk
= cmd
->sk
;
1803 sock_hold(match
->sk
);
1806 mgmt_pending_free(cmd
);
1809 int mgmt_powered(u16 index
, u8 powered
)
1811 struct mgmt_mode ev
;
1812 struct cmd_lookup match
= { powered
, NULL
};
1815 mgmt_pending_foreach(MGMT_OP_SET_POWERED
, index
, mode_rsp
, &match
);
1819 ret
= mgmt_event(MGMT_EV_POWERED
, index
, &ev
, sizeof(ev
), match
.sk
);
1827 int mgmt_discoverable(u16 index
, u8 discoverable
)
1829 struct mgmt_mode ev
;
1830 struct cmd_lookup match
= { discoverable
, NULL
};
1833 mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE
, index
, mode_rsp
, &match
);
1835 ev
.val
= discoverable
;
1837 ret
= mgmt_event(MGMT_EV_DISCOVERABLE
, index
, &ev
, sizeof(ev
),
1846 int mgmt_connectable(u16 index
, u8 connectable
)
1848 struct mgmt_mode ev
;
1849 struct cmd_lookup match
= { connectable
, NULL
};
1852 mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE
, index
, mode_rsp
, &match
);
1854 ev
.val
= connectable
;
1856 ret
= mgmt_event(MGMT_EV_CONNECTABLE
, index
, &ev
, sizeof(ev
), match
.sk
);
1864 int mgmt_new_key(u16 index
, struct link_key
*key
, u8 persistent
)
1866 struct mgmt_ev_new_key ev
;
1868 memset(&ev
, 0, sizeof(ev
));
1870 ev
.store_hint
= persistent
;
1871 bacpy(&ev
.key
.bdaddr
, &key
->bdaddr
);
1872 ev
.key
.type
= key
->type
;
1873 memcpy(ev
.key
.val
, key
->val
, 16);
1874 ev
.key
.pin_len
= key
->pin_len
;
1876 return mgmt_event(MGMT_EV_NEW_KEY
, index
, &ev
, sizeof(ev
), NULL
);
1879 int mgmt_connected(u16 index
, bdaddr_t
*bdaddr
)
1881 struct mgmt_ev_connected ev
;
1883 bacpy(&ev
.bdaddr
, bdaddr
);
1885 return mgmt_event(MGMT_EV_CONNECTED
, index
, &ev
, sizeof(ev
), NULL
);
1888 static void disconnect_rsp(struct pending_cmd
*cmd
, void *data
)
1890 struct mgmt_cp_disconnect
*cp
= cmd
->param
;
1891 struct sock
**sk
= data
;
1892 struct mgmt_rp_disconnect rp
;
1894 bacpy(&rp
.bdaddr
, &cp
->bdaddr
);
1896 cmd_complete(cmd
->sk
, cmd
->index
, MGMT_OP_DISCONNECT
, &rp
, sizeof(rp
));
1901 mgmt_pending_remove(cmd
);
1904 int mgmt_disconnected(u16 index
, bdaddr_t
*bdaddr
)
1906 struct mgmt_ev_disconnected ev
;
1907 struct sock
*sk
= NULL
;
1910 mgmt_pending_foreach(MGMT_OP_DISCONNECT
, index
, disconnect_rsp
, &sk
);
1912 bacpy(&ev
.bdaddr
, bdaddr
);
1914 err
= mgmt_event(MGMT_EV_DISCONNECTED
, index
, &ev
, sizeof(ev
), sk
);
1922 int mgmt_disconnect_failed(u16 index
)
1924 struct pending_cmd
*cmd
;
1927 cmd
= mgmt_pending_find(MGMT_OP_DISCONNECT
, index
);
1931 err
= cmd_status(cmd
->sk
, index
, MGMT_OP_DISCONNECT
, EIO
);
1933 mgmt_pending_remove(cmd
);
1938 int mgmt_connect_failed(u16 index
, bdaddr_t
*bdaddr
, u8 status
)
1940 struct mgmt_ev_connect_failed ev
;
1942 bacpy(&ev
.bdaddr
, bdaddr
);
1945 return mgmt_event(MGMT_EV_CONNECT_FAILED
, index
, &ev
, sizeof(ev
), NULL
);
1948 int mgmt_pin_code_request(u16 index
, bdaddr_t
*bdaddr
, u8 secure
)
1950 struct mgmt_ev_pin_code_request ev
;
1952 bacpy(&ev
.bdaddr
, bdaddr
);
1955 return mgmt_event(MGMT_EV_PIN_CODE_REQUEST
, index
, &ev
, sizeof(ev
),
1959 int mgmt_pin_code_reply_complete(u16 index
, bdaddr_t
*bdaddr
, u8 status
)
1961 struct pending_cmd
*cmd
;
1962 struct mgmt_rp_pin_code_reply rp
;
1965 cmd
= mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY
, index
);
1969 bacpy(&rp
.bdaddr
, bdaddr
);
1972 err
= cmd_complete(cmd
->sk
, index
, MGMT_OP_PIN_CODE_REPLY
, &rp
,
1975 mgmt_pending_remove(cmd
);
1980 int mgmt_pin_code_neg_reply_complete(u16 index
, bdaddr_t
*bdaddr
, u8 status
)
1982 struct pending_cmd
*cmd
;
1983 struct mgmt_rp_pin_code_reply rp
;
1986 cmd
= mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY
, index
);
1990 bacpy(&rp
.bdaddr
, bdaddr
);
1993 err
= cmd_complete(cmd
->sk
, index
, MGMT_OP_PIN_CODE_NEG_REPLY
, &rp
,
1996 mgmt_pending_remove(cmd
);
2001 int mgmt_user_confirm_request(u16 index
, bdaddr_t
*bdaddr
, __le32 value
,
2004 struct mgmt_ev_user_confirm_request ev
;
2006 BT_DBG("hci%u", index
);
2008 bacpy(&ev
.bdaddr
, bdaddr
);
2009 ev
.confirm_hint
= confirm_hint
;
2010 put_unaligned_le32(value
, &ev
.value
);
2012 return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST
, index
, &ev
, sizeof(ev
),
2016 static int confirm_reply_complete(u16 index
, bdaddr_t
*bdaddr
, u8 status
,
2019 struct pending_cmd
*cmd
;
2020 struct mgmt_rp_user_confirm_reply rp
;
2023 cmd
= mgmt_pending_find(opcode
, index
);
2027 bacpy(&rp
.bdaddr
, bdaddr
);
2029 err
= cmd_complete(cmd
->sk
, index
, opcode
, &rp
, sizeof(rp
));
2031 mgmt_pending_remove(cmd
);
2036 int mgmt_user_confirm_reply_complete(u16 index
, bdaddr_t
*bdaddr
, u8 status
)
2038 return confirm_reply_complete(index
, bdaddr
, status
,
2039 MGMT_OP_USER_CONFIRM_REPLY
);
2042 int mgmt_user_confirm_neg_reply_complete(u16 index
, bdaddr_t
*bdaddr
, u8 status
)
2044 return confirm_reply_complete(index
, bdaddr
, status
,
2045 MGMT_OP_USER_CONFIRM_NEG_REPLY
);
2048 int mgmt_auth_failed(u16 index
, bdaddr_t
*bdaddr
, u8 status
)
2050 struct mgmt_ev_auth_failed ev
;
2052 bacpy(&ev
.bdaddr
, bdaddr
);
2055 return mgmt_event(MGMT_EV_AUTH_FAILED
, index
, &ev
, sizeof(ev
), NULL
);
2058 int mgmt_set_local_name_complete(u16 index
, u8
*name
, u8 status
)
2060 struct pending_cmd
*cmd
;
2061 struct hci_dev
*hdev
;
2062 struct mgmt_cp_set_local_name ev
;
2065 memset(&ev
, 0, sizeof(ev
));
2066 memcpy(ev
.name
, name
, HCI_MAX_NAME_LENGTH
);
2068 cmd
= mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME
, index
);
2073 err
= cmd_status(cmd
->sk
, index
, MGMT_OP_SET_LOCAL_NAME
, EIO
);
2077 hdev
= hci_dev_get(index
);
2079 hci_dev_lock_bh(hdev
);
2081 hci_dev_unlock_bh(hdev
);
2085 err
= cmd_complete(cmd
->sk
, index
, MGMT_OP_SET_LOCAL_NAME
, &ev
,
2091 err
= mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED
, index
, &ev
, sizeof(ev
),
2092 cmd
? cmd
->sk
: NULL
);
2096 mgmt_pending_remove(cmd
);
2100 int mgmt_read_local_oob_data_reply_complete(u16 index
, u8
*hash
, u8
*randomizer
,
2103 struct pending_cmd
*cmd
;
2106 BT_DBG("hci%u status %u", index
, status
);
2108 cmd
= mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA
, index
);
2113 err
= cmd_status(cmd
->sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
2116 struct mgmt_rp_read_local_oob_data rp
;
2118 memcpy(rp
.hash
, hash
, sizeof(rp
.hash
));
2119 memcpy(rp
.randomizer
, randomizer
, sizeof(rp
.randomizer
));
2121 err
= cmd_complete(cmd
->sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
2125 mgmt_pending_remove(cmd
);
2130 int mgmt_device_found(u16 index
, bdaddr_t
*bdaddr
, u8
*dev_class
, s8 rssi
,
2133 struct mgmt_ev_device_found ev
;
2135 memset(&ev
, 0, sizeof(ev
));
2137 bacpy(&ev
.bdaddr
, bdaddr
);
2138 memcpy(ev
.dev_class
, dev_class
, sizeof(ev
.dev_class
));
2142 memcpy(ev
.eir
, eir
, sizeof(ev
.eir
));
2144 return mgmt_event(MGMT_EV_DEVICE_FOUND
, index
, &ev
, sizeof(ev
), NULL
);
2147 int mgmt_remote_name(u16 index
, bdaddr_t
*bdaddr
, u8
*name
)
2149 struct mgmt_ev_remote_name ev
;
2151 memset(&ev
, 0, sizeof(ev
));
2153 bacpy(&ev
.bdaddr
, bdaddr
);
2154 memcpy(ev
.name
, name
, HCI_MAX_NAME_LENGTH
);
2156 return mgmt_event(MGMT_EV_REMOTE_NAME
, index
, &ev
, sizeof(ev
), NULL
);
2159 int mgmt_discovering(u16 index
, u8 discovering
)
2161 return mgmt_event(MGMT_EV_DISCOVERING
, index
, &discovering
,
2162 sizeof(discovering
), NULL
);