2 BlueZ - Bluetooth protocol stack for Linux
4 Copyright (C) 2010 Nokia Corporation
5 Copyright (C) 2011-2012 Intel Corporation
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
15 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
22 SOFTWARE IS DISCLAIMED.
25 /* Bluetooth HCI Management interface */
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>
37 #define MGMT_VERSION 1
38 #define MGMT_REVISION 2
40 static const u16 mgmt_commands
[] = {
41 MGMT_OP_READ_INDEX_LIST
,
44 MGMT_OP_SET_DISCOVERABLE
,
45 MGMT_OP_SET_CONNECTABLE
,
46 MGMT_OP_SET_FAST_CONNECTABLE
,
48 MGMT_OP_SET_LINK_SECURITY
,
52 MGMT_OP_SET_DEV_CLASS
,
53 MGMT_OP_SET_LOCAL_NAME
,
56 MGMT_OP_LOAD_LINK_KEYS
,
57 MGMT_OP_LOAD_LONG_TERM_KEYS
,
59 MGMT_OP_GET_CONNECTIONS
,
60 MGMT_OP_PIN_CODE_REPLY
,
61 MGMT_OP_PIN_CODE_NEG_REPLY
,
62 MGMT_OP_SET_IO_CAPABILITY
,
64 MGMT_OP_CANCEL_PAIR_DEVICE
,
65 MGMT_OP_UNPAIR_DEVICE
,
66 MGMT_OP_USER_CONFIRM_REPLY
,
67 MGMT_OP_USER_CONFIRM_NEG_REPLY
,
68 MGMT_OP_USER_PASSKEY_REPLY
,
69 MGMT_OP_USER_PASSKEY_NEG_REPLY
,
70 MGMT_OP_READ_LOCAL_OOB_DATA
,
71 MGMT_OP_ADD_REMOTE_OOB_DATA
,
72 MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
73 MGMT_OP_START_DISCOVERY
,
74 MGMT_OP_STOP_DISCOVERY
,
77 MGMT_OP_UNBLOCK_DEVICE
,
78 MGMT_OP_SET_DEVICE_ID
,
81 static const u16 mgmt_events
[] = {
82 MGMT_EV_CONTROLLER_ERROR
,
84 MGMT_EV_INDEX_REMOVED
,
86 MGMT_EV_CLASS_OF_DEV_CHANGED
,
87 MGMT_EV_LOCAL_NAME_CHANGED
,
89 MGMT_EV_NEW_LONG_TERM_KEY
,
90 MGMT_EV_DEVICE_CONNECTED
,
91 MGMT_EV_DEVICE_DISCONNECTED
,
92 MGMT_EV_CONNECT_FAILED
,
93 MGMT_EV_PIN_CODE_REQUEST
,
94 MGMT_EV_USER_CONFIRM_REQUEST
,
95 MGMT_EV_USER_PASSKEY_REQUEST
,
99 MGMT_EV_DEVICE_BLOCKED
,
100 MGMT_EV_DEVICE_UNBLOCKED
,
101 MGMT_EV_DEVICE_UNPAIRED
,
102 MGMT_EV_PASSKEY_NOTIFY
,
106 * These LE scan and inquiry parameters were chosen according to LE General
107 * Discovery Procedure specification.
109 #define LE_SCAN_TYPE 0x01
110 #define LE_SCAN_WIN 0x12
111 #define LE_SCAN_INT 0x12
112 #define LE_SCAN_TIMEOUT_LE_ONLY 10240 /* TGAP(gen_disc_scan_min) */
113 #define LE_SCAN_TIMEOUT_BREDR_LE 5120 /* TGAP(100)/2 */
115 #define INQUIRY_LEN_BREDR 0x08 /* TGAP(100) */
116 #define INQUIRY_LEN_BREDR_LE 0x04 /* TGAP(100)/2 */
118 #define CACHE_TIMEOUT msecs_to_jiffies(2 * 1000)
120 #define hdev_is_powered(hdev) (test_bit(HCI_UP, &hdev->flags) && \
121 !test_bit(HCI_AUTO_OFF, &hdev->dev_flags))
124 struct list_head list
;
132 /* HCI to MGMT error code conversion table */
133 static u8 mgmt_status_table
[] = {
135 MGMT_STATUS_UNKNOWN_COMMAND
, /* Unknown Command */
136 MGMT_STATUS_NOT_CONNECTED
, /* No Connection */
137 MGMT_STATUS_FAILED
, /* Hardware Failure */
138 MGMT_STATUS_CONNECT_FAILED
, /* Page Timeout */
139 MGMT_STATUS_AUTH_FAILED
, /* Authentication Failed */
140 MGMT_STATUS_NOT_PAIRED
, /* PIN or Key Missing */
141 MGMT_STATUS_NO_RESOURCES
, /* Memory Full */
142 MGMT_STATUS_TIMEOUT
, /* Connection Timeout */
143 MGMT_STATUS_NO_RESOURCES
, /* Max Number of Connections */
144 MGMT_STATUS_NO_RESOURCES
, /* Max Number of SCO Connections */
145 MGMT_STATUS_ALREADY_CONNECTED
, /* ACL Connection Exists */
146 MGMT_STATUS_BUSY
, /* Command Disallowed */
147 MGMT_STATUS_NO_RESOURCES
, /* Rejected Limited Resources */
148 MGMT_STATUS_REJECTED
, /* Rejected Security */
149 MGMT_STATUS_REJECTED
, /* Rejected Personal */
150 MGMT_STATUS_TIMEOUT
, /* Host Timeout */
151 MGMT_STATUS_NOT_SUPPORTED
, /* Unsupported Feature */
152 MGMT_STATUS_INVALID_PARAMS
, /* Invalid Parameters */
153 MGMT_STATUS_DISCONNECTED
, /* OE User Ended Connection */
154 MGMT_STATUS_NO_RESOURCES
, /* OE Low Resources */
155 MGMT_STATUS_DISCONNECTED
, /* OE Power Off */
156 MGMT_STATUS_DISCONNECTED
, /* Connection Terminated */
157 MGMT_STATUS_BUSY
, /* Repeated Attempts */
158 MGMT_STATUS_REJECTED
, /* Pairing Not Allowed */
159 MGMT_STATUS_FAILED
, /* Unknown LMP PDU */
160 MGMT_STATUS_NOT_SUPPORTED
, /* Unsupported Remote Feature */
161 MGMT_STATUS_REJECTED
, /* SCO Offset Rejected */
162 MGMT_STATUS_REJECTED
, /* SCO Interval Rejected */
163 MGMT_STATUS_REJECTED
, /* Air Mode Rejected */
164 MGMT_STATUS_INVALID_PARAMS
, /* Invalid LMP Parameters */
165 MGMT_STATUS_FAILED
, /* Unspecified Error */
166 MGMT_STATUS_NOT_SUPPORTED
, /* Unsupported LMP Parameter Value */
167 MGMT_STATUS_FAILED
, /* Role Change Not Allowed */
168 MGMT_STATUS_TIMEOUT
, /* LMP Response Timeout */
169 MGMT_STATUS_FAILED
, /* LMP Error Transaction Collision */
170 MGMT_STATUS_FAILED
, /* LMP PDU Not Allowed */
171 MGMT_STATUS_REJECTED
, /* Encryption Mode Not Accepted */
172 MGMT_STATUS_FAILED
, /* Unit Link Key Used */
173 MGMT_STATUS_NOT_SUPPORTED
, /* QoS Not Supported */
174 MGMT_STATUS_TIMEOUT
, /* Instant Passed */
175 MGMT_STATUS_NOT_SUPPORTED
, /* Pairing Not Supported */
176 MGMT_STATUS_FAILED
, /* Transaction Collision */
177 MGMT_STATUS_INVALID_PARAMS
, /* Unacceptable Parameter */
178 MGMT_STATUS_REJECTED
, /* QoS Rejected */
179 MGMT_STATUS_NOT_SUPPORTED
, /* Classification Not Supported */
180 MGMT_STATUS_REJECTED
, /* Insufficient Security */
181 MGMT_STATUS_INVALID_PARAMS
, /* Parameter Out Of Range */
182 MGMT_STATUS_BUSY
, /* Role Switch Pending */
183 MGMT_STATUS_FAILED
, /* Slot Violation */
184 MGMT_STATUS_FAILED
, /* Role Switch Failed */
185 MGMT_STATUS_INVALID_PARAMS
, /* EIR Too Large */
186 MGMT_STATUS_NOT_SUPPORTED
, /* Simple Pairing Not Supported */
187 MGMT_STATUS_BUSY
, /* Host Busy Pairing */
188 MGMT_STATUS_REJECTED
, /* Rejected, No Suitable Channel */
189 MGMT_STATUS_BUSY
, /* Controller Busy */
190 MGMT_STATUS_INVALID_PARAMS
, /* Unsuitable Connection Interval */
191 MGMT_STATUS_TIMEOUT
, /* Directed Advertising Timeout */
192 MGMT_STATUS_AUTH_FAILED
, /* Terminated Due to MIC Failure */
193 MGMT_STATUS_CONNECT_FAILED
, /* Connection Establishment Failed */
194 MGMT_STATUS_CONNECT_FAILED
, /* MAC Connection Failed */
197 bool mgmt_valid_hdev(struct hci_dev
*hdev
)
199 return hdev
->dev_type
== HCI_BREDR
;
202 static u8
mgmt_status(u8 hci_status
)
204 if (hci_status
< ARRAY_SIZE(mgmt_status_table
))
205 return mgmt_status_table
[hci_status
];
207 return MGMT_STATUS_FAILED
;
210 static int cmd_status(struct sock
*sk
, u16 index
, u16 cmd
, u8 status
)
213 struct mgmt_hdr
*hdr
;
214 struct mgmt_ev_cmd_status
*ev
;
217 BT_DBG("sock %p, index %u, cmd %u, status %u", sk
, index
, cmd
, status
);
219 skb
= alloc_skb(sizeof(*hdr
) + sizeof(*ev
), GFP_KERNEL
);
223 hdr
= (void *) skb_put(skb
, sizeof(*hdr
));
225 hdr
->opcode
= __constant_cpu_to_le16(MGMT_EV_CMD_STATUS
);
226 hdr
->index
= cpu_to_le16(index
);
227 hdr
->len
= cpu_to_le16(sizeof(*ev
));
229 ev
= (void *) skb_put(skb
, sizeof(*ev
));
231 ev
->opcode
= cpu_to_le16(cmd
);
233 err
= sock_queue_rcv_skb(sk
, skb
);
240 static int cmd_complete(struct sock
*sk
, u16 index
, u16 cmd
, u8 status
,
241 void *rp
, size_t rp_len
)
244 struct mgmt_hdr
*hdr
;
245 struct mgmt_ev_cmd_complete
*ev
;
248 BT_DBG("sock %p", sk
);
250 skb
= alloc_skb(sizeof(*hdr
) + sizeof(*ev
) + rp_len
, GFP_KERNEL
);
254 hdr
= (void *) skb_put(skb
, sizeof(*hdr
));
256 hdr
->opcode
= __constant_cpu_to_le16(MGMT_EV_CMD_COMPLETE
);
257 hdr
->index
= cpu_to_le16(index
);
258 hdr
->len
= cpu_to_le16(sizeof(*ev
) + rp_len
);
260 ev
= (void *) skb_put(skb
, sizeof(*ev
) + rp_len
);
261 ev
->opcode
= cpu_to_le16(cmd
);
265 memcpy(ev
->data
, rp
, rp_len
);
267 err
= sock_queue_rcv_skb(sk
, skb
);
274 static int read_version(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
277 struct mgmt_rp_read_version rp
;
279 BT_DBG("sock %p", sk
);
281 rp
.version
= MGMT_VERSION
;
282 rp
.revision
= __constant_cpu_to_le16(MGMT_REVISION
);
284 return cmd_complete(sk
, MGMT_INDEX_NONE
, MGMT_OP_READ_VERSION
, 0, &rp
,
288 static int read_commands(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
291 struct mgmt_rp_read_commands
*rp
;
292 const u16 num_commands
= ARRAY_SIZE(mgmt_commands
);
293 const u16 num_events
= ARRAY_SIZE(mgmt_events
);
298 BT_DBG("sock %p", sk
);
300 rp_size
= sizeof(*rp
) + ((num_commands
+ num_events
) * sizeof(u16
));
302 rp
= kmalloc(rp_size
, GFP_KERNEL
);
306 rp
->num_commands
= __constant_cpu_to_le16(num_commands
);
307 rp
->num_events
= __constant_cpu_to_le16(num_events
);
309 for (i
= 0, opcode
= rp
->opcodes
; i
< num_commands
; i
++, opcode
++)
310 put_unaligned_le16(mgmt_commands
[i
], opcode
);
312 for (i
= 0; i
< num_events
; i
++, opcode
++)
313 put_unaligned_le16(mgmt_events
[i
], opcode
);
315 err
= cmd_complete(sk
, MGMT_INDEX_NONE
, MGMT_OP_READ_COMMANDS
, 0, rp
,
322 static int read_index_list(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
325 struct mgmt_rp_read_index_list
*rp
;
331 BT_DBG("sock %p", sk
);
333 read_lock(&hci_dev_list_lock
);
336 list_for_each_entry(d
, &hci_dev_list
, list
) {
337 if (!mgmt_valid_hdev(d
))
343 rp_len
= sizeof(*rp
) + (2 * count
);
344 rp
= kmalloc(rp_len
, GFP_ATOMIC
);
346 read_unlock(&hci_dev_list_lock
);
351 list_for_each_entry(d
, &hci_dev_list
, list
) {
352 if (test_bit(HCI_SETUP
, &d
->dev_flags
))
355 if (!mgmt_valid_hdev(d
))
358 rp
->index
[count
++] = cpu_to_le16(d
->id
);
359 BT_DBG("Added hci%u", d
->id
);
362 rp
->num_controllers
= cpu_to_le16(count
);
363 rp_len
= sizeof(*rp
) + (2 * count
);
365 read_unlock(&hci_dev_list_lock
);
367 err
= cmd_complete(sk
, MGMT_INDEX_NONE
, MGMT_OP_READ_INDEX_LIST
, 0, rp
,
375 static u32
get_supported_settings(struct hci_dev
*hdev
)
379 settings
|= MGMT_SETTING_POWERED
;
380 settings
|= MGMT_SETTING_PAIRABLE
;
382 if (lmp_ssp_capable(hdev
))
383 settings
|= MGMT_SETTING_SSP
;
385 if (lmp_bredr_capable(hdev
)) {
386 settings
|= MGMT_SETTING_CONNECTABLE
;
387 settings
|= MGMT_SETTING_FAST_CONNECTABLE
;
388 settings
|= MGMT_SETTING_DISCOVERABLE
;
389 settings
|= MGMT_SETTING_BREDR
;
390 settings
|= MGMT_SETTING_LINK_SECURITY
;
394 settings
|= MGMT_SETTING_HS
;
396 if (lmp_le_capable(hdev
))
397 settings
|= MGMT_SETTING_LE
;
402 static u32
get_current_settings(struct hci_dev
*hdev
)
406 if (hdev_is_powered(hdev
))
407 settings
|= MGMT_SETTING_POWERED
;
409 if (test_bit(HCI_CONNECTABLE
, &hdev
->dev_flags
))
410 settings
|= MGMT_SETTING_CONNECTABLE
;
412 if (test_bit(HCI_DISCOVERABLE
, &hdev
->dev_flags
))
413 settings
|= MGMT_SETTING_DISCOVERABLE
;
415 if (test_bit(HCI_PAIRABLE
, &hdev
->dev_flags
))
416 settings
|= MGMT_SETTING_PAIRABLE
;
418 if (lmp_bredr_capable(hdev
))
419 settings
|= MGMT_SETTING_BREDR
;
421 if (test_bit(HCI_LE_ENABLED
, &hdev
->dev_flags
))
422 settings
|= MGMT_SETTING_LE
;
424 if (test_bit(HCI_LINK_SECURITY
, &hdev
->dev_flags
))
425 settings
|= MGMT_SETTING_LINK_SECURITY
;
427 if (test_bit(HCI_SSP_ENABLED
, &hdev
->dev_flags
))
428 settings
|= MGMT_SETTING_SSP
;
430 if (test_bit(HCI_HS_ENABLED
, &hdev
->dev_flags
))
431 settings
|= MGMT_SETTING_HS
;
436 #define PNP_INFO_SVCLASS_ID 0x1200
438 static u8 bluetooth_base_uuid
[] = {
439 0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80,
440 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
443 static u16
get_uuid16(u8
*uuid128
)
448 for (i
= 0; i
< 12; i
++) {
449 if (bluetooth_base_uuid
[i
] != uuid128
[i
])
453 val
= get_unaligned_le32(&uuid128
[12]);
460 static void create_eir(struct hci_dev
*hdev
, u8
*data
)
464 u16 uuid16_list
[HCI_MAX_EIR_LENGTH
/ sizeof(u16
)];
465 int i
, truncated
= 0;
466 struct bt_uuid
*uuid
;
469 name_len
= strlen(hdev
->dev_name
);
475 ptr
[1] = EIR_NAME_SHORT
;
477 ptr
[1] = EIR_NAME_COMPLETE
;
479 /* EIR Data length */
480 ptr
[0] = name_len
+ 1;
482 memcpy(ptr
+ 2, hdev
->dev_name
, name_len
);
484 eir_len
+= (name_len
+ 2);
485 ptr
+= (name_len
+ 2);
488 if (hdev
->inq_tx_power
!= HCI_TX_POWER_INVALID
) {
490 ptr
[1] = EIR_TX_POWER
;
491 ptr
[2] = (u8
) hdev
->inq_tx_power
;
497 if (hdev
->devid_source
> 0) {
499 ptr
[1] = EIR_DEVICE_ID
;
501 put_unaligned_le16(hdev
->devid_source
, ptr
+ 2);
502 put_unaligned_le16(hdev
->devid_vendor
, ptr
+ 4);
503 put_unaligned_le16(hdev
->devid_product
, ptr
+ 6);
504 put_unaligned_le16(hdev
->devid_version
, ptr
+ 8);
510 memset(uuid16_list
, 0, sizeof(uuid16_list
));
512 /* Group all UUID16 types */
513 list_for_each_entry(uuid
, &hdev
->uuids
, list
) {
516 uuid16
= get_uuid16(uuid
->uuid
);
523 if (uuid16
== PNP_INFO_SVCLASS_ID
)
526 /* Stop if not enough space to put next UUID */
527 if (eir_len
+ 2 + sizeof(u16
) > HCI_MAX_EIR_LENGTH
) {
532 /* Check for duplicates */
533 for (i
= 0; uuid16_list
[i
] != 0; i
++)
534 if (uuid16_list
[i
] == uuid16
)
537 if (uuid16_list
[i
] == 0) {
538 uuid16_list
[i
] = uuid16
;
539 eir_len
+= sizeof(u16
);
543 if (uuid16_list
[0] != 0) {
547 ptr
[1] = truncated
? EIR_UUID16_SOME
: EIR_UUID16_ALL
;
552 for (i
= 0; uuid16_list
[i
] != 0; i
++) {
553 *ptr
++ = (uuid16_list
[i
] & 0x00ff);
554 *ptr
++ = (uuid16_list
[i
] & 0xff00) >> 8;
557 /* EIR Data length */
558 *length
= (i
* sizeof(u16
)) + 1;
562 static int update_eir(struct hci_dev
*hdev
)
564 struct hci_cp_write_eir cp
;
566 if (!hdev_is_powered(hdev
))
569 if (!lmp_ext_inq_capable(hdev
))
572 if (!test_bit(HCI_SSP_ENABLED
, &hdev
->dev_flags
))
575 if (test_bit(HCI_SERVICE_CACHE
, &hdev
->dev_flags
))
578 memset(&cp
, 0, sizeof(cp
));
580 create_eir(hdev
, cp
.data
);
582 if (memcmp(cp
.data
, hdev
->eir
, sizeof(cp
.data
)) == 0)
585 memcpy(hdev
->eir
, cp
.data
, sizeof(cp
.data
));
587 return hci_send_cmd(hdev
, HCI_OP_WRITE_EIR
, sizeof(cp
), &cp
);
590 static u8
get_service_classes(struct hci_dev
*hdev
)
592 struct bt_uuid
*uuid
;
595 list_for_each_entry(uuid
, &hdev
->uuids
, list
)
596 val
|= uuid
->svc_hint
;
601 static int update_class(struct hci_dev
*hdev
)
606 BT_DBG("%s", hdev
->name
);
608 if (!hdev_is_powered(hdev
))
611 if (test_bit(HCI_SERVICE_CACHE
, &hdev
->dev_flags
))
614 cod
[0] = hdev
->minor_class
;
615 cod
[1] = hdev
->major_class
;
616 cod
[2] = get_service_classes(hdev
);
618 if (memcmp(cod
, hdev
->dev_class
, 3) == 0)
621 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_CLASS_OF_DEV
, sizeof(cod
), cod
);
623 set_bit(HCI_PENDING_CLASS
, &hdev
->dev_flags
);
628 static void service_cache_off(struct work_struct
*work
)
630 struct hci_dev
*hdev
= container_of(work
, struct hci_dev
,
633 if (!test_and_clear_bit(HCI_SERVICE_CACHE
, &hdev
->dev_flags
))
641 hci_dev_unlock(hdev
);
644 static void mgmt_init_hdev(struct sock
*sk
, struct hci_dev
*hdev
)
646 if (test_and_set_bit(HCI_MGMT
, &hdev
->dev_flags
))
649 INIT_DELAYED_WORK(&hdev
->service_cache
, service_cache_off
);
651 /* Non-mgmt controlled devices get this bit set
652 * implicitly so that pairing works for them, however
653 * for mgmt we require user-space to explicitly enable
656 clear_bit(HCI_PAIRABLE
, &hdev
->dev_flags
);
659 static int read_controller_info(struct sock
*sk
, struct hci_dev
*hdev
,
660 void *data
, u16 data_len
)
662 struct mgmt_rp_read_info rp
;
664 BT_DBG("sock %p %s", sk
, hdev
->name
);
668 memset(&rp
, 0, sizeof(rp
));
670 bacpy(&rp
.bdaddr
, &hdev
->bdaddr
);
672 rp
.version
= hdev
->hci_ver
;
673 rp
.manufacturer
= cpu_to_le16(hdev
->manufacturer
);
675 rp
.supported_settings
= cpu_to_le32(get_supported_settings(hdev
));
676 rp
.current_settings
= cpu_to_le32(get_current_settings(hdev
));
678 memcpy(rp
.dev_class
, hdev
->dev_class
, 3);
680 memcpy(rp
.name
, hdev
->dev_name
, sizeof(hdev
->dev_name
));
681 memcpy(rp
.short_name
, hdev
->short_name
, sizeof(hdev
->short_name
));
683 hci_dev_unlock(hdev
);
685 return cmd_complete(sk
, hdev
->id
, MGMT_OP_READ_INFO
, 0, &rp
,
689 static void mgmt_pending_free(struct pending_cmd
*cmd
)
696 static struct pending_cmd
*mgmt_pending_add(struct sock
*sk
, u16 opcode
,
697 struct hci_dev
*hdev
, void *data
,
700 struct pending_cmd
*cmd
;
702 cmd
= kmalloc(sizeof(*cmd
), GFP_KERNEL
);
706 cmd
->opcode
= opcode
;
707 cmd
->index
= hdev
->id
;
709 cmd
->param
= kmalloc(len
, GFP_KERNEL
);
716 memcpy(cmd
->param
, data
, len
);
721 list_add(&cmd
->list
, &hdev
->mgmt_pending
);
726 static void mgmt_pending_foreach(u16 opcode
, struct hci_dev
*hdev
,
727 void (*cb
)(struct pending_cmd
*cmd
,
731 struct list_head
*p
, *n
;
733 list_for_each_safe(p
, n
, &hdev
->mgmt_pending
) {
734 struct pending_cmd
*cmd
;
736 cmd
= list_entry(p
, struct pending_cmd
, list
);
738 if (opcode
> 0 && cmd
->opcode
!= opcode
)
745 static struct pending_cmd
*mgmt_pending_find(u16 opcode
, struct hci_dev
*hdev
)
747 struct pending_cmd
*cmd
;
749 list_for_each_entry(cmd
, &hdev
->mgmt_pending
, list
) {
750 if (cmd
->opcode
== opcode
)
757 static void mgmt_pending_remove(struct pending_cmd
*cmd
)
759 list_del(&cmd
->list
);
760 mgmt_pending_free(cmd
);
763 static int send_settings_rsp(struct sock
*sk
, u16 opcode
, struct hci_dev
*hdev
)
765 __le32 settings
= cpu_to_le32(get_current_settings(hdev
));
767 return cmd_complete(sk
, hdev
->id
, opcode
, 0, &settings
,
771 static int set_powered(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
774 struct mgmt_mode
*cp
= data
;
775 struct pending_cmd
*cmd
;
778 BT_DBG("request for %s", hdev
->name
);
780 if (cp
->val
!= 0x00 && cp
->val
!= 0x01)
781 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_POWERED
,
782 MGMT_STATUS_INVALID_PARAMS
);
786 if (test_and_clear_bit(HCI_AUTO_OFF
, &hdev
->dev_flags
)) {
787 cancel_delayed_work(&hdev
->power_off
);
790 err
= send_settings_rsp(sk
, MGMT_OP_SET_POWERED
, hdev
);
791 mgmt_powered(hdev
, 1);
796 if (!!cp
->val
== hdev_is_powered(hdev
)) {
797 err
= send_settings_rsp(sk
, MGMT_OP_SET_POWERED
, hdev
);
801 if (mgmt_pending_find(MGMT_OP_SET_POWERED
, hdev
)) {
802 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_SET_POWERED
,
807 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_POWERED
, hdev
, data
, len
);
814 schedule_work(&hdev
->power_on
);
816 schedule_work(&hdev
->power_off
.work
);
821 hci_dev_unlock(hdev
);
825 static int mgmt_event(u16 event
, struct hci_dev
*hdev
, void *data
, u16 data_len
,
826 struct sock
*skip_sk
)
829 struct mgmt_hdr
*hdr
;
831 skb
= alloc_skb(sizeof(*hdr
) + data_len
, GFP_KERNEL
);
835 hdr
= (void *) skb_put(skb
, sizeof(*hdr
));
836 hdr
->opcode
= cpu_to_le16(event
);
838 hdr
->index
= cpu_to_le16(hdev
->id
);
840 hdr
->index
= __constant_cpu_to_le16(MGMT_INDEX_NONE
);
841 hdr
->len
= cpu_to_le16(data_len
);
844 memcpy(skb_put(skb
, data_len
), data
, data_len
);
847 __net_timestamp(skb
);
849 hci_send_to_control(skb
, skip_sk
);
855 static int new_settings(struct hci_dev
*hdev
, struct sock
*skip
)
859 ev
= cpu_to_le32(get_current_settings(hdev
));
861 return mgmt_event(MGMT_EV_NEW_SETTINGS
, hdev
, &ev
, sizeof(ev
), skip
);
864 static int set_discoverable(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
867 struct mgmt_cp_set_discoverable
*cp
= data
;
868 struct pending_cmd
*cmd
;
873 BT_DBG("request for %s", hdev
->name
);
875 if (!lmp_bredr_capable(hdev
))
876 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_DISCOVERABLE
,
877 MGMT_STATUS_NOT_SUPPORTED
);
879 if (cp
->val
!= 0x00 && cp
->val
!= 0x01)
880 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_DISCOVERABLE
,
881 MGMT_STATUS_INVALID_PARAMS
);
883 timeout
= __le16_to_cpu(cp
->timeout
);
884 if (!cp
->val
&& timeout
> 0)
885 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_DISCOVERABLE
,
886 MGMT_STATUS_INVALID_PARAMS
);
890 if (!hdev_is_powered(hdev
) && timeout
> 0) {
891 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_SET_DISCOVERABLE
,
892 MGMT_STATUS_NOT_POWERED
);
896 if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE
, hdev
) ||
897 mgmt_pending_find(MGMT_OP_SET_CONNECTABLE
, hdev
)) {
898 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_SET_DISCOVERABLE
,
903 if (!test_bit(HCI_CONNECTABLE
, &hdev
->dev_flags
)) {
904 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_SET_DISCOVERABLE
,
905 MGMT_STATUS_REJECTED
);
909 if (!hdev_is_powered(hdev
)) {
910 bool changed
= false;
912 if (!!cp
->val
!= test_bit(HCI_DISCOVERABLE
, &hdev
->dev_flags
)) {
913 change_bit(HCI_DISCOVERABLE
, &hdev
->dev_flags
);
917 err
= send_settings_rsp(sk
, MGMT_OP_SET_DISCOVERABLE
, hdev
);
922 err
= new_settings(hdev
, sk
);
927 if (!!cp
->val
== test_bit(HCI_DISCOVERABLE
, &hdev
->dev_flags
)) {
928 if (hdev
->discov_timeout
> 0) {
929 cancel_delayed_work(&hdev
->discov_off
);
930 hdev
->discov_timeout
= 0;
933 if (cp
->val
&& timeout
> 0) {
934 hdev
->discov_timeout
= timeout
;
935 queue_delayed_work(hdev
->workqueue
, &hdev
->discov_off
,
936 msecs_to_jiffies(hdev
->discov_timeout
* 1000));
939 err
= send_settings_rsp(sk
, MGMT_OP_SET_DISCOVERABLE
, hdev
);
943 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_DISCOVERABLE
, hdev
, data
, len
);
952 scan
|= SCAN_INQUIRY
;
954 cancel_delayed_work(&hdev
->discov_off
);
956 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_SCAN_ENABLE
, 1, &scan
);
958 mgmt_pending_remove(cmd
);
961 hdev
->discov_timeout
= timeout
;
964 hci_dev_unlock(hdev
);
968 static int set_connectable(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
971 struct mgmt_mode
*cp
= data
;
972 struct pending_cmd
*cmd
;
976 BT_DBG("request for %s", hdev
->name
);
978 if (!lmp_bredr_capable(hdev
))
979 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_CONNECTABLE
,
980 MGMT_STATUS_NOT_SUPPORTED
);
982 if (cp
->val
!= 0x00 && cp
->val
!= 0x01)
983 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_CONNECTABLE
,
984 MGMT_STATUS_INVALID_PARAMS
);
988 if (!hdev_is_powered(hdev
)) {
989 bool changed
= false;
991 if (!!cp
->val
!= test_bit(HCI_CONNECTABLE
, &hdev
->dev_flags
))
995 set_bit(HCI_CONNECTABLE
, &hdev
->dev_flags
);
997 clear_bit(HCI_CONNECTABLE
, &hdev
->dev_flags
);
998 clear_bit(HCI_DISCOVERABLE
, &hdev
->dev_flags
);
1001 err
= send_settings_rsp(sk
, MGMT_OP_SET_CONNECTABLE
, hdev
);
1006 err
= new_settings(hdev
, sk
);
1011 if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE
, hdev
) ||
1012 mgmt_pending_find(MGMT_OP_SET_CONNECTABLE
, hdev
)) {
1013 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_SET_CONNECTABLE
,
1018 if (!!cp
->val
== test_bit(HCI_PSCAN
, &hdev
->flags
)) {
1019 err
= send_settings_rsp(sk
, MGMT_OP_SET_CONNECTABLE
, hdev
);
1023 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_CONNECTABLE
, hdev
, data
, len
);
1034 if (test_bit(HCI_ISCAN
, &hdev
->flags
) &&
1035 hdev
->discov_timeout
> 0)
1036 cancel_delayed_work(&hdev
->discov_off
);
1039 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_SCAN_ENABLE
, 1, &scan
);
1041 mgmt_pending_remove(cmd
);
1044 hci_dev_unlock(hdev
);
1048 static int set_pairable(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
1051 struct mgmt_mode
*cp
= data
;
1054 BT_DBG("request for %s", hdev
->name
);
1056 if (cp
->val
!= 0x00 && cp
->val
!= 0x01)
1057 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_PAIRABLE
,
1058 MGMT_STATUS_INVALID_PARAMS
);
1063 set_bit(HCI_PAIRABLE
, &hdev
->dev_flags
);
1065 clear_bit(HCI_PAIRABLE
, &hdev
->dev_flags
);
1067 err
= send_settings_rsp(sk
, MGMT_OP_SET_PAIRABLE
, hdev
);
1071 err
= new_settings(hdev
, sk
);
1074 hci_dev_unlock(hdev
);
1078 static int set_link_security(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
1081 struct mgmt_mode
*cp
= data
;
1082 struct pending_cmd
*cmd
;
1086 BT_DBG("request for %s", hdev
->name
);
1088 if (!lmp_bredr_capable(hdev
))
1089 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_LINK_SECURITY
,
1090 MGMT_STATUS_NOT_SUPPORTED
);
1092 if (cp
->val
!= 0x00 && cp
->val
!= 0x01)
1093 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_LINK_SECURITY
,
1094 MGMT_STATUS_INVALID_PARAMS
);
1098 if (!hdev_is_powered(hdev
)) {
1099 bool changed
= false;
1101 if (!!cp
->val
!= test_bit(HCI_LINK_SECURITY
,
1102 &hdev
->dev_flags
)) {
1103 change_bit(HCI_LINK_SECURITY
, &hdev
->dev_flags
);
1107 err
= send_settings_rsp(sk
, MGMT_OP_SET_LINK_SECURITY
, hdev
);
1112 err
= new_settings(hdev
, sk
);
1117 if (mgmt_pending_find(MGMT_OP_SET_LINK_SECURITY
, hdev
)) {
1118 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_SET_LINK_SECURITY
,
1125 if (test_bit(HCI_AUTH
, &hdev
->flags
) == val
) {
1126 err
= send_settings_rsp(sk
, MGMT_OP_SET_LINK_SECURITY
, hdev
);
1130 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_LINK_SECURITY
, hdev
, data
, len
);
1136 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_AUTH_ENABLE
, sizeof(val
), &val
);
1138 mgmt_pending_remove(cmd
);
1143 hci_dev_unlock(hdev
);
1147 static int set_ssp(struct sock
*sk
, struct hci_dev
*hdev
, void *data
, u16 len
)
1149 struct mgmt_mode
*cp
= data
;
1150 struct pending_cmd
*cmd
;
1154 BT_DBG("request for %s", hdev
->name
);
1156 if (!lmp_ssp_capable(hdev
))
1157 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_SSP
,
1158 MGMT_STATUS_NOT_SUPPORTED
);
1160 if (cp
->val
!= 0x00 && cp
->val
!= 0x01)
1161 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_SSP
,
1162 MGMT_STATUS_INVALID_PARAMS
);
1168 if (!hdev_is_powered(hdev
)) {
1169 bool changed
= false;
1171 if (val
!= test_bit(HCI_SSP_ENABLED
, &hdev
->dev_flags
)) {
1172 change_bit(HCI_SSP_ENABLED
, &hdev
->dev_flags
);
1176 err
= send_settings_rsp(sk
, MGMT_OP_SET_SSP
, hdev
);
1181 err
= new_settings(hdev
, sk
);
1186 if (mgmt_pending_find(MGMT_OP_SET_SSP
, hdev
)) {
1187 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_SET_SSP
,
1192 if (test_bit(HCI_SSP_ENABLED
, &hdev
->dev_flags
) == val
) {
1193 err
= send_settings_rsp(sk
, MGMT_OP_SET_SSP
, hdev
);
1197 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_SSP
, hdev
, data
, len
);
1203 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_SSP_MODE
, sizeof(val
), &val
);
1205 mgmt_pending_remove(cmd
);
1210 hci_dev_unlock(hdev
);
1214 static int set_hs(struct sock
*sk
, struct hci_dev
*hdev
, void *data
, u16 len
)
1216 struct mgmt_mode
*cp
= data
;
1218 BT_DBG("request for %s", hdev
->name
);
1221 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_HS
,
1222 MGMT_STATUS_NOT_SUPPORTED
);
1224 if (cp
->val
!= 0x00 && cp
->val
!= 0x01)
1225 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_HS
,
1226 MGMT_STATUS_INVALID_PARAMS
);
1229 set_bit(HCI_HS_ENABLED
, &hdev
->dev_flags
);
1231 clear_bit(HCI_HS_ENABLED
, &hdev
->dev_flags
);
1233 return send_settings_rsp(sk
, MGMT_OP_SET_HS
, hdev
);
1236 static int set_le(struct sock
*sk
, struct hci_dev
*hdev
, void *data
, u16 len
)
1238 struct mgmt_mode
*cp
= data
;
1239 struct hci_cp_write_le_host_supported hci_cp
;
1240 struct pending_cmd
*cmd
;
1244 BT_DBG("request for %s", hdev
->name
);
1246 if (!lmp_le_capable(hdev
))
1247 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_LE
,
1248 MGMT_STATUS_NOT_SUPPORTED
);
1250 if (cp
->val
!= 0x00 && cp
->val
!= 0x01)
1251 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_LE
,
1252 MGMT_STATUS_INVALID_PARAMS
);
1257 enabled
= lmp_host_le_capable(hdev
);
1259 if (!hdev_is_powered(hdev
) || val
== enabled
) {
1260 bool changed
= false;
1262 if (val
!= test_bit(HCI_LE_ENABLED
, &hdev
->dev_flags
)) {
1263 change_bit(HCI_LE_ENABLED
, &hdev
->dev_flags
);
1267 err
= send_settings_rsp(sk
, MGMT_OP_SET_LE
, hdev
);
1272 err
= new_settings(hdev
, sk
);
1277 if (mgmt_pending_find(MGMT_OP_SET_LE
, hdev
)) {
1278 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_SET_LE
,
1283 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_LE
, hdev
, data
, len
);
1289 memset(&hci_cp
, 0, sizeof(hci_cp
));
1293 hci_cp
.simul
= lmp_le_br_capable(hdev
);
1296 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_LE_HOST_SUPPORTED
, sizeof(hci_cp
),
1299 mgmt_pending_remove(cmd
);
1302 hci_dev_unlock(hdev
);
1306 static int add_uuid(struct sock
*sk
, struct hci_dev
*hdev
, void *data
, u16 len
)
1308 struct mgmt_cp_add_uuid
*cp
= data
;
1309 struct pending_cmd
*cmd
;
1310 struct bt_uuid
*uuid
;
1313 BT_DBG("request for %s", hdev
->name
);
1317 if (test_bit(HCI_PENDING_CLASS
, &hdev
->dev_flags
)) {
1318 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_ADD_UUID
,
1323 uuid
= kmalloc(sizeof(*uuid
), GFP_KERNEL
);
1329 memcpy(uuid
->uuid
, cp
->uuid
, 16);
1330 uuid
->svc_hint
= cp
->svc_hint
;
1332 list_add(&uuid
->list
, &hdev
->uuids
);
1334 err
= update_class(hdev
);
1338 err
= update_eir(hdev
);
1342 if (!test_bit(HCI_PENDING_CLASS
, &hdev
->dev_flags
)) {
1343 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_ADD_UUID
, 0,
1344 hdev
->dev_class
, 3);
1348 cmd
= mgmt_pending_add(sk
, MGMT_OP_ADD_UUID
, hdev
, data
, len
);
1353 hci_dev_unlock(hdev
);
1357 static bool enable_service_cache(struct hci_dev
*hdev
)
1359 if (!hdev_is_powered(hdev
))
1362 if (!test_and_set_bit(HCI_SERVICE_CACHE
, &hdev
->dev_flags
)) {
1363 schedule_delayed_work(&hdev
->service_cache
, CACHE_TIMEOUT
);
1370 static int remove_uuid(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
1373 struct mgmt_cp_remove_uuid
*cp
= data
;
1374 struct pending_cmd
*cmd
;
1375 struct list_head
*p
, *n
;
1376 u8 bt_uuid_any
[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1379 BT_DBG("request for %s", hdev
->name
);
1383 if (test_bit(HCI_PENDING_CLASS
, &hdev
->dev_flags
)) {
1384 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_REMOVE_UUID
,
1389 if (memcmp(cp
->uuid
, bt_uuid_any
, 16) == 0) {
1390 err
= hci_uuids_clear(hdev
);
1392 if (enable_service_cache(hdev
)) {
1393 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_REMOVE_UUID
,
1394 0, hdev
->dev_class
, 3);
1403 list_for_each_safe(p
, n
, &hdev
->uuids
) {
1404 struct bt_uuid
*match
= list_entry(p
, struct bt_uuid
, list
);
1406 if (memcmp(match
->uuid
, cp
->uuid
, 16) != 0)
1409 list_del(&match
->list
);
1415 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_REMOVE_UUID
,
1416 MGMT_STATUS_INVALID_PARAMS
);
1421 err
= update_class(hdev
);
1425 err
= update_eir(hdev
);
1429 if (!test_bit(HCI_PENDING_CLASS
, &hdev
->dev_flags
)) {
1430 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_REMOVE_UUID
, 0,
1431 hdev
->dev_class
, 3);
1435 cmd
= mgmt_pending_add(sk
, MGMT_OP_REMOVE_UUID
, hdev
, data
, len
);
1440 hci_dev_unlock(hdev
);
1444 static int set_dev_class(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
1447 struct mgmt_cp_set_dev_class
*cp
= data
;
1448 struct pending_cmd
*cmd
;
1451 BT_DBG("request for %s", hdev
->name
);
1453 if (!lmp_bredr_capable(hdev
))
1454 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_DEV_CLASS
,
1455 MGMT_STATUS_NOT_SUPPORTED
);
1457 if (test_bit(HCI_PENDING_CLASS
, &hdev
->dev_flags
))
1458 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_DEV_CLASS
,
1461 if ((cp
->minor
& 0x03) != 0 || (cp
->major
& 0xe0) != 0)
1462 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_DEV_CLASS
,
1463 MGMT_STATUS_INVALID_PARAMS
);
1467 hdev
->major_class
= cp
->major
;
1468 hdev
->minor_class
= cp
->minor
;
1470 if (!hdev_is_powered(hdev
)) {
1471 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_SET_DEV_CLASS
, 0,
1472 hdev
->dev_class
, 3);
1476 if (test_and_clear_bit(HCI_SERVICE_CACHE
, &hdev
->dev_flags
)) {
1477 hci_dev_unlock(hdev
);
1478 cancel_delayed_work_sync(&hdev
->service_cache
);
1483 err
= update_class(hdev
);
1487 if (!test_bit(HCI_PENDING_CLASS
, &hdev
->dev_flags
)) {
1488 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_SET_DEV_CLASS
, 0,
1489 hdev
->dev_class
, 3);
1493 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_DEV_CLASS
, hdev
, data
, len
);
1498 hci_dev_unlock(hdev
);
1502 static int load_link_keys(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
1505 struct mgmt_cp_load_link_keys
*cp
= data
;
1506 u16 key_count
, expected_len
;
1509 key_count
= __le16_to_cpu(cp
->key_count
);
1511 expected_len
= sizeof(*cp
) + key_count
*
1512 sizeof(struct mgmt_link_key_info
);
1513 if (expected_len
!= len
) {
1514 BT_ERR("load_link_keys: expected %u bytes, got %u bytes",
1516 return cmd_status(sk
, hdev
->id
, MGMT_OP_LOAD_LINK_KEYS
,
1517 MGMT_STATUS_INVALID_PARAMS
);
1520 BT_DBG("%s debug_keys %u key_count %u", hdev
->name
, cp
->debug_keys
,
1525 hci_link_keys_clear(hdev
);
1527 set_bit(HCI_LINK_KEYS
, &hdev
->dev_flags
);
1530 set_bit(HCI_DEBUG_KEYS
, &hdev
->dev_flags
);
1532 clear_bit(HCI_DEBUG_KEYS
, &hdev
->dev_flags
);
1534 for (i
= 0; i
< key_count
; i
++) {
1535 struct mgmt_link_key_info
*key
= &cp
->keys
[i
];
1537 hci_add_link_key(hdev
, NULL
, 0, &key
->addr
.bdaddr
, key
->val
,
1538 key
->type
, key
->pin_len
);
1541 cmd_complete(sk
, hdev
->id
, MGMT_OP_LOAD_LINK_KEYS
, 0, NULL
, 0);
1543 hci_dev_unlock(hdev
);
1548 static int device_unpaired(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
1549 u8 addr_type
, struct sock
*skip_sk
)
1551 struct mgmt_ev_device_unpaired ev
;
1553 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
1554 ev
.addr
.type
= addr_type
;
1556 return mgmt_event(MGMT_EV_DEVICE_UNPAIRED
, hdev
, &ev
, sizeof(ev
),
1560 static int unpair_device(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
1563 struct mgmt_cp_unpair_device
*cp
= data
;
1564 struct mgmt_rp_unpair_device rp
;
1565 struct hci_cp_disconnect dc
;
1566 struct pending_cmd
*cmd
;
1567 struct hci_conn
*conn
;
1572 memset(&rp
, 0, sizeof(rp
));
1573 bacpy(&rp
.addr
.bdaddr
, &cp
->addr
.bdaddr
);
1574 rp
.addr
.type
= cp
->addr
.type
;
1576 if (!hdev_is_powered(hdev
)) {
1577 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_UNPAIR_DEVICE
,
1578 MGMT_STATUS_NOT_POWERED
, &rp
, sizeof(rp
));
1582 if (cp
->addr
.type
== BDADDR_BREDR
)
1583 err
= hci_remove_link_key(hdev
, &cp
->addr
.bdaddr
);
1585 err
= hci_remove_ltk(hdev
, &cp
->addr
.bdaddr
);
1588 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_UNPAIR_DEVICE
,
1589 MGMT_STATUS_NOT_PAIRED
, &rp
, sizeof(rp
));
1593 if (cp
->disconnect
) {
1594 if (cp
->addr
.type
== BDADDR_BREDR
)
1595 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
,
1598 conn
= hci_conn_hash_lookup_ba(hdev
, LE_LINK
,
1605 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_UNPAIR_DEVICE
, 0,
1607 device_unpaired(hdev
, &cp
->addr
.bdaddr
, cp
->addr
.type
, sk
);
1611 cmd
= mgmt_pending_add(sk
, MGMT_OP_UNPAIR_DEVICE
, hdev
, cp
,
1618 dc
.handle
= cpu_to_le16(conn
->handle
);
1619 dc
.reason
= 0x13; /* Remote User Terminated Connection */
1620 err
= hci_send_cmd(hdev
, HCI_OP_DISCONNECT
, sizeof(dc
), &dc
);
1622 mgmt_pending_remove(cmd
);
1625 hci_dev_unlock(hdev
);
1629 static int disconnect(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
1632 struct mgmt_cp_disconnect
*cp
= data
;
1633 struct hci_cp_disconnect dc
;
1634 struct pending_cmd
*cmd
;
1635 struct hci_conn
*conn
;
1642 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1643 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_DISCONNECT
,
1644 MGMT_STATUS_NOT_POWERED
);
1648 if (mgmt_pending_find(MGMT_OP_DISCONNECT
, hdev
)) {
1649 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_DISCONNECT
,
1654 if (cp
->addr
.type
== BDADDR_BREDR
)
1655 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
,
1658 conn
= hci_conn_hash_lookup_ba(hdev
, LE_LINK
, &cp
->addr
.bdaddr
);
1660 if (!conn
|| conn
->state
== BT_OPEN
|| conn
->state
== BT_CLOSED
) {
1661 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_DISCONNECT
,
1662 MGMT_STATUS_NOT_CONNECTED
);
1666 cmd
= mgmt_pending_add(sk
, MGMT_OP_DISCONNECT
, hdev
, data
, len
);
1672 dc
.handle
= cpu_to_le16(conn
->handle
);
1673 dc
.reason
= HCI_ERROR_REMOTE_USER_TERM
;
1675 err
= hci_send_cmd(hdev
, HCI_OP_DISCONNECT
, sizeof(dc
), &dc
);
1677 mgmt_pending_remove(cmd
);
1680 hci_dev_unlock(hdev
);
1684 static u8
link_to_bdaddr(u8 link_type
, u8 addr_type
)
1686 switch (link_type
) {
1688 switch (addr_type
) {
1689 case ADDR_LE_DEV_PUBLIC
:
1690 return BDADDR_LE_PUBLIC
;
1693 /* Fallback to LE Random address type */
1694 return BDADDR_LE_RANDOM
;
1698 /* Fallback to BR/EDR type */
1699 return BDADDR_BREDR
;
1703 static int get_connections(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
1706 struct mgmt_rp_get_connections
*rp
;
1716 if (!hdev_is_powered(hdev
)) {
1717 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_GET_CONNECTIONS
,
1718 MGMT_STATUS_NOT_POWERED
);
1723 list_for_each_entry(c
, &hdev
->conn_hash
.list
, list
) {
1724 if (test_bit(HCI_CONN_MGMT_CONNECTED
, &c
->flags
))
1728 rp_len
= sizeof(*rp
) + (i
* sizeof(struct mgmt_addr_info
));
1729 rp
= kmalloc(rp_len
, GFP_KERNEL
);
1736 list_for_each_entry(c
, &hdev
->conn_hash
.list
, list
) {
1737 if (!test_bit(HCI_CONN_MGMT_CONNECTED
, &c
->flags
))
1739 bacpy(&rp
->addr
[i
].bdaddr
, &c
->dst
);
1740 rp
->addr
[i
].type
= link_to_bdaddr(c
->type
, c
->dst_type
);
1741 if (c
->type
== SCO_LINK
|| c
->type
== ESCO_LINK
)
1746 rp
->conn_count
= cpu_to_le16(i
);
1748 /* Recalculate length in case of filtered SCO connections, etc */
1749 rp_len
= sizeof(*rp
) + (i
* sizeof(struct mgmt_addr_info
));
1751 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_GET_CONNECTIONS
, 0, rp
,
1757 hci_dev_unlock(hdev
);
1761 static int send_pin_code_neg_reply(struct sock
*sk
, struct hci_dev
*hdev
,
1762 struct mgmt_cp_pin_code_neg_reply
*cp
)
1764 struct pending_cmd
*cmd
;
1767 cmd
= mgmt_pending_add(sk
, MGMT_OP_PIN_CODE_NEG_REPLY
, hdev
, cp
,
1772 err
= hci_send_cmd(hdev
, HCI_OP_PIN_CODE_NEG_REPLY
,
1773 sizeof(cp
->addr
.bdaddr
), &cp
->addr
.bdaddr
);
1775 mgmt_pending_remove(cmd
);
1780 static int pin_code_reply(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
1783 struct hci_conn
*conn
;
1784 struct mgmt_cp_pin_code_reply
*cp
= data
;
1785 struct hci_cp_pin_code_reply reply
;
1786 struct pending_cmd
*cmd
;
1793 if (!hdev_is_powered(hdev
)) {
1794 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_PIN_CODE_REPLY
,
1795 MGMT_STATUS_NOT_POWERED
);
1799 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
, &cp
->addr
.bdaddr
);
1801 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_PIN_CODE_REPLY
,
1802 MGMT_STATUS_NOT_CONNECTED
);
1806 if (conn
->pending_sec_level
== BT_SECURITY_HIGH
&& cp
->pin_len
!= 16) {
1807 struct mgmt_cp_pin_code_neg_reply ncp
;
1809 memcpy(&ncp
.addr
, &cp
->addr
, sizeof(ncp
.addr
));
1811 BT_ERR("PIN code is not 16 bytes long");
1813 err
= send_pin_code_neg_reply(sk
, hdev
, &ncp
);
1815 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_PIN_CODE_REPLY
,
1816 MGMT_STATUS_INVALID_PARAMS
);
1821 cmd
= mgmt_pending_add(sk
, MGMT_OP_PIN_CODE_REPLY
, hdev
, data
, len
);
1827 bacpy(&reply
.bdaddr
, &cp
->addr
.bdaddr
);
1828 reply
.pin_len
= cp
->pin_len
;
1829 memcpy(reply
.pin_code
, cp
->pin_code
, sizeof(reply
.pin_code
));
1831 err
= hci_send_cmd(hdev
, HCI_OP_PIN_CODE_REPLY
, sizeof(reply
), &reply
);
1833 mgmt_pending_remove(cmd
);
1836 hci_dev_unlock(hdev
);
1840 static int set_io_capability(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
1843 struct mgmt_cp_set_io_capability
*cp
= data
;
1849 hdev
->io_capability
= cp
->io_capability
;
1851 BT_DBG("%s IO capability set to 0x%02x", hdev
->name
,
1852 hdev
->io_capability
);
1854 hci_dev_unlock(hdev
);
1856 return cmd_complete(sk
, hdev
->id
, MGMT_OP_SET_IO_CAPABILITY
, 0, NULL
,
1860 static struct pending_cmd
*find_pairing(struct hci_conn
*conn
)
1862 struct hci_dev
*hdev
= conn
->hdev
;
1863 struct pending_cmd
*cmd
;
1865 list_for_each_entry(cmd
, &hdev
->mgmt_pending
, list
) {
1866 if (cmd
->opcode
!= MGMT_OP_PAIR_DEVICE
)
1869 if (cmd
->user_data
!= conn
)
1878 static void pairing_complete(struct pending_cmd
*cmd
, u8 status
)
1880 struct mgmt_rp_pair_device rp
;
1881 struct hci_conn
*conn
= cmd
->user_data
;
1883 bacpy(&rp
.addr
.bdaddr
, &conn
->dst
);
1884 rp
.addr
.type
= link_to_bdaddr(conn
->type
, conn
->dst_type
);
1886 cmd_complete(cmd
->sk
, cmd
->index
, MGMT_OP_PAIR_DEVICE
, status
,
1889 /* So we don't get further callbacks for this connection */
1890 conn
->connect_cfm_cb
= NULL
;
1891 conn
->security_cfm_cb
= NULL
;
1892 conn
->disconn_cfm_cb
= NULL
;
1896 mgmt_pending_remove(cmd
);
1899 static void pairing_complete_cb(struct hci_conn
*conn
, u8 status
)
1901 struct pending_cmd
*cmd
;
1903 BT_DBG("status %u", status
);
1905 cmd
= find_pairing(conn
);
1907 BT_DBG("Unable to find a pending command");
1909 pairing_complete(cmd
, mgmt_status(status
));
1912 static void le_connect_complete_cb(struct hci_conn
*conn
, u8 status
)
1914 struct pending_cmd
*cmd
;
1916 BT_DBG("status %u", status
);
1921 cmd
= find_pairing(conn
);
1923 BT_DBG("Unable to find a pending command");
1925 pairing_complete(cmd
, mgmt_status(status
));
1928 static int pair_device(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
1931 struct mgmt_cp_pair_device
*cp
= data
;
1932 struct mgmt_rp_pair_device rp
;
1933 struct pending_cmd
*cmd
;
1934 u8 sec_level
, auth_type
;
1935 struct hci_conn
*conn
;
1942 if (!hdev_is_powered(hdev
)) {
1943 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_PAIR_DEVICE
,
1944 MGMT_STATUS_NOT_POWERED
);
1948 sec_level
= BT_SECURITY_MEDIUM
;
1949 if (cp
->io_cap
== 0x03)
1950 auth_type
= HCI_AT_DEDICATED_BONDING
;
1952 auth_type
= HCI_AT_DEDICATED_BONDING_MITM
;
1954 if (cp
->addr
.type
== BDADDR_BREDR
)
1955 conn
= hci_connect(hdev
, ACL_LINK
, &cp
->addr
.bdaddr
,
1956 cp
->addr
.type
, sec_level
, auth_type
);
1958 conn
= hci_connect(hdev
, LE_LINK
, &cp
->addr
.bdaddr
,
1959 cp
->addr
.type
, sec_level
, auth_type
);
1961 memset(&rp
, 0, sizeof(rp
));
1962 bacpy(&rp
.addr
.bdaddr
, &cp
->addr
.bdaddr
);
1963 rp
.addr
.type
= cp
->addr
.type
;
1968 if (PTR_ERR(conn
) == -EBUSY
)
1969 status
= MGMT_STATUS_BUSY
;
1971 status
= MGMT_STATUS_CONNECT_FAILED
;
1973 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_PAIR_DEVICE
,
1979 if (conn
->connect_cfm_cb
) {
1981 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_PAIR_DEVICE
,
1982 MGMT_STATUS_BUSY
, &rp
, sizeof(rp
));
1986 cmd
= mgmt_pending_add(sk
, MGMT_OP_PAIR_DEVICE
, hdev
, data
, len
);
1993 /* For LE, just connecting isn't a proof that the pairing finished */
1994 if (cp
->addr
.type
== BDADDR_BREDR
)
1995 conn
->connect_cfm_cb
= pairing_complete_cb
;
1997 conn
->connect_cfm_cb
= le_connect_complete_cb
;
1999 conn
->security_cfm_cb
= pairing_complete_cb
;
2000 conn
->disconn_cfm_cb
= pairing_complete_cb
;
2001 conn
->io_capability
= cp
->io_cap
;
2002 cmd
->user_data
= conn
;
2004 if (conn
->state
== BT_CONNECTED
&&
2005 hci_conn_security(conn
, sec_level
, auth_type
))
2006 pairing_complete(cmd
, 0);
2011 hci_dev_unlock(hdev
);
2015 static int cancel_pair_device(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
2018 struct mgmt_addr_info
*addr
= data
;
2019 struct pending_cmd
*cmd
;
2020 struct hci_conn
*conn
;
2027 if (!hdev_is_powered(hdev
)) {
2028 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_CANCEL_PAIR_DEVICE
,
2029 MGMT_STATUS_NOT_POWERED
);
2033 cmd
= mgmt_pending_find(MGMT_OP_PAIR_DEVICE
, hdev
);
2035 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_CANCEL_PAIR_DEVICE
,
2036 MGMT_STATUS_INVALID_PARAMS
);
2040 conn
= cmd
->user_data
;
2042 if (bacmp(&addr
->bdaddr
, &conn
->dst
) != 0) {
2043 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_CANCEL_PAIR_DEVICE
,
2044 MGMT_STATUS_INVALID_PARAMS
);
2048 pairing_complete(cmd
, MGMT_STATUS_CANCELLED
);
2050 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_CANCEL_PAIR_DEVICE
, 0,
2051 addr
, sizeof(*addr
));
2053 hci_dev_unlock(hdev
);
2057 static int user_pairing_resp(struct sock
*sk
, struct hci_dev
*hdev
,
2058 bdaddr_t
*bdaddr
, u8 type
, u16 mgmt_op
,
2059 u16 hci_op
, __le32 passkey
)
2061 struct pending_cmd
*cmd
;
2062 struct hci_conn
*conn
;
2067 if (!hdev_is_powered(hdev
)) {
2068 err
= cmd_status(sk
, hdev
->id
, mgmt_op
,
2069 MGMT_STATUS_NOT_POWERED
);
2073 if (type
== BDADDR_BREDR
)
2074 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
, bdaddr
);
2076 conn
= hci_conn_hash_lookup_ba(hdev
, LE_LINK
, bdaddr
);
2079 err
= cmd_status(sk
, hdev
->id
, mgmt_op
,
2080 MGMT_STATUS_NOT_CONNECTED
);
2084 if (type
== BDADDR_LE_PUBLIC
|| type
== BDADDR_LE_RANDOM
) {
2085 /* Continue with pairing via SMP */
2086 err
= smp_user_confirm_reply(conn
, mgmt_op
, passkey
);
2089 err
= cmd_status(sk
, hdev
->id
, mgmt_op
,
2090 MGMT_STATUS_SUCCESS
);
2092 err
= cmd_status(sk
, hdev
->id
, mgmt_op
,
2093 MGMT_STATUS_FAILED
);
2098 cmd
= mgmt_pending_add(sk
, mgmt_op
, hdev
, bdaddr
, sizeof(*bdaddr
));
2104 /* Continue with pairing via HCI */
2105 if (hci_op
== HCI_OP_USER_PASSKEY_REPLY
) {
2106 struct hci_cp_user_passkey_reply cp
;
2108 bacpy(&cp
.bdaddr
, bdaddr
);
2109 cp
.passkey
= passkey
;
2110 err
= hci_send_cmd(hdev
, hci_op
, sizeof(cp
), &cp
);
2112 err
= hci_send_cmd(hdev
, hci_op
, sizeof(*bdaddr
), bdaddr
);
2115 mgmt_pending_remove(cmd
);
2118 hci_dev_unlock(hdev
);
2122 static int pin_code_neg_reply(struct sock
*sk
, struct hci_dev
*hdev
,
2123 void *data
, u16 len
)
2125 struct mgmt_cp_pin_code_neg_reply
*cp
= data
;
2129 return user_pairing_resp(sk
, hdev
, &cp
->addr
.bdaddr
, cp
->addr
.type
,
2130 MGMT_OP_PIN_CODE_NEG_REPLY
,
2131 HCI_OP_PIN_CODE_NEG_REPLY
, 0);
2134 static int user_confirm_reply(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
2137 struct mgmt_cp_user_confirm_reply
*cp
= data
;
2141 if (len
!= sizeof(*cp
))
2142 return cmd_status(sk
, hdev
->id
, MGMT_OP_USER_CONFIRM_REPLY
,
2143 MGMT_STATUS_INVALID_PARAMS
);
2145 return user_pairing_resp(sk
, hdev
, &cp
->addr
.bdaddr
, cp
->addr
.type
,
2146 MGMT_OP_USER_CONFIRM_REPLY
,
2147 HCI_OP_USER_CONFIRM_REPLY
, 0);
2150 static int user_confirm_neg_reply(struct sock
*sk
, struct hci_dev
*hdev
,
2151 void *data
, u16 len
)
2153 struct mgmt_cp_user_confirm_neg_reply
*cp
= data
;
2157 return user_pairing_resp(sk
, hdev
, &cp
->addr
.bdaddr
, cp
->addr
.type
,
2158 MGMT_OP_USER_CONFIRM_NEG_REPLY
,
2159 HCI_OP_USER_CONFIRM_NEG_REPLY
, 0);
2162 static int user_passkey_reply(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
2165 struct mgmt_cp_user_passkey_reply
*cp
= data
;
2169 return user_pairing_resp(sk
, hdev
, &cp
->addr
.bdaddr
, cp
->addr
.type
,
2170 MGMT_OP_USER_PASSKEY_REPLY
,
2171 HCI_OP_USER_PASSKEY_REPLY
, cp
->passkey
);
2174 static int user_passkey_neg_reply(struct sock
*sk
, struct hci_dev
*hdev
,
2175 void *data
, u16 len
)
2177 struct mgmt_cp_user_passkey_neg_reply
*cp
= data
;
2181 return user_pairing_resp(sk
, hdev
, &cp
->addr
.bdaddr
, cp
->addr
.type
,
2182 MGMT_OP_USER_PASSKEY_NEG_REPLY
,
2183 HCI_OP_USER_PASSKEY_NEG_REPLY
, 0);
2186 static int update_name(struct hci_dev
*hdev
, const char *name
)
2188 struct hci_cp_write_local_name cp
;
2190 memcpy(cp
.name
, name
, sizeof(cp
.name
));
2192 return hci_send_cmd(hdev
, HCI_OP_WRITE_LOCAL_NAME
, sizeof(cp
), &cp
);
2195 static int set_local_name(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
2198 struct mgmt_cp_set_local_name
*cp
= data
;
2199 struct pending_cmd
*cmd
;
2206 memcpy(hdev
->short_name
, cp
->short_name
, sizeof(hdev
->short_name
));
2208 if (!hdev_is_powered(hdev
)) {
2209 memcpy(hdev
->dev_name
, cp
->name
, sizeof(hdev
->dev_name
));
2211 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_SET_LOCAL_NAME
, 0,
2216 err
= mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED
, hdev
, data
, len
,
2222 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_LOCAL_NAME
, hdev
, data
, len
);
2228 err
= update_name(hdev
, cp
->name
);
2230 mgmt_pending_remove(cmd
);
2233 hci_dev_unlock(hdev
);
2237 static int read_local_oob_data(struct sock
*sk
, struct hci_dev
*hdev
,
2238 void *data
, u16 data_len
)
2240 struct pending_cmd
*cmd
;
2243 BT_DBG("%s", hdev
->name
);
2247 if (!hdev_is_powered(hdev
)) {
2248 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_READ_LOCAL_OOB_DATA
,
2249 MGMT_STATUS_NOT_POWERED
);
2253 if (!lmp_ssp_capable(hdev
)) {
2254 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_READ_LOCAL_OOB_DATA
,
2255 MGMT_STATUS_NOT_SUPPORTED
);
2259 if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA
, hdev
)) {
2260 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_READ_LOCAL_OOB_DATA
,
2265 cmd
= mgmt_pending_add(sk
, MGMT_OP_READ_LOCAL_OOB_DATA
, hdev
, NULL
, 0);
2271 err
= hci_send_cmd(hdev
, HCI_OP_READ_LOCAL_OOB_DATA
, 0, NULL
);
2273 mgmt_pending_remove(cmd
);
2276 hci_dev_unlock(hdev
);
2280 static int add_remote_oob_data(struct sock
*sk
, struct hci_dev
*hdev
,
2281 void *data
, u16 len
)
2283 struct mgmt_cp_add_remote_oob_data
*cp
= data
;
2287 BT_DBG("%s ", hdev
->name
);
2291 err
= hci_add_remote_oob_data(hdev
, &cp
->addr
.bdaddr
, cp
->hash
,
2294 status
= MGMT_STATUS_FAILED
;
2296 status
= MGMT_STATUS_SUCCESS
;
2298 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_ADD_REMOTE_OOB_DATA
, status
,
2299 &cp
->addr
, sizeof(cp
->addr
));
2301 hci_dev_unlock(hdev
);
2305 static int remove_remote_oob_data(struct sock
*sk
, struct hci_dev
*hdev
,
2306 void *data
, u16 len
)
2308 struct mgmt_cp_remove_remote_oob_data
*cp
= data
;
2312 BT_DBG("%s", hdev
->name
);
2316 err
= hci_remove_remote_oob_data(hdev
, &cp
->addr
.bdaddr
);
2318 status
= MGMT_STATUS_INVALID_PARAMS
;
2320 status
= MGMT_STATUS_SUCCESS
;
2322 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
2323 status
, &cp
->addr
, sizeof(cp
->addr
));
2325 hci_dev_unlock(hdev
);
2329 int mgmt_interleaved_discovery(struct hci_dev
*hdev
)
2333 BT_DBG("%s", hdev
->name
);
2337 err
= hci_do_inquiry(hdev
, INQUIRY_LEN_BREDR_LE
);
2339 hci_discovery_set_state(hdev
, DISCOVERY_STOPPED
);
2341 hci_dev_unlock(hdev
);
2346 static int start_discovery(struct sock
*sk
, struct hci_dev
*hdev
,
2347 void *data
, u16 len
)
2349 struct mgmt_cp_start_discovery
*cp
= data
;
2350 struct pending_cmd
*cmd
;
2353 BT_DBG("%s", hdev
->name
);
2357 if (!hdev_is_powered(hdev
)) {
2358 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_START_DISCOVERY
,
2359 MGMT_STATUS_NOT_POWERED
);
2363 if (test_bit(HCI_PERIODIC_INQ
, &hdev
->dev_flags
)) {
2364 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_START_DISCOVERY
,
2369 if (hdev
->discovery
.state
!= DISCOVERY_STOPPED
) {
2370 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_START_DISCOVERY
,
2375 cmd
= mgmt_pending_add(sk
, MGMT_OP_START_DISCOVERY
, hdev
, NULL
, 0);
2381 hdev
->discovery
.type
= cp
->type
;
2383 switch (hdev
->discovery
.type
) {
2384 case DISCOV_TYPE_BREDR
:
2385 if (!lmp_bredr_capable(hdev
)) {
2386 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_START_DISCOVERY
,
2387 MGMT_STATUS_NOT_SUPPORTED
);
2388 mgmt_pending_remove(cmd
);
2392 err
= hci_do_inquiry(hdev
, INQUIRY_LEN_BREDR
);
2395 case DISCOV_TYPE_LE
:
2396 if (!lmp_host_le_capable(hdev
)) {
2397 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_START_DISCOVERY
,
2398 MGMT_STATUS_NOT_SUPPORTED
);
2399 mgmt_pending_remove(cmd
);
2403 err
= hci_le_scan(hdev
, LE_SCAN_TYPE
, LE_SCAN_INT
,
2404 LE_SCAN_WIN
, LE_SCAN_TIMEOUT_LE_ONLY
);
2407 case DISCOV_TYPE_INTERLEAVED
:
2408 if (!lmp_host_le_capable(hdev
) || !lmp_bredr_capable(hdev
)) {
2409 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_START_DISCOVERY
,
2410 MGMT_STATUS_NOT_SUPPORTED
);
2411 mgmt_pending_remove(cmd
);
2415 err
= hci_le_scan(hdev
, LE_SCAN_TYPE
, LE_SCAN_INT
, LE_SCAN_WIN
,
2416 LE_SCAN_TIMEOUT_BREDR_LE
);
2420 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_START_DISCOVERY
,
2421 MGMT_STATUS_INVALID_PARAMS
);
2422 mgmt_pending_remove(cmd
);
2427 mgmt_pending_remove(cmd
);
2429 hci_discovery_set_state(hdev
, DISCOVERY_STARTING
);
2432 hci_dev_unlock(hdev
);
2436 static int stop_discovery(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
2439 struct mgmt_cp_stop_discovery
*mgmt_cp
= data
;
2440 struct pending_cmd
*cmd
;
2441 struct hci_cp_remote_name_req_cancel cp
;
2442 struct inquiry_entry
*e
;
2445 BT_DBG("%s", hdev
->name
);
2449 if (!hci_discovery_active(hdev
)) {
2450 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_STOP_DISCOVERY
,
2451 MGMT_STATUS_REJECTED
, &mgmt_cp
->type
,
2452 sizeof(mgmt_cp
->type
));
2456 if (hdev
->discovery
.type
!= mgmt_cp
->type
) {
2457 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_STOP_DISCOVERY
,
2458 MGMT_STATUS_INVALID_PARAMS
, &mgmt_cp
->type
,
2459 sizeof(mgmt_cp
->type
));
2463 cmd
= mgmt_pending_add(sk
, MGMT_OP_STOP_DISCOVERY
, hdev
, NULL
, 0);
2469 switch (hdev
->discovery
.state
) {
2470 case DISCOVERY_FINDING
:
2471 if (test_bit(HCI_INQUIRY
, &hdev
->flags
))
2472 err
= hci_cancel_inquiry(hdev
);
2474 err
= hci_cancel_le_scan(hdev
);
2478 case DISCOVERY_RESOLVING
:
2479 e
= hci_inquiry_cache_lookup_resolve(hdev
, BDADDR_ANY
,
2482 mgmt_pending_remove(cmd
);
2483 err
= cmd_complete(sk
, hdev
->id
,
2484 MGMT_OP_STOP_DISCOVERY
, 0,
2486 sizeof(mgmt_cp
->type
));
2487 hci_discovery_set_state(hdev
, DISCOVERY_STOPPED
);
2491 bacpy(&cp
.bdaddr
, &e
->data
.bdaddr
);
2492 err
= hci_send_cmd(hdev
, HCI_OP_REMOTE_NAME_REQ_CANCEL
,
2498 BT_DBG("unknown discovery state %u", hdev
->discovery
.state
);
2503 mgmt_pending_remove(cmd
);
2505 hci_discovery_set_state(hdev
, DISCOVERY_STOPPING
);
2508 hci_dev_unlock(hdev
);
2512 static int confirm_name(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
2515 struct mgmt_cp_confirm_name
*cp
= data
;
2516 struct inquiry_entry
*e
;
2519 BT_DBG("%s", hdev
->name
);
2523 if (!hci_discovery_active(hdev
)) {
2524 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_CONFIRM_NAME
,
2525 MGMT_STATUS_FAILED
);
2529 e
= hci_inquiry_cache_lookup_unknown(hdev
, &cp
->addr
.bdaddr
);
2531 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_CONFIRM_NAME
,
2532 MGMT_STATUS_INVALID_PARAMS
);
2536 if (cp
->name_known
) {
2537 e
->name_state
= NAME_KNOWN
;
2540 e
->name_state
= NAME_NEEDED
;
2541 hci_inquiry_cache_update_resolve(hdev
, e
);
2544 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_CONFIRM_NAME
, 0, &cp
->addr
,
2548 hci_dev_unlock(hdev
);
2552 static int block_device(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
2555 struct mgmt_cp_block_device
*cp
= data
;
2559 BT_DBG("%s", hdev
->name
);
2563 err
= hci_blacklist_add(hdev
, &cp
->addr
.bdaddr
, cp
->addr
.type
);
2565 status
= MGMT_STATUS_FAILED
;
2567 status
= MGMT_STATUS_SUCCESS
;
2569 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_BLOCK_DEVICE
, status
,
2570 &cp
->addr
, sizeof(cp
->addr
));
2572 hci_dev_unlock(hdev
);
2577 static int unblock_device(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
2580 struct mgmt_cp_unblock_device
*cp
= data
;
2584 BT_DBG("%s", hdev
->name
);
2588 err
= hci_blacklist_del(hdev
, &cp
->addr
.bdaddr
, cp
->addr
.type
);
2590 status
= MGMT_STATUS_INVALID_PARAMS
;
2592 status
= MGMT_STATUS_SUCCESS
;
2594 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_UNBLOCK_DEVICE
, status
,
2595 &cp
->addr
, sizeof(cp
->addr
));
2597 hci_dev_unlock(hdev
);
2602 static int set_device_id(struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
2605 struct mgmt_cp_set_device_id
*cp
= data
;
2609 BT_DBG("%s", hdev
->name
);
2611 source
= __le16_to_cpu(cp
->source
);
2613 if (source
> 0x0002)
2614 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_DEVICE_ID
,
2615 MGMT_STATUS_INVALID_PARAMS
);
2619 hdev
->devid_source
= source
;
2620 hdev
->devid_vendor
= __le16_to_cpu(cp
->vendor
);
2621 hdev
->devid_product
= __le16_to_cpu(cp
->product
);
2622 hdev
->devid_version
= __le16_to_cpu(cp
->version
);
2624 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_SET_DEVICE_ID
, 0, NULL
, 0);
2628 hci_dev_unlock(hdev
);
2633 static int set_fast_connectable(struct sock
*sk
, struct hci_dev
*hdev
,
2634 void *data
, u16 len
)
2636 struct mgmt_mode
*cp
= data
;
2637 struct hci_cp_write_page_scan_activity acp
;
2641 BT_DBG("%s", hdev
->name
);
2643 if (!lmp_bredr_capable(hdev
))
2644 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_FAST_CONNECTABLE
,
2645 MGMT_STATUS_NOT_SUPPORTED
);
2647 if (cp
->val
!= 0x00 && cp
->val
!= 0x01)
2648 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_FAST_CONNECTABLE
,
2649 MGMT_STATUS_INVALID_PARAMS
);
2651 if (!hdev_is_powered(hdev
))
2652 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_FAST_CONNECTABLE
,
2653 MGMT_STATUS_NOT_POWERED
);
2655 if (!test_bit(HCI_CONNECTABLE
, &hdev
->dev_flags
))
2656 return cmd_status(sk
, hdev
->id
, MGMT_OP_SET_FAST_CONNECTABLE
,
2657 MGMT_STATUS_REJECTED
);
2662 type
= PAGE_SCAN_TYPE_INTERLACED
;
2664 /* 160 msec page scan interval */
2665 acp
.interval
= __constant_cpu_to_le16(0x0100);
2667 type
= PAGE_SCAN_TYPE_STANDARD
; /* default */
2669 /* default 1.28 sec page scan */
2670 acp
.interval
= __constant_cpu_to_le16(0x0800);
2673 /* default 11.25 msec page scan window */
2674 acp
.window
= __constant_cpu_to_le16(0x0012);
2676 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY
, sizeof(acp
),
2679 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_SET_FAST_CONNECTABLE
,
2680 MGMT_STATUS_FAILED
);
2684 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_PAGE_SCAN_TYPE
, 1, &type
);
2686 err
= cmd_status(sk
, hdev
->id
, MGMT_OP_SET_FAST_CONNECTABLE
,
2687 MGMT_STATUS_FAILED
);
2691 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_SET_FAST_CONNECTABLE
, 0,
2694 hci_dev_unlock(hdev
);
2698 static int load_long_term_keys(struct sock
*sk
, struct hci_dev
*hdev
,
2699 void *cp_data
, u16 len
)
2701 struct mgmt_cp_load_long_term_keys
*cp
= cp_data
;
2702 u16 key_count
, expected_len
;
2705 key_count
= __le16_to_cpu(cp
->key_count
);
2707 expected_len
= sizeof(*cp
) + key_count
*
2708 sizeof(struct mgmt_ltk_info
);
2709 if (expected_len
!= len
) {
2710 BT_ERR("load_keys: expected %u bytes, got %u bytes",
2712 return cmd_status(sk
, hdev
->id
, MGMT_OP_LOAD_LONG_TERM_KEYS
,
2716 BT_DBG("%s key_count %u", hdev
->name
, key_count
);
2720 hci_smp_ltks_clear(hdev
);
2722 for (i
= 0; i
< key_count
; i
++) {
2723 struct mgmt_ltk_info
*key
= &cp
->keys
[i
];
2729 type
= HCI_SMP_LTK_SLAVE
;
2731 hci_add_ltk(hdev
, &key
->addr
.bdaddr
,
2732 bdaddr_to_le(key
->addr
.type
),
2733 type
, 0, key
->authenticated
, key
->val
,
2734 key
->enc_size
, key
->ediv
, key
->rand
);
2737 err
= cmd_complete(sk
, hdev
->id
, MGMT_OP_LOAD_LONG_TERM_KEYS
, 0,
2740 hci_dev_unlock(hdev
);
2745 static const struct mgmt_handler
{
2746 int (*func
) (struct sock
*sk
, struct hci_dev
*hdev
, void *data
,
2750 } mgmt_handlers
[] = {
2751 { NULL
}, /* 0x0000 (no command) */
2752 { read_version
, false, MGMT_READ_VERSION_SIZE
},
2753 { read_commands
, false, MGMT_READ_COMMANDS_SIZE
},
2754 { read_index_list
, false, MGMT_READ_INDEX_LIST_SIZE
},
2755 { read_controller_info
, false, MGMT_READ_INFO_SIZE
},
2756 { set_powered
, false, MGMT_SETTING_SIZE
},
2757 { set_discoverable
, false, MGMT_SET_DISCOVERABLE_SIZE
},
2758 { set_connectable
, false, MGMT_SETTING_SIZE
},
2759 { set_fast_connectable
, false, MGMT_SETTING_SIZE
},
2760 { set_pairable
, false, MGMT_SETTING_SIZE
},
2761 { set_link_security
, false, MGMT_SETTING_SIZE
},
2762 { set_ssp
, false, MGMT_SETTING_SIZE
},
2763 { set_hs
, false, MGMT_SETTING_SIZE
},
2764 { set_le
, false, MGMT_SETTING_SIZE
},
2765 { set_dev_class
, false, MGMT_SET_DEV_CLASS_SIZE
},
2766 { set_local_name
, false, MGMT_SET_LOCAL_NAME_SIZE
},
2767 { add_uuid
, false, MGMT_ADD_UUID_SIZE
},
2768 { remove_uuid
, false, MGMT_REMOVE_UUID_SIZE
},
2769 { load_link_keys
, true, MGMT_LOAD_LINK_KEYS_SIZE
},
2770 { load_long_term_keys
, true, MGMT_LOAD_LONG_TERM_KEYS_SIZE
},
2771 { disconnect
, false, MGMT_DISCONNECT_SIZE
},
2772 { get_connections
, false, MGMT_GET_CONNECTIONS_SIZE
},
2773 { pin_code_reply
, false, MGMT_PIN_CODE_REPLY_SIZE
},
2774 { pin_code_neg_reply
, false, MGMT_PIN_CODE_NEG_REPLY_SIZE
},
2775 { set_io_capability
, false, MGMT_SET_IO_CAPABILITY_SIZE
},
2776 { pair_device
, false, MGMT_PAIR_DEVICE_SIZE
},
2777 { cancel_pair_device
, false, MGMT_CANCEL_PAIR_DEVICE_SIZE
},
2778 { unpair_device
, false, MGMT_UNPAIR_DEVICE_SIZE
},
2779 { user_confirm_reply
, false, MGMT_USER_CONFIRM_REPLY_SIZE
},
2780 { user_confirm_neg_reply
, false, MGMT_USER_CONFIRM_NEG_REPLY_SIZE
},
2781 { user_passkey_reply
, false, MGMT_USER_PASSKEY_REPLY_SIZE
},
2782 { user_passkey_neg_reply
, false, MGMT_USER_PASSKEY_NEG_REPLY_SIZE
},
2783 { read_local_oob_data
, false, MGMT_READ_LOCAL_OOB_DATA_SIZE
},
2784 { add_remote_oob_data
, false, MGMT_ADD_REMOTE_OOB_DATA_SIZE
},
2785 { remove_remote_oob_data
, false, MGMT_REMOVE_REMOTE_OOB_DATA_SIZE
},
2786 { start_discovery
, false, MGMT_START_DISCOVERY_SIZE
},
2787 { stop_discovery
, false, MGMT_STOP_DISCOVERY_SIZE
},
2788 { confirm_name
, false, MGMT_CONFIRM_NAME_SIZE
},
2789 { block_device
, false, MGMT_BLOCK_DEVICE_SIZE
},
2790 { unblock_device
, false, MGMT_UNBLOCK_DEVICE_SIZE
},
2791 { set_device_id
, false, MGMT_SET_DEVICE_ID_SIZE
},
2795 int mgmt_control(struct sock
*sk
, struct msghdr
*msg
, size_t msglen
)
2799 struct mgmt_hdr
*hdr
;
2800 u16 opcode
, index
, len
;
2801 struct hci_dev
*hdev
= NULL
;
2802 const struct mgmt_handler
*handler
;
2805 BT_DBG("got %zu bytes", msglen
);
2807 if (msglen
< sizeof(*hdr
))
2810 buf
= kmalloc(msglen
, GFP_KERNEL
);
2814 if (memcpy_fromiovec(buf
, msg
->msg_iov
, msglen
)) {
2820 opcode
= __le16_to_cpu(hdr
->opcode
);
2821 index
= __le16_to_cpu(hdr
->index
);
2822 len
= __le16_to_cpu(hdr
->len
);
2824 if (len
!= msglen
- sizeof(*hdr
)) {
2829 if (index
!= MGMT_INDEX_NONE
) {
2830 hdev
= hci_dev_get(index
);
2832 err
= cmd_status(sk
, index
, opcode
,
2833 MGMT_STATUS_INVALID_INDEX
);
2838 if (opcode
>= ARRAY_SIZE(mgmt_handlers
) ||
2839 mgmt_handlers
[opcode
].func
== NULL
) {
2840 BT_DBG("Unknown op %u", opcode
);
2841 err
= cmd_status(sk
, index
, opcode
,
2842 MGMT_STATUS_UNKNOWN_COMMAND
);
2846 if ((hdev
&& opcode
< MGMT_OP_READ_INFO
) ||
2847 (!hdev
&& opcode
>= MGMT_OP_READ_INFO
)) {
2848 err
= cmd_status(sk
, index
, opcode
,
2849 MGMT_STATUS_INVALID_INDEX
);
2853 handler
= &mgmt_handlers
[opcode
];
2855 if ((handler
->var_len
&& len
< handler
->data_len
) ||
2856 (!handler
->var_len
&& len
!= handler
->data_len
)) {
2857 err
= cmd_status(sk
, index
, opcode
,
2858 MGMT_STATUS_INVALID_PARAMS
);
2863 mgmt_init_hdev(sk
, hdev
);
2865 cp
= buf
+ sizeof(*hdr
);
2867 err
= handler
->func(sk
, hdev
, cp
, len
);
2881 static void cmd_status_rsp(struct pending_cmd
*cmd
, void *data
)
2885 cmd_status(cmd
->sk
, cmd
->index
, cmd
->opcode
, *status
);
2886 mgmt_pending_remove(cmd
);
2889 int mgmt_index_added(struct hci_dev
*hdev
)
2891 if (!mgmt_valid_hdev(hdev
))
2894 return mgmt_event(MGMT_EV_INDEX_ADDED
, hdev
, NULL
, 0, NULL
);
2897 int mgmt_index_removed(struct hci_dev
*hdev
)
2899 u8 status
= MGMT_STATUS_INVALID_INDEX
;
2901 if (!mgmt_valid_hdev(hdev
))
2904 mgmt_pending_foreach(0, hdev
, cmd_status_rsp
, &status
);
2906 return mgmt_event(MGMT_EV_INDEX_REMOVED
, hdev
, NULL
, 0, NULL
);
2911 struct hci_dev
*hdev
;
2915 static void settings_rsp(struct pending_cmd
*cmd
, void *data
)
2917 struct cmd_lookup
*match
= data
;
2919 send_settings_rsp(cmd
->sk
, cmd
->opcode
, match
->hdev
);
2921 list_del(&cmd
->list
);
2923 if (match
->sk
== NULL
) {
2924 match
->sk
= cmd
->sk
;
2925 sock_hold(match
->sk
);
2928 mgmt_pending_free(cmd
);
2931 static int set_bredr_scan(struct hci_dev
*hdev
)
2935 if (test_bit(HCI_CONNECTABLE
, &hdev
->dev_flags
))
2937 if (test_bit(HCI_DISCOVERABLE
, &hdev
->dev_flags
))
2938 scan
|= SCAN_INQUIRY
;
2943 return hci_send_cmd(hdev
, HCI_OP_WRITE_SCAN_ENABLE
, 1, &scan
);
2946 int mgmt_powered(struct hci_dev
*hdev
, u8 powered
)
2948 struct cmd_lookup match
= { NULL
, hdev
};
2951 if (!test_bit(HCI_MGMT
, &hdev
->dev_flags
))
2954 mgmt_pending_foreach(MGMT_OP_SET_POWERED
, hdev
, settings_rsp
, &match
);
2957 if (test_bit(HCI_SSP_ENABLED
, &hdev
->dev_flags
) &&
2958 !lmp_host_ssp_capable(hdev
)) {
2961 hci_send_cmd(hdev
, HCI_OP_WRITE_SSP_MODE
, 1, &ssp
);
2964 if (test_bit(HCI_LE_ENABLED
, &hdev
->dev_flags
)) {
2965 struct hci_cp_write_le_host_supported cp
;
2968 cp
.simul
= lmp_le_br_capable(hdev
);
2970 /* Check first if we already have the right
2971 * host state (host features set)
2973 if (cp
.le
!= lmp_host_le_capable(hdev
) ||
2974 cp
.simul
!= lmp_host_le_br_capable(hdev
))
2976 HCI_OP_WRITE_LE_HOST_SUPPORTED
,
2980 if (lmp_bredr_capable(hdev
)) {
2981 set_bredr_scan(hdev
);
2983 update_name(hdev
, hdev
->dev_name
);
2987 u8 status
= MGMT_STATUS_NOT_POWERED
;
2988 mgmt_pending_foreach(0, hdev
, cmd_status_rsp
, &status
);
2991 err
= new_settings(hdev
, match
.sk
);
2999 int mgmt_discoverable(struct hci_dev
*hdev
, u8 discoverable
)
3001 struct cmd_lookup match
= { NULL
, hdev
};
3002 bool changed
= false;
3006 if (!test_and_set_bit(HCI_DISCOVERABLE
, &hdev
->dev_flags
))
3009 if (test_and_clear_bit(HCI_DISCOVERABLE
, &hdev
->dev_flags
))
3013 mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE
, hdev
, settings_rsp
,
3017 err
= new_settings(hdev
, match
.sk
);
3025 int mgmt_connectable(struct hci_dev
*hdev
, u8 connectable
)
3027 struct cmd_lookup match
= { NULL
, hdev
};
3028 bool changed
= false;
3032 if (!test_and_set_bit(HCI_CONNECTABLE
, &hdev
->dev_flags
))
3035 if (test_and_clear_bit(HCI_CONNECTABLE
, &hdev
->dev_flags
))
3039 mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE
, hdev
, settings_rsp
,
3043 err
= new_settings(hdev
, match
.sk
);
3051 int mgmt_write_scan_failed(struct hci_dev
*hdev
, u8 scan
, u8 status
)
3053 u8 mgmt_err
= mgmt_status(status
);
3055 if (scan
& SCAN_PAGE
)
3056 mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE
, hdev
,
3057 cmd_status_rsp
, &mgmt_err
);
3059 if (scan
& SCAN_INQUIRY
)
3060 mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE
, hdev
,
3061 cmd_status_rsp
, &mgmt_err
);
3066 int mgmt_new_link_key(struct hci_dev
*hdev
, struct link_key
*key
,
3069 struct mgmt_ev_new_link_key ev
;
3071 memset(&ev
, 0, sizeof(ev
));
3073 ev
.store_hint
= persistent
;
3074 bacpy(&ev
.key
.addr
.bdaddr
, &key
->bdaddr
);
3075 ev
.key
.addr
.type
= BDADDR_BREDR
;
3076 ev
.key
.type
= key
->type
;
3077 memcpy(ev
.key
.val
, key
->val
, HCI_LINK_KEY_SIZE
);
3078 ev
.key
.pin_len
= key
->pin_len
;
3080 return mgmt_event(MGMT_EV_NEW_LINK_KEY
, hdev
, &ev
, sizeof(ev
), NULL
);
3083 int mgmt_new_ltk(struct hci_dev
*hdev
, struct smp_ltk
*key
, u8 persistent
)
3085 struct mgmt_ev_new_long_term_key ev
;
3087 memset(&ev
, 0, sizeof(ev
));
3089 ev
.store_hint
= persistent
;
3090 bacpy(&ev
.key
.addr
.bdaddr
, &key
->bdaddr
);
3091 ev
.key
.addr
.type
= link_to_bdaddr(LE_LINK
, key
->bdaddr_type
);
3092 ev
.key
.authenticated
= key
->authenticated
;
3093 ev
.key
.enc_size
= key
->enc_size
;
3094 ev
.key
.ediv
= key
->ediv
;
3096 if (key
->type
== HCI_SMP_LTK
)
3099 memcpy(ev
.key
.rand
, key
->rand
, sizeof(key
->rand
));
3100 memcpy(ev
.key
.val
, key
->val
, sizeof(key
->val
));
3102 return mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY
, hdev
, &ev
, sizeof(ev
),
3106 int mgmt_device_connected(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
3107 u8 addr_type
, u32 flags
, u8
*name
, u8 name_len
,
3111 struct mgmt_ev_device_connected
*ev
= (void *) buf
;
3114 bacpy(&ev
->addr
.bdaddr
, bdaddr
);
3115 ev
->addr
.type
= link_to_bdaddr(link_type
, addr_type
);
3117 ev
->flags
= __cpu_to_le32(flags
);
3120 eir_len
= eir_append_data(ev
->eir
, 0, EIR_NAME_COMPLETE
,
3123 if (dev_class
&& memcmp(dev_class
, "\0\0\0", 3) != 0)
3124 eir_len
= eir_append_data(ev
->eir
, eir_len
,
3125 EIR_CLASS_OF_DEV
, dev_class
, 3);
3127 ev
->eir_len
= cpu_to_le16(eir_len
);
3129 return mgmt_event(MGMT_EV_DEVICE_CONNECTED
, hdev
, buf
,
3130 sizeof(*ev
) + eir_len
, NULL
);
3133 static void disconnect_rsp(struct pending_cmd
*cmd
, void *data
)
3135 struct mgmt_cp_disconnect
*cp
= cmd
->param
;
3136 struct sock
**sk
= data
;
3137 struct mgmt_rp_disconnect rp
;
3139 bacpy(&rp
.addr
.bdaddr
, &cp
->addr
.bdaddr
);
3140 rp
.addr
.type
= cp
->addr
.type
;
3142 cmd_complete(cmd
->sk
, cmd
->index
, MGMT_OP_DISCONNECT
, 0, &rp
,
3148 mgmt_pending_remove(cmd
);
3151 static void unpair_device_rsp(struct pending_cmd
*cmd
, void *data
)
3153 struct hci_dev
*hdev
= data
;
3154 struct mgmt_cp_unpair_device
*cp
= cmd
->param
;
3155 struct mgmt_rp_unpair_device rp
;
3157 memset(&rp
, 0, sizeof(rp
));
3158 bacpy(&rp
.addr
.bdaddr
, &cp
->addr
.bdaddr
);
3159 rp
.addr
.type
= cp
->addr
.type
;
3161 device_unpaired(hdev
, &cp
->addr
.bdaddr
, cp
->addr
.type
, cmd
->sk
);
3163 cmd_complete(cmd
->sk
, cmd
->index
, cmd
->opcode
, 0, &rp
, sizeof(rp
));
3165 mgmt_pending_remove(cmd
);
3168 int mgmt_device_disconnected(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3169 u8 link_type
, u8 addr_type
, u8 reason
)
3171 struct mgmt_ev_device_disconnected ev
;
3172 struct sock
*sk
= NULL
;
3175 mgmt_pending_foreach(MGMT_OP_DISCONNECT
, hdev
, disconnect_rsp
, &sk
);
3177 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3178 ev
.addr
.type
= link_to_bdaddr(link_type
, addr_type
);
3181 err
= mgmt_event(MGMT_EV_DEVICE_DISCONNECTED
, hdev
, &ev
, sizeof(ev
),
3187 mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE
, hdev
, unpair_device_rsp
,
3193 int mgmt_disconnect_failed(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3194 u8 link_type
, u8 addr_type
, u8 status
)
3196 struct mgmt_rp_disconnect rp
;
3197 struct pending_cmd
*cmd
;
3200 mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE
, hdev
, unpair_device_rsp
,
3203 cmd
= mgmt_pending_find(MGMT_OP_DISCONNECT
, hdev
);
3207 bacpy(&rp
.addr
.bdaddr
, bdaddr
);
3208 rp
.addr
.type
= link_to_bdaddr(link_type
, addr_type
);
3210 err
= cmd_complete(cmd
->sk
, cmd
->index
, MGMT_OP_DISCONNECT
,
3211 mgmt_status(status
), &rp
, sizeof(rp
));
3213 mgmt_pending_remove(cmd
);
3218 int mgmt_connect_failed(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
3219 u8 addr_type
, u8 status
)
3221 struct mgmt_ev_connect_failed ev
;
3223 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3224 ev
.addr
.type
= link_to_bdaddr(link_type
, addr_type
);
3225 ev
.status
= mgmt_status(status
);
3227 return mgmt_event(MGMT_EV_CONNECT_FAILED
, hdev
, &ev
, sizeof(ev
), NULL
);
3230 int mgmt_pin_code_request(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 secure
)
3232 struct mgmt_ev_pin_code_request ev
;
3234 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3235 ev
.addr
.type
= BDADDR_BREDR
;
3238 return mgmt_event(MGMT_EV_PIN_CODE_REQUEST
, hdev
, &ev
, sizeof(ev
),
3242 int mgmt_pin_code_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3245 struct pending_cmd
*cmd
;
3246 struct mgmt_rp_pin_code_reply rp
;
3249 cmd
= mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY
, hdev
);
3253 bacpy(&rp
.addr
.bdaddr
, bdaddr
);
3254 rp
.addr
.type
= BDADDR_BREDR
;
3256 err
= cmd_complete(cmd
->sk
, hdev
->id
, MGMT_OP_PIN_CODE_REPLY
,
3257 mgmt_status(status
), &rp
, sizeof(rp
));
3259 mgmt_pending_remove(cmd
);
3264 int mgmt_pin_code_neg_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3267 struct pending_cmd
*cmd
;
3268 struct mgmt_rp_pin_code_reply rp
;
3271 cmd
= mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY
, hdev
);
3275 bacpy(&rp
.addr
.bdaddr
, bdaddr
);
3276 rp
.addr
.type
= BDADDR_BREDR
;
3278 err
= cmd_complete(cmd
->sk
, hdev
->id
, MGMT_OP_PIN_CODE_NEG_REPLY
,
3279 mgmt_status(status
), &rp
, sizeof(rp
));
3281 mgmt_pending_remove(cmd
);
3286 int mgmt_user_confirm_request(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3287 u8 link_type
, u8 addr_type
, __le32 value
,
3290 struct mgmt_ev_user_confirm_request ev
;
3292 BT_DBG("%s", hdev
->name
);
3294 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3295 ev
.addr
.type
= link_to_bdaddr(link_type
, addr_type
);
3296 ev
.confirm_hint
= confirm_hint
;
3299 return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST
, hdev
, &ev
, sizeof(ev
),
3303 int mgmt_user_passkey_request(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3304 u8 link_type
, u8 addr_type
)
3306 struct mgmt_ev_user_passkey_request ev
;
3308 BT_DBG("%s", hdev
->name
);
3310 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3311 ev
.addr
.type
= link_to_bdaddr(link_type
, addr_type
);
3313 return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST
, hdev
, &ev
, sizeof(ev
),
3317 static int user_pairing_resp_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3318 u8 link_type
, u8 addr_type
, u8 status
,
3321 struct pending_cmd
*cmd
;
3322 struct mgmt_rp_user_confirm_reply rp
;
3325 cmd
= mgmt_pending_find(opcode
, hdev
);
3329 bacpy(&rp
.addr
.bdaddr
, bdaddr
);
3330 rp
.addr
.type
= link_to_bdaddr(link_type
, addr_type
);
3331 err
= cmd_complete(cmd
->sk
, hdev
->id
, opcode
, mgmt_status(status
),
3334 mgmt_pending_remove(cmd
);
3339 int mgmt_user_confirm_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3340 u8 link_type
, u8 addr_type
, u8 status
)
3342 return user_pairing_resp_complete(hdev
, bdaddr
, link_type
, addr_type
,
3343 status
, MGMT_OP_USER_CONFIRM_REPLY
);
3346 int mgmt_user_confirm_neg_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3347 u8 link_type
, u8 addr_type
, u8 status
)
3349 return user_pairing_resp_complete(hdev
, bdaddr
, link_type
, addr_type
,
3351 MGMT_OP_USER_CONFIRM_NEG_REPLY
);
3354 int mgmt_user_passkey_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3355 u8 link_type
, u8 addr_type
, u8 status
)
3357 return user_pairing_resp_complete(hdev
, bdaddr
, link_type
, addr_type
,
3358 status
, MGMT_OP_USER_PASSKEY_REPLY
);
3361 int mgmt_user_passkey_neg_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3362 u8 link_type
, u8 addr_type
, u8 status
)
3364 return user_pairing_resp_complete(hdev
, bdaddr
, link_type
, addr_type
,
3366 MGMT_OP_USER_PASSKEY_NEG_REPLY
);
3369 int mgmt_user_passkey_notify(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3370 u8 link_type
, u8 addr_type
, u32 passkey
,
3373 struct mgmt_ev_passkey_notify ev
;
3375 BT_DBG("%s", hdev
->name
);
3377 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3378 ev
.addr
.type
= link_to_bdaddr(link_type
, addr_type
);
3379 ev
.passkey
= __cpu_to_le32(passkey
);
3380 ev
.entered
= entered
;
3382 return mgmt_event(MGMT_EV_PASSKEY_NOTIFY
, hdev
, &ev
, sizeof(ev
), NULL
);
3385 int mgmt_auth_failed(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
3386 u8 addr_type
, u8 status
)
3388 struct mgmt_ev_auth_failed ev
;
3390 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3391 ev
.addr
.type
= link_to_bdaddr(link_type
, addr_type
);
3392 ev
.status
= mgmt_status(status
);
3394 return mgmt_event(MGMT_EV_AUTH_FAILED
, hdev
, &ev
, sizeof(ev
), NULL
);
3397 int mgmt_auth_enable_complete(struct hci_dev
*hdev
, u8 status
)
3399 struct cmd_lookup match
= { NULL
, hdev
};
3400 bool changed
= false;
3404 u8 mgmt_err
= mgmt_status(status
);
3405 mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY
, hdev
,
3406 cmd_status_rsp
, &mgmt_err
);
3410 if (test_bit(HCI_AUTH
, &hdev
->flags
)) {
3411 if (!test_and_set_bit(HCI_LINK_SECURITY
, &hdev
->dev_flags
))
3414 if (test_and_clear_bit(HCI_LINK_SECURITY
, &hdev
->dev_flags
))
3418 mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY
, hdev
, settings_rsp
,
3422 err
= new_settings(hdev
, match
.sk
);
3430 static int clear_eir(struct hci_dev
*hdev
)
3432 struct hci_cp_write_eir cp
;
3434 if (!lmp_ext_inq_capable(hdev
))
3437 memset(hdev
->eir
, 0, sizeof(hdev
->eir
));
3439 memset(&cp
, 0, sizeof(cp
));
3441 return hci_send_cmd(hdev
, HCI_OP_WRITE_EIR
, sizeof(cp
), &cp
);
3444 int mgmt_ssp_enable_complete(struct hci_dev
*hdev
, u8 enable
, u8 status
)
3446 struct cmd_lookup match
= { NULL
, hdev
};
3447 bool changed
= false;
3451 u8 mgmt_err
= mgmt_status(status
);
3453 if (enable
&& test_and_clear_bit(HCI_SSP_ENABLED
,
3455 err
= new_settings(hdev
, NULL
);
3457 mgmt_pending_foreach(MGMT_OP_SET_SSP
, hdev
, cmd_status_rsp
,
3464 if (!test_and_set_bit(HCI_SSP_ENABLED
, &hdev
->dev_flags
))
3467 if (test_and_clear_bit(HCI_SSP_ENABLED
, &hdev
->dev_flags
))
3471 mgmt_pending_foreach(MGMT_OP_SET_SSP
, hdev
, settings_rsp
, &match
);
3474 err
= new_settings(hdev
, match
.sk
);
3479 if (test_bit(HCI_SSP_ENABLED
, &hdev
->dev_flags
))
3487 static void class_rsp(struct pending_cmd
*cmd
, void *data
)
3489 struct cmd_lookup
*match
= data
;
3491 cmd_complete(cmd
->sk
, cmd
->index
, cmd
->opcode
, match
->mgmt_status
,
3492 match
->hdev
->dev_class
, 3);
3494 list_del(&cmd
->list
);
3496 if (match
->sk
== NULL
) {
3497 match
->sk
= cmd
->sk
;
3498 sock_hold(match
->sk
);
3501 mgmt_pending_free(cmd
);
3504 int mgmt_set_class_of_dev_complete(struct hci_dev
*hdev
, u8
*dev_class
,
3507 struct cmd_lookup match
= { NULL
, hdev
, mgmt_status(status
) };
3510 clear_bit(HCI_PENDING_CLASS
, &hdev
->dev_flags
);
3512 mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS
, hdev
, class_rsp
, &match
);
3513 mgmt_pending_foreach(MGMT_OP_ADD_UUID
, hdev
, class_rsp
, &match
);
3514 mgmt_pending_foreach(MGMT_OP_REMOVE_UUID
, hdev
, class_rsp
, &match
);
3517 err
= mgmt_event(MGMT_EV_CLASS_OF_DEV_CHANGED
, hdev
, dev_class
,
3526 int mgmt_set_local_name_complete(struct hci_dev
*hdev
, u8
*name
, u8 status
)
3528 struct pending_cmd
*cmd
;
3529 struct mgmt_cp_set_local_name ev
;
3530 bool changed
= false;
3533 if (memcmp(name
, hdev
->dev_name
, sizeof(hdev
->dev_name
)) != 0) {
3534 memcpy(hdev
->dev_name
, name
, sizeof(hdev
->dev_name
));
3538 memset(&ev
, 0, sizeof(ev
));
3539 memcpy(ev
.name
, name
, HCI_MAX_NAME_LENGTH
);
3540 memcpy(ev
.short_name
, hdev
->short_name
, HCI_MAX_SHORT_NAME_LENGTH
);
3542 cmd
= mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME
, hdev
);
3546 /* Always assume that either the short or the complete name has
3547 * changed if there was a pending mgmt command */
3551 err
= cmd_status(cmd
->sk
, hdev
->id
, MGMT_OP_SET_LOCAL_NAME
,
3552 mgmt_status(status
));
3556 err
= cmd_complete(cmd
->sk
, hdev
->id
, MGMT_OP_SET_LOCAL_NAME
, 0, &ev
,
3563 err
= mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED
, hdev
, &ev
,
3564 sizeof(ev
), cmd
? cmd
->sk
: NULL
);
3566 /* EIR is taken care of separately when powering on the
3567 * adapter so only update them here if this is a name change
3568 * unrelated to power on.
3570 if (!test_bit(HCI_INIT
, &hdev
->flags
))
3575 mgmt_pending_remove(cmd
);
3579 int mgmt_read_local_oob_data_reply_complete(struct hci_dev
*hdev
, u8
*hash
,
3580 u8
*randomizer
, u8 status
)
3582 struct pending_cmd
*cmd
;
3585 BT_DBG("%s status %u", hdev
->name
, status
);
3587 cmd
= mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA
, hdev
);
3592 err
= cmd_status(cmd
->sk
, hdev
->id
, MGMT_OP_READ_LOCAL_OOB_DATA
,
3593 mgmt_status(status
));
3595 struct mgmt_rp_read_local_oob_data rp
;
3597 memcpy(rp
.hash
, hash
, sizeof(rp
.hash
));
3598 memcpy(rp
.randomizer
, randomizer
, sizeof(rp
.randomizer
));
3600 err
= cmd_complete(cmd
->sk
, hdev
->id
,
3601 MGMT_OP_READ_LOCAL_OOB_DATA
, 0, &rp
,
3605 mgmt_pending_remove(cmd
);
3610 int mgmt_le_enable_complete(struct hci_dev
*hdev
, u8 enable
, u8 status
)
3612 struct cmd_lookup match
= { NULL
, hdev
};
3613 bool changed
= false;
3617 u8 mgmt_err
= mgmt_status(status
);
3619 if (enable
&& test_and_clear_bit(HCI_LE_ENABLED
,
3621 err
= new_settings(hdev
, NULL
);
3623 mgmt_pending_foreach(MGMT_OP_SET_LE
, hdev
, cmd_status_rsp
,
3630 if (!test_and_set_bit(HCI_LE_ENABLED
, &hdev
->dev_flags
))
3633 if (test_and_clear_bit(HCI_LE_ENABLED
, &hdev
->dev_flags
))
3637 mgmt_pending_foreach(MGMT_OP_SET_LE
, hdev
, settings_rsp
, &match
);
3640 err
= new_settings(hdev
, match
.sk
);
3648 int mgmt_device_found(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
3649 u8 addr_type
, u8
*dev_class
, s8 rssi
, u8 cfm_name
, u8
3650 ssp
, u8
*eir
, u16 eir_len
)
3653 struct mgmt_ev_device_found
*ev
= (void *) buf
;
3656 /* Leave 5 bytes for a potential CoD field */
3657 if (sizeof(*ev
) + eir_len
+ 5 > sizeof(buf
))
3660 memset(buf
, 0, sizeof(buf
));
3662 bacpy(&ev
->addr
.bdaddr
, bdaddr
);
3663 ev
->addr
.type
= link_to_bdaddr(link_type
, addr_type
);
3666 ev
->flags
|= __constant_cpu_to_le32(MGMT_DEV_FOUND_CONFIRM_NAME
);
3668 ev
->flags
|= __constant_cpu_to_le32(MGMT_DEV_FOUND_LEGACY_PAIRING
);
3671 memcpy(ev
->eir
, eir
, eir_len
);
3673 if (dev_class
&& !eir_has_data_type(ev
->eir
, eir_len
, EIR_CLASS_OF_DEV
))
3674 eir_len
= eir_append_data(ev
->eir
, eir_len
, EIR_CLASS_OF_DEV
,
3677 ev
->eir_len
= cpu_to_le16(eir_len
);
3678 ev_size
= sizeof(*ev
) + eir_len
;
3680 return mgmt_event(MGMT_EV_DEVICE_FOUND
, hdev
, ev
, ev_size
, NULL
);
3683 int mgmt_remote_name(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
3684 u8 addr_type
, s8 rssi
, u8
*name
, u8 name_len
)
3686 struct mgmt_ev_device_found
*ev
;
3687 char buf
[sizeof(*ev
) + HCI_MAX_NAME_LENGTH
+ 2];
3690 ev
= (struct mgmt_ev_device_found
*) buf
;
3692 memset(buf
, 0, sizeof(buf
));
3694 bacpy(&ev
->addr
.bdaddr
, bdaddr
);
3695 ev
->addr
.type
= link_to_bdaddr(link_type
, addr_type
);
3698 eir_len
= eir_append_data(ev
->eir
, 0, EIR_NAME_COMPLETE
, name
,
3701 ev
->eir_len
= cpu_to_le16(eir_len
);
3703 return mgmt_event(MGMT_EV_DEVICE_FOUND
, hdev
, ev
,
3704 sizeof(*ev
) + eir_len
, NULL
);
3707 int mgmt_start_discovery_failed(struct hci_dev
*hdev
, u8 status
)
3709 struct pending_cmd
*cmd
;
3713 hci_discovery_set_state(hdev
, DISCOVERY_STOPPED
);
3715 cmd
= mgmt_pending_find(MGMT_OP_START_DISCOVERY
, hdev
);
3719 type
= hdev
->discovery
.type
;
3721 err
= cmd_complete(cmd
->sk
, hdev
->id
, cmd
->opcode
, mgmt_status(status
),
3722 &type
, sizeof(type
));
3723 mgmt_pending_remove(cmd
);
3728 int mgmt_stop_discovery_failed(struct hci_dev
*hdev
, u8 status
)
3730 struct pending_cmd
*cmd
;
3733 cmd
= mgmt_pending_find(MGMT_OP_STOP_DISCOVERY
, hdev
);
3737 err
= cmd_complete(cmd
->sk
, hdev
->id
, cmd
->opcode
, mgmt_status(status
),
3738 &hdev
->discovery
.type
, sizeof(hdev
->discovery
.type
));
3739 mgmt_pending_remove(cmd
);
3744 int mgmt_discovering(struct hci_dev
*hdev
, u8 discovering
)
3746 struct mgmt_ev_discovering ev
;
3747 struct pending_cmd
*cmd
;
3749 BT_DBG("%s discovering %u", hdev
->name
, discovering
);
3752 cmd
= mgmt_pending_find(MGMT_OP_START_DISCOVERY
, hdev
);
3754 cmd
= mgmt_pending_find(MGMT_OP_STOP_DISCOVERY
, hdev
);
3757 u8 type
= hdev
->discovery
.type
;
3759 cmd_complete(cmd
->sk
, hdev
->id
, cmd
->opcode
, 0, &type
,
3761 mgmt_pending_remove(cmd
);
3764 memset(&ev
, 0, sizeof(ev
));
3765 ev
.type
= hdev
->discovery
.type
;
3766 ev
.discovering
= discovering
;
3768 return mgmt_event(MGMT_EV_DISCOVERING
, hdev
, &ev
, sizeof(ev
), NULL
);
3771 int mgmt_device_blocked(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 type
)
3773 struct pending_cmd
*cmd
;
3774 struct mgmt_ev_device_blocked ev
;
3776 cmd
= mgmt_pending_find(MGMT_OP_BLOCK_DEVICE
, hdev
);
3778 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3779 ev
.addr
.type
= type
;
3781 return mgmt_event(MGMT_EV_DEVICE_BLOCKED
, hdev
, &ev
, sizeof(ev
),
3782 cmd
? cmd
->sk
: NULL
);
3785 int mgmt_device_unblocked(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 type
)
3787 struct pending_cmd
*cmd
;
3788 struct mgmt_ev_device_unblocked ev
;
3790 cmd
= mgmt_pending_find(MGMT_OP_UNBLOCK_DEVICE
, hdev
);
3792 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3793 ev
.addr
.type
= type
;
3795 return mgmt_event(MGMT_EV_DEVICE_UNBLOCKED
, hdev
, &ev
, sizeof(ev
),
3796 cmd
? cmd
->sk
: NULL
);
3799 module_param(enable_hs
, bool, 0644);
3800 MODULE_PARM_DESC(enable_hs
, "Enable High Speed support");