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
);
260 hci_dev_lock_bh(hdev
);
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_bh(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
);
397 hci_dev_lock_bh(hdev
);
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 queue_work(hdev
->workqueue
, &hdev
->power_on
);
420 queue_work(hdev
->workqueue
, &hdev
->power_off
.work
);
425 hci_dev_unlock_bh(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
);
452 hci_dev_lock_bh(hdev
);
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_bh(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
);
523 hci_dev_lock_bh(hdev
);
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_bh(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
);
615 hci_dev_lock_bh(hdev
);
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_bh(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
);
830 hci_dev_lock_bh(hdev
);
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_bh(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
);
881 hci_dev_lock_bh(hdev
);
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_bh(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
);
943 hci_dev_lock_bh(hdev
);
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_bh(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
);
977 hci_dev_lock_bh(hdev
);
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_bh(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
,
1037 hci_dev_lock_bh(hdev
);
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 hci_dev_unlock_bh(hdev
);
1061 static int remove_keys(struct sock
*sk
, u16 index
, unsigned char *data
,
1064 struct hci_dev
*hdev
;
1065 struct mgmt_cp_remove_keys
*cp
;
1066 struct mgmt_rp_remove_keys rp
;
1067 struct hci_cp_disconnect dc
;
1068 struct pending_cmd
*cmd
;
1069 struct hci_conn
*conn
;
1074 if (len
!= sizeof(*cp
))
1075 return cmd_status(sk
, index
, MGMT_OP_REMOVE_KEYS
,
1076 MGMT_STATUS_INVALID_PARAMS
);
1078 hdev
= hci_dev_get(index
);
1080 return cmd_status(sk
, index
, MGMT_OP_REMOVE_KEYS
,
1081 MGMT_STATUS_INVALID_PARAMS
);
1083 hci_dev_lock_bh(hdev
);
1085 memset(&rp
, 0, sizeof(rp
));
1086 bacpy(&rp
.bdaddr
, &cp
->bdaddr
);
1087 rp
.status
= MGMT_STATUS_FAILED
;
1089 err
= hci_remove_link_key(hdev
, &cp
->bdaddr
);
1091 rp
.status
= MGMT_STATUS_NOT_PAIRED
;
1095 if (!test_bit(HCI_UP
, &hdev
->flags
) || !cp
->disconnect
) {
1096 err
= cmd_complete(sk
, index
, MGMT_OP_REMOVE_KEYS
, &rp
,
1101 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
, &cp
->bdaddr
);
1103 err
= cmd_complete(sk
, index
, MGMT_OP_REMOVE_KEYS
, &rp
,
1108 cmd
= mgmt_pending_add(sk
, MGMT_OP_REMOVE_KEYS
, hdev
, cp
, sizeof(*cp
));
1114 put_unaligned_le16(conn
->handle
, &dc
.handle
);
1115 dc
.reason
= 0x13; /* Remote User Terminated Connection */
1116 err
= hci_send_cmd(hdev
, HCI_OP_DISCONNECT
, sizeof(dc
), &dc
);
1118 mgmt_pending_remove(cmd
);
1122 err
= cmd_complete(sk
, index
, MGMT_OP_REMOVE_KEYS
, &rp
,
1124 hci_dev_unlock_bh(hdev
);
1130 static int disconnect(struct sock
*sk
, u16 index
, unsigned char *data
, u16 len
)
1132 struct hci_dev
*hdev
;
1133 struct mgmt_cp_disconnect
*cp
;
1134 struct hci_cp_disconnect dc
;
1135 struct pending_cmd
*cmd
;
1136 struct hci_conn
*conn
;
1143 if (len
!= sizeof(*cp
))
1144 return cmd_status(sk
, index
, MGMT_OP_DISCONNECT
,
1145 MGMT_STATUS_INVALID_PARAMS
);
1147 hdev
= hci_dev_get(index
);
1149 return cmd_status(sk
, index
, MGMT_OP_DISCONNECT
,
1150 MGMT_STATUS_INVALID_PARAMS
);
1152 hci_dev_lock_bh(hdev
);
1154 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1155 err
= cmd_status(sk
, index
, MGMT_OP_DISCONNECT
,
1156 MGMT_STATUS_NOT_POWERED
);
1160 if (mgmt_pending_find(MGMT_OP_DISCONNECT
, hdev
)) {
1161 err
= cmd_status(sk
, index
, MGMT_OP_DISCONNECT
,
1166 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
, &cp
->bdaddr
);
1168 conn
= hci_conn_hash_lookup_ba(hdev
, LE_LINK
, &cp
->bdaddr
);
1171 err
= cmd_status(sk
, index
, MGMT_OP_DISCONNECT
,
1172 MGMT_STATUS_NOT_CONNECTED
);
1176 cmd
= mgmt_pending_add(sk
, MGMT_OP_DISCONNECT
, hdev
, data
, len
);
1182 put_unaligned_le16(conn
->handle
, &dc
.handle
);
1183 dc
.reason
= 0x13; /* Remote User Terminated Connection */
1185 err
= hci_send_cmd(hdev
, HCI_OP_DISCONNECT
, sizeof(dc
), &dc
);
1187 mgmt_pending_remove(cmd
);
1190 hci_dev_unlock_bh(hdev
);
1196 static u8
link_to_mgmt(u8 link_type
, u8 addr_type
)
1198 switch (link_type
) {
1200 switch (addr_type
) {
1201 case ADDR_LE_DEV_PUBLIC
:
1202 return MGMT_ADDR_LE_PUBLIC
;
1203 case ADDR_LE_DEV_RANDOM
:
1204 return MGMT_ADDR_LE_RANDOM
;
1206 return MGMT_ADDR_INVALID
;
1209 return MGMT_ADDR_BREDR
;
1211 return MGMT_ADDR_INVALID
;
1215 static int get_connections(struct sock
*sk
, u16 index
)
1217 struct mgmt_rp_get_connections
*rp
;
1218 struct hci_dev
*hdev
;
1220 struct list_head
*p
;
1227 hdev
= hci_dev_get(index
);
1229 return cmd_status(sk
, index
, MGMT_OP_GET_CONNECTIONS
,
1230 MGMT_STATUS_INVALID_PARAMS
);
1232 hci_dev_lock_bh(hdev
);
1235 list_for_each(p
, &hdev
->conn_hash
.list
) {
1239 rp_len
= sizeof(*rp
) + (count
* sizeof(struct mgmt_addr_info
));
1240 rp
= kmalloc(rp_len
, GFP_ATOMIC
);
1246 put_unaligned_le16(count
, &rp
->conn_count
);
1249 list_for_each_entry(c
, &hdev
->conn_hash
.list
, list
) {
1250 bacpy(&rp
->addr
[i
].bdaddr
, &c
->dst
);
1251 rp
->addr
[i
].type
= link_to_mgmt(c
->type
, c
->dst_type
);
1252 if (rp
->addr
[i
].type
== MGMT_ADDR_INVALID
)
1257 /* Recalculate length in case of filtered SCO connections, etc */
1258 rp_len
= sizeof(*rp
) + (i
* sizeof(struct mgmt_addr_info
));
1260 err
= cmd_complete(sk
, index
, MGMT_OP_GET_CONNECTIONS
, rp
, rp_len
);
1264 hci_dev_unlock_bh(hdev
);
1269 static int send_pin_code_neg_reply(struct sock
*sk
, u16 index
,
1270 struct hci_dev
*hdev
, struct mgmt_cp_pin_code_neg_reply
*cp
)
1272 struct pending_cmd
*cmd
;
1275 cmd
= mgmt_pending_add(sk
, MGMT_OP_PIN_CODE_NEG_REPLY
, hdev
, cp
,
1280 err
= hci_send_cmd(hdev
, HCI_OP_PIN_CODE_NEG_REPLY
, sizeof(cp
->bdaddr
),
1283 mgmt_pending_remove(cmd
);
1288 static int pin_code_reply(struct sock
*sk
, u16 index
, unsigned char *data
,
1291 struct hci_dev
*hdev
;
1292 struct hci_conn
*conn
;
1293 struct mgmt_cp_pin_code_reply
*cp
;
1294 struct mgmt_cp_pin_code_neg_reply ncp
;
1295 struct hci_cp_pin_code_reply reply
;
1296 struct pending_cmd
*cmd
;
1303 if (len
!= sizeof(*cp
))
1304 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
,
1305 MGMT_STATUS_INVALID_PARAMS
);
1307 hdev
= hci_dev_get(index
);
1309 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
,
1310 MGMT_STATUS_INVALID_PARAMS
);
1312 hci_dev_lock_bh(hdev
);
1314 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1315 err
= cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
,
1316 MGMT_STATUS_NOT_POWERED
);
1320 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
, &cp
->bdaddr
);
1322 err
= cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
,
1323 MGMT_STATUS_NOT_CONNECTED
);
1327 if (conn
->pending_sec_level
== BT_SECURITY_HIGH
&& cp
->pin_len
!= 16) {
1328 bacpy(&ncp
.bdaddr
, &cp
->bdaddr
);
1330 BT_ERR("PIN code is not 16 bytes long");
1332 err
= send_pin_code_neg_reply(sk
, index
, hdev
, &ncp
);
1334 err
= cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
,
1335 MGMT_STATUS_INVALID_PARAMS
);
1340 cmd
= mgmt_pending_add(sk
, MGMT_OP_PIN_CODE_REPLY
, hdev
, data
, len
);
1346 bacpy(&reply
.bdaddr
, &cp
->bdaddr
);
1347 reply
.pin_len
= cp
->pin_len
;
1348 memcpy(reply
.pin_code
, cp
->pin_code
, sizeof(reply
.pin_code
));
1350 err
= hci_send_cmd(hdev
, HCI_OP_PIN_CODE_REPLY
, sizeof(reply
), &reply
);
1352 mgmt_pending_remove(cmd
);
1355 hci_dev_unlock_bh(hdev
);
1361 static int pin_code_neg_reply(struct sock
*sk
, u16 index
, unsigned char *data
,
1364 struct hci_dev
*hdev
;
1365 struct mgmt_cp_pin_code_neg_reply
*cp
;
1372 if (len
!= sizeof(*cp
))
1373 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_NEG_REPLY
,
1374 MGMT_STATUS_INVALID_PARAMS
);
1376 hdev
= hci_dev_get(index
);
1378 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_NEG_REPLY
,
1379 MGMT_STATUS_INVALID_PARAMS
);
1381 hci_dev_lock_bh(hdev
);
1383 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1384 err
= cmd_status(sk
, index
, MGMT_OP_PIN_CODE_NEG_REPLY
,
1385 MGMT_STATUS_NOT_POWERED
);
1389 err
= send_pin_code_neg_reply(sk
, index
, hdev
, cp
);
1392 hci_dev_unlock_bh(hdev
);
1398 static int set_io_capability(struct sock
*sk
, u16 index
, unsigned char *data
,
1401 struct hci_dev
*hdev
;
1402 struct mgmt_cp_set_io_capability
*cp
;
1408 if (len
!= sizeof(*cp
))
1409 return cmd_status(sk
, index
, MGMT_OP_SET_IO_CAPABILITY
,
1410 MGMT_STATUS_INVALID_PARAMS
);
1412 hdev
= hci_dev_get(index
);
1414 return cmd_status(sk
, index
, MGMT_OP_SET_IO_CAPABILITY
,
1415 MGMT_STATUS_INVALID_PARAMS
);
1417 hci_dev_lock_bh(hdev
);
1419 hdev
->io_capability
= cp
->io_capability
;
1421 BT_DBG("%s IO capability set to 0x%02x", hdev
->name
,
1422 hdev
->io_capability
);
1424 hci_dev_unlock_bh(hdev
);
1427 return cmd_complete(sk
, index
, MGMT_OP_SET_IO_CAPABILITY
, NULL
, 0);
1430 static inline struct pending_cmd
*find_pairing(struct hci_conn
*conn
)
1432 struct hci_dev
*hdev
= conn
->hdev
;
1433 struct pending_cmd
*cmd
;
1435 list_for_each_entry(cmd
, &hdev
->mgmt_pending
, list
) {
1436 if (cmd
->opcode
!= MGMT_OP_PAIR_DEVICE
)
1439 if (cmd
->user_data
!= conn
)
1448 static void pairing_complete(struct pending_cmd
*cmd
, u8 status
)
1450 struct mgmt_rp_pair_device rp
;
1451 struct hci_conn
*conn
= cmd
->user_data
;
1453 bacpy(&rp
.addr
.bdaddr
, &conn
->dst
);
1454 rp
.addr
.type
= link_to_mgmt(conn
->type
, conn
->dst_type
);
1457 cmd_complete(cmd
->sk
, cmd
->index
, MGMT_OP_PAIR_DEVICE
, &rp
, sizeof(rp
));
1459 /* So we don't get further callbacks for this connection */
1460 conn
->connect_cfm_cb
= NULL
;
1461 conn
->security_cfm_cb
= NULL
;
1462 conn
->disconn_cfm_cb
= NULL
;
1466 mgmt_pending_remove(cmd
);
1469 static void pairing_complete_cb(struct hci_conn
*conn
, u8 status
)
1471 struct pending_cmd
*cmd
;
1473 BT_DBG("status %u", status
);
1475 cmd
= find_pairing(conn
);
1477 BT_DBG("Unable to find a pending command");
1479 pairing_complete(cmd
, status
);
1482 static int pair_device(struct sock
*sk
, u16 index
, unsigned char *data
, u16 len
)
1484 struct hci_dev
*hdev
;
1485 struct mgmt_cp_pair_device
*cp
;
1486 struct mgmt_rp_pair_device rp
;
1487 struct pending_cmd
*cmd
;
1488 u8 sec_level
, auth_type
;
1489 struct hci_conn
*conn
;
1496 if (len
!= sizeof(*cp
))
1497 return cmd_status(sk
, index
, MGMT_OP_PAIR_DEVICE
,
1498 MGMT_STATUS_INVALID_PARAMS
);
1500 hdev
= hci_dev_get(index
);
1502 return cmd_status(sk
, index
, MGMT_OP_PAIR_DEVICE
,
1503 MGMT_STATUS_INVALID_PARAMS
);
1505 hci_dev_lock_bh(hdev
);
1507 sec_level
= BT_SECURITY_MEDIUM
;
1508 if (cp
->io_cap
== 0x03)
1509 auth_type
= HCI_AT_DEDICATED_BONDING
;
1511 auth_type
= HCI_AT_DEDICATED_BONDING_MITM
;
1513 if (cp
->addr
.type
== MGMT_ADDR_BREDR
)
1514 conn
= hci_connect(hdev
, ACL_LINK
, &cp
->addr
.bdaddr
, sec_level
,
1517 conn
= hci_connect(hdev
, LE_LINK
, &cp
->addr
.bdaddr
, sec_level
,
1520 memset(&rp
, 0, sizeof(rp
));
1521 bacpy(&rp
.addr
.bdaddr
, &cp
->addr
.bdaddr
);
1522 rp
.addr
.type
= cp
->addr
.type
;
1525 rp
.status
= -PTR_ERR(conn
);
1526 err
= cmd_complete(sk
, index
, MGMT_OP_PAIR_DEVICE
,
1531 if (conn
->connect_cfm_cb
) {
1534 err
= cmd_complete(sk
, index
, MGMT_OP_PAIR_DEVICE
,
1539 cmd
= mgmt_pending_add(sk
, MGMT_OP_PAIR_DEVICE
, hdev
, data
, len
);
1546 /* For LE, just connecting isn't a proof that the pairing finished */
1547 if (cp
->addr
.type
== MGMT_ADDR_BREDR
)
1548 conn
->connect_cfm_cb
= pairing_complete_cb
;
1550 conn
->security_cfm_cb
= pairing_complete_cb
;
1551 conn
->disconn_cfm_cb
= pairing_complete_cb
;
1552 conn
->io_capability
= cp
->io_cap
;
1553 cmd
->user_data
= conn
;
1555 if (conn
->state
== BT_CONNECTED
&&
1556 hci_conn_security(conn
, sec_level
, auth_type
))
1557 pairing_complete(cmd
, 0);
1562 hci_dev_unlock_bh(hdev
);
1568 static int user_confirm_reply(struct sock
*sk
, u16 index
, unsigned char *data
,
1569 u16 len
, int success
)
1571 struct mgmt_cp_user_confirm_reply
*cp
= (void *) data
;
1572 u16 mgmt_op
, hci_op
;
1573 struct pending_cmd
*cmd
;
1574 struct hci_dev
*hdev
;
1580 mgmt_op
= MGMT_OP_USER_CONFIRM_REPLY
;
1581 hci_op
= HCI_OP_USER_CONFIRM_REPLY
;
1583 mgmt_op
= MGMT_OP_USER_CONFIRM_NEG_REPLY
;
1584 hci_op
= HCI_OP_USER_CONFIRM_NEG_REPLY
;
1587 if (len
!= sizeof(*cp
))
1588 return cmd_status(sk
, index
, mgmt_op
,
1589 MGMT_STATUS_INVALID_PARAMS
);
1591 hdev
= hci_dev_get(index
);
1593 return cmd_status(sk
, index
, mgmt_op
,
1594 MGMT_STATUS_INVALID_PARAMS
);
1596 hci_dev_lock_bh(hdev
);
1598 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1599 err
= cmd_status(sk
, index
, mgmt_op
, ENETDOWN
);
1603 cmd
= mgmt_pending_add(sk
, mgmt_op
, hdev
, data
, len
);
1609 err
= hci_send_cmd(hdev
, hci_op
, sizeof(cp
->bdaddr
), &cp
->bdaddr
);
1611 mgmt_pending_remove(cmd
);
1614 hci_dev_unlock_bh(hdev
);
1620 static int set_local_name(struct sock
*sk
, u16 index
, unsigned char *data
,
1623 struct mgmt_cp_set_local_name
*mgmt_cp
= (void *) data
;
1624 struct hci_cp_write_local_name hci_cp
;
1625 struct hci_dev
*hdev
;
1626 struct pending_cmd
*cmd
;
1631 if (len
!= sizeof(*mgmt_cp
))
1632 return cmd_status(sk
, index
, MGMT_OP_SET_LOCAL_NAME
,
1633 MGMT_STATUS_INVALID_PARAMS
);
1635 hdev
= hci_dev_get(index
);
1637 return cmd_status(sk
, index
, MGMT_OP_SET_LOCAL_NAME
,
1638 MGMT_STATUS_INVALID_PARAMS
);
1640 hci_dev_lock_bh(hdev
);
1642 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_LOCAL_NAME
, hdev
, data
, len
);
1648 memcpy(hci_cp
.name
, mgmt_cp
->name
, sizeof(hci_cp
.name
));
1649 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_LOCAL_NAME
, sizeof(hci_cp
),
1652 mgmt_pending_remove(cmd
);
1655 hci_dev_unlock_bh(hdev
);
1661 static int read_local_oob_data(struct sock
*sk
, u16 index
)
1663 struct hci_dev
*hdev
;
1664 struct pending_cmd
*cmd
;
1667 BT_DBG("hci%u", index
);
1669 hdev
= hci_dev_get(index
);
1671 return cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
1672 MGMT_STATUS_INVALID_PARAMS
);
1674 hci_dev_lock_bh(hdev
);
1676 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1677 err
= cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
1678 MGMT_STATUS_NOT_POWERED
);
1682 if (!(hdev
->features
[6] & LMP_SIMPLE_PAIR
)) {
1683 err
= cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
1684 MGMT_STATUS_NOT_SUPPORTED
);
1688 if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA
, hdev
)) {
1689 err
= cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
1694 cmd
= mgmt_pending_add(sk
, MGMT_OP_READ_LOCAL_OOB_DATA
, hdev
, NULL
, 0);
1700 err
= hci_send_cmd(hdev
, HCI_OP_READ_LOCAL_OOB_DATA
, 0, NULL
);
1702 mgmt_pending_remove(cmd
);
1705 hci_dev_unlock_bh(hdev
);
1711 static int add_remote_oob_data(struct sock
*sk
, u16 index
, unsigned char *data
,
1714 struct hci_dev
*hdev
;
1715 struct mgmt_cp_add_remote_oob_data
*cp
= (void *) data
;
1718 BT_DBG("hci%u ", index
);
1720 if (len
!= sizeof(*cp
))
1721 return cmd_status(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
,
1722 MGMT_STATUS_INVALID_PARAMS
);
1724 hdev
= hci_dev_get(index
);
1726 return cmd_status(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
,
1727 MGMT_STATUS_INVALID_PARAMS
);
1729 hci_dev_lock_bh(hdev
);
1731 err
= hci_add_remote_oob_data(hdev
, &cp
->bdaddr
, cp
->hash
,
1734 err
= cmd_status(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
,
1735 MGMT_STATUS_FAILED
);
1737 err
= cmd_complete(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
, NULL
,
1740 hci_dev_unlock_bh(hdev
);
1746 static int remove_remote_oob_data(struct sock
*sk
, u16 index
,
1747 unsigned char *data
, u16 len
)
1749 struct hci_dev
*hdev
;
1750 struct mgmt_cp_remove_remote_oob_data
*cp
= (void *) data
;
1753 BT_DBG("hci%u ", index
);
1755 if (len
!= sizeof(*cp
))
1756 return cmd_status(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
1757 MGMT_STATUS_INVALID_PARAMS
);
1759 hdev
= hci_dev_get(index
);
1761 return cmd_status(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
1762 MGMT_STATUS_INVALID_PARAMS
);
1764 hci_dev_lock_bh(hdev
);
1766 err
= hci_remove_remote_oob_data(hdev
, &cp
->bdaddr
);
1768 err
= cmd_status(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
1769 MGMT_STATUS_INVALID_PARAMS
);
1771 err
= cmd_complete(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
1774 hci_dev_unlock_bh(hdev
);
1780 static int start_discovery(struct sock
*sk
, u16 index
)
1782 struct pending_cmd
*cmd
;
1783 struct hci_dev
*hdev
;
1786 BT_DBG("hci%u", index
);
1788 hdev
= hci_dev_get(index
);
1790 return cmd_status(sk
, index
, MGMT_OP_START_DISCOVERY
,
1791 MGMT_STATUS_INVALID_PARAMS
);
1793 hci_dev_lock_bh(hdev
);
1795 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1796 err
= cmd_status(sk
, index
, MGMT_OP_START_DISCOVERY
,
1797 MGMT_STATUS_NOT_POWERED
);
1801 cmd
= mgmt_pending_add(sk
, MGMT_OP_START_DISCOVERY
, hdev
, NULL
, 0);
1807 err
= hci_do_inquiry(hdev
, INQUIRY_LEN_BREDR
);
1809 mgmt_pending_remove(cmd
);
1812 hci_dev_unlock_bh(hdev
);
1818 static int stop_discovery(struct sock
*sk
, u16 index
)
1820 struct hci_dev
*hdev
;
1821 struct pending_cmd
*cmd
;
1824 BT_DBG("hci%u", index
);
1826 hdev
= hci_dev_get(index
);
1828 return cmd_status(sk
, index
, MGMT_OP_STOP_DISCOVERY
,
1829 MGMT_STATUS_INVALID_PARAMS
);
1831 hci_dev_lock_bh(hdev
);
1833 cmd
= mgmt_pending_add(sk
, MGMT_OP_STOP_DISCOVERY
, hdev
, NULL
, 0);
1839 err
= hci_cancel_inquiry(hdev
);
1841 mgmt_pending_remove(cmd
);
1844 hci_dev_unlock_bh(hdev
);
1850 static int block_device(struct sock
*sk
, u16 index
, unsigned char *data
,
1853 struct hci_dev
*hdev
;
1854 struct mgmt_cp_block_device
*cp
= (void *) data
;
1857 BT_DBG("hci%u", index
);
1859 if (len
!= sizeof(*cp
))
1860 return cmd_status(sk
, index
, MGMT_OP_BLOCK_DEVICE
,
1861 MGMT_STATUS_INVALID_PARAMS
);
1863 hdev
= hci_dev_get(index
);
1865 return cmd_status(sk
, index
, MGMT_OP_BLOCK_DEVICE
,
1866 MGMT_STATUS_INVALID_PARAMS
);
1868 hci_dev_lock_bh(hdev
);
1870 err
= hci_blacklist_add(hdev
, &cp
->bdaddr
);
1872 err
= cmd_status(sk
, index
, MGMT_OP_BLOCK_DEVICE
,
1873 MGMT_STATUS_FAILED
);
1875 err
= cmd_complete(sk
, index
, MGMT_OP_BLOCK_DEVICE
,
1878 hci_dev_unlock_bh(hdev
);
1884 static int unblock_device(struct sock
*sk
, u16 index
, unsigned char *data
,
1887 struct hci_dev
*hdev
;
1888 struct mgmt_cp_unblock_device
*cp
= (void *) data
;
1891 BT_DBG("hci%u", index
);
1893 if (len
!= sizeof(*cp
))
1894 return cmd_status(sk
, index
, MGMT_OP_UNBLOCK_DEVICE
,
1895 MGMT_STATUS_INVALID_PARAMS
);
1897 hdev
= hci_dev_get(index
);
1899 return cmd_status(sk
, index
, MGMT_OP_UNBLOCK_DEVICE
,
1900 MGMT_STATUS_INVALID_PARAMS
);
1902 hci_dev_lock_bh(hdev
);
1904 err
= hci_blacklist_del(hdev
, &cp
->bdaddr
);
1907 err
= cmd_status(sk
, index
, MGMT_OP_UNBLOCK_DEVICE
,
1908 MGMT_STATUS_INVALID_PARAMS
);
1910 err
= cmd_complete(sk
, index
, MGMT_OP_UNBLOCK_DEVICE
,
1913 hci_dev_unlock_bh(hdev
);
1919 static int set_fast_connectable(struct sock
*sk
, u16 index
,
1920 unsigned char *data
, u16 len
)
1922 struct hci_dev
*hdev
;
1923 struct mgmt_cp_set_fast_connectable
*cp
= (void *) data
;
1924 struct hci_cp_write_page_scan_activity acp
;
1928 BT_DBG("hci%u", index
);
1930 if (len
!= sizeof(*cp
))
1931 return cmd_status(sk
, index
, MGMT_OP_SET_FAST_CONNECTABLE
,
1932 MGMT_STATUS_INVALID_PARAMS
);
1934 hdev
= hci_dev_get(index
);
1936 return cmd_status(sk
, index
, MGMT_OP_SET_FAST_CONNECTABLE
,
1937 MGMT_STATUS_INVALID_PARAMS
);
1942 type
= PAGE_SCAN_TYPE_INTERLACED
;
1943 acp
.interval
= 0x0024; /* 22.5 msec page scan interval */
1945 type
= PAGE_SCAN_TYPE_STANDARD
; /* default */
1946 acp
.interval
= 0x0800; /* default 1.28 sec page scan */
1949 acp
.window
= 0x0012; /* default 11.25 msec page scan window */
1951 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY
,
1954 err
= cmd_status(sk
, index
, MGMT_OP_SET_FAST_CONNECTABLE
,
1955 MGMT_STATUS_FAILED
);
1959 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_PAGE_SCAN_TYPE
, 1, &type
);
1961 err
= cmd_status(sk
, index
, MGMT_OP_SET_FAST_CONNECTABLE
,
1962 MGMT_STATUS_FAILED
);
1966 err
= cmd_complete(sk
, index
, MGMT_OP_SET_FAST_CONNECTABLE
,
1969 hci_dev_unlock(hdev
);
1975 int mgmt_control(struct sock
*sk
, struct msghdr
*msg
, size_t msglen
)
1978 struct mgmt_hdr
*hdr
;
1979 u16 opcode
, index
, len
;
1982 BT_DBG("got %zu bytes", msglen
);
1984 if (msglen
< sizeof(*hdr
))
1987 buf
= kmalloc(msglen
, GFP_KERNEL
);
1991 if (memcpy_fromiovec(buf
, msg
->msg_iov
, msglen
)) {
1996 hdr
= (struct mgmt_hdr
*) buf
;
1997 opcode
= get_unaligned_le16(&hdr
->opcode
);
1998 index
= get_unaligned_le16(&hdr
->index
);
1999 len
= get_unaligned_le16(&hdr
->len
);
2001 if (len
!= msglen
- sizeof(*hdr
)) {
2007 case MGMT_OP_READ_VERSION
:
2008 err
= read_version(sk
);
2010 case MGMT_OP_READ_INDEX_LIST
:
2011 err
= read_index_list(sk
);
2013 case MGMT_OP_READ_INFO
:
2014 err
= read_controller_info(sk
, index
);
2016 case MGMT_OP_SET_POWERED
:
2017 err
= set_powered(sk
, index
, buf
+ sizeof(*hdr
), len
);
2019 case MGMT_OP_SET_DISCOVERABLE
:
2020 err
= set_discoverable(sk
, index
, buf
+ sizeof(*hdr
), len
);
2022 case MGMT_OP_SET_CONNECTABLE
:
2023 err
= set_connectable(sk
, index
, buf
+ sizeof(*hdr
), len
);
2025 case MGMT_OP_SET_PAIRABLE
:
2026 err
= set_pairable(sk
, index
, buf
+ sizeof(*hdr
), len
);
2028 case MGMT_OP_ADD_UUID
:
2029 err
= add_uuid(sk
, index
, buf
+ sizeof(*hdr
), len
);
2031 case MGMT_OP_REMOVE_UUID
:
2032 err
= remove_uuid(sk
, index
, buf
+ sizeof(*hdr
), len
);
2034 case MGMT_OP_SET_DEV_CLASS
:
2035 err
= set_dev_class(sk
, index
, buf
+ sizeof(*hdr
), len
);
2037 case MGMT_OP_SET_SERVICE_CACHE
:
2038 err
= set_service_cache(sk
, index
, buf
+ sizeof(*hdr
), len
);
2040 case MGMT_OP_LOAD_LINK_KEYS
:
2041 err
= load_link_keys(sk
, index
, buf
+ sizeof(*hdr
), len
);
2043 case MGMT_OP_REMOVE_KEYS
:
2044 err
= remove_keys(sk
, index
, buf
+ sizeof(*hdr
), len
);
2046 case MGMT_OP_DISCONNECT
:
2047 err
= disconnect(sk
, index
, buf
+ sizeof(*hdr
), len
);
2049 case MGMT_OP_GET_CONNECTIONS
:
2050 err
= get_connections(sk
, index
);
2052 case MGMT_OP_PIN_CODE_REPLY
:
2053 err
= pin_code_reply(sk
, index
, buf
+ sizeof(*hdr
), len
);
2055 case MGMT_OP_PIN_CODE_NEG_REPLY
:
2056 err
= pin_code_neg_reply(sk
, index
, buf
+ sizeof(*hdr
), len
);
2058 case MGMT_OP_SET_IO_CAPABILITY
:
2059 err
= set_io_capability(sk
, index
, buf
+ sizeof(*hdr
), len
);
2061 case MGMT_OP_PAIR_DEVICE
:
2062 err
= pair_device(sk
, index
, buf
+ sizeof(*hdr
), len
);
2064 case MGMT_OP_USER_CONFIRM_REPLY
:
2065 err
= user_confirm_reply(sk
, index
, buf
+ sizeof(*hdr
), len
, 1);
2067 case MGMT_OP_USER_CONFIRM_NEG_REPLY
:
2068 err
= user_confirm_reply(sk
, index
, buf
+ sizeof(*hdr
), len
, 0);
2070 case MGMT_OP_SET_LOCAL_NAME
:
2071 err
= set_local_name(sk
, index
, buf
+ sizeof(*hdr
), len
);
2073 case MGMT_OP_READ_LOCAL_OOB_DATA
:
2074 err
= read_local_oob_data(sk
, index
);
2076 case MGMT_OP_ADD_REMOTE_OOB_DATA
:
2077 err
= add_remote_oob_data(sk
, index
, buf
+ sizeof(*hdr
), len
);
2079 case MGMT_OP_REMOVE_REMOTE_OOB_DATA
:
2080 err
= remove_remote_oob_data(sk
, index
, buf
+ sizeof(*hdr
),
2083 case MGMT_OP_START_DISCOVERY
:
2084 err
= start_discovery(sk
, index
);
2086 case MGMT_OP_STOP_DISCOVERY
:
2087 err
= stop_discovery(sk
, index
);
2089 case MGMT_OP_BLOCK_DEVICE
:
2090 err
= block_device(sk
, index
, buf
+ sizeof(*hdr
), len
);
2092 case MGMT_OP_UNBLOCK_DEVICE
:
2093 err
= unblock_device(sk
, index
, buf
+ sizeof(*hdr
), len
);
2095 case MGMT_OP_SET_FAST_CONNECTABLE
:
2096 err
= set_fast_connectable(sk
, index
, buf
+ sizeof(*hdr
),
2100 BT_DBG("Unknown op %u", opcode
);
2101 err
= cmd_status(sk
, index
, opcode
,
2102 MGMT_STATUS_UNKNOWN_COMMAND
);
2116 static void cmd_status_rsp(struct pending_cmd
*cmd
, void *data
)
2120 cmd_status(cmd
->sk
, cmd
->index
, cmd
->opcode
, *status
);
2121 mgmt_pending_remove(cmd
);
2124 int mgmt_index_added(struct hci_dev
*hdev
)
2126 return mgmt_event(MGMT_EV_INDEX_ADDED
, hdev
, NULL
, 0, NULL
);
2129 int mgmt_index_removed(struct hci_dev
*hdev
)
2133 mgmt_pending_foreach(0, hdev
, cmd_status_rsp
, &status
);
2135 return mgmt_event(MGMT_EV_INDEX_REMOVED
, hdev
, NULL
, 0, NULL
);
2143 static void mode_rsp(struct pending_cmd
*cmd
, void *data
)
2145 struct mgmt_mode
*cp
= cmd
->param
;
2146 struct cmd_lookup
*match
= data
;
2148 if (cp
->val
!= match
->val
)
2151 send_mode_rsp(cmd
->sk
, cmd
->opcode
, cmd
->index
, cp
->val
);
2153 list_del(&cmd
->list
);
2155 if (match
->sk
== NULL
) {
2156 match
->sk
= cmd
->sk
;
2157 sock_hold(match
->sk
);
2160 mgmt_pending_free(cmd
);
2163 int mgmt_powered(struct hci_dev
*hdev
, u8 powered
)
2165 struct mgmt_mode ev
;
2166 struct cmd_lookup match
= { powered
, NULL
};
2169 mgmt_pending_foreach(MGMT_OP_SET_POWERED
, hdev
, mode_rsp
, &match
);
2172 u8 status
= ENETDOWN
;
2173 mgmt_pending_foreach(0, hdev
, cmd_status_rsp
, &status
);
2178 ret
= mgmt_event(MGMT_EV_POWERED
, hdev
, &ev
, sizeof(ev
), match
.sk
);
2186 int mgmt_discoverable(struct hci_dev
*hdev
, u8 discoverable
)
2188 struct mgmt_mode ev
;
2189 struct cmd_lookup match
= { discoverable
, NULL
};
2192 mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE
, hdev
, mode_rsp
, &match
);
2194 ev
.val
= discoverable
;
2196 ret
= mgmt_event(MGMT_EV_DISCOVERABLE
, hdev
, &ev
, sizeof(ev
),
2205 int mgmt_connectable(struct hci_dev
*hdev
, u8 connectable
)
2207 struct mgmt_mode ev
;
2208 struct cmd_lookup match
= { connectable
, NULL
};
2211 mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE
, hdev
, mode_rsp
, &match
);
2213 ev
.val
= connectable
;
2215 ret
= mgmt_event(MGMT_EV_CONNECTABLE
, hdev
, &ev
, sizeof(ev
), match
.sk
);
2223 int mgmt_write_scan_failed(struct hci_dev
*hdev
, u8 scan
, u8 status
)
2225 u8 mgmt_err
= mgmt_status(status
);
2227 if (scan
& SCAN_PAGE
)
2228 mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE
, hdev
,
2229 cmd_status_rsp
, &mgmt_err
);
2231 if (scan
& SCAN_INQUIRY
)
2232 mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE
, hdev
,
2233 cmd_status_rsp
, &mgmt_err
);
2238 int mgmt_new_link_key(struct hci_dev
*hdev
, struct link_key
*key
,
2241 struct mgmt_ev_new_link_key ev
;
2243 memset(&ev
, 0, sizeof(ev
));
2245 ev
.store_hint
= persistent
;
2246 bacpy(&ev
.key
.bdaddr
, &key
->bdaddr
);
2247 ev
.key
.type
= key
->type
;
2248 memcpy(ev
.key
.val
, key
->val
, 16);
2249 ev
.key
.pin_len
= key
->pin_len
;
2251 return mgmt_event(MGMT_EV_NEW_LINK_KEY
, hdev
, &ev
, sizeof(ev
), NULL
);
2254 int mgmt_connected(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
2257 struct mgmt_addr_info ev
;
2259 bacpy(&ev
.bdaddr
, bdaddr
);
2260 ev
.type
= link_to_mgmt(link_type
, addr_type
);
2262 return mgmt_event(MGMT_EV_CONNECTED
, hdev
, &ev
, sizeof(ev
), NULL
);
2265 static void disconnect_rsp(struct pending_cmd
*cmd
, void *data
)
2267 struct mgmt_cp_disconnect
*cp
= cmd
->param
;
2268 struct sock
**sk
= data
;
2269 struct mgmt_rp_disconnect rp
;
2271 bacpy(&rp
.bdaddr
, &cp
->bdaddr
);
2274 cmd_complete(cmd
->sk
, cmd
->index
, MGMT_OP_DISCONNECT
, &rp
, sizeof(rp
));
2279 mgmt_pending_remove(cmd
);
2282 static void remove_keys_rsp(struct pending_cmd
*cmd
, void *data
)
2285 struct mgmt_cp_remove_keys
*cp
= cmd
->param
;
2286 struct mgmt_rp_remove_keys rp
;
2288 memset(&rp
, 0, sizeof(rp
));
2289 bacpy(&rp
.bdaddr
, &cp
->bdaddr
);
2291 rp
.status
= *status
;
2293 cmd_complete(cmd
->sk
, cmd
->index
, MGMT_OP_REMOVE_KEYS
, &rp
,
2296 mgmt_pending_remove(cmd
);
2299 int mgmt_disconnected(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
2302 struct mgmt_addr_info ev
;
2303 struct sock
*sk
= NULL
;
2306 mgmt_pending_foreach(MGMT_OP_DISCONNECT
, hdev
, disconnect_rsp
, &sk
);
2308 bacpy(&ev
.bdaddr
, bdaddr
);
2309 ev
.type
= link_to_mgmt(link_type
, addr_type
);
2311 err
= mgmt_event(MGMT_EV_DISCONNECTED
, hdev
, &ev
, sizeof(ev
), sk
);
2316 mgmt_pending_foreach(MGMT_OP_REMOVE_KEYS
, hdev
, remove_keys_rsp
, NULL
);
2321 int mgmt_disconnect_failed(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 status
)
2323 struct pending_cmd
*cmd
;
2324 u8 mgmt_err
= mgmt_status(status
);
2327 cmd
= mgmt_pending_find(MGMT_OP_DISCONNECT
, hdev
);
2332 struct mgmt_rp_disconnect rp
;
2334 bacpy(&rp
.bdaddr
, bdaddr
);
2337 err
= cmd_complete(cmd
->sk
, cmd
->index
, MGMT_OP_DISCONNECT
,
2340 err
= cmd_status(cmd
->sk
, hdev
->id
, MGMT_OP_DISCONNECT
,
2343 mgmt_pending_remove(cmd
);
2348 int mgmt_connect_failed(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
2349 u8 addr_type
, u8 status
)
2351 struct mgmt_ev_connect_failed ev
;
2353 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
2354 ev
.addr
.type
= link_to_mgmt(link_type
, addr_type
);
2355 ev
.status
= mgmt_status(status
);
2357 return mgmt_event(MGMT_EV_CONNECT_FAILED
, hdev
, &ev
, sizeof(ev
), NULL
);
2360 int mgmt_pin_code_request(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 secure
)
2362 struct mgmt_ev_pin_code_request ev
;
2364 bacpy(&ev
.bdaddr
, bdaddr
);
2367 return mgmt_event(MGMT_EV_PIN_CODE_REQUEST
, hdev
, &ev
, sizeof(ev
),
2371 int mgmt_pin_code_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
2374 struct pending_cmd
*cmd
;
2375 struct mgmt_rp_pin_code_reply rp
;
2378 cmd
= mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY
, hdev
);
2382 bacpy(&rp
.bdaddr
, bdaddr
);
2383 rp
.status
= mgmt_status(status
);
2385 err
= cmd_complete(cmd
->sk
, hdev
->id
, MGMT_OP_PIN_CODE_REPLY
, &rp
,
2388 mgmt_pending_remove(cmd
);
2393 int mgmt_pin_code_neg_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
2396 struct pending_cmd
*cmd
;
2397 struct mgmt_rp_pin_code_reply rp
;
2400 cmd
= mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY
, hdev
);
2404 bacpy(&rp
.bdaddr
, bdaddr
);
2405 rp
.status
= mgmt_status(status
);
2407 err
= cmd_complete(cmd
->sk
, hdev
->id
, MGMT_OP_PIN_CODE_NEG_REPLY
, &rp
,
2410 mgmt_pending_remove(cmd
);
2415 int mgmt_user_confirm_request(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
2416 __le32 value
, u8 confirm_hint
)
2418 struct mgmt_ev_user_confirm_request ev
;
2420 BT_DBG("%s", hdev
->name
);
2422 bacpy(&ev
.bdaddr
, bdaddr
);
2423 ev
.confirm_hint
= confirm_hint
;
2424 put_unaligned_le32(value
, &ev
.value
);
2426 return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST
, hdev
, &ev
, sizeof(ev
),
2430 static int confirm_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
2431 u8 status
, u8 opcode
)
2433 struct pending_cmd
*cmd
;
2434 struct mgmt_rp_user_confirm_reply rp
;
2437 cmd
= mgmt_pending_find(opcode
, hdev
);
2441 bacpy(&rp
.bdaddr
, bdaddr
);
2442 rp
.status
= mgmt_status(status
);
2443 err
= cmd_complete(cmd
->sk
, hdev
->id
, opcode
, &rp
, sizeof(rp
));
2445 mgmt_pending_remove(cmd
);
2450 int mgmt_user_confirm_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
2453 return confirm_reply_complete(hdev
, bdaddr
, mgmt_status(status
),
2454 MGMT_OP_USER_CONFIRM_REPLY
);
2457 int mgmt_user_confirm_neg_reply_complete(struct hci_dev
*hdev
,
2458 bdaddr_t
*bdaddr
, u8 status
)
2460 return confirm_reply_complete(hdev
, bdaddr
, mgmt_status(status
),
2461 MGMT_OP_USER_CONFIRM_NEG_REPLY
);
2464 int mgmt_auth_failed(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 status
)
2466 struct mgmt_ev_auth_failed ev
;
2468 bacpy(&ev
.bdaddr
, bdaddr
);
2469 ev
.status
= mgmt_status(status
);
2471 return mgmt_event(MGMT_EV_AUTH_FAILED
, hdev
, &ev
, sizeof(ev
), NULL
);
2474 int mgmt_set_local_name_complete(struct hci_dev
*hdev
, u8
*name
, u8 status
)
2476 struct pending_cmd
*cmd
;
2477 struct mgmt_cp_set_local_name ev
;
2480 memset(&ev
, 0, sizeof(ev
));
2481 memcpy(ev
.name
, name
, HCI_MAX_NAME_LENGTH
);
2483 cmd
= mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME
, hdev
);
2488 err
= cmd_status(cmd
->sk
, hdev
->id
, MGMT_OP_SET_LOCAL_NAME
,
2489 mgmt_status(status
));
2495 err
= cmd_complete(cmd
->sk
, hdev
->id
, MGMT_OP_SET_LOCAL_NAME
, &ev
,
2501 err
= mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED
, hdev
, &ev
, sizeof(ev
),
2502 cmd
? cmd
->sk
: NULL
);
2506 mgmt_pending_remove(cmd
);
2510 int mgmt_read_local_oob_data_reply_complete(struct hci_dev
*hdev
, u8
*hash
,
2511 u8
*randomizer
, u8 status
)
2513 struct pending_cmd
*cmd
;
2516 BT_DBG("%s status %u", hdev
->name
, status
);
2518 cmd
= mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA
, hdev
);
2523 err
= cmd_status(cmd
->sk
, hdev
->id
,
2524 MGMT_OP_READ_LOCAL_OOB_DATA
,
2525 mgmt_status(status
));
2527 struct mgmt_rp_read_local_oob_data rp
;
2529 memcpy(rp
.hash
, hash
, sizeof(rp
.hash
));
2530 memcpy(rp
.randomizer
, randomizer
, sizeof(rp
.randomizer
));
2532 err
= cmd_complete(cmd
->sk
, hdev
->id
,
2533 MGMT_OP_READ_LOCAL_OOB_DATA
,
2537 mgmt_pending_remove(cmd
);
2542 int mgmt_device_found(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
2543 u8 addr_type
, u8
*dev_class
, s8 rssi
, u8
*eir
)
2545 struct mgmt_ev_device_found ev
;
2547 memset(&ev
, 0, sizeof(ev
));
2549 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
2550 ev
.addr
.type
= link_to_mgmt(link_type
, addr_type
);
2554 memcpy(ev
.eir
, eir
, sizeof(ev
.eir
));
2557 memcpy(ev
.dev_class
, dev_class
, sizeof(ev
.dev_class
));
2559 return mgmt_event(MGMT_EV_DEVICE_FOUND
, hdev
, &ev
, sizeof(ev
), NULL
);
2562 int mgmt_remote_name(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8
*name
)
2564 struct mgmt_ev_remote_name ev
;
2566 memset(&ev
, 0, sizeof(ev
));
2568 bacpy(&ev
.bdaddr
, bdaddr
);
2569 memcpy(ev
.name
, name
, HCI_MAX_NAME_LENGTH
);
2571 return mgmt_event(MGMT_EV_REMOTE_NAME
, hdev
, &ev
, sizeof(ev
), NULL
);
2574 int mgmt_start_discovery_failed(struct hci_dev
*hdev
, u8 status
)
2576 struct pending_cmd
*cmd
;
2579 cmd
= mgmt_pending_find(MGMT_OP_START_DISCOVERY
, hdev
);
2583 err
= cmd_status(cmd
->sk
, hdev
->id
, cmd
->opcode
, mgmt_status(status
));
2584 mgmt_pending_remove(cmd
);
2589 int mgmt_stop_discovery_failed(struct hci_dev
*hdev
, u8 status
)
2591 struct pending_cmd
*cmd
;
2594 cmd
= mgmt_pending_find(MGMT_OP_STOP_DISCOVERY
, hdev
);
2598 err
= cmd_status(cmd
->sk
, hdev
->id
, cmd
->opcode
, status
);
2599 mgmt_pending_remove(cmd
);
2604 int mgmt_discovering(struct hci_dev
*hdev
, u8 discovering
)
2606 struct pending_cmd
*cmd
;
2609 cmd
= mgmt_pending_find(MGMT_OP_START_DISCOVERY
, hdev
);
2611 cmd
= mgmt_pending_find(MGMT_OP_STOP_DISCOVERY
, hdev
);
2614 cmd_complete(cmd
->sk
, hdev
->id
, cmd
->opcode
, NULL
, 0);
2615 mgmt_pending_remove(cmd
);
2618 return mgmt_event(MGMT_EV_DISCOVERING
, hdev
, &discovering
,
2619 sizeof(discovering
), NULL
);
2622 int mgmt_device_blocked(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
)
2624 struct pending_cmd
*cmd
;
2625 struct mgmt_ev_device_blocked ev
;
2627 cmd
= mgmt_pending_find(MGMT_OP_BLOCK_DEVICE
, hdev
);
2629 bacpy(&ev
.bdaddr
, bdaddr
);
2631 return mgmt_event(MGMT_EV_DEVICE_BLOCKED
, hdev
, &ev
, sizeof(ev
),
2632 cmd
? cmd
->sk
: NULL
);
2635 int mgmt_device_unblocked(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
)
2637 struct pending_cmd
*cmd
;
2638 struct mgmt_ev_device_unblocked ev
;
2640 cmd
= mgmt_pending_find(MGMT_OP_UNBLOCK_DEVICE
, hdev
);
2642 bacpy(&ev
.bdaddr
, bdaddr
);
2644 return mgmt_event(MGMT_EV_DEVICE_UNBLOCKED
, hdev
, &ev
, sizeof(ev
),
2645 cmd
? cmd
->sk
: NULL
);