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 <linux/module.h>
28 #include <asm/unaligned.h>
30 #include <net/bluetooth/bluetooth.h>
31 #include <net/bluetooth/hci_core.h>
32 #include <net/bluetooth/mgmt.h>
33 #include <net/bluetooth/smp.h>
35 #define MGMT_VERSION 0
36 #define MGMT_REVISION 1
39 * These LE scan and inquiry parameters were chosen according to LE General
40 * Discovery Procedure specification.
42 #define LE_SCAN_TYPE 0x01
43 #define LE_SCAN_WIN 0x12
44 #define LE_SCAN_INT 0x12
45 #define LE_SCAN_TIMEOUT_LE_ONLY 10240 /* TGAP(gen_disc_scan_min) */
47 #define INQUIRY_LEN_BREDR 0x08 /* TGAP(100) */
49 #define SERVICE_CACHE_TIMEOUT (5 * 1000)
52 struct list_head list
;
60 /* HCI to MGMT error code conversion table */
61 static u8 mgmt_status_table
[] = {
63 MGMT_STATUS_UNKNOWN_COMMAND
, /* Unknown Command */
64 MGMT_STATUS_NOT_CONNECTED
, /* No Connection */
65 MGMT_STATUS_FAILED
, /* Hardware Failure */
66 MGMT_STATUS_CONNECT_FAILED
, /* Page Timeout */
67 MGMT_STATUS_AUTH_FAILED
, /* Authentication Failed */
68 MGMT_STATUS_NOT_PAIRED
, /* PIN or Key Missing */
69 MGMT_STATUS_NO_RESOURCES
, /* Memory Full */
70 MGMT_STATUS_TIMEOUT
, /* Connection Timeout */
71 MGMT_STATUS_NO_RESOURCES
, /* Max Number of Connections */
72 MGMT_STATUS_NO_RESOURCES
, /* Max Number of SCO Connections */
73 MGMT_STATUS_ALREADY_CONNECTED
, /* ACL Connection Exists */
74 MGMT_STATUS_BUSY
, /* Command Disallowed */
75 MGMT_STATUS_NO_RESOURCES
, /* Rejected Limited Resources */
76 MGMT_STATUS_REJECTED
, /* Rejected Security */
77 MGMT_STATUS_REJECTED
, /* Rejected Personal */
78 MGMT_STATUS_TIMEOUT
, /* Host Timeout */
79 MGMT_STATUS_NOT_SUPPORTED
, /* Unsupported Feature */
80 MGMT_STATUS_INVALID_PARAMS
, /* Invalid Parameters */
81 MGMT_STATUS_DISCONNECTED
, /* OE User Ended Connection */
82 MGMT_STATUS_NO_RESOURCES
, /* OE Low Resources */
83 MGMT_STATUS_DISCONNECTED
, /* OE Power Off */
84 MGMT_STATUS_DISCONNECTED
, /* Connection Terminated */
85 MGMT_STATUS_BUSY
, /* Repeated Attempts */
86 MGMT_STATUS_REJECTED
, /* Pairing Not Allowed */
87 MGMT_STATUS_FAILED
, /* Unknown LMP PDU */
88 MGMT_STATUS_NOT_SUPPORTED
, /* Unsupported Remote Feature */
89 MGMT_STATUS_REJECTED
, /* SCO Offset Rejected */
90 MGMT_STATUS_REJECTED
, /* SCO Interval Rejected */
91 MGMT_STATUS_REJECTED
, /* Air Mode Rejected */
92 MGMT_STATUS_INVALID_PARAMS
, /* Invalid LMP Parameters */
93 MGMT_STATUS_FAILED
, /* Unspecified Error */
94 MGMT_STATUS_NOT_SUPPORTED
, /* Unsupported LMP Parameter Value */
95 MGMT_STATUS_FAILED
, /* Role Change Not Allowed */
96 MGMT_STATUS_TIMEOUT
, /* LMP Response Timeout */
97 MGMT_STATUS_FAILED
, /* LMP Error Transaction Collision */
98 MGMT_STATUS_FAILED
, /* LMP PDU Not Allowed */
99 MGMT_STATUS_REJECTED
, /* Encryption Mode Not Accepted */
100 MGMT_STATUS_FAILED
, /* Unit Link Key Used */
101 MGMT_STATUS_NOT_SUPPORTED
, /* QoS Not Supported */
102 MGMT_STATUS_TIMEOUT
, /* Instant Passed */
103 MGMT_STATUS_NOT_SUPPORTED
, /* Pairing Not Supported */
104 MGMT_STATUS_FAILED
, /* Transaction Collision */
105 MGMT_STATUS_INVALID_PARAMS
, /* Unacceptable Parameter */
106 MGMT_STATUS_REJECTED
, /* QoS Rejected */
107 MGMT_STATUS_NOT_SUPPORTED
, /* Classification Not Supported */
108 MGMT_STATUS_REJECTED
, /* Insufficient Security */
109 MGMT_STATUS_INVALID_PARAMS
, /* Parameter Out Of Range */
110 MGMT_STATUS_BUSY
, /* Role Switch Pending */
111 MGMT_STATUS_FAILED
, /* Slot Violation */
112 MGMT_STATUS_FAILED
, /* Role Switch Failed */
113 MGMT_STATUS_INVALID_PARAMS
, /* EIR Too Large */
114 MGMT_STATUS_NOT_SUPPORTED
, /* Simple Pairing Not Supported */
115 MGMT_STATUS_BUSY
, /* Host Busy Pairing */
116 MGMT_STATUS_REJECTED
, /* Rejected, No Suitable Channel */
117 MGMT_STATUS_BUSY
, /* Controller Busy */
118 MGMT_STATUS_INVALID_PARAMS
, /* Unsuitable Connection Interval */
119 MGMT_STATUS_TIMEOUT
, /* Directed Advertising Timeout */
120 MGMT_STATUS_AUTH_FAILED
, /* Terminated Due to MIC Failure */
121 MGMT_STATUS_CONNECT_FAILED
, /* Connection Establishment Failed */
122 MGMT_STATUS_CONNECT_FAILED
, /* MAC Connection Failed */
125 static u8
mgmt_status(u8 hci_status
)
127 if (hci_status
< ARRAY_SIZE(mgmt_status_table
))
128 return mgmt_status_table
[hci_status
];
130 return MGMT_STATUS_FAILED
;
133 static int cmd_status(struct sock
*sk
, u16 index
, u16 cmd
, u8 status
)
136 struct mgmt_hdr
*hdr
;
137 struct mgmt_ev_cmd_status
*ev
;
140 BT_DBG("sock %p, index %u, cmd %u, status %u", sk
, index
, cmd
, status
);
142 skb
= alloc_skb(sizeof(*hdr
) + sizeof(*ev
), GFP_ATOMIC
);
146 hdr
= (void *) skb_put(skb
, sizeof(*hdr
));
148 hdr
->opcode
= cpu_to_le16(MGMT_EV_CMD_STATUS
);
149 hdr
->index
= cpu_to_le16(index
);
150 hdr
->len
= cpu_to_le16(sizeof(*ev
));
152 ev
= (void *) skb_put(skb
, sizeof(*ev
));
154 put_unaligned_le16(cmd
, &ev
->opcode
);
156 err
= sock_queue_rcv_skb(sk
, skb
);
163 static int cmd_complete(struct sock
*sk
, u16 index
, u16 cmd
, void *rp
,
167 struct mgmt_hdr
*hdr
;
168 struct mgmt_ev_cmd_complete
*ev
;
171 BT_DBG("sock %p", sk
);
173 skb
= alloc_skb(sizeof(*hdr
) + sizeof(*ev
) + rp_len
, GFP_ATOMIC
);
177 hdr
= (void *) skb_put(skb
, sizeof(*hdr
));
179 hdr
->opcode
= cpu_to_le16(MGMT_EV_CMD_COMPLETE
);
180 hdr
->index
= cpu_to_le16(index
);
181 hdr
->len
= cpu_to_le16(sizeof(*ev
) + rp_len
);
183 ev
= (void *) skb_put(skb
, sizeof(*ev
) + rp_len
);
184 put_unaligned_le16(cmd
, &ev
->opcode
);
187 memcpy(ev
->data
, rp
, rp_len
);
189 err
= sock_queue_rcv_skb(sk
, skb
);
196 static int read_version(struct sock
*sk
)
198 struct mgmt_rp_read_version rp
;
200 BT_DBG("sock %p", sk
);
202 rp
.version
= MGMT_VERSION
;
203 put_unaligned_le16(MGMT_REVISION
, &rp
.revision
);
205 return cmd_complete(sk
, MGMT_INDEX_NONE
, MGMT_OP_READ_VERSION
, &rp
,
209 static int read_index_list(struct sock
*sk
)
211 struct mgmt_rp_read_index_list
*rp
;
218 BT_DBG("sock %p", sk
);
220 read_lock(&hci_dev_list_lock
);
223 list_for_each(p
, &hci_dev_list
) {
227 rp_len
= sizeof(*rp
) + (2 * count
);
228 rp
= kmalloc(rp_len
, GFP_ATOMIC
);
230 read_unlock(&hci_dev_list_lock
);
234 put_unaligned_le16(count
, &rp
->num_controllers
);
237 list_for_each_entry(d
, &hci_dev_list
, list
) {
238 if (test_and_clear_bit(HCI_AUTO_OFF
, &d
->dev_flags
))
239 cancel_delayed_work(&d
->power_off
);
241 if (test_bit(HCI_SETUP
, &d
->dev_flags
))
244 put_unaligned_le16(d
->id
, &rp
->index
[i
++]);
245 BT_DBG("Added hci%u", d
->id
);
248 read_unlock(&hci_dev_list_lock
);
250 err
= cmd_complete(sk
, MGMT_INDEX_NONE
, MGMT_OP_READ_INDEX_LIST
, rp
,
258 static u32
get_supported_settings(struct hci_dev
*hdev
)
262 settings
|= MGMT_SETTING_POWERED
;
263 settings
|= MGMT_SETTING_CONNECTABLE
;
264 settings
|= MGMT_SETTING_FAST_CONNECTABLE
;
265 settings
|= MGMT_SETTING_DISCOVERABLE
;
266 settings
|= MGMT_SETTING_PAIRABLE
;
268 if (hdev
->features
[6] & LMP_SIMPLE_PAIR
)
269 settings
|= MGMT_SETTING_SSP
;
271 if (!(hdev
->features
[4] & LMP_NO_BREDR
)) {
272 settings
|= MGMT_SETTING_BREDR
;
273 settings
|= MGMT_SETTING_LINK_SECURITY
;
276 if (hdev
->features
[4] & LMP_LE
)
277 settings
|= MGMT_SETTING_LE
;
282 static u32
get_current_settings(struct hci_dev
*hdev
)
286 if (test_bit(HCI_UP
, &hdev
->flags
))
287 settings
|= MGMT_SETTING_POWERED
;
291 if (test_bit(HCI_PSCAN
, &hdev
->flags
))
292 settings
|= MGMT_SETTING_CONNECTABLE
;
294 if (test_bit(HCI_ISCAN
, &hdev
->flags
))
295 settings
|= MGMT_SETTING_DISCOVERABLE
;
297 if (test_bit(HCI_PAIRABLE
, &hdev
->dev_flags
))
298 settings
|= MGMT_SETTING_PAIRABLE
;
300 if (!(hdev
->features
[4] & LMP_NO_BREDR
))
301 settings
|= MGMT_SETTING_BREDR
;
303 if (hdev
->host_features
[0] & LMP_HOST_LE
)
304 settings
|= MGMT_SETTING_LE
;
306 if (test_bit(HCI_AUTH
, &hdev
->flags
))
307 settings
|= MGMT_SETTING_LINK_SECURITY
;
309 if (test_bit(HCI_SSP_ENABLED
, &hdev
->dev_flags
))
310 settings
|= MGMT_SETTING_SSP
;
315 #define PNP_INFO_SVCLASS_ID 0x1200
317 static u8 bluetooth_base_uuid
[] = {
318 0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80,
319 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322 static u16
get_uuid16(u8
*uuid128
)
327 for (i
= 0; i
< 12; i
++) {
328 if (bluetooth_base_uuid
[i
] != uuid128
[i
])
332 memcpy(&val
, &uuid128
[12], 4);
334 val
= le32_to_cpu(val
);
341 static void create_eir(struct hci_dev
*hdev
, u8
*data
)
345 u16 uuid16_list
[HCI_MAX_EIR_LENGTH
/ sizeof(u16
)];
346 int i
, truncated
= 0;
347 struct bt_uuid
*uuid
;
350 name_len
= strlen(hdev
->dev_name
);
356 ptr
[1] = EIR_NAME_SHORT
;
358 ptr
[1] = EIR_NAME_COMPLETE
;
360 /* EIR Data length */
361 ptr
[0] = name_len
+ 1;
363 memcpy(ptr
+ 2, hdev
->dev_name
, name_len
);
365 eir_len
+= (name_len
+ 2);
366 ptr
+= (name_len
+ 2);
369 memset(uuid16_list
, 0, sizeof(uuid16_list
));
371 /* Group all UUID16 types */
372 list_for_each_entry(uuid
, &hdev
->uuids
, list
) {
375 uuid16
= get_uuid16(uuid
->uuid
);
382 if (uuid16
== PNP_INFO_SVCLASS_ID
)
385 /* Stop if not enough space to put next UUID */
386 if (eir_len
+ 2 + sizeof(u16
) > HCI_MAX_EIR_LENGTH
) {
391 /* Check for duplicates */
392 for (i
= 0; uuid16_list
[i
] != 0; i
++)
393 if (uuid16_list
[i
] == uuid16
)
396 if (uuid16_list
[i
] == 0) {
397 uuid16_list
[i
] = uuid16
;
398 eir_len
+= sizeof(u16
);
402 if (uuid16_list
[0] != 0) {
406 ptr
[1] = truncated
? EIR_UUID16_SOME
: EIR_UUID16_ALL
;
411 for (i
= 0; uuid16_list
[i
] != 0; i
++) {
412 *ptr
++ = (uuid16_list
[i
] & 0x00ff);
413 *ptr
++ = (uuid16_list
[i
] & 0xff00) >> 8;
416 /* EIR Data length */
417 *length
= (i
* sizeof(u16
)) + 1;
421 static int update_eir(struct hci_dev
*hdev
)
423 struct hci_cp_write_eir cp
;
425 if (!(hdev
->features
[6] & LMP_EXT_INQ
))
428 if (!test_bit(HCI_SSP_ENABLED
, &hdev
->dev_flags
))
431 if (test_bit(HCI_SERVICE_CACHE
, &hdev
->dev_flags
))
434 memset(&cp
, 0, sizeof(cp
));
436 create_eir(hdev
, cp
.data
);
438 if (memcmp(cp
.data
, hdev
->eir
, sizeof(cp
.data
)) == 0)
441 memcpy(hdev
->eir
, cp
.data
, sizeof(cp
.data
));
443 return hci_send_cmd(hdev
, HCI_OP_WRITE_EIR
, sizeof(cp
), &cp
);
446 static u8
get_service_classes(struct hci_dev
*hdev
)
448 struct bt_uuid
*uuid
;
451 list_for_each_entry(uuid
, &hdev
->uuids
, list
)
452 val
|= uuid
->svc_hint
;
457 static int update_class(struct hci_dev
*hdev
)
461 BT_DBG("%s", hdev
->name
);
463 if (test_bit(HCI_SERVICE_CACHE
, &hdev
->dev_flags
))
466 cod
[0] = hdev
->minor_class
;
467 cod
[1] = hdev
->major_class
;
468 cod
[2] = get_service_classes(hdev
);
470 if (memcmp(cod
, hdev
->dev_class
, 3) == 0)
473 return hci_send_cmd(hdev
, HCI_OP_WRITE_CLASS_OF_DEV
, sizeof(cod
), cod
);
476 static void service_cache_off(struct work_struct
*work
)
478 struct hci_dev
*hdev
= container_of(work
, struct hci_dev
,
481 if (!test_and_clear_bit(HCI_SERVICE_CACHE
, &hdev
->dev_flags
))
489 hci_dev_unlock(hdev
);
492 static void mgmt_init_hdev(struct hci_dev
*hdev
)
494 if (!test_and_set_bit(HCI_MGMT
, &hdev
->dev_flags
))
495 INIT_DELAYED_WORK(&hdev
->service_cache
, service_cache_off
);
497 if (!test_and_set_bit(HCI_SERVICE_CACHE
, &hdev
->dev_flags
))
498 schedule_delayed_work(&hdev
->service_cache
,
499 msecs_to_jiffies(SERVICE_CACHE_TIMEOUT
));
502 static int read_controller_info(struct sock
*sk
, u16 index
)
504 struct mgmt_rp_read_info rp
;
505 struct hci_dev
*hdev
;
507 BT_DBG("sock %p hci%u", sk
, index
);
509 hdev
= hci_dev_get(index
);
511 return cmd_status(sk
, index
, MGMT_OP_READ_INFO
,
512 MGMT_STATUS_INVALID_PARAMS
);
514 if (test_and_clear_bit(HCI_AUTO_OFF
, &hdev
->dev_flags
))
515 cancel_delayed_work_sync(&hdev
->power_off
);
519 if (test_and_clear_bit(HCI_PI_MGMT_INIT
, &hci_pi(sk
)->flags
))
520 mgmt_init_hdev(hdev
);
522 memset(&rp
, 0, sizeof(rp
));
524 bacpy(&rp
.bdaddr
, &hdev
->bdaddr
);
526 rp
.version
= hdev
->hci_ver
;
528 put_unaligned_le16(hdev
->manufacturer
, &rp
.manufacturer
);
530 rp
.supported_settings
= cpu_to_le32(get_supported_settings(hdev
));
531 rp
.current_settings
= cpu_to_le32(get_current_settings(hdev
));
533 memcpy(rp
.dev_class
, hdev
->dev_class
, 3);
535 memcpy(rp
.name
, hdev
->dev_name
, sizeof(hdev
->dev_name
));
537 hci_dev_unlock(hdev
);
540 return cmd_complete(sk
, index
, MGMT_OP_READ_INFO
, &rp
, sizeof(rp
));
543 static void mgmt_pending_free(struct pending_cmd
*cmd
)
550 static struct pending_cmd
*mgmt_pending_add(struct sock
*sk
, u16 opcode
,
551 struct hci_dev
*hdev
,
554 struct pending_cmd
*cmd
;
556 cmd
= kmalloc(sizeof(*cmd
), GFP_ATOMIC
);
560 cmd
->opcode
= opcode
;
561 cmd
->index
= hdev
->id
;
563 cmd
->param
= kmalloc(len
, GFP_ATOMIC
);
570 memcpy(cmd
->param
, data
, len
);
575 list_add(&cmd
->list
, &hdev
->mgmt_pending
);
580 static void mgmt_pending_foreach(u16 opcode
, struct hci_dev
*hdev
,
581 void (*cb
)(struct pending_cmd
*cmd
, void *data
),
584 struct list_head
*p
, *n
;
586 list_for_each_safe(p
, n
, &hdev
->mgmt_pending
) {
587 struct pending_cmd
*cmd
;
589 cmd
= list_entry(p
, struct pending_cmd
, list
);
591 if (opcode
> 0 && cmd
->opcode
!= opcode
)
598 static struct pending_cmd
*mgmt_pending_find(u16 opcode
, struct hci_dev
*hdev
)
600 struct pending_cmd
*cmd
;
602 list_for_each_entry(cmd
, &hdev
->mgmt_pending
, list
) {
603 if (cmd
->opcode
== opcode
)
610 static void mgmt_pending_remove(struct pending_cmd
*cmd
)
612 list_del(&cmd
->list
);
613 mgmt_pending_free(cmd
);
616 static int send_settings_rsp(struct sock
*sk
, u16 opcode
, struct hci_dev
*hdev
)
618 __le32 settings
= cpu_to_le32(get_current_settings(hdev
));
620 return cmd_complete(sk
, hdev
->id
, opcode
, &settings
, sizeof(settings
));
623 static int set_powered(struct sock
*sk
, u16 index
, void *data
, u16 len
)
625 struct mgmt_mode
*cp
= data
;
626 struct hci_dev
*hdev
;
627 struct pending_cmd
*cmd
;
630 BT_DBG("request for hci%u", index
);
632 if (len
!= sizeof(*cp
))
633 return cmd_status(sk
, index
, MGMT_OP_SET_POWERED
,
634 MGMT_STATUS_INVALID_PARAMS
);
636 hdev
= hci_dev_get(index
);
638 return cmd_status(sk
, index
, MGMT_OP_SET_POWERED
,
639 MGMT_STATUS_INVALID_PARAMS
);
643 up
= test_bit(HCI_UP
, &hdev
->flags
);
644 if ((cp
->val
&& up
) || (!cp
->val
&& !up
)) {
645 err
= send_settings_rsp(sk
, MGMT_OP_SET_POWERED
, hdev
);
649 if (mgmt_pending_find(MGMT_OP_SET_POWERED
, hdev
)) {
650 err
= cmd_status(sk
, index
, MGMT_OP_SET_POWERED
,
655 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_POWERED
, hdev
, data
, len
);
662 schedule_work(&hdev
->power_on
);
664 schedule_work(&hdev
->power_off
.work
);
669 hci_dev_unlock(hdev
);
674 static int set_discoverable(struct sock
*sk
, u16 index
, void *data
, u16 len
)
676 struct mgmt_cp_set_discoverable
*cp
= data
;
677 struct hci_dev
*hdev
;
678 struct pending_cmd
*cmd
;
682 BT_DBG("request for hci%u", index
);
684 if (len
!= sizeof(*cp
))
685 return cmd_status(sk
, index
, MGMT_OP_SET_DISCOVERABLE
,
686 MGMT_STATUS_INVALID_PARAMS
);
688 hdev
= hci_dev_get(index
);
690 return cmd_status(sk
, index
, MGMT_OP_SET_DISCOVERABLE
,
691 MGMT_STATUS_INVALID_PARAMS
);
695 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
696 err
= cmd_status(sk
, index
, MGMT_OP_SET_DISCOVERABLE
,
697 MGMT_STATUS_NOT_POWERED
);
701 if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE
, hdev
) ||
702 mgmt_pending_find(MGMT_OP_SET_CONNECTABLE
, hdev
)) {
703 err
= cmd_status(sk
, index
, MGMT_OP_SET_DISCOVERABLE
,
708 if (cp
->val
== test_bit(HCI_ISCAN
, &hdev
->flags
) &&
709 test_bit(HCI_PSCAN
, &hdev
->flags
)) {
710 err
= send_settings_rsp(sk
, MGMT_OP_SET_DISCOVERABLE
, hdev
);
714 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_DISCOVERABLE
, hdev
, data
, len
);
723 scan
|= SCAN_INQUIRY
;
725 cancel_delayed_work(&hdev
->discov_off
);
727 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_SCAN_ENABLE
, 1, &scan
);
729 mgmt_pending_remove(cmd
);
732 hdev
->discov_timeout
= get_unaligned_le16(&cp
->timeout
);
735 hci_dev_unlock(hdev
);
741 static int set_connectable(struct sock
*sk
, u16 index
, void *data
, u16 len
)
743 struct mgmt_mode
*cp
= data
;
744 struct hci_dev
*hdev
;
745 struct pending_cmd
*cmd
;
749 BT_DBG("request for hci%u", index
);
751 if (len
!= sizeof(*cp
))
752 return cmd_status(sk
, index
, MGMT_OP_SET_CONNECTABLE
,
753 MGMT_STATUS_INVALID_PARAMS
);
755 hdev
= hci_dev_get(index
);
757 return cmd_status(sk
, index
, MGMT_OP_SET_CONNECTABLE
,
758 MGMT_STATUS_INVALID_PARAMS
);
762 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
763 err
= cmd_status(sk
, index
, MGMT_OP_SET_CONNECTABLE
,
764 MGMT_STATUS_NOT_POWERED
);
768 if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE
, hdev
) ||
769 mgmt_pending_find(MGMT_OP_SET_CONNECTABLE
, hdev
)) {
770 err
= cmd_status(sk
, index
, MGMT_OP_SET_CONNECTABLE
,
775 if (cp
->val
== test_bit(HCI_PSCAN
, &hdev
->flags
)) {
776 err
= send_settings_rsp(sk
, MGMT_OP_SET_CONNECTABLE
, hdev
);
780 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_CONNECTABLE
, hdev
, data
, len
);
791 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_SCAN_ENABLE
, 1, &scan
);
793 mgmt_pending_remove(cmd
);
796 hci_dev_unlock(hdev
);
802 static int mgmt_event(u16 event
, struct hci_dev
*hdev
, void *data
,
803 u16 data_len
, struct sock
*skip_sk
)
806 struct mgmt_hdr
*hdr
;
808 skb
= alloc_skb(sizeof(*hdr
) + data_len
, GFP_ATOMIC
);
812 bt_cb(skb
)->channel
= HCI_CHANNEL_CONTROL
;
814 hdr
= (void *) skb_put(skb
, sizeof(*hdr
));
815 hdr
->opcode
= cpu_to_le16(event
);
817 hdr
->index
= cpu_to_le16(hdev
->id
);
819 hdr
->index
= cpu_to_le16(MGMT_INDEX_NONE
);
820 hdr
->len
= cpu_to_le16(data_len
);
823 memcpy(skb_put(skb
, data_len
), data
, data_len
);
825 hci_send_to_sock(NULL
, skb
, skip_sk
);
831 static int set_pairable(struct sock
*sk
, u16 index
, void *data
, u16 len
)
833 struct mgmt_mode
*cp
= data
;
834 struct hci_dev
*hdev
;
838 BT_DBG("request for hci%u", index
);
840 if (len
!= sizeof(*cp
))
841 return cmd_status(sk
, index
, MGMT_OP_SET_PAIRABLE
,
842 MGMT_STATUS_INVALID_PARAMS
);
844 hdev
= hci_dev_get(index
);
846 return cmd_status(sk
, index
, MGMT_OP_SET_PAIRABLE
,
847 MGMT_STATUS_INVALID_PARAMS
);
852 set_bit(HCI_PAIRABLE
, &hdev
->dev_flags
);
854 clear_bit(HCI_PAIRABLE
, &hdev
->dev_flags
);
856 err
= send_settings_rsp(sk
, MGMT_OP_SET_PAIRABLE
, hdev
);
860 ev
= cpu_to_le32(get_current_settings(hdev
));
862 err
= mgmt_event(MGMT_EV_NEW_SETTINGS
, hdev
, &ev
, sizeof(ev
), sk
);
865 hci_dev_unlock(hdev
);
871 static int add_uuid(struct sock
*sk
, u16 index
, void *data
, u16 len
)
873 struct mgmt_cp_add_uuid
*cp
= data
;
874 struct hci_dev
*hdev
;
875 struct bt_uuid
*uuid
;
878 BT_DBG("request for hci%u", index
);
880 if (len
!= sizeof(*cp
))
881 return cmd_status(sk
, index
, MGMT_OP_ADD_UUID
,
882 MGMT_STATUS_INVALID_PARAMS
);
884 hdev
= hci_dev_get(index
);
886 return cmd_status(sk
, index
, MGMT_OP_ADD_UUID
,
887 MGMT_STATUS_INVALID_PARAMS
);
891 uuid
= kmalloc(sizeof(*uuid
), GFP_ATOMIC
);
897 memcpy(uuid
->uuid
, cp
->uuid
, 16);
898 uuid
->svc_hint
= cp
->svc_hint
;
900 list_add(&uuid
->list
, &hdev
->uuids
);
902 err
= update_class(hdev
);
906 err
= update_eir(hdev
);
910 err
= cmd_complete(sk
, index
, MGMT_OP_ADD_UUID
, NULL
, 0);
913 hci_dev_unlock(hdev
);
919 static int remove_uuid(struct sock
*sk
, u16 index
, void *data
, u16 len
)
921 struct mgmt_cp_remove_uuid
*cp
= data
;
922 struct list_head
*p
, *n
;
923 struct hci_dev
*hdev
;
924 u8 bt_uuid_any
[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
927 BT_DBG("request for hci%u", index
);
929 if (len
!= sizeof(*cp
))
930 return cmd_status(sk
, index
, MGMT_OP_REMOVE_UUID
,
931 MGMT_STATUS_INVALID_PARAMS
);
933 hdev
= hci_dev_get(index
);
935 return cmd_status(sk
, index
, MGMT_OP_REMOVE_UUID
,
936 MGMT_STATUS_INVALID_PARAMS
);
940 if (memcmp(cp
->uuid
, bt_uuid_any
, 16) == 0) {
941 err
= hci_uuids_clear(hdev
);
947 list_for_each_safe(p
, n
, &hdev
->uuids
) {
948 struct bt_uuid
*match
= list_entry(p
, struct bt_uuid
, list
);
950 if (memcmp(match
->uuid
, cp
->uuid
, 16) != 0)
953 list_del(&match
->list
);
958 err
= cmd_status(sk
, index
, MGMT_OP_REMOVE_UUID
,
959 MGMT_STATUS_INVALID_PARAMS
);
963 err
= update_class(hdev
);
967 err
= update_eir(hdev
);
971 err
= cmd_complete(sk
, index
, MGMT_OP_REMOVE_UUID
, NULL
, 0);
974 hci_dev_unlock(hdev
);
980 static int set_dev_class(struct sock
*sk
, u16 index
, void *data
, u16 len
)
982 struct hci_dev
*hdev
;
983 struct mgmt_cp_set_dev_class
*cp
= data
;
986 BT_DBG("request for hci%u", index
);
988 if (len
!= sizeof(*cp
))
989 return cmd_status(sk
, index
, MGMT_OP_SET_DEV_CLASS
,
990 MGMT_STATUS_INVALID_PARAMS
);
992 hdev
= hci_dev_get(index
);
994 return cmd_status(sk
, index
, MGMT_OP_SET_DEV_CLASS
,
995 MGMT_STATUS_INVALID_PARAMS
);
999 hdev
->major_class
= cp
->major
;
1000 hdev
->minor_class
= cp
->minor
;
1002 if (test_and_clear_bit(HCI_SERVICE_CACHE
, &hdev
->dev_flags
)) {
1003 hci_dev_unlock(hdev
);
1004 cancel_delayed_work_sync(&hdev
->service_cache
);
1009 err
= update_class(hdev
);
1012 err
= cmd_complete(sk
, index
, MGMT_OP_SET_DEV_CLASS
, NULL
, 0);
1014 hci_dev_unlock(hdev
);
1020 static int load_link_keys(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1022 struct hci_dev
*hdev
;
1023 struct mgmt_cp_load_link_keys
*cp
= data
;
1024 u16 key_count
, expected_len
;
1027 if (len
< sizeof(*cp
))
1028 return cmd_status(sk
, index
, MGMT_OP_LOAD_LINK_KEYS
,
1029 MGMT_STATUS_INVALID_PARAMS
);
1031 key_count
= get_unaligned_le16(&cp
->key_count
);
1033 expected_len
= sizeof(*cp
) + key_count
*
1034 sizeof(struct mgmt_link_key_info
);
1035 if (expected_len
!= len
) {
1036 BT_ERR("load_link_keys: expected %u bytes, got %u bytes",
1038 return cmd_status(sk
, index
, MGMT_OP_LOAD_LINK_KEYS
,
1039 MGMT_STATUS_INVALID_PARAMS
);
1042 hdev
= hci_dev_get(index
);
1044 return cmd_status(sk
, index
, MGMT_OP_LOAD_LINK_KEYS
,
1045 MGMT_STATUS_INVALID_PARAMS
);
1047 BT_DBG("hci%u debug_keys %u key_count %u", index
, cp
->debug_keys
,
1052 hci_link_keys_clear(hdev
);
1054 set_bit(HCI_LINK_KEYS
, &hdev
->dev_flags
);
1057 set_bit(HCI_DEBUG_KEYS
, &hdev
->dev_flags
);
1059 clear_bit(HCI_DEBUG_KEYS
, &hdev
->dev_flags
);
1061 for (i
= 0; i
< key_count
; i
++) {
1062 struct mgmt_link_key_info
*key
= &cp
->keys
[i
];
1064 hci_add_link_key(hdev
, NULL
, 0, &key
->bdaddr
, key
->val
, key
->type
,
1068 cmd_complete(sk
, index
, MGMT_OP_LOAD_LINK_KEYS
, NULL
, 0);
1070 hci_dev_unlock(hdev
);
1076 static int unpair_device(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1078 struct hci_dev
*hdev
;
1079 struct mgmt_cp_unpair_device
*cp
= data
;
1080 struct mgmt_rp_unpair_device rp
;
1081 struct hci_cp_disconnect dc
;
1082 struct pending_cmd
*cmd
;
1083 struct hci_conn
*conn
;
1086 if (len
!= sizeof(*cp
))
1087 return cmd_status(sk
, index
, MGMT_OP_UNPAIR_DEVICE
,
1088 MGMT_STATUS_INVALID_PARAMS
);
1090 hdev
= hci_dev_get(index
);
1092 return cmd_status(sk
, index
, MGMT_OP_UNPAIR_DEVICE
,
1093 MGMT_STATUS_INVALID_PARAMS
);
1097 memset(&rp
, 0, sizeof(rp
));
1098 bacpy(&rp
.addr
.bdaddr
, &cp
->addr
.bdaddr
);
1099 rp
.addr
.type
= cp
->addr
.type
;
1100 rp
.status
= MGMT_STATUS_FAILED
;
1102 if (cp
->addr
.type
== MGMT_ADDR_BREDR
)
1103 err
= hci_remove_link_key(hdev
, &cp
->addr
.bdaddr
);
1105 err
= hci_remove_ltk(hdev
, &cp
->addr
.bdaddr
);
1108 rp
.status
= MGMT_STATUS_NOT_PAIRED
;
1112 if (!test_bit(HCI_UP
, &hdev
->flags
) || !cp
->disconnect
) {
1113 err
= cmd_complete(sk
, index
, MGMT_OP_UNPAIR_DEVICE
, &rp
,
1118 if (cp
->addr
.type
== MGMT_ADDR_BREDR
)
1119 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
,
1122 conn
= hci_conn_hash_lookup_ba(hdev
, LE_LINK
,
1126 err
= cmd_complete(sk
, index
, MGMT_OP_UNPAIR_DEVICE
, &rp
,
1131 cmd
= mgmt_pending_add(sk
, MGMT_OP_UNPAIR_DEVICE
, hdev
, cp
,
1138 put_unaligned_le16(conn
->handle
, &dc
.handle
);
1139 dc
.reason
= 0x13; /* Remote User Terminated Connection */
1140 err
= hci_send_cmd(hdev
, HCI_OP_DISCONNECT
, sizeof(dc
), &dc
);
1142 mgmt_pending_remove(cmd
);
1146 err
= cmd_complete(sk
, index
, MGMT_OP_UNPAIR_DEVICE
, &rp
,
1148 hci_dev_unlock(hdev
);
1154 static int disconnect(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1156 struct hci_dev
*hdev
;
1157 struct mgmt_cp_disconnect
*cp
= data
;
1158 struct hci_cp_disconnect dc
;
1159 struct pending_cmd
*cmd
;
1160 struct hci_conn
*conn
;
1165 if (len
!= sizeof(*cp
))
1166 return cmd_status(sk
, index
, MGMT_OP_DISCONNECT
,
1167 MGMT_STATUS_INVALID_PARAMS
);
1169 hdev
= hci_dev_get(index
);
1171 return cmd_status(sk
, index
, MGMT_OP_DISCONNECT
,
1172 MGMT_STATUS_INVALID_PARAMS
);
1176 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1177 err
= cmd_status(sk
, index
, MGMT_OP_DISCONNECT
,
1178 MGMT_STATUS_NOT_POWERED
);
1182 if (mgmt_pending_find(MGMT_OP_DISCONNECT
, hdev
)) {
1183 err
= cmd_status(sk
, index
, MGMT_OP_DISCONNECT
,
1188 if (cp
->addr
.type
== MGMT_ADDR_BREDR
)
1189 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
, &cp
->addr
.bdaddr
);
1191 conn
= hci_conn_hash_lookup_ba(hdev
, LE_LINK
, &cp
->addr
.bdaddr
);
1194 err
= cmd_status(sk
, index
, MGMT_OP_DISCONNECT
,
1195 MGMT_STATUS_NOT_CONNECTED
);
1199 cmd
= mgmt_pending_add(sk
, MGMT_OP_DISCONNECT
, hdev
, data
, len
);
1205 put_unaligned_le16(conn
->handle
, &dc
.handle
);
1206 dc
.reason
= 0x13; /* Remote User Terminated Connection */
1208 err
= hci_send_cmd(hdev
, HCI_OP_DISCONNECT
, sizeof(dc
), &dc
);
1210 mgmt_pending_remove(cmd
);
1213 hci_dev_unlock(hdev
);
1219 static u8
link_to_mgmt(u8 link_type
, u8 addr_type
)
1221 switch (link_type
) {
1223 switch (addr_type
) {
1224 case ADDR_LE_DEV_PUBLIC
:
1225 return MGMT_ADDR_LE_PUBLIC
;
1226 case ADDR_LE_DEV_RANDOM
:
1227 return MGMT_ADDR_LE_RANDOM
;
1229 return MGMT_ADDR_INVALID
;
1232 return MGMT_ADDR_BREDR
;
1234 return MGMT_ADDR_INVALID
;
1238 static int get_connections(struct sock
*sk
, u16 index
)
1240 struct mgmt_rp_get_connections
*rp
;
1241 struct hci_dev
*hdev
;
1249 hdev
= hci_dev_get(index
);
1251 return cmd_status(sk
, index
, MGMT_OP_GET_CONNECTIONS
,
1252 MGMT_STATUS_INVALID_PARAMS
);
1257 list_for_each_entry(c
, &hdev
->conn_hash
.list
, list
) {
1258 if (test_bit(HCI_CONN_MGMT_CONNECTED
, &c
->flags
))
1262 rp_len
= sizeof(*rp
) + (count
* sizeof(struct mgmt_addr_info
));
1263 rp
= kmalloc(rp_len
, GFP_ATOMIC
);
1269 put_unaligned_le16(count
, &rp
->conn_count
);
1272 list_for_each_entry(c
, &hdev
->conn_hash
.list
, list
) {
1273 if (!test_bit(HCI_CONN_MGMT_CONNECTED
, &c
->flags
))
1275 bacpy(&rp
->addr
[i
].bdaddr
, &c
->dst
);
1276 rp
->addr
[i
].type
= link_to_mgmt(c
->type
, c
->dst_type
);
1277 if (rp
->addr
[i
].type
== MGMT_ADDR_INVALID
)
1282 /* Recalculate length in case of filtered SCO connections, etc */
1283 rp_len
= sizeof(*rp
) + (i
* sizeof(struct mgmt_addr_info
));
1285 err
= cmd_complete(sk
, index
, MGMT_OP_GET_CONNECTIONS
, rp
, rp_len
);
1289 hci_dev_unlock(hdev
);
1294 static int send_pin_code_neg_reply(struct sock
*sk
, u16 index
,
1295 struct hci_dev
*hdev
, struct mgmt_cp_pin_code_neg_reply
*cp
)
1297 struct pending_cmd
*cmd
;
1300 cmd
= mgmt_pending_add(sk
, MGMT_OP_PIN_CODE_NEG_REPLY
, hdev
, cp
,
1305 err
= hci_send_cmd(hdev
, HCI_OP_PIN_CODE_NEG_REPLY
, sizeof(cp
->bdaddr
),
1308 mgmt_pending_remove(cmd
);
1313 static int pin_code_reply(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1315 struct hci_dev
*hdev
;
1316 struct hci_conn
*conn
;
1317 struct mgmt_cp_pin_code_reply
*cp
= data
;
1318 struct mgmt_cp_pin_code_neg_reply ncp
;
1319 struct hci_cp_pin_code_reply reply
;
1320 struct pending_cmd
*cmd
;
1325 if (len
!= sizeof(*cp
))
1326 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
,
1327 MGMT_STATUS_INVALID_PARAMS
);
1329 hdev
= hci_dev_get(index
);
1331 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
,
1332 MGMT_STATUS_INVALID_PARAMS
);
1336 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1337 err
= cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
,
1338 MGMT_STATUS_NOT_POWERED
);
1342 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
, &cp
->bdaddr
);
1344 err
= cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
,
1345 MGMT_STATUS_NOT_CONNECTED
);
1349 if (conn
->pending_sec_level
== BT_SECURITY_HIGH
&& cp
->pin_len
!= 16) {
1350 bacpy(&ncp
.bdaddr
, &cp
->bdaddr
);
1352 BT_ERR("PIN code is not 16 bytes long");
1354 err
= send_pin_code_neg_reply(sk
, index
, hdev
, &ncp
);
1356 err
= cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
,
1357 MGMT_STATUS_INVALID_PARAMS
);
1362 cmd
= mgmt_pending_add(sk
, MGMT_OP_PIN_CODE_REPLY
, hdev
, data
,
1369 bacpy(&reply
.bdaddr
, &cp
->bdaddr
);
1370 reply
.pin_len
= cp
->pin_len
;
1371 memcpy(reply
.pin_code
, cp
->pin_code
, sizeof(reply
.pin_code
));
1373 err
= hci_send_cmd(hdev
, HCI_OP_PIN_CODE_REPLY
, sizeof(reply
), &reply
);
1375 mgmt_pending_remove(cmd
);
1378 hci_dev_unlock(hdev
);
1384 static int pin_code_neg_reply(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1386 struct hci_dev
*hdev
;
1387 struct mgmt_cp_pin_code_neg_reply
*cp
= data
;
1392 if (len
!= sizeof(*cp
))
1393 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_NEG_REPLY
,
1394 MGMT_STATUS_INVALID_PARAMS
);
1396 hdev
= hci_dev_get(index
);
1398 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_NEG_REPLY
,
1399 MGMT_STATUS_INVALID_PARAMS
);
1403 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1404 err
= cmd_status(sk
, index
, MGMT_OP_PIN_CODE_NEG_REPLY
,
1405 MGMT_STATUS_NOT_POWERED
);
1409 err
= send_pin_code_neg_reply(sk
, index
, hdev
, cp
);
1412 hci_dev_unlock(hdev
);
1418 static int set_io_capability(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1420 struct hci_dev
*hdev
;
1421 struct mgmt_cp_set_io_capability
*cp
= data
;
1425 if (len
!= sizeof(*cp
))
1426 return cmd_status(sk
, index
, MGMT_OP_SET_IO_CAPABILITY
,
1427 MGMT_STATUS_INVALID_PARAMS
);
1429 hdev
= hci_dev_get(index
);
1431 return cmd_status(sk
, index
, MGMT_OP_SET_IO_CAPABILITY
,
1432 MGMT_STATUS_INVALID_PARAMS
);
1436 hdev
->io_capability
= cp
->io_capability
;
1438 BT_DBG("%s IO capability set to 0x%02x", hdev
->name
,
1439 hdev
->io_capability
);
1441 hci_dev_unlock(hdev
);
1444 return cmd_complete(sk
, index
, MGMT_OP_SET_IO_CAPABILITY
, NULL
, 0);
1447 static inline struct pending_cmd
*find_pairing(struct hci_conn
*conn
)
1449 struct hci_dev
*hdev
= conn
->hdev
;
1450 struct pending_cmd
*cmd
;
1452 list_for_each_entry(cmd
, &hdev
->mgmt_pending
, list
) {
1453 if (cmd
->opcode
!= MGMT_OP_PAIR_DEVICE
)
1456 if (cmd
->user_data
!= conn
)
1465 static void pairing_complete(struct pending_cmd
*cmd
, u8 status
)
1467 struct mgmt_rp_pair_device rp
;
1468 struct hci_conn
*conn
= cmd
->user_data
;
1470 bacpy(&rp
.addr
.bdaddr
, &conn
->dst
);
1471 rp
.addr
.type
= link_to_mgmt(conn
->type
, conn
->dst_type
);
1474 cmd_complete(cmd
->sk
, cmd
->index
, MGMT_OP_PAIR_DEVICE
, &rp
, sizeof(rp
));
1476 /* So we don't get further callbacks for this connection */
1477 conn
->connect_cfm_cb
= NULL
;
1478 conn
->security_cfm_cb
= NULL
;
1479 conn
->disconn_cfm_cb
= NULL
;
1483 mgmt_pending_remove(cmd
);
1486 static void pairing_complete_cb(struct hci_conn
*conn
, u8 status
)
1488 struct pending_cmd
*cmd
;
1490 BT_DBG("status %u", status
);
1492 cmd
= find_pairing(conn
);
1494 BT_DBG("Unable to find a pending command");
1496 pairing_complete(cmd
, status
);
1499 static int pair_device(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1501 struct hci_dev
*hdev
;
1502 struct mgmt_cp_pair_device
*cp
= data
;
1503 struct mgmt_rp_pair_device rp
;
1504 struct pending_cmd
*cmd
;
1505 u8 sec_level
, auth_type
;
1506 struct hci_conn
*conn
;
1511 if (len
!= sizeof(*cp
))
1512 return cmd_status(sk
, index
, MGMT_OP_PAIR_DEVICE
,
1513 MGMT_STATUS_INVALID_PARAMS
);
1515 hdev
= hci_dev_get(index
);
1517 return cmd_status(sk
, index
, MGMT_OP_PAIR_DEVICE
,
1518 MGMT_STATUS_INVALID_PARAMS
);
1522 sec_level
= BT_SECURITY_MEDIUM
;
1523 if (cp
->io_cap
== 0x03)
1524 auth_type
= HCI_AT_DEDICATED_BONDING
;
1526 auth_type
= HCI_AT_DEDICATED_BONDING_MITM
;
1528 if (cp
->addr
.type
== MGMT_ADDR_BREDR
)
1529 conn
= hci_connect(hdev
, ACL_LINK
, &cp
->addr
.bdaddr
, sec_level
,
1532 conn
= hci_connect(hdev
, LE_LINK
, &cp
->addr
.bdaddr
, sec_level
,
1535 memset(&rp
, 0, sizeof(rp
));
1536 bacpy(&rp
.addr
.bdaddr
, &cp
->addr
.bdaddr
);
1537 rp
.addr
.type
= cp
->addr
.type
;
1540 rp
.status
= -PTR_ERR(conn
);
1541 err
= cmd_complete(sk
, index
, MGMT_OP_PAIR_DEVICE
,
1546 if (conn
->connect_cfm_cb
) {
1549 err
= cmd_complete(sk
, index
, MGMT_OP_PAIR_DEVICE
,
1554 cmd
= mgmt_pending_add(sk
, MGMT_OP_PAIR_DEVICE
, hdev
, data
, len
);
1561 /* For LE, just connecting isn't a proof that the pairing finished */
1562 if (cp
->addr
.type
== MGMT_ADDR_BREDR
)
1563 conn
->connect_cfm_cb
= pairing_complete_cb
;
1565 conn
->security_cfm_cb
= pairing_complete_cb
;
1566 conn
->disconn_cfm_cb
= pairing_complete_cb
;
1567 conn
->io_capability
= cp
->io_cap
;
1568 cmd
->user_data
= conn
;
1570 if (conn
->state
== BT_CONNECTED
&&
1571 hci_conn_security(conn
, sec_level
, auth_type
))
1572 pairing_complete(cmd
, 0);
1577 hci_dev_unlock(hdev
);
1583 static int cancel_pair_device(struct sock
*sk
, u16 index
,
1584 unsigned char *data
, u16 len
)
1586 struct mgmt_addr_info
*addr
= (void *) data
;
1587 struct hci_dev
*hdev
;
1588 struct pending_cmd
*cmd
;
1589 struct hci_conn
*conn
;
1594 if (len
!= sizeof(*addr
))
1595 return cmd_status(sk
, index
, MGMT_OP_CANCEL_PAIR_DEVICE
,
1596 MGMT_STATUS_INVALID_PARAMS
);
1598 hdev
= hci_dev_get(index
);
1600 return cmd_status(sk
, index
, MGMT_OP_CANCEL_PAIR_DEVICE
,
1601 MGMT_STATUS_INVALID_PARAMS
);
1605 cmd
= mgmt_pending_find(MGMT_OP_PAIR_DEVICE
, hdev
);
1607 err
= cmd_status(sk
, index
, MGMT_OP_CANCEL_PAIR_DEVICE
,
1608 MGMT_STATUS_INVALID_PARAMS
);
1612 conn
= cmd
->user_data
;
1614 if (bacmp(&addr
->bdaddr
, &conn
->dst
) != 0) {
1615 err
= cmd_status(sk
, index
, MGMT_OP_CANCEL_PAIR_DEVICE
,
1616 MGMT_STATUS_INVALID_PARAMS
);
1620 pairing_complete(cmd
, MGMT_STATUS_CANCELLED
);
1622 err
= cmd_complete(sk
, index
, MGMT_OP_CANCEL_PAIR_DEVICE
, addr
,
1625 hci_dev_unlock(hdev
);
1631 static int user_pairing_resp(struct sock
*sk
, u16 index
, bdaddr_t
*bdaddr
,
1632 u8 type
, u16 mgmt_op
, u16 hci_op
,
1635 struct pending_cmd
*cmd
;
1636 struct hci_dev
*hdev
;
1637 struct hci_conn
*conn
;
1640 hdev
= hci_dev_get(index
);
1642 return cmd_status(sk
, index
, mgmt_op
,
1643 MGMT_STATUS_INVALID_PARAMS
);
1647 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1648 err
= cmd_status(sk
, index
, mgmt_op
, MGMT_STATUS_NOT_POWERED
);
1652 if (type
== MGMT_ADDR_BREDR
)
1653 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
, bdaddr
);
1655 conn
= hci_conn_hash_lookup_ba(hdev
, LE_LINK
, bdaddr
);
1658 err
= cmd_status(sk
, index
, mgmt_op
,
1659 MGMT_STATUS_NOT_CONNECTED
);
1663 if (type
== MGMT_ADDR_LE_PUBLIC
|| type
== MGMT_ADDR_LE_RANDOM
) {
1664 /* Continue with pairing via SMP */
1665 err
= smp_user_confirm_reply(conn
, mgmt_op
, passkey
);
1668 err
= cmd_status(sk
, index
, mgmt_op
,
1669 MGMT_STATUS_SUCCESS
);
1671 err
= cmd_status(sk
, index
, mgmt_op
,
1672 MGMT_STATUS_FAILED
);
1677 cmd
= mgmt_pending_add(sk
, mgmt_op
, hdev
, bdaddr
, sizeof(*bdaddr
));
1683 /* Continue with pairing via HCI */
1684 if (hci_op
== HCI_OP_USER_PASSKEY_REPLY
) {
1685 struct hci_cp_user_passkey_reply cp
;
1687 bacpy(&cp
.bdaddr
, bdaddr
);
1688 cp
.passkey
= passkey
;
1689 err
= hci_send_cmd(hdev
, hci_op
, sizeof(cp
), &cp
);
1691 err
= hci_send_cmd(hdev
, hci_op
, sizeof(*bdaddr
), bdaddr
);
1694 mgmt_pending_remove(cmd
);
1697 hci_dev_unlock(hdev
);
1703 static int user_confirm_reply(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1705 struct mgmt_cp_user_confirm_reply
*cp
= data
;
1709 if (len
!= sizeof(*cp
))
1710 return cmd_status(sk
, index
, MGMT_OP_USER_CONFIRM_REPLY
,
1711 MGMT_STATUS_INVALID_PARAMS
);
1713 return user_pairing_resp(sk
, index
, &cp
->addr
.bdaddr
, cp
->addr
.type
,
1714 MGMT_OP_USER_CONFIRM_REPLY
,
1715 HCI_OP_USER_CONFIRM_REPLY
, 0);
1718 static int user_confirm_neg_reply(struct sock
*sk
, u16 index
, void *data
,
1721 struct mgmt_cp_user_confirm_neg_reply
*cp
= data
;
1725 if (len
!= sizeof(*cp
))
1726 return cmd_status(sk
, index
, MGMT_OP_USER_CONFIRM_NEG_REPLY
,
1727 MGMT_STATUS_INVALID_PARAMS
);
1729 return user_pairing_resp(sk
, index
, &cp
->addr
.bdaddr
, cp
->addr
.type
,
1730 MGMT_OP_USER_CONFIRM_NEG_REPLY
,
1731 HCI_OP_USER_CONFIRM_NEG_REPLY
, 0);
1734 static int user_passkey_reply(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1736 struct mgmt_cp_user_passkey_reply
*cp
= data
;
1740 if (len
!= sizeof(*cp
))
1741 return cmd_status(sk
, index
, MGMT_OP_USER_PASSKEY_REPLY
,
1744 return user_pairing_resp(sk
, index
, &cp
->addr
.bdaddr
, cp
->addr
.type
,
1745 MGMT_OP_USER_PASSKEY_REPLY
,
1746 HCI_OP_USER_PASSKEY_REPLY
,
1750 static int user_passkey_neg_reply(struct sock
*sk
, u16 index
, void *data
,
1753 struct mgmt_cp_user_passkey_neg_reply
*cp
= data
;
1757 if (len
!= sizeof(*cp
))
1758 return cmd_status(sk
, index
, MGMT_OP_USER_PASSKEY_NEG_REPLY
,
1761 return user_pairing_resp(sk
, index
, &cp
->addr
.bdaddr
, cp
->addr
.type
,
1762 MGMT_OP_USER_PASSKEY_NEG_REPLY
,
1763 HCI_OP_USER_PASSKEY_NEG_REPLY
, 0);
1766 static int set_local_name(struct sock
*sk
, u16 index
, void *data
,
1769 struct mgmt_cp_set_local_name
*mgmt_cp
= data
;
1770 struct hci_cp_write_local_name hci_cp
;
1771 struct hci_dev
*hdev
;
1772 struct pending_cmd
*cmd
;
1777 if (len
!= sizeof(*mgmt_cp
))
1778 return cmd_status(sk
, index
, MGMT_OP_SET_LOCAL_NAME
,
1779 MGMT_STATUS_INVALID_PARAMS
);
1781 hdev
= hci_dev_get(index
);
1783 return cmd_status(sk
, index
, MGMT_OP_SET_LOCAL_NAME
,
1784 MGMT_STATUS_INVALID_PARAMS
);
1788 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_LOCAL_NAME
, hdev
, data
,
1795 memcpy(hci_cp
.name
, mgmt_cp
->name
, sizeof(hci_cp
.name
));
1796 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_LOCAL_NAME
, sizeof(hci_cp
),
1799 mgmt_pending_remove(cmd
);
1802 hci_dev_unlock(hdev
);
1808 static int read_local_oob_data(struct sock
*sk
, u16 index
)
1810 struct hci_dev
*hdev
;
1811 struct pending_cmd
*cmd
;
1814 BT_DBG("hci%u", index
);
1816 hdev
= hci_dev_get(index
);
1818 return cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
1819 MGMT_STATUS_INVALID_PARAMS
);
1823 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1824 err
= cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
1825 MGMT_STATUS_NOT_POWERED
);
1829 if (!(hdev
->features
[6] & LMP_SIMPLE_PAIR
)) {
1830 err
= cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
1831 MGMT_STATUS_NOT_SUPPORTED
);
1835 if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA
, hdev
)) {
1836 err
= cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
1841 cmd
= mgmt_pending_add(sk
, MGMT_OP_READ_LOCAL_OOB_DATA
, hdev
, NULL
, 0);
1847 err
= hci_send_cmd(hdev
, HCI_OP_READ_LOCAL_OOB_DATA
, 0, NULL
);
1849 mgmt_pending_remove(cmd
);
1852 hci_dev_unlock(hdev
);
1858 static int add_remote_oob_data(struct sock
*sk
, u16 index
, void *data
,
1861 struct hci_dev
*hdev
;
1862 struct mgmt_cp_add_remote_oob_data
*cp
= data
;
1865 BT_DBG("hci%u ", index
);
1867 if (len
!= sizeof(*cp
))
1868 return cmd_status(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
,
1869 MGMT_STATUS_INVALID_PARAMS
);
1871 hdev
= hci_dev_get(index
);
1873 return cmd_status(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
,
1874 MGMT_STATUS_INVALID_PARAMS
);
1878 err
= hci_add_remote_oob_data(hdev
, &cp
->addr
.bdaddr
, cp
->hash
,
1881 err
= cmd_status(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
,
1882 MGMT_STATUS_FAILED
);
1884 err
= cmd_complete(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
, NULL
,
1887 hci_dev_unlock(hdev
);
1893 static int remove_remote_oob_data(struct sock
*sk
, u16 index
,
1894 void *data
, u16 len
)
1896 struct hci_dev
*hdev
;
1897 struct mgmt_cp_remove_remote_oob_data
*cp
= data
;
1900 BT_DBG("hci%u ", index
);
1902 if (len
!= sizeof(*cp
))
1903 return cmd_status(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
1904 MGMT_STATUS_INVALID_PARAMS
);
1906 hdev
= hci_dev_get(index
);
1908 return cmd_status(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
1909 MGMT_STATUS_INVALID_PARAMS
);
1913 err
= hci_remove_remote_oob_data(hdev
, &cp
->addr
.bdaddr
);
1915 err
= cmd_status(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
1916 MGMT_STATUS_INVALID_PARAMS
);
1918 err
= cmd_complete(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
1921 hci_dev_unlock(hdev
);
1927 static int start_discovery(struct sock
*sk
, u16 index
,
1928 void *data
, u16 len
)
1930 struct mgmt_cp_start_discovery
*cp
= data
;
1931 unsigned long discov_type
= cp
->type
;
1932 struct pending_cmd
*cmd
;
1933 struct hci_dev
*hdev
;
1936 BT_DBG("hci%u", index
);
1938 if (len
!= sizeof(*cp
))
1939 return cmd_status(sk
, index
, MGMT_OP_START_DISCOVERY
,
1940 MGMT_STATUS_INVALID_PARAMS
);
1942 hdev
= hci_dev_get(index
);
1944 return cmd_status(sk
, index
, MGMT_OP_START_DISCOVERY
,
1945 MGMT_STATUS_INVALID_PARAMS
);
1949 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1950 err
= cmd_status(sk
, index
, MGMT_OP_START_DISCOVERY
,
1951 MGMT_STATUS_NOT_POWERED
);
1955 if (hdev
->discovery
.state
!= DISCOVERY_STOPPED
) {
1956 err
= cmd_status(sk
, index
, MGMT_OP_START_DISCOVERY
,
1961 cmd
= mgmt_pending_add(sk
, MGMT_OP_START_DISCOVERY
, hdev
, NULL
, 0);
1967 if (test_bit(MGMT_ADDR_BREDR
, &discov_type
))
1968 err
= hci_do_inquiry(hdev
, INQUIRY_LEN_BREDR
);
1969 else if (test_bit(MGMT_ADDR_LE_PUBLIC
, &discov_type
) &&
1970 test_bit(MGMT_ADDR_LE_RANDOM
, &discov_type
))
1971 err
= hci_le_scan(hdev
, LE_SCAN_TYPE
, LE_SCAN_INT
,
1972 LE_SCAN_WIN
, LE_SCAN_TIMEOUT_LE_ONLY
);
1977 mgmt_pending_remove(cmd
);
1979 hci_discovery_set_state(hdev
, DISCOVERY_STARTING
);
1982 hci_dev_unlock(hdev
);
1988 static int stop_discovery(struct sock
*sk
, u16 index
)
1990 struct hci_dev
*hdev
;
1991 struct pending_cmd
*cmd
;
1992 struct hci_cp_remote_name_req_cancel cp
;
1993 struct inquiry_entry
*e
;
1996 BT_DBG("hci%u", index
);
1998 hdev
= hci_dev_get(index
);
2000 return cmd_status(sk
, index
, MGMT_OP_STOP_DISCOVERY
,
2001 MGMT_STATUS_INVALID_PARAMS
);
2005 if (!hci_discovery_active(hdev
)) {
2006 err
= cmd_status(sk
, index
, MGMT_OP_STOP_DISCOVERY
,
2007 MGMT_STATUS_REJECTED
);
2011 cmd
= mgmt_pending_add(sk
, MGMT_OP_STOP_DISCOVERY
, hdev
, NULL
, 0);
2017 if (hdev
->discovery
.state
== DISCOVERY_INQUIRY
) {
2018 err
= hci_cancel_inquiry(hdev
);
2020 mgmt_pending_remove(cmd
);
2022 hci_discovery_set_state(hdev
, DISCOVERY_STOPPING
);
2026 e
= hci_inquiry_cache_lookup_resolve(hdev
, BDADDR_ANY
, NAME_PENDING
);
2028 mgmt_pending_remove(cmd
);
2029 err
= cmd_complete(sk
, index
, MGMT_OP_STOP_DISCOVERY
, NULL
, 0);
2030 hci_discovery_set_state(hdev
, DISCOVERY_STOPPED
);
2034 bacpy(&cp
.bdaddr
, &e
->data
.bdaddr
);
2035 err
= hci_send_cmd(hdev
, HCI_OP_REMOTE_NAME_REQ_CANCEL
,
2038 mgmt_pending_remove(cmd
);
2040 hci_discovery_set_state(hdev
, DISCOVERY_STOPPING
);
2043 hci_dev_unlock(hdev
);
2049 static int confirm_name(struct sock
*sk
, u16 index
, void *data
, u16 len
)
2051 struct mgmt_cp_confirm_name
*cp
= data
;
2052 struct inquiry_entry
*e
;
2053 struct hci_dev
*hdev
;
2056 BT_DBG("hci%u", index
);
2058 if (len
!= sizeof(*cp
))
2059 return cmd_status(sk
, index
, MGMT_OP_CONFIRM_NAME
,
2060 MGMT_STATUS_INVALID_PARAMS
);
2062 hdev
= hci_dev_get(index
);
2064 return cmd_status(sk
, index
, MGMT_OP_CONFIRM_NAME
,
2065 MGMT_STATUS_INVALID_PARAMS
);
2069 if (!hci_discovery_active(hdev
)) {
2070 err
= cmd_status(sk
, index
, MGMT_OP_CONFIRM_NAME
,
2071 MGMT_STATUS_FAILED
);
2075 e
= hci_inquiry_cache_lookup_unknown(hdev
, &cp
->bdaddr
);
2077 err
= cmd_status (sk
, index
, MGMT_OP_CONFIRM_NAME
,
2078 MGMT_STATUS_INVALID_PARAMS
);
2082 if (cp
->name_known
) {
2083 e
->name_state
= NAME_KNOWN
;
2086 e
->name_state
= NAME_NEEDED
;
2087 hci_inquiry_cache_update_resolve(hdev
, e
);
2093 hci_dev_unlock(hdev
);
2098 static int block_device(struct sock
*sk
, u16 index
, void *data
, u16 len
)
2100 struct hci_dev
*hdev
;
2101 struct mgmt_cp_block_device
*cp
= data
;
2104 BT_DBG("hci%u", index
);
2106 if (len
!= sizeof(*cp
))
2107 return cmd_status(sk
, index
, MGMT_OP_BLOCK_DEVICE
,
2108 MGMT_STATUS_INVALID_PARAMS
);
2110 hdev
= hci_dev_get(index
);
2112 return cmd_status(sk
, index
, MGMT_OP_BLOCK_DEVICE
,
2113 MGMT_STATUS_INVALID_PARAMS
);
2117 err
= hci_blacklist_add(hdev
, &cp
->addr
.bdaddr
, cp
->addr
.type
);
2119 err
= cmd_status(sk
, index
, MGMT_OP_BLOCK_DEVICE
,
2120 MGMT_STATUS_FAILED
);
2122 err
= cmd_complete(sk
, index
, MGMT_OP_BLOCK_DEVICE
,
2125 hci_dev_unlock(hdev
);
2131 static int unblock_device(struct sock
*sk
, u16 index
, void *data
, u16 len
)
2133 struct hci_dev
*hdev
;
2134 struct mgmt_cp_unblock_device
*cp
= data
;
2137 BT_DBG("hci%u", index
);
2139 if (len
!= sizeof(*cp
))
2140 return cmd_status(sk
, index
, MGMT_OP_UNBLOCK_DEVICE
,
2141 MGMT_STATUS_INVALID_PARAMS
);
2143 hdev
= hci_dev_get(index
);
2145 return cmd_status(sk
, index
, MGMT_OP_UNBLOCK_DEVICE
,
2146 MGMT_STATUS_INVALID_PARAMS
);
2150 err
= hci_blacklist_del(hdev
, &cp
->addr
.bdaddr
, cp
->addr
.type
);
2153 err
= cmd_status(sk
, index
, MGMT_OP_UNBLOCK_DEVICE
,
2154 MGMT_STATUS_INVALID_PARAMS
);
2156 err
= cmd_complete(sk
, index
, MGMT_OP_UNBLOCK_DEVICE
,
2159 hci_dev_unlock(hdev
);
2165 static int set_fast_connectable(struct sock
*sk
, u16 index
,
2166 void *data
, u16 len
)
2168 struct hci_dev
*hdev
;
2169 struct mgmt_mode
*cp
= data
;
2170 struct hci_cp_write_page_scan_activity acp
;
2174 BT_DBG("hci%u", index
);
2176 if (len
!= sizeof(*cp
))
2177 return cmd_status(sk
, index
, MGMT_OP_SET_FAST_CONNECTABLE
,
2178 MGMT_STATUS_INVALID_PARAMS
);
2180 hdev
= hci_dev_get(index
);
2182 return cmd_status(sk
, index
, MGMT_OP_SET_FAST_CONNECTABLE
,
2183 MGMT_STATUS_INVALID_PARAMS
);
2188 type
= PAGE_SCAN_TYPE_INTERLACED
;
2189 acp
.interval
= 0x0024; /* 22.5 msec page scan interval */
2191 type
= PAGE_SCAN_TYPE_STANDARD
; /* default */
2192 acp
.interval
= 0x0800; /* default 1.28 sec page scan */
2195 acp
.window
= 0x0012; /* default 11.25 msec page scan window */
2197 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY
,
2200 err
= cmd_status(sk
, index
, MGMT_OP_SET_FAST_CONNECTABLE
,
2201 MGMT_STATUS_FAILED
);
2205 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_PAGE_SCAN_TYPE
, 1, &type
);
2207 err
= cmd_status(sk
, index
, MGMT_OP_SET_FAST_CONNECTABLE
,
2208 MGMT_STATUS_FAILED
);
2212 err
= cmd_complete(sk
, index
, MGMT_OP_SET_FAST_CONNECTABLE
,
2215 hci_dev_unlock(hdev
);
2221 static int load_long_term_keys(struct sock
*sk
, u16 index
,
2222 void *cp_data
, u16 len
)
2224 struct hci_dev
*hdev
;
2225 struct mgmt_cp_load_long_term_keys
*cp
= cp_data
;
2226 u16 key_count
, expected_len
;
2229 if (len
< sizeof(*cp
))
2230 return cmd_status(sk
, index
, MGMT_OP_LOAD_LONG_TERM_KEYS
,
2233 key_count
= get_unaligned_le16(&cp
->key_count
);
2235 expected_len
= sizeof(*cp
) + key_count
*
2236 sizeof(struct mgmt_ltk_info
);
2237 if (expected_len
!= len
) {
2238 BT_ERR("load_keys: expected %u bytes, got %u bytes",
2240 return cmd_status(sk
, index
, MGMT_OP_LOAD_LONG_TERM_KEYS
,
2244 hdev
= hci_dev_get(index
);
2246 return cmd_status(sk
, index
, MGMT_OP_LOAD_LONG_TERM_KEYS
,
2249 BT_DBG("hci%u key_count %u", index
, key_count
);
2253 hci_smp_ltks_clear(hdev
);
2255 for (i
= 0; i
< key_count
; i
++) {
2256 struct mgmt_ltk_info
*key
= &cp
->keys
[i
];
2262 type
= HCI_SMP_LTK_SLAVE
;
2264 hci_add_ltk(hdev
, &key
->addr
.bdaddr
, key
->addr
.type
,
2265 type
, 0, key
->authenticated
, key
->val
,
2266 key
->enc_size
, key
->ediv
, key
->rand
);
2269 hci_dev_unlock(hdev
);
2275 int mgmt_control(struct sock
*sk
, struct msghdr
*msg
, size_t msglen
)
2279 struct mgmt_hdr
*hdr
;
2280 u16 opcode
, index
, len
;
2283 BT_DBG("got %zu bytes", msglen
);
2285 if (msglen
< sizeof(*hdr
))
2288 buf
= kmalloc(msglen
, GFP_KERNEL
);
2292 if (memcpy_fromiovec(buf
, msg
->msg_iov
, msglen
)) {
2298 opcode
= get_unaligned_le16(&hdr
->opcode
);
2299 index
= get_unaligned_le16(&hdr
->index
);
2300 len
= get_unaligned_le16(&hdr
->len
);
2302 if (len
!= msglen
- sizeof(*hdr
)) {
2307 cp
= buf
+ sizeof(*hdr
);
2310 case MGMT_OP_READ_VERSION
:
2311 err
= read_version(sk
);
2313 case MGMT_OP_READ_INDEX_LIST
:
2314 err
= read_index_list(sk
);
2316 case MGMT_OP_READ_INFO
:
2317 err
= read_controller_info(sk
, index
);
2319 case MGMT_OP_SET_POWERED
:
2320 err
= set_powered(sk
, index
, cp
, len
);
2322 case MGMT_OP_SET_DISCOVERABLE
:
2323 err
= set_discoverable(sk
, index
, cp
, len
);
2325 case MGMT_OP_SET_CONNECTABLE
:
2326 err
= set_connectable(sk
, index
, cp
, len
);
2328 case MGMT_OP_SET_FAST_CONNECTABLE
:
2329 err
= set_fast_connectable(sk
, index
, cp
, len
);
2331 case MGMT_OP_SET_PAIRABLE
:
2332 err
= set_pairable(sk
, index
, cp
, len
);
2334 case MGMT_OP_ADD_UUID
:
2335 err
= add_uuid(sk
, index
, cp
, len
);
2337 case MGMT_OP_REMOVE_UUID
:
2338 err
= remove_uuid(sk
, index
, cp
, len
);
2340 case MGMT_OP_SET_DEV_CLASS
:
2341 err
= set_dev_class(sk
, index
, cp
, len
);
2343 case MGMT_OP_LOAD_LINK_KEYS
:
2344 err
= load_link_keys(sk
, index
, cp
, len
);
2346 case MGMT_OP_DISCONNECT
:
2347 err
= disconnect(sk
, index
, cp
, len
);
2349 case MGMT_OP_GET_CONNECTIONS
:
2350 err
= get_connections(sk
, index
);
2352 case MGMT_OP_PIN_CODE_REPLY
:
2353 err
= pin_code_reply(sk
, index
, cp
, len
);
2355 case MGMT_OP_PIN_CODE_NEG_REPLY
:
2356 err
= pin_code_neg_reply(sk
, index
, cp
, len
);
2358 case MGMT_OP_SET_IO_CAPABILITY
:
2359 err
= set_io_capability(sk
, index
, cp
, len
);
2361 case MGMT_OP_PAIR_DEVICE
:
2362 err
= pair_device(sk
, index
, cp
, len
);
2364 case MGMT_OP_CANCEL_PAIR_DEVICE
:
2365 err
= cancel_pair_device(sk
, index
, buf
+ sizeof(*hdr
), len
);
2367 case MGMT_OP_UNPAIR_DEVICE
:
2368 err
= unpair_device(sk
, index
, cp
, len
);
2370 case MGMT_OP_USER_CONFIRM_REPLY
:
2371 err
= user_confirm_reply(sk
, index
, cp
, len
);
2373 case MGMT_OP_USER_CONFIRM_NEG_REPLY
:
2374 err
= user_confirm_neg_reply(sk
, index
, cp
, len
);
2376 case MGMT_OP_USER_PASSKEY_REPLY
:
2377 err
= user_passkey_reply(sk
, index
, cp
, len
);
2379 case MGMT_OP_USER_PASSKEY_NEG_REPLY
:
2380 err
= user_passkey_neg_reply(sk
, index
, cp
, len
);
2382 case MGMT_OP_SET_LOCAL_NAME
:
2383 err
= set_local_name(sk
, index
, cp
, len
);
2385 case MGMT_OP_READ_LOCAL_OOB_DATA
:
2386 err
= read_local_oob_data(sk
, index
);
2388 case MGMT_OP_ADD_REMOTE_OOB_DATA
:
2389 err
= add_remote_oob_data(sk
, index
, cp
, len
);
2391 case MGMT_OP_REMOVE_REMOTE_OOB_DATA
:
2392 err
= remove_remote_oob_data(sk
, index
, cp
, len
);
2394 case MGMT_OP_START_DISCOVERY
:
2395 err
= start_discovery(sk
, index
, cp
, len
);
2397 case MGMT_OP_STOP_DISCOVERY
:
2398 err
= stop_discovery(sk
, index
);
2400 case MGMT_OP_CONFIRM_NAME
:
2401 err
= confirm_name(sk
, index
, cp
, len
);
2403 case MGMT_OP_BLOCK_DEVICE
:
2404 err
= block_device(sk
, index
, cp
, len
);
2406 case MGMT_OP_UNBLOCK_DEVICE
:
2407 err
= unblock_device(sk
, index
, cp
, len
);
2409 case MGMT_OP_LOAD_LONG_TERM_KEYS
:
2410 err
= load_long_term_keys(sk
, index
, cp
, len
);
2413 BT_DBG("Unknown op %u", opcode
);
2414 err
= cmd_status(sk
, index
, opcode
,
2415 MGMT_STATUS_UNKNOWN_COMMAND
);
2429 static void cmd_status_rsp(struct pending_cmd
*cmd
, void *data
)
2433 cmd_status(cmd
->sk
, cmd
->index
, cmd
->opcode
, *status
);
2434 mgmt_pending_remove(cmd
);
2437 int mgmt_index_added(struct hci_dev
*hdev
)
2439 return mgmt_event(MGMT_EV_INDEX_ADDED
, hdev
, NULL
, 0, NULL
);
2442 int mgmt_index_removed(struct hci_dev
*hdev
)
2446 mgmt_pending_foreach(0, hdev
, cmd_status_rsp
, &status
);
2448 return mgmt_event(MGMT_EV_INDEX_REMOVED
, hdev
, NULL
, 0, NULL
);
2454 struct hci_dev
*hdev
;
2457 static void settings_rsp(struct pending_cmd
*cmd
, void *data
)
2459 struct cmd_lookup
*match
= data
;
2461 send_settings_rsp(cmd
->sk
, cmd
->opcode
, match
->hdev
);
2463 list_del(&cmd
->list
);
2465 if (match
->sk
== NULL
) {
2466 match
->sk
= cmd
->sk
;
2467 sock_hold(match
->sk
);
2470 mgmt_pending_free(cmd
);
2473 int mgmt_powered(struct hci_dev
*hdev
, u8 powered
)
2475 struct cmd_lookup match
= { powered
, NULL
, hdev
};
2479 mgmt_pending_foreach(MGMT_OP_SET_POWERED
, hdev
, settings_rsp
, &match
);
2482 u8 status
= ENETDOWN
;
2483 mgmt_pending_foreach(0, hdev
, cmd_status_rsp
, &status
);
2486 ev
= cpu_to_le32(get_current_settings(hdev
));
2488 ret
= mgmt_event(MGMT_EV_NEW_SETTINGS
, hdev
, &ev
, sizeof(ev
),
2497 int mgmt_discoverable(struct hci_dev
*hdev
, u8 discoverable
)
2499 struct cmd_lookup match
= { discoverable
, NULL
, hdev
};
2503 mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE
, hdev
, settings_rsp
, &match
);
2505 ev
= cpu_to_le32(get_current_settings(hdev
));
2507 ret
= mgmt_event(MGMT_EV_NEW_SETTINGS
, hdev
, &ev
, sizeof(ev
),
2515 int mgmt_connectable(struct hci_dev
*hdev
, u8 connectable
)
2518 struct cmd_lookup match
= { connectable
, NULL
, hdev
};
2521 mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE
, hdev
, settings_rsp
,
2524 ev
= cpu_to_le32(get_current_settings(hdev
));
2526 ret
= mgmt_event(MGMT_EV_NEW_SETTINGS
, hdev
, &ev
, sizeof(ev
), match
.sk
);
2534 int mgmt_write_scan_failed(struct hci_dev
*hdev
, u8 scan
, u8 status
)
2536 u8 mgmt_err
= mgmt_status(status
);
2538 if (scan
& SCAN_PAGE
)
2539 mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE
, hdev
,
2540 cmd_status_rsp
, &mgmt_err
);
2542 if (scan
& SCAN_INQUIRY
)
2543 mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE
, hdev
,
2544 cmd_status_rsp
, &mgmt_err
);
2549 int mgmt_new_link_key(struct hci_dev
*hdev
, struct link_key
*key
,
2552 struct mgmt_ev_new_link_key ev
;
2554 memset(&ev
, 0, sizeof(ev
));
2556 ev
.store_hint
= persistent
;
2557 bacpy(&ev
.key
.bdaddr
, &key
->bdaddr
);
2558 ev
.key
.type
= key
->type
;
2559 memcpy(ev
.key
.val
, key
->val
, 16);
2560 ev
.key
.pin_len
= key
->pin_len
;
2562 return mgmt_event(MGMT_EV_NEW_LINK_KEY
, hdev
, &ev
, sizeof(ev
), NULL
);
2565 int mgmt_new_ltk(struct hci_dev
*hdev
, struct smp_ltk
*key
, u8 persistent
)
2567 struct mgmt_ev_new_long_term_key ev
;
2569 memset(&ev
, 0, sizeof(ev
));
2571 ev
.store_hint
= persistent
;
2572 bacpy(&ev
.key
.addr
.bdaddr
, &key
->bdaddr
);
2573 ev
.key
.addr
.type
= key
->bdaddr_type
;
2574 ev
.key
.authenticated
= key
->authenticated
;
2575 ev
.key
.enc_size
= key
->enc_size
;
2576 ev
.key
.ediv
= key
->ediv
;
2578 if (key
->type
== HCI_SMP_LTK
)
2581 memcpy(ev
.key
.rand
, key
->rand
, sizeof(key
->rand
));
2582 memcpy(ev
.key
.val
, key
->val
, sizeof(key
->val
));
2584 return mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY
, hdev
,
2585 &ev
, sizeof(ev
), NULL
);
2588 int mgmt_device_connected(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
2589 u8 addr_type
, u8
*name
, u8 name_len
,
2593 struct mgmt_ev_device_connected
*ev
= (void *) buf
;
2596 bacpy(&ev
->addr
.bdaddr
, bdaddr
);
2597 ev
->addr
.type
= link_to_mgmt(link_type
, addr_type
);
2600 eir_len
= eir_append_data(ev
->eir
, 0, EIR_NAME_COMPLETE
,
2603 if (dev_class
&& memcmp(dev_class
, "\0\0\0", 3) != 0)
2604 eir_len
= eir_append_data(&ev
->eir
[eir_len
], eir_len
,
2605 EIR_CLASS_OF_DEV
, dev_class
, 3);
2607 put_unaligned_le16(eir_len
, &ev
->eir_len
);
2609 return mgmt_event(MGMT_EV_DEVICE_CONNECTED
, hdev
, buf
,
2610 sizeof(*ev
) + eir_len
, NULL
);
2613 static void disconnect_rsp(struct pending_cmd
*cmd
, void *data
)
2615 struct mgmt_cp_disconnect
*cp
= cmd
->param
;
2616 struct sock
**sk
= data
;
2617 struct mgmt_rp_disconnect rp
;
2619 bacpy(&rp
.addr
.bdaddr
, &cp
->addr
.bdaddr
);
2620 rp
.addr
.type
= cp
->addr
.type
;
2623 cmd_complete(cmd
->sk
, cmd
->index
, MGMT_OP_DISCONNECT
, &rp
, sizeof(rp
));
2628 mgmt_pending_remove(cmd
);
2631 static void unpair_device_rsp(struct pending_cmd
*cmd
, void *data
)
2634 struct mgmt_cp_unpair_device
*cp
= cmd
->param
;
2635 struct mgmt_rp_unpair_device rp
;
2637 memset(&rp
, 0, sizeof(rp
));
2638 bacpy(&rp
.addr
.bdaddr
, &cp
->addr
.bdaddr
);
2639 rp
.addr
.type
= cp
->addr
.type
;
2641 rp
.status
= *status
;
2643 cmd_complete(cmd
->sk
, cmd
->index
, MGMT_OP_UNPAIR_DEVICE
, &rp
,
2646 mgmt_pending_remove(cmd
);
2649 int mgmt_device_disconnected(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
2650 u8 link_type
, u8 addr_type
)
2652 struct mgmt_addr_info ev
;
2653 struct sock
*sk
= NULL
;
2656 mgmt_pending_foreach(MGMT_OP_DISCONNECT
, hdev
, disconnect_rsp
, &sk
);
2658 bacpy(&ev
.bdaddr
, bdaddr
);
2659 ev
.type
= link_to_mgmt(link_type
, addr_type
);
2661 err
= mgmt_event(MGMT_EV_DEVICE_DISCONNECTED
, hdev
, &ev
, sizeof(ev
),
2667 mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE
, hdev
, unpair_device_rsp
,
2673 int mgmt_disconnect_failed(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
2674 u8 link_type
, u8 addr_type
, u8 status
)
2676 struct mgmt_rp_disconnect rp
;
2677 struct pending_cmd
*cmd
;
2680 cmd
= mgmt_pending_find(MGMT_OP_DISCONNECT
, hdev
);
2684 bacpy(&rp
.addr
.bdaddr
, bdaddr
);
2685 rp
.addr
.type
= link_to_mgmt(link_type
, addr_type
);
2686 rp
.status
= mgmt_status(status
);
2688 err
= cmd_complete(cmd
->sk
, cmd
->index
, MGMT_OP_DISCONNECT
,
2691 mgmt_pending_remove(cmd
);
2696 int mgmt_connect_failed(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
2697 u8 addr_type
, u8 status
)
2699 struct mgmt_ev_connect_failed ev
;
2701 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
2702 ev
.addr
.type
= link_to_mgmt(link_type
, addr_type
);
2703 ev
.status
= mgmt_status(status
);
2705 return mgmt_event(MGMT_EV_CONNECT_FAILED
, hdev
, &ev
, sizeof(ev
), NULL
);
2708 int mgmt_pin_code_request(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 secure
)
2710 struct mgmt_ev_pin_code_request ev
;
2712 bacpy(&ev
.bdaddr
, bdaddr
);
2715 return mgmt_event(MGMT_EV_PIN_CODE_REQUEST
, hdev
, &ev
, sizeof(ev
),
2719 int mgmt_pin_code_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
2722 struct pending_cmd
*cmd
;
2723 struct mgmt_rp_pin_code_reply rp
;
2726 cmd
= mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY
, hdev
);
2730 bacpy(&rp
.bdaddr
, bdaddr
);
2731 rp
.status
= mgmt_status(status
);
2733 err
= cmd_complete(cmd
->sk
, hdev
->id
, MGMT_OP_PIN_CODE_REPLY
, &rp
,
2736 mgmt_pending_remove(cmd
);
2741 int mgmt_pin_code_neg_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
2744 struct pending_cmd
*cmd
;
2745 struct mgmt_rp_pin_code_reply rp
;
2748 cmd
= mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY
, hdev
);
2752 bacpy(&rp
.bdaddr
, bdaddr
);
2753 rp
.status
= mgmt_status(status
);
2755 err
= cmd_complete(cmd
->sk
, hdev
->id
, MGMT_OP_PIN_CODE_NEG_REPLY
, &rp
,
2758 mgmt_pending_remove(cmd
);
2763 int mgmt_user_confirm_request(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
2764 u8 link_type
, u8 addr_type
, __le32 value
,
2767 struct mgmt_ev_user_confirm_request ev
;
2769 BT_DBG("%s", hdev
->name
);
2771 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
2772 ev
.addr
.type
= link_to_mgmt(link_type
, addr_type
);
2773 ev
.confirm_hint
= confirm_hint
;
2774 put_unaligned_le32(value
, &ev
.value
);
2776 return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST
, hdev
, &ev
, sizeof(ev
),
2780 int mgmt_user_passkey_request(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
2781 u8 link_type
, u8 addr_type
)
2783 struct mgmt_ev_user_passkey_request ev
;
2785 BT_DBG("%s", hdev
->name
);
2787 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
2788 ev
.addr
.type
= link_to_mgmt(link_type
, addr_type
);
2790 return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST
, hdev
, &ev
, sizeof(ev
),
2794 static int user_pairing_resp_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
2795 u8 link_type
, u8 addr_type
, u8 status
,
2798 struct pending_cmd
*cmd
;
2799 struct mgmt_rp_user_confirm_reply rp
;
2802 cmd
= mgmt_pending_find(opcode
, hdev
);
2806 bacpy(&rp
.addr
.bdaddr
, bdaddr
);
2807 rp
.addr
.type
= link_to_mgmt(link_type
, addr_type
);
2808 rp
.status
= mgmt_status(status
);
2809 err
= cmd_complete(cmd
->sk
, hdev
->id
, opcode
, &rp
, sizeof(rp
));
2811 mgmt_pending_remove(cmd
);
2816 int mgmt_user_confirm_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
2817 u8 link_type
, u8 addr_type
, u8 status
)
2819 return user_pairing_resp_complete(hdev
, bdaddr
, link_type
, addr_type
,
2820 status
, MGMT_OP_USER_CONFIRM_REPLY
);
2823 int mgmt_user_confirm_neg_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
2824 u8 link_type
, u8 addr_type
, u8 status
)
2826 return user_pairing_resp_complete(hdev
, bdaddr
, link_type
, addr_type
,
2827 status
, MGMT_OP_USER_CONFIRM_NEG_REPLY
);
2830 int mgmt_user_passkey_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
2831 u8 link_type
, u8 addr_type
, u8 status
)
2833 return user_pairing_resp_complete(hdev
, bdaddr
, link_type
, addr_type
,
2834 status
, MGMT_OP_USER_PASSKEY_REPLY
);
2837 int mgmt_user_passkey_neg_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
2838 u8 link_type
, u8 addr_type
, u8 status
)
2840 return user_pairing_resp_complete(hdev
, bdaddr
, link_type
, addr_type
,
2841 status
, MGMT_OP_USER_PASSKEY_NEG_REPLY
);
2844 int mgmt_auth_failed(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 status
)
2846 struct mgmt_ev_auth_failed ev
;
2848 bacpy(&ev
.bdaddr
, bdaddr
);
2849 ev
.status
= mgmt_status(status
);
2851 return mgmt_event(MGMT_EV_AUTH_FAILED
, hdev
, &ev
, sizeof(ev
), NULL
);
2854 int mgmt_set_local_name_complete(struct hci_dev
*hdev
, u8
*name
, u8 status
)
2856 struct pending_cmd
*cmd
;
2857 struct mgmt_cp_set_local_name ev
;
2860 memset(&ev
, 0, sizeof(ev
));
2861 memcpy(ev
.name
, name
, HCI_MAX_NAME_LENGTH
);
2863 cmd
= mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME
, hdev
);
2868 err
= cmd_status(cmd
->sk
, hdev
->id
, MGMT_OP_SET_LOCAL_NAME
,
2869 mgmt_status(status
));
2875 err
= cmd_complete(cmd
->sk
, hdev
->id
, MGMT_OP_SET_LOCAL_NAME
, &ev
,
2881 err
= mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED
, hdev
, &ev
, sizeof(ev
),
2882 cmd
? cmd
->sk
: NULL
);
2886 mgmt_pending_remove(cmd
);
2890 int mgmt_read_local_oob_data_reply_complete(struct hci_dev
*hdev
, u8
*hash
,
2891 u8
*randomizer
, u8 status
)
2893 struct pending_cmd
*cmd
;
2896 BT_DBG("%s status %u", hdev
->name
, status
);
2898 cmd
= mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA
, hdev
);
2903 err
= cmd_status(cmd
->sk
, hdev
->id
,
2904 MGMT_OP_READ_LOCAL_OOB_DATA
,
2905 mgmt_status(status
));
2907 struct mgmt_rp_read_local_oob_data rp
;
2909 memcpy(rp
.hash
, hash
, sizeof(rp
.hash
));
2910 memcpy(rp
.randomizer
, randomizer
, sizeof(rp
.randomizer
));
2912 err
= cmd_complete(cmd
->sk
, hdev
->id
,
2913 MGMT_OP_READ_LOCAL_OOB_DATA
,
2917 mgmt_pending_remove(cmd
);
2922 int mgmt_device_found(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
2923 u8 addr_type
, u8
*dev_class
, s8 rssi
,
2924 u8 cfm_name
, u8
*eir
, u16 eir_len
)
2927 struct mgmt_ev_device_found
*ev
= (void *) buf
;
2930 /* Leave 5 bytes for a potential CoD field */
2931 if (sizeof(*ev
) + eir_len
+ 5 > sizeof(buf
))
2934 memset(buf
, 0, sizeof(buf
));
2936 bacpy(&ev
->addr
.bdaddr
, bdaddr
);
2937 ev
->addr
.type
= link_to_mgmt(link_type
, addr_type
);
2939 ev
->confirm_name
= cfm_name
;
2942 memcpy(ev
->eir
, eir
, eir_len
);
2944 if (dev_class
&& !eir_has_data_type(ev
->eir
, eir_len
, EIR_CLASS_OF_DEV
))
2945 eir_len
= eir_append_data(ev
->eir
, eir_len
, EIR_CLASS_OF_DEV
,
2948 put_unaligned_le16(eir_len
, &ev
->eir_len
);
2950 ev_size
= sizeof(*ev
) + eir_len
;
2952 return mgmt_event(MGMT_EV_DEVICE_FOUND
, hdev
, ev
, ev_size
, NULL
);
2955 int mgmt_remote_name(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
2956 u8 addr_type
, s8 rssi
, u8
*name
, u8 name_len
)
2958 struct mgmt_ev_device_found
*ev
;
2959 char buf
[sizeof(*ev
) + HCI_MAX_NAME_LENGTH
+ 2];
2962 ev
= (struct mgmt_ev_device_found
*) buf
;
2964 memset(buf
, 0, sizeof(buf
));
2966 bacpy(&ev
->addr
.bdaddr
, bdaddr
);
2967 ev
->addr
.type
= link_to_mgmt(link_type
, addr_type
);
2970 eir_len
= eir_append_data(ev
->eir
, 0, EIR_NAME_COMPLETE
, name
,
2973 put_unaligned_le16(eir_len
, &ev
->eir_len
);
2975 return mgmt_event(MGMT_EV_DEVICE_FOUND
, hdev
, ev
,
2976 sizeof(*ev
) + eir_len
, NULL
);
2979 int mgmt_start_discovery_failed(struct hci_dev
*hdev
, u8 status
)
2981 struct pending_cmd
*cmd
;
2984 cmd
= mgmt_pending_find(MGMT_OP_START_DISCOVERY
, hdev
);
2988 err
= cmd_status(cmd
->sk
, hdev
->id
, cmd
->opcode
, mgmt_status(status
));
2989 mgmt_pending_remove(cmd
);
2994 int mgmt_stop_discovery_failed(struct hci_dev
*hdev
, u8 status
)
2996 struct pending_cmd
*cmd
;
2999 cmd
= mgmt_pending_find(MGMT_OP_STOP_DISCOVERY
, hdev
);
3003 err
= cmd_status(cmd
->sk
, hdev
->id
, cmd
->opcode
, mgmt_status(status
));
3004 mgmt_pending_remove(cmd
);
3009 int mgmt_discovering(struct hci_dev
*hdev
, u8 discovering
)
3011 struct pending_cmd
*cmd
;
3013 BT_DBG("%s discovering %u", hdev
->name
, discovering
);
3016 cmd
= mgmt_pending_find(MGMT_OP_START_DISCOVERY
, hdev
);
3018 cmd
= mgmt_pending_find(MGMT_OP_STOP_DISCOVERY
, hdev
);
3021 cmd_complete(cmd
->sk
, hdev
->id
, cmd
->opcode
, NULL
, 0);
3022 mgmt_pending_remove(cmd
);
3025 return mgmt_event(MGMT_EV_DISCOVERING
, hdev
, &discovering
,
3026 sizeof(discovering
), NULL
);
3029 int mgmt_device_blocked(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 type
)
3031 struct pending_cmd
*cmd
;
3032 struct mgmt_ev_device_blocked ev
;
3034 cmd
= mgmt_pending_find(MGMT_OP_BLOCK_DEVICE
, hdev
);
3036 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3037 ev
.addr
.type
= type
;
3039 return mgmt_event(MGMT_EV_DEVICE_BLOCKED
, hdev
, &ev
, sizeof(ev
),
3040 cmd
? cmd
->sk
: NULL
);
3043 int mgmt_device_unblocked(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 type
)
3045 struct pending_cmd
*cmd
;
3046 struct mgmt_ev_device_unblocked ev
;
3048 cmd
= mgmt_pending_find(MGMT_OP_UNBLOCK_DEVICE
, hdev
);
3050 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3051 ev
.addr
.type
= type
;
3053 return mgmt_event(MGMT_EV_DEVICE_UNBLOCKED
, hdev
, &ev
, sizeof(ev
),
3054 cmd
? cmd
->sk
: NULL
);