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/kernel.h>
28 #include <linux/uaccess.h>
29 #include <linux/module.h>
30 #include <asm/unaligned.h>
32 #include <net/bluetooth/bluetooth.h>
33 #include <net/bluetooth/hci_core.h>
34 #include <net/bluetooth/mgmt.h>
35 #include <net/bluetooth/smp.h>
40 #define MGMT_VERSION 1
41 #define MGMT_REVISION 0
43 static const u16 mgmt_commands
[] = {
44 MGMT_OP_READ_INDEX_LIST
,
47 MGMT_OP_SET_DISCOVERABLE
,
48 MGMT_OP_SET_CONNECTABLE
,
49 MGMT_OP_SET_FAST_CONNECTABLE
,
51 MGMT_OP_SET_LINK_SECURITY
,
55 MGMT_OP_SET_DEV_CLASS
,
56 MGMT_OP_SET_LOCAL_NAME
,
59 MGMT_OP_LOAD_LINK_KEYS
,
60 MGMT_OP_LOAD_LONG_TERM_KEYS
,
62 MGMT_OP_GET_CONNECTIONS
,
63 MGMT_OP_PIN_CODE_REPLY
,
64 MGMT_OP_PIN_CODE_NEG_REPLY
,
65 MGMT_OP_SET_IO_CAPABILITY
,
67 MGMT_OP_CANCEL_PAIR_DEVICE
,
68 MGMT_OP_UNPAIR_DEVICE
,
69 MGMT_OP_USER_CONFIRM_REPLY
,
70 MGMT_OP_USER_CONFIRM_NEG_REPLY
,
71 MGMT_OP_USER_PASSKEY_REPLY
,
72 MGMT_OP_USER_PASSKEY_NEG_REPLY
,
73 MGMT_OP_READ_LOCAL_OOB_DATA
,
74 MGMT_OP_ADD_REMOTE_OOB_DATA
,
75 MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
76 MGMT_OP_START_DISCOVERY
,
77 MGMT_OP_STOP_DISCOVERY
,
80 MGMT_OP_UNBLOCK_DEVICE
,
83 static const u16 mgmt_events
[] = {
84 MGMT_EV_CONTROLLER_ERROR
,
86 MGMT_EV_INDEX_REMOVED
,
88 MGMT_EV_CLASS_OF_DEV_CHANGED
,
89 MGMT_EV_LOCAL_NAME_CHANGED
,
91 MGMT_EV_NEW_LONG_TERM_KEY
,
92 MGMT_EV_DEVICE_CONNECTED
,
93 MGMT_EV_DEVICE_DISCONNECTED
,
94 MGMT_EV_CONNECT_FAILED
,
95 MGMT_EV_PIN_CODE_REQUEST
,
96 MGMT_EV_USER_CONFIRM_REQUEST
,
97 MGMT_EV_USER_PASSKEY_REQUEST
,
101 MGMT_EV_DEVICE_BLOCKED
,
102 MGMT_EV_DEVICE_UNBLOCKED
,
103 MGMT_EV_DEVICE_UNPAIRED
,
107 * These LE scan and inquiry parameters were chosen according to LE General
108 * Discovery Procedure specification.
110 #define LE_SCAN_TYPE 0x01
111 #define LE_SCAN_WIN 0x12
112 #define LE_SCAN_INT 0x12
113 #define LE_SCAN_TIMEOUT_LE_ONLY 10240 /* TGAP(gen_disc_scan_min) */
114 #define LE_SCAN_TIMEOUT_BREDR_LE 5120 /* TGAP(100)/2 */
116 #define INQUIRY_LEN_BREDR 0x08 /* TGAP(100) */
117 #define INQUIRY_LEN_BREDR_LE 0x04 /* TGAP(100)/2 */
119 #define SERVICE_CACHE_TIMEOUT (5 * 1000)
121 #define hdev_is_powered(hdev) (test_bit(HCI_UP, &hdev->flags) && \
122 !test_bit(HCI_AUTO_OFF, &hdev->dev_flags))
125 struct list_head list
;
133 /* HCI to MGMT error code conversion table */
134 static u8 mgmt_status_table
[] = {
136 MGMT_STATUS_UNKNOWN_COMMAND
, /* Unknown Command */
137 MGMT_STATUS_NOT_CONNECTED
, /* No Connection */
138 MGMT_STATUS_FAILED
, /* Hardware Failure */
139 MGMT_STATUS_CONNECT_FAILED
, /* Page Timeout */
140 MGMT_STATUS_AUTH_FAILED
, /* Authentication Failed */
141 MGMT_STATUS_NOT_PAIRED
, /* PIN or Key Missing */
142 MGMT_STATUS_NO_RESOURCES
, /* Memory Full */
143 MGMT_STATUS_TIMEOUT
, /* Connection Timeout */
144 MGMT_STATUS_NO_RESOURCES
, /* Max Number of Connections */
145 MGMT_STATUS_NO_RESOURCES
, /* Max Number of SCO Connections */
146 MGMT_STATUS_ALREADY_CONNECTED
, /* ACL Connection Exists */
147 MGMT_STATUS_BUSY
, /* Command Disallowed */
148 MGMT_STATUS_NO_RESOURCES
, /* Rejected Limited Resources */
149 MGMT_STATUS_REJECTED
, /* Rejected Security */
150 MGMT_STATUS_REJECTED
, /* Rejected Personal */
151 MGMT_STATUS_TIMEOUT
, /* Host Timeout */
152 MGMT_STATUS_NOT_SUPPORTED
, /* Unsupported Feature */
153 MGMT_STATUS_INVALID_PARAMS
, /* Invalid Parameters */
154 MGMT_STATUS_DISCONNECTED
, /* OE User Ended Connection */
155 MGMT_STATUS_NO_RESOURCES
, /* OE Low Resources */
156 MGMT_STATUS_DISCONNECTED
, /* OE Power Off */
157 MGMT_STATUS_DISCONNECTED
, /* Connection Terminated */
158 MGMT_STATUS_BUSY
, /* Repeated Attempts */
159 MGMT_STATUS_REJECTED
, /* Pairing Not Allowed */
160 MGMT_STATUS_FAILED
, /* Unknown LMP PDU */
161 MGMT_STATUS_NOT_SUPPORTED
, /* Unsupported Remote Feature */
162 MGMT_STATUS_REJECTED
, /* SCO Offset Rejected */
163 MGMT_STATUS_REJECTED
, /* SCO Interval Rejected */
164 MGMT_STATUS_REJECTED
, /* Air Mode Rejected */
165 MGMT_STATUS_INVALID_PARAMS
, /* Invalid LMP Parameters */
166 MGMT_STATUS_FAILED
, /* Unspecified Error */
167 MGMT_STATUS_NOT_SUPPORTED
, /* Unsupported LMP Parameter Value */
168 MGMT_STATUS_FAILED
, /* Role Change Not Allowed */
169 MGMT_STATUS_TIMEOUT
, /* LMP Response Timeout */
170 MGMT_STATUS_FAILED
, /* LMP Error Transaction Collision */
171 MGMT_STATUS_FAILED
, /* LMP PDU Not Allowed */
172 MGMT_STATUS_REJECTED
, /* Encryption Mode Not Accepted */
173 MGMT_STATUS_FAILED
, /* Unit Link Key Used */
174 MGMT_STATUS_NOT_SUPPORTED
, /* QoS Not Supported */
175 MGMT_STATUS_TIMEOUT
, /* Instant Passed */
176 MGMT_STATUS_NOT_SUPPORTED
, /* Pairing Not Supported */
177 MGMT_STATUS_FAILED
, /* Transaction Collision */
178 MGMT_STATUS_INVALID_PARAMS
, /* Unacceptable Parameter */
179 MGMT_STATUS_REJECTED
, /* QoS Rejected */
180 MGMT_STATUS_NOT_SUPPORTED
, /* Classification Not Supported */
181 MGMT_STATUS_REJECTED
, /* Insufficient Security */
182 MGMT_STATUS_INVALID_PARAMS
, /* Parameter Out Of Range */
183 MGMT_STATUS_BUSY
, /* Role Switch Pending */
184 MGMT_STATUS_FAILED
, /* Slot Violation */
185 MGMT_STATUS_FAILED
, /* Role Switch Failed */
186 MGMT_STATUS_INVALID_PARAMS
, /* EIR Too Large */
187 MGMT_STATUS_NOT_SUPPORTED
, /* Simple Pairing Not Supported */
188 MGMT_STATUS_BUSY
, /* Host Busy Pairing */
189 MGMT_STATUS_REJECTED
, /* Rejected, No Suitable Channel */
190 MGMT_STATUS_BUSY
, /* Controller Busy */
191 MGMT_STATUS_INVALID_PARAMS
, /* Unsuitable Connection Interval */
192 MGMT_STATUS_TIMEOUT
, /* Directed Advertising Timeout */
193 MGMT_STATUS_AUTH_FAILED
, /* Terminated Due to MIC Failure */
194 MGMT_STATUS_CONNECT_FAILED
, /* Connection Establishment Failed */
195 MGMT_STATUS_CONNECT_FAILED
, /* MAC Connection Failed */
198 static u8
mgmt_status(u8 hci_status
)
200 if (hci_status
< ARRAY_SIZE(mgmt_status_table
))
201 return mgmt_status_table
[hci_status
];
203 return MGMT_STATUS_FAILED
;
206 static int cmd_status(struct sock
*sk
, u16 index
, u16 cmd
, u8 status
)
209 struct mgmt_hdr
*hdr
;
210 struct mgmt_ev_cmd_status
*ev
;
213 BT_DBG("sock %p, index %u, cmd %u, status %u", sk
, index
, cmd
, status
);
215 skb
= alloc_skb(sizeof(*hdr
) + sizeof(*ev
), GFP_ATOMIC
);
219 hdr
= (void *) skb_put(skb
, sizeof(*hdr
));
221 hdr
->opcode
= cpu_to_le16(MGMT_EV_CMD_STATUS
);
222 hdr
->index
= cpu_to_le16(index
);
223 hdr
->len
= cpu_to_le16(sizeof(*ev
));
225 ev
= (void *) skb_put(skb
, sizeof(*ev
));
227 put_unaligned_le16(cmd
, &ev
->opcode
);
229 err
= sock_queue_rcv_skb(sk
, skb
);
236 static int cmd_complete(struct sock
*sk
, u16 index
, u16 cmd
, u8 status
,
237 void *rp
, size_t rp_len
)
240 struct mgmt_hdr
*hdr
;
241 struct mgmt_ev_cmd_complete
*ev
;
244 BT_DBG("sock %p", sk
);
246 skb
= alloc_skb(sizeof(*hdr
) + sizeof(*ev
) + rp_len
, GFP_ATOMIC
);
250 hdr
= (void *) skb_put(skb
, sizeof(*hdr
));
252 hdr
->opcode
= cpu_to_le16(MGMT_EV_CMD_COMPLETE
);
253 hdr
->index
= cpu_to_le16(index
);
254 hdr
->len
= cpu_to_le16(sizeof(*ev
) + rp_len
);
256 ev
= (void *) skb_put(skb
, sizeof(*ev
) + rp_len
);
257 put_unaligned_le16(cmd
, &ev
->opcode
);
261 memcpy(ev
->data
, rp
, rp_len
);
263 err
= sock_queue_rcv_skb(sk
, skb
);
270 static int read_version(struct sock
*sk
)
272 struct mgmt_rp_read_version rp
;
274 BT_DBG("sock %p", sk
);
276 rp
.version
= MGMT_VERSION
;
277 put_unaligned_le16(MGMT_REVISION
, &rp
.revision
);
279 return cmd_complete(sk
, MGMT_INDEX_NONE
, MGMT_OP_READ_VERSION
, 0, &rp
,
283 static int read_commands(struct sock
*sk
)
285 struct mgmt_rp_read_commands
*rp
;
286 u16 num_commands
= ARRAY_SIZE(mgmt_commands
);
287 u16 num_events
= ARRAY_SIZE(mgmt_events
);
292 BT_DBG("sock %p", sk
);
294 rp_size
= sizeof(*rp
) + ((num_commands
+ num_events
) * sizeof(u16
));
296 rp
= kmalloc(rp_size
, GFP_KERNEL
);
300 put_unaligned_le16(num_commands
, &rp
->num_commands
);
301 put_unaligned_le16(num_events
, &rp
->num_events
);
303 for (i
= 0, opcode
= rp
->opcodes
; i
< num_commands
; i
++, opcode
++)
304 put_unaligned_le16(mgmt_commands
[i
], opcode
);
306 for (i
= 0; i
< num_events
; i
++, opcode
++)
307 put_unaligned_le16(mgmt_events
[i
], opcode
);
309 err
= cmd_complete(sk
, MGMT_INDEX_NONE
, MGMT_OP_READ_COMMANDS
, 0, rp
,
316 static int read_index_list(struct sock
*sk
)
318 struct mgmt_rp_read_index_list
*rp
;
325 BT_DBG("sock %p", sk
);
327 read_lock(&hci_dev_list_lock
);
330 list_for_each(p
, &hci_dev_list
) {
334 rp_len
= sizeof(*rp
) + (2 * count
);
335 rp
= kmalloc(rp_len
, GFP_ATOMIC
);
337 read_unlock(&hci_dev_list_lock
);
341 put_unaligned_le16(count
, &rp
->num_controllers
);
344 list_for_each_entry(d
, &hci_dev_list
, list
) {
345 if (test_bit(HCI_SETUP
, &d
->dev_flags
))
348 put_unaligned_le16(d
->id
, &rp
->index
[i
++]);
349 BT_DBG("Added hci%u", d
->id
);
352 read_unlock(&hci_dev_list_lock
);
354 err
= cmd_complete(sk
, MGMT_INDEX_NONE
, MGMT_OP_READ_INDEX_LIST
, 0, rp
,
362 static u32
get_supported_settings(struct hci_dev
*hdev
)
366 settings
|= MGMT_SETTING_POWERED
;
367 settings
|= MGMT_SETTING_CONNECTABLE
;
368 settings
|= MGMT_SETTING_FAST_CONNECTABLE
;
369 settings
|= MGMT_SETTING_DISCOVERABLE
;
370 settings
|= MGMT_SETTING_PAIRABLE
;
372 if (hdev
->features
[6] & LMP_SIMPLE_PAIR
)
373 settings
|= MGMT_SETTING_SSP
;
375 if (!(hdev
->features
[4] & LMP_NO_BREDR
)) {
376 settings
|= MGMT_SETTING_BREDR
;
377 settings
|= MGMT_SETTING_LINK_SECURITY
;
381 settings
|= MGMT_SETTING_HS
;
384 if (hdev
->features
[4] & LMP_LE
)
385 settings
|= MGMT_SETTING_LE
;
391 static u32
get_current_settings(struct hci_dev
*hdev
)
395 if (hdev_is_powered(hdev
))
396 settings
|= MGMT_SETTING_POWERED
;
398 if (test_bit(HCI_CONNECTABLE
, &hdev
->dev_flags
))
399 settings
|= MGMT_SETTING_CONNECTABLE
;
401 if (test_bit(HCI_DISCOVERABLE
, &hdev
->dev_flags
))
402 settings
|= MGMT_SETTING_DISCOVERABLE
;
404 if (test_bit(HCI_PAIRABLE
, &hdev
->dev_flags
))
405 settings
|= MGMT_SETTING_PAIRABLE
;
407 if (!(hdev
->features
[4] & LMP_NO_BREDR
))
408 settings
|= MGMT_SETTING_BREDR
;
410 if (test_bit(HCI_LE_ENABLED
, &hdev
->dev_flags
))
411 settings
|= MGMT_SETTING_LE
;
413 if (test_bit(HCI_LINK_SECURITY
, &hdev
->dev_flags
))
414 settings
|= MGMT_SETTING_LINK_SECURITY
;
416 if (test_bit(HCI_SSP_ENABLED
, &hdev
->dev_flags
))
417 settings
|= MGMT_SETTING_SSP
;
419 if (test_bit(HCI_HS_ENABLED
, &hdev
->dev_flags
))
420 settings
|= MGMT_SETTING_HS
;
425 #define PNP_INFO_SVCLASS_ID 0x1200
427 static u8 bluetooth_base_uuid
[] = {
428 0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80,
429 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
432 static u16
get_uuid16(u8
*uuid128
)
437 for (i
= 0; i
< 12; i
++) {
438 if (bluetooth_base_uuid
[i
] != uuid128
[i
])
442 memcpy(&val
, &uuid128
[12], 4);
444 val
= le32_to_cpu(val
);
451 static void create_eir(struct hci_dev
*hdev
, u8
*data
)
455 u16 uuid16_list
[HCI_MAX_EIR_LENGTH
/ sizeof(u16
)];
456 int i
, truncated
= 0;
457 struct bt_uuid
*uuid
;
460 name_len
= strlen(hdev
->dev_name
);
466 ptr
[1] = EIR_NAME_SHORT
;
468 ptr
[1] = EIR_NAME_COMPLETE
;
470 /* EIR Data length */
471 ptr
[0] = name_len
+ 1;
473 memcpy(ptr
+ 2, hdev
->dev_name
, name_len
);
475 eir_len
+= (name_len
+ 2);
476 ptr
+= (name_len
+ 2);
479 memset(uuid16_list
, 0, sizeof(uuid16_list
));
481 /* Group all UUID16 types */
482 list_for_each_entry(uuid
, &hdev
->uuids
, list
) {
485 uuid16
= get_uuid16(uuid
->uuid
);
492 if (uuid16
== PNP_INFO_SVCLASS_ID
)
495 /* Stop if not enough space to put next UUID */
496 if (eir_len
+ 2 + sizeof(u16
) > HCI_MAX_EIR_LENGTH
) {
501 /* Check for duplicates */
502 for (i
= 0; uuid16_list
[i
] != 0; i
++)
503 if (uuid16_list
[i
] == uuid16
)
506 if (uuid16_list
[i
] == 0) {
507 uuid16_list
[i
] = uuid16
;
508 eir_len
+= sizeof(u16
);
512 if (uuid16_list
[0] != 0) {
516 ptr
[1] = truncated
? EIR_UUID16_SOME
: EIR_UUID16_ALL
;
521 for (i
= 0; uuid16_list
[i
] != 0; i
++) {
522 *ptr
++ = (uuid16_list
[i
] & 0x00ff);
523 *ptr
++ = (uuid16_list
[i
] & 0xff00) >> 8;
526 /* EIR Data length */
527 *length
= (i
* sizeof(u16
)) + 1;
531 static int update_eir(struct hci_dev
*hdev
)
533 struct hci_cp_write_eir cp
;
535 if (!(hdev
->features
[6] & LMP_EXT_INQ
))
538 if (!test_bit(HCI_SSP_ENABLED
, &hdev
->dev_flags
))
541 if (test_bit(HCI_SERVICE_CACHE
, &hdev
->dev_flags
))
544 memset(&cp
, 0, sizeof(cp
));
546 create_eir(hdev
, cp
.data
);
548 if (memcmp(cp
.data
, hdev
->eir
, sizeof(cp
.data
)) == 0)
551 memcpy(hdev
->eir
, cp
.data
, sizeof(cp
.data
));
553 return hci_send_cmd(hdev
, HCI_OP_WRITE_EIR
, sizeof(cp
), &cp
);
556 static u8
get_service_classes(struct hci_dev
*hdev
)
558 struct bt_uuid
*uuid
;
561 list_for_each_entry(uuid
, &hdev
->uuids
, list
)
562 val
|= uuid
->svc_hint
;
567 static int update_class(struct hci_dev
*hdev
)
571 BT_DBG("%s", hdev
->name
);
573 if (test_bit(HCI_SERVICE_CACHE
, &hdev
->dev_flags
))
576 cod
[0] = hdev
->minor_class
;
577 cod
[1] = hdev
->major_class
;
578 cod
[2] = get_service_classes(hdev
);
580 if (memcmp(cod
, hdev
->dev_class
, 3) == 0)
583 return hci_send_cmd(hdev
, HCI_OP_WRITE_CLASS_OF_DEV
, sizeof(cod
), cod
);
586 static void service_cache_off(struct work_struct
*work
)
588 struct hci_dev
*hdev
= container_of(work
, struct hci_dev
,
591 if (!test_and_clear_bit(HCI_SERVICE_CACHE
, &hdev
->dev_flags
))
599 hci_dev_unlock(hdev
);
602 static void mgmt_init_hdev(struct hci_dev
*hdev
)
604 if (!test_and_set_bit(HCI_MGMT
, &hdev
->dev_flags
)) {
605 INIT_DELAYED_WORK(&hdev
->service_cache
, service_cache_off
);
607 /* Non-mgmt controlled devices get this bit set
608 * implicitly so that pairing works for them, however
609 * for mgmt we require user-space to explicitly enable
612 clear_bit(HCI_PAIRABLE
, &hdev
->dev_flags
);
615 if (!test_and_set_bit(HCI_SERVICE_CACHE
, &hdev
->dev_flags
))
616 schedule_delayed_work(&hdev
->service_cache
,
617 msecs_to_jiffies(SERVICE_CACHE_TIMEOUT
));
620 static int read_controller_info(struct sock
*sk
, u16 index
)
622 struct mgmt_rp_read_info rp
;
623 struct hci_dev
*hdev
;
625 BT_DBG("sock %p hci%u", sk
, index
);
627 hdev
= hci_dev_get(index
);
629 return cmd_status(sk
, index
, MGMT_OP_READ_INFO
,
630 MGMT_STATUS_INVALID_PARAMS
);
634 if (test_and_clear_bit(HCI_PI_MGMT_INIT
, &hci_pi(sk
)->flags
))
635 mgmt_init_hdev(hdev
);
637 memset(&rp
, 0, sizeof(rp
));
639 bacpy(&rp
.bdaddr
, &hdev
->bdaddr
);
641 rp
.version
= hdev
->hci_ver
;
643 put_unaligned_le16(hdev
->manufacturer
, &rp
.manufacturer
);
645 rp
.supported_settings
= cpu_to_le32(get_supported_settings(hdev
));
646 rp
.current_settings
= cpu_to_le32(get_current_settings(hdev
));
648 memcpy(rp
.dev_class
, hdev
->dev_class
, 3);
650 memcpy(rp
.name
, hdev
->dev_name
, sizeof(hdev
->dev_name
));
652 hci_dev_unlock(hdev
);
655 return cmd_complete(sk
, index
, MGMT_OP_READ_INFO
, 0, &rp
, sizeof(rp
));
658 static void mgmt_pending_free(struct pending_cmd
*cmd
)
665 static struct pending_cmd
*mgmt_pending_add(struct sock
*sk
, u16 opcode
,
666 struct hci_dev
*hdev
,
669 struct pending_cmd
*cmd
;
671 cmd
= kmalloc(sizeof(*cmd
), GFP_ATOMIC
);
675 cmd
->opcode
= opcode
;
676 cmd
->index
= hdev
->id
;
678 cmd
->param
= kmalloc(len
, GFP_ATOMIC
);
685 memcpy(cmd
->param
, data
, len
);
690 list_add(&cmd
->list
, &hdev
->mgmt_pending
);
695 static void mgmt_pending_foreach(u16 opcode
, struct hci_dev
*hdev
,
696 void (*cb
)(struct pending_cmd
*cmd
, void *data
),
699 struct list_head
*p
, *n
;
701 list_for_each_safe(p
, n
, &hdev
->mgmt_pending
) {
702 struct pending_cmd
*cmd
;
704 cmd
= list_entry(p
, struct pending_cmd
, list
);
706 if (opcode
> 0 && cmd
->opcode
!= opcode
)
713 static struct pending_cmd
*mgmt_pending_find(u16 opcode
, struct hci_dev
*hdev
)
715 struct pending_cmd
*cmd
;
717 list_for_each_entry(cmd
, &hdev
->mgmt_pending
, list
) {
718 if (cmd
->opcode
== opcode
)
725 static void mgmt_pending_remove(struct pending_cmd
*cmd
)
727 list_del(&cmd
->list
);
728 mgmt_pending_free(cmd
);
731 static int send_settings_rsp(struct sock
*sk
, u16 opcode
, struct hci_dev
*hdev
)
733 __le32 settings
= cpu_to_le32(get_current_settings(hdev
));
735 return cmd_complete(sk
, hdev
->id
, opcode
, 0, &settings
,
739 static int set_powered(struct sock
*sk
, u16 index
, void *data
, u16 len
)
741 struct mgmt_mode
*cp
= data
;
742 struct hci_dev
*hdev
;
743 struct pending_cmd
*cmd
;
746 BT_DBG("request for hci%u", index
);
748 if (len
!= sizeof(*cp
))
749 return cmd_status(sk
, index
, MGMT_OP_SET_POWERED
,
750 MGMT_STATUS_INVALID_PARAMS
);
752 hdev
= hci_dev_get(index
);
754 return cmd_status(sk
, index
, MGMT_OP_SET_POWERED
,
755 MGMT_STATUS_INVALID_PARAMS
);
759 if (test_and_clear_bit(HCI_AUTO_OFF
, &hdev
->dev_flags
)) {
760 cancel_delayed_work(&hdev
->power_off
);
763 err
= send_settings_rsp(sk
, MGMT_OP_SET_POWERED
, hdev
);
764 mgmt_powered(hdev
, 1);
769 if (!!cp
->val
== hdev_is_powered(hdev
)) {
770 err
= send_settings_rsp(sk
, MGMT_OP_SET_POWERED
, hdev
);
774 if (mgmt_pending_find(MGMT_OP_SET_POWERED
, hdev
)) {
775 err
= cmd_status(sk
, index
, MGMT_OP_SET_POWERED
,
780 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_POWERED
, hdev
, data
, len
);
787 schedule_work(&hdev
->power_on
);
789 schedule_work(&hdev
->power_off
.work
);
794 hci_dev_unlock(hdev
);
799 static int mgmt_event(u16 event
, struct hci_dev
*hdev
, void *data
,
800 u16 data_len
, struct sock
*skip_sk
)
803 struct mgmt_hdr
*hdr
;
805 skb
= alloc_skb(sizeof(*hdr
) + data_len
, GFP_ATOMIC
);
809 hdr
= (void *) skb_put(skb
, sizeof(*hdr
));
810 hdr
->opcode
= cpu_to_le16(event
);
812 hdr
->index
= cpu_to_le16(hdev
->id
);
814 hdr
->index
= cpu_to_le16(MGMT_INDEX_NONE
);
815 hdr
->len
= cpu_to_le16(data_len
);
818 memcpy(skb_put(skb
, data_len
), data
, data_len
);
821 __net_timestamp(skb
);
823 hci_send_to_control(skb
, skip_sk
);
829 static int new_settings(struct hci_dev
*hdev
, struct sock
*skip
)
833 ev
= cpu_to_le32(get_current_settings(hdev
));
835 return mgmt_event(MGMT_EV_NEW_SETTINGS
, hdev
, &ev
, sizeof(ev
), skip
);
838 static int set_discoverable(struct sock
*sk
, u16 index
, void *data
, u16 len
)
840 struct mgmt_cp_set_discoverable
*cp
= data
;
841 struct hci_dev
*hdev
;
842 struct pending_cmd
*cmd
;
847 BT_DBG("request for hci%u", index
);
849 if (len
!= sizeof(*cp
))
850 return cmd_status(sk
, index
, MGMT_OP_SET_DISCOVERABLE
,
851 MGMT_STATUS_INVALID_PARAMS
);
853 timeout
= get_unaligned_le16(&cp
->timeout
);
854 if (!cp
->val
&& timeout
> 0)
855 return cmd_status(sk
, index
, MGMT_OP_SET_DISCOVERABLE
,
856 MGMT_STATUS_INVALID_PARAMS
);
858 hdev
= hci_dev_get(index
);
860 return cmd_status(sk
, index
, MGMT_OP_SET_DISCOVERABLE
,
861 MGMT_STATUS_INVALID_PARAMS
);
865 if (!hdev_is_powered(hdev
) && timeout
> 0) {
866 err
= cmd_status(sk
, index
, MGMT_OP_SET_DISCOVERABLE
,
867 MGMT_STATUS_NOT_POWERED
);
871 if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE
, hdev
) ||
872 mgmt_pending_find(MGMT_OP_SET_CONNECTABLE
, hdev
)) {
873 err
= cmd_status(sk
, index
, MGMT_OP_SET_DISCOVERABLE
,
878 if (!test_bit(HCI_CONNECTABLE
, &hdev
->dev_flags
)) {
879 err
= cmd_status(sk
, index
, MGMT_OP_SET_DISCOVERABLE
,
880 MGMT_STATUS_REJECTED
);
884 if (!hdev_is_powered(hdev
)) {
885 bool changed
= false;
887 if (!!cp
->val
!= test_bit(HCI_DISCOVERABLE
, &hdev
->dev_flags
)) {
888 change_bit(HCI_DISCOVERABLE
, &hdev
->dev_flags
);
892 err
= send_settings_rsp(sk
, MGMT_OP_SET_DISCOVERABLE
, hdev
);
897 err
= new_settings(hdev
, sk
);
902 if (!!cp
->val
== test_bit(HCI_DISCOVERABLE
, &hdev
->dev_flags
)) {
903 if (hdev
->discov_timeout
> 0) {
904 cancel_delayed_work(&hdev
->discov_off
);
905 hdev
->discov_timeout
= 0;
908 if (cp
->val
&& timeout
> 0) {
909 hdev
->discov_timeout
= timeout
;
910 queue_delayed_work(hdev
->workqueue
, &hdev
->discov_off
,
911 msecs_to_jiffies(hdev
->discov_timeout
* 1000));
914 err
= send_settings_rsp(sk
, MGMT_OP_SET_DISCOVERABLE
, hdev
);
918 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_DISCOVERABLE
, hdev
, data
, len
);
927 scan
|= SCAN_INQUIRY
;
929 cancel_delayed_work(&hdev
->discov_off
);
931 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_SCAN_ENABLE
, 1, &scan
);
933 mgmt_pending_remove(cmd
);
936 hdev
->discov_timeout
= timeout
;
939 hci_dev_unlock(hdev
);
945 static int set_connectable(struct sock
*sk
, u16 index
, void *data
, u16 len
)
947 struct mgmt_mode
*cp
= data
;
948 struct hci_dev
*hdev
;
949 struct pending_cmd
*cmd
;
953 BT_DBG("request for hci%u", index
);
955 if (len
!= sizeof(*cp
))
956 return cmd_status(sk
, index
, MGMT_OP_SET_CONNECTABLE
,
957 MGMT_STATUS_INVALID_PARAMS
);
959 hdev
= hci_dev_get(index
);
961 return cmd_status(sk
, index
, MGMT_OP_SET_CONNECTABLE
,
962 MGMT_STATUS_INVALID_PARAMS
);
966 if (!hdev_is_powered(hdev
)) {
967 bool changed
= false;
969 if (!!cp
->val
!= test_bit(HCI_CONNECTABLE
, &hdev
->dev_flags
))
973 set_bit(HCI_CONNECTABLE
, &hdev
->dev_flags
);
975 clear_bit(HCI_CONNECTABLE
, &hdev
->dev_flags
);
976 clear_bit(HCI_DISCOVERABLE
, &hdev
->dev_flags
);
979 err
= send_settings_rsp(sk
, MGMT_OP_SET_CONNECTABLE
, hdev
);
984 err
= new_settings(hdev
, sk
);
989 if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE
, hdev
) ||
990 mgmt_pending_find(MGMT_OP_SET_CONNECTABLE
, hdev
)) {
991 err
= cmd_status(sk
, index
, MGMT_OP_SET_CONNECTABLE
,
996 if (!!cp
->val
== test_bit(HCI_PSCAN
, &hdev
->flags
)) {
997 err
= send_settings_rsp(sk
, MGMT_OP_SET_CONNECTABLE
, hdev
);
1001 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_CONNECTABLE
, hdev
, data
, len
);
1012 if (test_bit(HCI_ISCAN
, &hdev
->flags
) &&
1013 hdev
->discov_timeout
> 0)
1014 cancel_delayed_work(&hdev
->discov_off
);
1017 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_SCAN_ENABLE
, 1, &scan
);
1019 mgmt_pending_remove(cmd
);
1022 hci_dev_unlock(hdev
);
1028 static int set_pairable(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1030 struct mgmt_mode
*cp
= data
;
1031 struct hci_dev
*hdev
;
1034 BT_DBG("request for hci%u", index
);
1036 if (len
!= sizeof(*cp
))
1037 return cmd_status(sk
, index
, MGMT_OP_SET_PAIRABLE
,
1038 MGMT_STATUS_INVALID_PARAMS
);
1040 hdev
= hci_dev_get(index
);
1042 return cmd_status(sk
, index
, MGMT_OP_SET_PAIRABLE
,
1043 MGMT_STATUS_INVALID_PARAMS
);
1048 set_bit(HCI_PAIRABLE
, &hdev
->dev_flags
);
1050 clear_bit(HCI_PAIRABLE
, &hdev
->dev_flags
);
1052 err
= send_settings_rsp(sk
, MGMT_OP_SET_PAIRABLE
, hdev
);
1056 err
= new_settings(hdev
, sk
);
1059 hci_dev_unlock(hdev
);
1065 static int set_link_security(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1067 struct mgmt_mode
*cp
= data
;
1068 struct pending_cmd
*cmd
;
1069 struct hci_dev
*hdev
;
1073 BT_DBG("request for hci%u", index
);
1075 if (len
!= sizeof(*cp
))
1076 return cmd_status(sk
, index
, MGMT_OP_SET_LINK_SECURITY
,
1077 MGMT_STATUS_INVALID_PARAMS
);
1079 hdev
= hci_dev_get(index
);
1081 return cmd_status(sk
, index
, MGMT_OP_SET_LINK_SECURITY
,
1082 MGMT_STATUS_INVALID_PARAMS
);
1086 if (!hdev_is_powered(hdev
)) {
1087 bool changed
= false;
1089 if (!!cp
->val
!= test_bit(HCI_LINK_SECURITY
,
1090 &hdev
->dev_flags
)) {
1091 change_bit(HCI_LINK_SECURITY
, &hdev
->dev_flags
);
1095 err
= send_settings_rsp(sk
, MGMT_OP_SET_LINK_SECURITY
, hdev
);
1100 err
= new_settings(hdev
, sk
);
1105 if (mgmt_pending_find(MGMT_OP_SET_LINK_SECURITY
, hdev
)) {
1106 err
= cmd_status(sk
, index
, MGMT_OP_SET_LINK_SECURITY
,
1113 if (test_bit(HCI_AUTH
, &hdev
->flags
) == val
) {
1114 err
= send_settings_rsp(sk
, MGMT_OP_SET_LINK_SECURITY
, hdev
);
1118 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_LINK_SECURITY
, hdev
, data
, len
);
1124 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_AUTH_ENABLE
, sizeof(val
), &val
);
1126 mgmt_pending_remove(cmd
);
1131 hci_dev_unlock(hdev
);
1137 static int set_ssp(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1139 struct mgmt_mode
*cp
= data
;
1140 struct pending_cmd
*cmd
;
1141 struct hci_dev
*hdev
;
1145 BT_DBG("request for hci%u", index
);
1147 if (len
!= sizeof(*cp
))
1148 return cmd_status(sk
, index
, MGMT_OP_SET_SSP
,
1149 MGMT_STATUS_INVALID_PARAMS
);
1151 hdev
= hci_dev_get(index
);
1153 return cmd_status(sk
, index
, MGMT_OP_SET_SSP
,
1154 MGMT_STATUS_INVALID_PARAMS
);
1158 if (!(hdev
->features
[6] & LMP_SIMPLE_PAIR
)) {
1159 err
= cmd_status(sk
, index
, MGMT_OP_SET_SSP
,
1160 MGMT_STATUS_NOT_SUPPORTED
);
1166 if (!hdev_is_powered(hdev
)) {
1167 bool changed
= false;
1169 if (val
!= test_bit(HCI_SSP_ENABLED
, &hdev
->dev_flags
)) {
1170 change_bit(HCI_SSP_ENABLED
, &hdev
->dev_flags
);
1174 err
= send_settings_rsp(sk
, MGMT_OP_SET_SSP
, hdev
);
1179 err
= new_settings(hdev
, sk
);
1184 if (mgmt_pending_find(MGMT_OP_SET_SSP
, hdev
)) {
1185 err
= cmd_status(sk
, index
, MGMT_OP_SET_SSP
, MGMT_STATUS_BUSY
);
1189 if (test_bit(HCI_SSP_ENABLED
, &hdev
->dev_flags
) == val
) {
1190 err
= send_settings_rsp(sk
, MGMT_OP_SET_SSP
, hdev
);
1194 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_SSP
, hdev
, data
, len
);
1200 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_SSP_MODE
, sizeof(val
), &val
);
1202 mgmt_pending_remove(cmd
);
1207 hci_dev_unlock(hdev
);
1213 static int set_hs(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1215 struct mgmt_mode
*cp
= data
;
1216 struct hci_dev
*hdev
;
1219 BT_DBG("request for hci%u", index
);
1221 if (len
!= sizeof(*cp
))
1222 return cmd_status(sk
, index
, MGMT_OP_SET_HS
,
1223 MGMT_STATUS_INVALID_PARAMS
);
1225 hdev
= hci_dev_get(index
);
1227 return cmd_status(sk
, index
, MGMT_OP_SET_HS
,
1228 MGMT_STATUS_INVALID_PARAMS
);
1231 err
= cmd_status(sk
, index
, MGMT_OP_SET_HS
,
1232 MGMT_STATUS_NOT_SUPPORTED
);
1237 set_bit(HCI_HS_ENABLED
, &hdev
->dev_flags
);
1239 clear_bit(HCI_HS_ENABLED
, &hdev
->dev_flags
);
1241 err
= send_settings_rsp(sk
, MGMT_OP_SET_HS
, hdev
);
1248 static int set_le(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1250 struct mgmt_mode
*cp
= data
;
1251 struct hci_cp_write_le_host_supported hci_cp
;
1252 struct pending_cmd
*cmd
;
1253 struct hci_dev
*hdev
;
1257 BT_DBG("request for hci%u", index
);
1259 if (len
!= sizeof(*cp
))
1260 return cmd_status(sk
, index
, MGMT_OP_SET_LE
,
1261 MGMT_STATUS_INVALID_PARAMS
);
1263 hdev
= hci_dev_get(index
);
1265 return cmd_status(sk
, index
, MGMT_OP_SET_LE
,
1266 MGMT_STATUS_INVALID_PARAMS
);
1268 if (!enable_le
|| !(hdev
->features
[4] & LMP_LE
)) {
1269 err
= cmd_status(sk
, index
, MGMT_OP_SET_LE
,
1270 MGMT_STATUS_NOT_SUPPORTED
);
1276 if (!hdev_is_powered(hdev
)) {
1277 bool changed
= false;
1279 if (val
!= test_bit(HCI_LE_ENABLED
, &hdev
->dev_flags
)) {
1280 change_bit(HCI_LE_ENABLED
, &hdev
->dev_flags
);
1284 err
= send_settings_rsp(sk
, MGMT_OP_SET_LE
, hdev
);
1289 err
= new_settings(hdev
, sk
);
1294 if (mgmt_pending_find(MGMT_OP_SET_LE
, hdev
)) {
1295 err
= cmd_status(sk
, index
, MGMT_OP_SET_LE
, MGMT_STATUS_BUSY
);
1299 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_LE
, hdev
, data
, len
);
1305 memset(&hci_cp
, 0, sizeof(hci_cp
));
1309 hci_cp
.simul
= !!(hdev
->features
[6] & LMP_SIMUL_LE_BR
);
1312 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_LE_HOST_SUPPORTED
,
1313 sizeof(hci_cp
), &hci_cp
);
1315 mgmt_pending_remove(cmd
);
1324 static int add_uuid(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1326 struct mgmt_cp_add_uuid
*cp
= data
;
1327 struct hci_dev
*hdev
;
1328 struct bt_uuid
*uuid
;
1331 BT_DBG("request for hci%u", index
);
1333 if (len
!= sizeof(*cp
))
1334 return cmd_status(sk
, index
, MGMT_OP_ADD_UUID
,
1335 MGMT_STATUS_INVALID_PARAMS
);
1337 hdev
= hci_dev_get(index
);
1339 return cmd_status(sk
, index
, MGMT_OP_ADD_UUID
,
1340 MGMT_STATUS_INVALID_PARAMS
);
1344 uuid
= kmalloc(sizeof(*uuid
), GFP_ATOMIC
);
1350 memcpy(uuid
->uuid
, cp
->uuid
, 16);
1351 uuid
->svc_hint
= cp
->svc_hint
;
1353 list_add(&uuid
->list
, &hdev
->uuids
);
1355 err
= update_class(hdev
);
1359 err
= update_eir(hdev
);
1363 err
= cmd_complete(sk
, index
, MGMT_OP_ADD_UUID
, 0, NULL
, 0);
1366 hci_dev_unlock(hdev
);
1372 static int remove_uuid(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1374 struct mgmt_cp_remove_uuid
*cp
= data
;
1375 struct list_head
*p
, *n
;
1376 struct hci_dev
*hdev
;
1377 u8 bt_uuid_any
[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1380 BT_DBG("request for hci%u", index
);
1382 if (len
!= sizeof(*cp
))
1383 return cmd_status(sk
, index
, MGMT_OP_REMOVE_UUID
,
1384 MGMT_STATUS_INVALID_PARAMS
);
1386 hdev
= hci_dev_get(index
);
1388 return cmd_status(sk
, index
, MGMT_OP_REMOVE_UUID
,
1389 MGMT_STATUS_INVALID_PARAMS
);
1393 if (memcmp(cp
->uuid
, bt_uuid_any
, 16) == 0) {
1394 err
= hci_uuids_clear(hdev
);
1400 list_for_each_safe(p
, n
, &hdev
->uuids
) {
1401 struct bt_uuid
*match
= list_entry(p
, struct bt_uuid
, list
);
1403 if (memcmp(match
->uuid
, cp
->uuid
, 16) != 0)
1406 list_del(&match
->list
);
1411 err
= cmd_status(sk
, index
, MGMT_OP_REMOVE_UUID
,
1412 MGMT_STATUS_INVALID_PARAMS
);
1416 err
= update_class(hdev
);
1420 err
= update_eir(hdev
);
1424 err
= cmd_complete(sk
, index
, MGMT_OP_REMOVE_UUID
, 0, NULL
, 0);
1427 hci_dev_unlock(hdev
);
1433 static int set_dev_class(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1435 struct hci_dev
*hdev
;
1436 struct mgmt_cp_set_dev_class
*cp
= data
;
1439 BT_DBG("request for hci%u", index
);
1441 if (len
!= sizeof(*cp
))
1442 return cmd_status(sk
, index
, MGMT_OP_SET_DEV_CLASS
,
1443 MGMT_STATUS_INVALID_PARAMS
);
1445 hdev
= hci_dev_get(index
);
1447 return cmd_status(sk
, index
, MGMT_OP_SET_DEV_CLASS
,
1448 MGMT_STATUS_INVALID_PARAMS
);
1452 if (!hdev_is_powered(hdev
)) {
1453 err
= cmd_status(sk
, index
, MGMT_OP_SET_DEV_CLASS
,
1454 MGMT_STATUS_NOT_POWERED
);
1458 hdev
->major_class
= cp
->major
;
1459 hdev
->minor_class
= cp
->minor
;
1461 if (test_and_clear_bit(HCI_SERVICE_CACHE
, &hdev
->dev_flags
)) {
1462 hci_dev_unlock(hdev
);
1463 cancel_delayed_work_sync(&hdev
->service_cache
);
1468 err
= update_class(hdev
);
1471 err
= cmd_complete(sk
, index
, MGMT_OP_SET_DEV_CLASS
, 0,
1475 hci_dev_unlock(hdev
);
1481 static int load_link_keys(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1483 struct hci_dev
*hdev
;
1484 struct mgmt_cp_load_link_keys
*cp
= data
;
1485 u16 key_count
, expected_len
;
1488 if (len
< sizeof(*cp
))
1489 return cmd_status(sk
, index
, MGMT_OP_LOAD_LINK_KEYS
,
1490 MGMT_STATUS_INVALID_PARAMS
);
1492 key_count
= get_unaligned_le16(&cp
->key_count
);
1494 expected_len
= sizeof(*cp
) + key_count
*
1495 sizeof(struct mgmt_link_key_info
);
1496 if (expected_len
!= len
) {
1497 BT_ERR("load_link_keys: expected %u bytes, got %u bytes",
1499 return cmd_status(sk
, index
, MGMT_OP_LOAD_LINK_KEYS
,
1500 MGMT_STATUS_INVALID_PARAMS
);
1503 hdev
= hci_dev_get(index
);
1505 return cmd_status(sk
, index
, MGMT_OP_LOAD_LINK_KEYS
,
1506 MGMT_STATUS_INVALID_PARAMS
);
1508 BT_DBG("hci%u debug_keys %u key_count %u", index
, cp
->debug_keys
,
1513 hci_link_keys_clear(hdev
);
1515 set_bit(HCI_LINK_KEYS
, &hdev
->dev_flags
);
1518 set_bit(HCI_DEBUG_KEYS
, &hdev
->dev_flags
);
1520 clear_bit(HCI_DEBUG_KEYS
, &hdev
->dev_flags
);
1522 for (i
= 0; i
< key_count
; i
++) {
1523 struct mgmt_link_key_info
*key
= &cp
->keys
[i
];
1525 hci_add_link_key(hdev
, NULL
, 0, &key
->addr
.bdaddr
, key
->val
,
1526 key
->type
, key
->pin_len
);
1529 cmd_complete(sk
, index
, MGMT_OP_LOAD_LINK_KEYS
, 0, NULL
, 0);
1531 hci_dev_unlock(hdev
);
1537 static int device_unpaired(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
1538 u8 addr_type
, struct sock
*skip_sk
)
1540 struct mgmt_ev_device_unpaired ev
;
1542 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
1543 ev
.addr
.type
= addr_type
;
1545 return mgmt_event(MGMT_EV_DEVICE_UNPAIRED
, hdev
, &ev
, sizeof(ev
),
1549 static int unpair_device(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1551 struct hci_dev
*hdev
;
1552 struct mgmt_cp_unpair_device
*cp
= data
;
1553 struct mgmt_rp_unpair_device rp
;
1554 struct hci_cp_disconnect dc
;
1555 struct pending_cmd
*cmd
;
1556 struct hci_conn
*conn
;
1560 if (len
!= sizeof(*cp
))
1561 return cmd_status(sk
, index
, MGMT_OP_UNPAIR_DEVICE
,
1562 MGMT_STATUS_INVALID_PARAMS
);
1564 hdev
= hci_dev_get(index
);
1566 return cmd_status(sk
, index
, MGMT_OP_UNPAIR_DEVICE
,
1567 MGMT_STATUS_INVALID_PARAMS
);
1571 memset(&rp
, 0, sizeof(rp
));
1572 bacpy(&rp
.addr
.bdaddr
, &cp
->addr
.bdaddr
);
1573 rp
.addr
.type
= cp
->addr
.type
;
1575 if (cp
->addr
.type
== MGMT_ADDR_BREDR
)
1576 err
= hci_remove_link_key(hdev
, &cp
->addr
.bdaddr
);
1578 err
= hci_remove_ltk(hdev
, &cp
->addr
.bdaddr
);
1581 status
= MGMT_STATUS_NOT_PAIRED
;
1585 if (!test_bit(HCI_UP
, &hdev
->flags
) || !cp
->disconnect
) {
1586 err
= cmd_complete(sk
, index
, MGMT_OP_UNPAIR_DEVICE
, status
,
1588 device_unpaired(hdev
, &cp
->addr
.bdaddr
, cp
->addr
.type
, sk
);
1592 if (cp
->addr
.type
== MGMT_ADDR_BREDR
)
1593 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
,
1596 conn
= hci_conn_hash_lookup_ba(hdev
, LE_LINK
,
1600 err
= cmd_complete(sk
, index
, MGMT_OP_UNPAIR_DEVICE
, status
,
1602 device_unpaired(hdev
, &cp
->addr
.bdaddr
, cp
->addr
.type
, sk
);
1606 cmd
= mgmt_pending_add(sk
, MGMT_OP_UNPAIR_DEVICE
, hdev
, cp
,
1613 put_unaligned_le16(conn
->handle
, &dc
.handle
);
1614 dc
.reason
= 0x13; /* Remote User Terminated Connection */
1615 err
= hci_send_cmd(hdev
, HCI_OP_DISCONNECT
, sizeof(dc
), &dc
);
1617 mgmt_pending_remove(cmd
);
1621 err
= cmd_complete(sk
, index
, MGMT_OP_UNPAIR_DEVICE
, status
,
1623 hci_dev_unlock(hdev
);
1629 static int disconnect(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1631 struct hci_dev
*hdev
;
1632 struct mgmt_cp_disconnect
*cp
= data
;
1633 struct hci_cp_disconnect dc
;
1634 struct pending_cmd
*cmd
;
1635 struct hci_conn
*conn
;
1640 if (len
!= sizeof(*cp
))
1641 return cmd_status(sk
, index
, MGMT_OP_DISCONNECT
,
1642 MGMT_STATUS_INVALID_PARAMS
);
1644 hdev
= hci_dev_get(index
);
1646 return cmd_status(sk
, index
, MGMT_OP_DISCONNECT
,
1647 MGMT_STATUS_INVALID_PARAMS
);
1651 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1652 err
= cmd_status(sk
, index
, MGMT_OP_DISCONNECT
,
1653 MGMT_STATUS_NOT_POWERED
);
1657 if (mgmt_pending_find(MGMT_OP_DISCONNECT
, hdev
)) {
1658 err
= cmd_status(sk
, index
, MGMT_OP_DISCONNECT
,
1663 if (cp
->addr
.type
== MGMT_ADDR_BREDR
)
1664 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
, &cp
->addr
.bdaddr
);
1666 conn
= hci_conn_hash_lookup_ba(hdev
, LE_LINK
, &cp
->addr
.bdaddr
);
1669 err
= cmd_status(sk
, index
, MGMT_OP_DISCONNECT
,
1670 MGMT_STATUS_NOT_CONNECTED
);
1674 cmd
= mgmt_pending_add(sk
, MGMT_OP_DISCONNECT
, hdev
, data
, len
);
1680 put_unaligned_le16(conn
->handle
, &dc
.handle
);
1681 dc
.reason
= 0x13; /* Remote User Terminated Connection */
1683 err
= hci_send_cmd(hdev
, HCI_OP_DISCONNECT
, sizeof(dc
), &dc
);
1685 mgmt_pending_remove(cmd
);
1688 hci_dev_unlock(hdev
);
1694 static u8
link_to_mgmt(u8 link_type
, u8 addr_type
)
1696 switch (link_type
) {
1698 switch (addr_type
) {
1699 case ADDR_LE_DEV_PUBLIC
:
1700 return MGMT_ADDR_LE_PUBLIC
;
1701 case ADDR_LE_DEV_RANDOM
:
1702 return MGMT_ADDR_LE_RANDOM
;
1704 return MGMT_ADDR_INVALID
;
1707 return MGMT_ADDR_BREDR
;
1709 return MGMT_ADDR_INVALID
;
1713 static int get_connections(struct sock
*sk
, u16 index
)
1715 struct mgmt_rp_get_connections
*rp
;
1716 struct hci_dev
*hdev
;
1724 hdev
= hci_dev_get(index
);
1726 return cmd_status(sk
, index
, MGMT_OP_GET_CONNECTIONS
,
1727 MGMT_STATUS_INVALID_PARAMS
);
1732 list_for_each_entry(c
, &hdev
->conn_hash
.list
, list
) {
1733 if (test_bit(HCI_CONN_MGMT_CONNECTED
, &c
->flags
))
1737 rp_len
= sizeof(*rp
) + (count
* sizeof(struct mgmt_addr_info
));
1738 rp
= kmalloc(rp_len
, GFP_ATOMIC
);
1744 put_unaligned_le16(count
, &rp
->conn_count
);
1747 list_for_each_entry(c
, &hdev
->conn_hash
.list
, list
) {
1748 if (!test_bit(HCI_CONN_MGMT_CONNECTED
, &c
->flags
))
1750 bacpy(&rp
->addr
[i
].bdaddr
, &c
->dst
);
1751 rp
->addr
[i
].type
= link_to_mgmt(c
->type
, c
->dst_type
);
1752 if (rp
->addr
[i
].type
== MGMT_ADDR_INVALID
)
1757 /* Recalculate length in case of filtered SCO connections, etc */
1758 rp_len
= sizeof(*rp
) + (i
* sizeof(struct mgmt_addr_info
));
1760 err
= cmd_complete(sk
, index
, MGMT_OP_GET_CONNECTIONS
, 0, rp
, rp_len
);
1764 hci_dev_unlock(hdev
);
1769 static int send_pin_code_neg_reply(struct sock
*sk
, u16 index
,
1770 struct hci_dev
*hdev
, struct mgmt_cp_pin_code_neg_reply
*cp
)
1772 struct pending_cmd
*cmd
;
1775 cmd
= mgmt_pending_add(sk
, MGMT_OP_PIN_CODE_NEG_REPLY
, hdev
, cp
,
1780 err
= hci_send_cmd(hdev
, HCI_OP_PIN_CODE_NEG_REPLY
,
1781 sizeof(cp
->addr
.bdaddr
), &cp
->addr
.bdaddr
);
1783 mgmt_pending_remove(cmd
);
1788 static int pin_code_reply(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1790 struct hci_dev
*hdev
;
1791 struct hci_conn
*conn
;
1792 struct mgmt_cp_pin_code_reply
*cp
= data
;
1793 struct hci_cp_pin_code_reply reply
;
1794 struct pending_cmd
*cmd
;
1799 if (len
!= sizeof(*cp
))
1800 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
,
1801 MGMT_STATUS_INVALID_PARAMS
);
1803 hdev
= hci_dev_get(index
);
1805 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
,
1806 MGMT_STATUS_INVALID_PARAMS
);
1810 if (!hdev_is_powered(hdev
)) {
1811 err
= cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
,
1812 MGMT_STATUS_NOT_POWERED
);
1816 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
, &cp
->addr
.bdaddr
);
1818 err
= cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
,
1819 MGMT_STATUS_NOT_CONNECTED
);
1823 if (conn
->pending_sec_level
== BT_SECURITY_HIGH
&& cp
->pin_len
!= 16) {
1824 struct mgmt_cp_pin_code_neg_reply ncp
;
1826 memcpy(&ncp
.addr
, &cp
->addr
, sizeof(ncp
.addr
));
1828 BT_ERR("PIN code is not 16 bytes long");
1830 err
= send_pin_code_neg_reply(sk
, index
, hdev
, &ncp
);
1832 err
= cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
,
1833 MGMT_STATUS_INVALID_PARAMS
);
1838 cmd
= mgmt_pending_add(sk
, MGMT_OP_PIN_CODE_REPLY
, hdev
, data
,
1845 bacpy(&reply
.bdaddr
, &cp
->addr
.bdaddr
);
1846 reply
.pin_len
= cp
->pin_len
;
1847 memcpy(reply
.pin_code
, cp
->pin_code
, sizeof(reply
.pin_code
));
1849 err
= hci_send_cmd(hdev
, HCI_OP_PIN_CODE_REPLY
, sizeof(reply
), &reply
);
1851 mgmt_pending_remove(cmd
);
1854 hci_dev_unlock(hdev
);
1860 static int pin_code_neg_reply(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1862 struct hci_dev
*hdev
;
1863 struct mgmt_cp_pin_code_neg_reply
*cp
= data
;
1868 if (len
!= sizeof(*cp
))
1869 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_NEG_REPLY
,
1870 MGMT_STATUS_INVALID_PARAMS
);
1872 hdev
= hci_dev_get(index
);
1874 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_NEG_REPLY
,
1875 MGMT_STATUS_INVALID_PARAMS
);
1879 if (!hdev_is_powered(hdev
)) {
1880 err
= cmd_status(sk
, index
, MGMT_OP_PIN_CODE_NEG_REPLY
,
1881 MGMT_STATUS_NOT_POWERED
);
1885 err
= send_pin_code_neg_reply(sk
, index
, hdev
, cp
);
1888 hci_dev_unlock(hdev
);
1894 static int set_io_capability(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1896 struct hci_dev
*hdev
;
1897 struct mgmt_cp_set_io_capability
*cp
= data
;
1901 if (len
!= sizeof(*cp
))
1902 return cmd_status(sk
, index
, MGMT_OP_SET_IO_CAPABILITY
,
1903 MGMT_STATUS_INVALID_PARAMS
);
1905 hdev
= hci_dev_get(index
);
1907 return cmd_status(sk
, index
, MGMT_OP_SET_IO_CAPABILITY
,
1908 MGMT_STATUS_INVALID_PARAMS
);
1912 hdev
->io_capability
= cp
->io_capability
;
1914 BT_DBG("%s IO capability set to 0x%02x", hdev
->name
,
1915 hdev
->io_capability
);
1917 hci_dev_unlock(hdev
);
1920 return cmd_complete(sk
, index
, MGMT_OP_SET_IO_CAPABILITY
, 0, NULL
, 0);
1923 static inline struct pending_cmd
*find_pairing(struct hci_conn
*conn
)
1925 struct hci_dev
*hdev
= conn
->hdev
;
1926 struct pending_cmd
*cmd
;
1928 list_for_each_entry(cmd
, &hdev
->mgmt_pending
, list
) {
1929 if (cmd
->opcode
!= MGMT_OP_PAIR_DEVICE
)
1932 if (cmd
->user_data
!= conn
)
1941 static void pairing_complete(struct pending_cmd
*cmd
, u8 status
)
1943 struct mgmt_rp_pair_device rp
;
1944 struct hci_conn
*conn
= cmd
->user_data
;
1946 bacpy(&rp
.addr
.bdaddr
, &conn
->dst
);
1947 rp
.addr
.type
= link_to_mgmt(conn
->type
, conn
->dst_type
);
1949 cmd_complete(cmd
->sk
, cmd
->index
, MGMT_OP_PAIR_DEVICE
, status
,
1952 /* So we don't get further callbacks for this connection */
1953 conn
->connect_cfm_cb
= NULL
;
1954 conn
->security_cfm_cb
= NULL
;
1955 conn
->disconn_cfm_cb
= NULL
;
1959 mgmt_pending_remove(cmd
);
1962 static void pairing_complete_cb(struct hci_conn
*conn
, u8 status
)
1964 struct pending_cmd
*cmd
;
1966 BT_DBG("status %u", status
);
1968 cmd
= find_pairing(conn
);
1970 BT_DBG("Unable to find a pending command");
1972 pairing_complete(cmd
, mgmt_status(status
));
1975 static int pair_device(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1977 struct hci_dev
*hdev
;
1978 struct mgmt_cp_pair_device
*cp
= data
;
1979 struct mgmt_rp_pair_device rp
;
1980 struct pending_cmd
*cmd
;
1981 u8 sec_level
, auth_type
;
1982 struct hci_conn
*conn
;
1987 if (len
!= sizeof(*cp
))
1988 return cmd_status(sk
, index
, MGMT_OP_PAIR_DEVICE
,
1989 MGMT_STATUS_INVALID_PARAMS
);
1991 hdev
= hci_dev_get(index
);
1993 return cmd_status(sk
, index
, MGMT_OP_PAIR_DEVICE
,
1994 MGMT_STATUS_INVALID_PARAMS
);
1998 sec_level
= BT_SECURITY_MEDIUM
;
1999 if (cp
->io_cap
== 0x03)
2000 auth_type
= HCI_AT_DEDICATED_BONDING
;
2002 auth_type
= HCI_AT_DEDICATED_BONDING_MITM
;
2004 if (cp
->addr
.type
== MGMT_ADDR_BREDR
)
2005 conn
= hci_connect(hdev
, ACL_LINK
, &cp
->addr
.bdaddr
, sec_level
,
2008 conn
= hci_connect(hdev
, LE_LINK
, &cp
->addr
.bdaddr
, sec_level
,
2011 memset(&rp
, 0, sizeof(rp
));
2012 bacpy(&rp
.addr
.bdaddr
, &cp
->addr
.bdaddr
);
2013 rp
.addr
.type
= cp
->addr
.type
;
2016 err
= cmd_complete(sk
, index
, MGMT_OP_PAIR_DEVICE
,
2017 MGMT_STATUS_CONNECT_FAILED
,
2022 if (conn
->connect_cfm_cb
) {
2024 err
= cmd_complete(sk
, index
, MGMT_OP_PAIR_DEVICE
,
2025 MGMT_STATUS_BUSY
, &rp
, sizeof(rp
));
2029 cmd
= mgmt_pending_add(sk
, MGMT_OP_PAIR_DEVICE
, hdev
, data
, len
);
2036 /* For LE, just connecting isn't a proof that the pairing finished */
2037 if (cp
->addr
.type
== MGMT_ADDR_BREDR
)
2038 conn
->connect_cfm_cb
= pairing_complete_cb
;
2040 conn
->security_cfm_cb
= pairing_complete_cb
;
2041 conn
->disconn_cfm_cb
= pairing_complete_cb
;
2042 conn
->io_capability
= cp
->io_cap
;
2043 cmd
->user_data
= conn
;
2045 if (conn
->state
== BT_CONNECTED
&&
2046 hci_conn_security(conn
, sec_level
, auth_type
))
2047 pairing_complete(cmd
, 0);
2052 hci_dev_unlock(hdev
);
2058 static int cancel_pair_device(struct sock
*sk
, u16 index
,
2059 unsigned char *data
, u16 len
)
2061 struct mgmt_addr_info
*addr
= (void *) data
;
2062 struct hci_dev
*hdev
;
2063 struct pending_cmd
*cmd
;
2064 struct hci_conn
*conn
;
2069 if (len
!= sizeof(*addr
))
2070 return cmd_status(sk
, index
, MGMT_OP_CANCEL_PAIR_DEVICE
,
2071 MGMT_STATUS_INVALID_PARAMS
);
2073 hdev
= hci_dev_get(index
);
2075 return cmd_status(sk
, index
, MGMT_OP_CANCEL_PAIR_DEVICE
,
2076 MGMT_STATUS_INVALID_PARAMS
);
2080 cmd
= mgmt_pending_find(MGMT_OP_PAIR_DEVICE
, hdev
);
2082 err
= cmd_status(sk
, index
, MGMT_OP_CANCEL_PAIR_DEVICE
,
2083 MGMT_STATUS_INVALID_PARAMS
);
2087 conn
= cmd
->user_data
;
2089 if (bacmp(&addr
->bdaddr
, &conn
->dst
) != 0) {
2090 err
= cmd_status(sk
, index
, MGMT_OP_CANCEL_PAIR_DEVICE
,
2091 MGMT_STATUS_INVALID_PARAMS
);
2095 pairing_complete(cmd
, MGMT_STATUS_CANCELLED
);
2097 err
= cmd_complete(sk
, index
, MGMT_OP_CANCEL_PAIR_DEVICE
, 0, addr
,
2100 hci_dev_unlock(hdev
);
2106 static int user_pairing_resp(struct sock
*sk
, u16 index
, bdaddr_t
*bdaddr
,
2107 u8 type
, u16 mgmt_op
, u16 hci_op
,
2110 struct pending_cmd
*cmd
;
2111 struct hci_dev
*hdev
;
2112 struct hci_conn
*conn
;
2115 hdev
= hci_dev_get(index
);
2117 return cmd_status(sk
, index
, mgmt_op
,
2118 MGMT_STATUS_INVALID_PARAMS
);
2122 if (!hdev_is_powered(hdev
)) {
2123 err
= cmd_status(sk
, index
, mgmt_op
, MGMT_STATUS_NOT_POWERED
);
2127 if (type
== MGMT_ADDR_BREDR
)
2128 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
, bdaddr
);
2130 conn
= hci_conn_hash_lookup_ba(hdev
, LE_LINK
, bdaddr
);
2133 err
= cmd_status(sk
, index
, mgmt_op
,
2134 MGMT_STATUS_NOT_CONNECTED
);
2138 if (type
== MGMT_ADDR_LE_PUBLIC
|| type
== MGMT_ADDR_LE_RANDOM
) {
2139 /* Continue with pairing via SMP */
2140 err
= smp_user_confirm_reply(conn
, mgmt_op
, passkey
);
2143 err
= cmd_status(sk
, index
, mgmt_op
,
2144 MGMT_STATUS_SUCCESS
);
2146 err
= cmd_status(sk
, index
, mgmt_op
,
2147 MGMT_STATUS_FAILED
);
2152 cmd
= mgmt_pending_add(sk
, mgmt_op
, hdev
, bdaddr
, sizeof(*bdaddr
));
2158 /* Continue with pairing via HCI */
2159 if (hci_op
== HCI_OP_USER_PASSKEY_REPLY
) {
2160 struct hci_cp_user_passkey_reply cp
;
2162 bacpy(&cp
.bdaddr
, bdaddr
);
2163 cp
.passkey
= passkey
;
2164 err
= hci_send_cmd(hdev
, hci_op
, sizeof(cp
), &cp
);
2166 err
= hci_send_cmd(hdev
, hci_op
, sizeof(*bdaddr
), bdaddr
);
2169 mgmt_pending_remove(cmd
);
2172 hci_dev_unlock(hdev
);
2178 static int user_confirm_reply(struct sock
*sk
, u16 index
, void *data
, u16 len
)
2180 struct mgmt_cp_user_confirm_reply
*cp
= data
;
2184 if (len
!= sizeof(*cp
))
2185 return cmd_status(sk
, index
, MGMT_OP_USER_CONFIRM_REPLY
,
2186 MGMT_STATUS_INVALID_PARAMS
);
2188 return user_pairing_resp(sk
, index
, &cp
->addr
.bdaddr
, cp
->addr
.type
,
2189 MGMT_OP_USER_CONFIRM_REPLY
,
2190 HCI_OP_USER_CONFIRM_REPLY
, 0);
2193 static int user_confirm_neg_reply(struct sock
*sk
, u16 index
, void *data
,
2196 struct mgmt_cp_user_confirm_neg_reply
*cp
= data
;
2200 if (len
!= sizeof(*cp
))
2201 return cmd_status(sk
, index
, MGMT_OP_USER_CONFIRM_NEG_REPLY
,
2202 MGMT_STATUS_INVALID_PARAMS
);
2204 return user_pairing_resp(sk
, index
, &cp
->addr
.bdaddr
, cp
->addr
.type
,
2205 MGMT_OP_USER_CONFIRM_NEG_REPLY
,
2206 HCI_OP_USER_CONFIRM_NEG_REPLY
, 0);
2209 static int user_passkey_reply(struct sock
*sk
, u16 index
, void *data
, u16 len
)
2211 struct mgmt_cp_user_passkey_reply
*cp
= data
;
2215 if (len
!= sizeof(*cp
))
2216 return cmd_status(sk
, index
, MGMT_OP_USER_PASSKEY_REPLY
,
2219 return user_pairing_resp(sk
, index
, &cp
->addr
.bdaddr
, cp
->addr
.type
,
2220 MGMT_OP_USER_PASSKEY_REPLY
,
2221 HCI_OP_USER_PASSKEY_REPLY
,
2225 static int user_passkey_neg_reply(struct sock
*sk
, u16 index
, void *data
,
2228 struct mgmt_cp_user_passkey_neg_reply
*cp
= data
;
2232 if (len
!= sizeof(*cp
))
2233 return cmd_status(sk
, index
, MGMT_OP_USER_PASSKEY_NEG_REPLY
,
2236 return user_pairing_resp(sk
, index
, &cp
->addr
.bdaddr
, cp
->addr
.type
,
2237 MGMT_OP_USER_PASSKEY_NEG_REPLY
,
2238 HCI_OP_USER_PASSKEY_NEG_REPLY
, 0);
2241 static int set_local_name(struct sock
*sk
, u16 index
, void *data
,
2244 struct mgmt_cp_set_local_name
*mgmt_cp
= data
;
2245 struct hci_cp_write_local_name hci_cp
;
2246 struct hci_dev
*hdev
;
2247 struct pending_cmd
*cmd
;
2252 if (len
!= sizeof(*mgmt_cp
))
2253 return cmd_status(sk
, index
, MGMT_OP_SET_LOCAL_NAME
,
2254 MGMT_STATUS_INVALID_PARAMS
);
2256 hdev
= hci_dev_get(index
);
2258 return cmd_status(sk
, index
, MGMT_OP_SET_LOCAL_NAME
,
2259 MGMT_STATUS_INVALID_PARAMS
);
2263 if (!hdev_is_powered(hdev
)) {
2264 err
= cmd_status(sk
, index
, MGMT_OP_SET_LOCAL_NAME
,
2265 MGMT_STATUS_NOT_POWERED
);
2269 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_LOCAL_NAME
, hdev
, data
,
2276 memcpy(hci_cp
.name
, mgmt_cp
->name
, sizeof(hci_cp
.name
));
2277 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_LOCAL_NAME
, sizeof(hci_cp
),
2280 mgmt_pending_remove(cmd
);
2283 hci_dev_unlock(hdev
);
2289 static int read_local_oob_data(struct sock
*sk
, u16 index
)
2291 struct hci_dev
*hdev
;
2292 struct pending_cmd
*cmd
;
2295 BT_DBG("hci%u", index
);
2297 hdev
= hci_dev_get(index
);
2299 return cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
2300 MGMT_STATUS_INVALID_PARAMS
);
2304 if (!hdev_is_powered(hdev
)) {
2305 err
= cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
2306 MGMT_STATUS_NOT_POWERED
);
2310 if (!(hdev
->features
[6] & LMP_SIMPLE_PAIR
)) {
2311 err
= cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
2312 MGMT_STATUS_NOT_SUPPORTED
);
2316 if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA
, hdev
)) {
2317 err
= cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
2322 cmd
= mgmt_pending_add(sk
, MGMT_OP_READ_LOCAL_OOB_DATA
, hdev
, NULL
, 0);
2328 err
= hci_send_cmd(hdev
, HCI_OP_READ_LOCAL_OOB_DATA
, 0, NULL
);
2330 mgmt_pending_remove(cmd
);
2333 hci_dev_unlock(hdev
);
2339 static int add_remote_oob_data(struct sock
*sk
, u16 index
, void *data
,
2342 struct hci_dev
*hdev
;
2343 struct mgmt_cp_add_remote_oob_data
*cp
= data
;
2347 BT_DBG("hci%u ", index
);
2349 if (len
!= sizeof(*cp
))
2350 return cmd_status(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
,
2351 MGMT_STATUS_INVALID_PARAMS
);
2353 hdev
= hci_dev_get(index
);
2355 return cmd_complete(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
,
2356 MGMT_STATUS_INVALID_PARAMS
,
2357 &cp
->addr
, sizeof(cp
->addr
));
2361 err
= hci_add_remote_oob_data(hdev
, &cp
->addr
.bdaddr
, cp
->hash
,
2364 status
= MGMT_STATUS_FAILED
;
2368 err
= cmd_complete(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
, status
,
2369 &cp
->addr
, sizeof(cp
->addr
));
2371 hci_dev_unlock(hdev
);
2377 static int remove_remote_oob_data(struct sock
*sk
, u16 index
,
2378 void *data
, u16 len
)
2380 struct hci_dev
*hdev
;
2381 struct mgmt_cp_remove_remote_oob_data
*cp
= data
;
2385 BT_DBG("hci%u ", index
);
2387 if (len
!= sizeof(*cp
))
2388 return cmd_status(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
2389 MGMT_STATUS_INVALID_PARAMS
);
2391 hdev
= hci_dev_get(index
);
2393 return cmd_complete(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
2394 MGMT_STATUS_INVALID_PARAMS
,
2395 &cp
->addr
, sizeof(cp
->addr
));
2399 err
= hci_remove_remote_oob_data(hdev
, &cp
->addr
.bdaddr
);
2401 status
= MGMT_STATUS_INVALID_PARAMS
;
2405 err
= cmd_complete(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
, status
,
2406 &cp
->addr
, sizeof(cp
->addr
));
2408 hci_dev_unlock(hdev
);
2414 static int discovery(struct hci_dev
*hdev
)
2418 if (lmp_host_le_capable(hdev
)) {
2419 if (lmp_bredr_capable(hdev
)) {
2420 err
= hci_le_scan(hdev
, LE_SCAN_TYPE
,
2421 LE_SCAN_INT
, LE_SCAN_WIN
,
2422 LE_SCAN_TIMEOUT_BREDR_LE
);
2424 hdev
->discovery
.type
= DISCOV_TYPE_LE
;
2425 err
= hci_le_scan(hdev
, LE_SCAN_TYPE
,
2426 LE_SCAN_INT
, LE_SCAN_WIN
,
2427 LE_SCAN_TIMEOUT_LE_ONLY
);
2430 hdev
->discovery
.type
= DISCOV_TYPE_BREDR
;
2431 err
= hci_do_inquiry(hdev
, INQUIRY_LEN_BREDR
);
2437 int mgmt_interleaved_discovery(struct hci_dev
*hdev
)
2441 BT_DBG("%s", hdev
->name
);
2445 err
= hci_do_inquiry(hdev
, INQUIRY_LEN_BREDR_LE
);
2447 hci_discovery_set_state(hdev
, DISCOVERY_STOPPED
);
2449 hci_dev_unlock(hdev
);
2454 static int start_discovery(struct sock
*sk
, u16 index
,
2455 void *data
, u16 len
)
2457 struct mgmt_cp_start_discovery
*cp
= data
;
2458 struct pending_cmd
*cmd
;
2459 struct hci_dev
*hdev
;
2462 BT_DBG("hci%u", index
);
2464 if (len
!= sizeof(*cp
))
2465 return cmd_status(sk
, index
, MGMT_OP_START_DISCOVERY
,
2466 MGMT_STATUS_INVALID_PARAMS
);
2468 hdev
= hci_dev_get(index
);
2470 return cmd_status(sk
, index
, MGMT_OP_START_DISCOVERY
,
2471 MGMT_STATUS_INVALID_PARAMS
);
2475 if (!hdev_is_powered(hdev
)) {
2476 err
= cmd_status(sk
, index
, MGMT_OP_START_DISCOVERY
,
2477 MGMT_STATUS_NOT_POWERED
);
2481 if (hdev
->discovery
.state
!= DISCOVERY_STOPPED
) {
2482 err
= cmd_status(sk
, index
, MGMT_OP_START_DISCOVERY
,
2487 cmd
= mgmt_pending_add(sk
, MGMT_OP_START_DISCOVERY
, hdev
, NULL
, 0);
2493 hdev
->discovery
.type
= cp
->type
;
2495 switch (hdev
->discovery
.type
) {
2496 case DISCOV_TYPE_BREDR
:
2497 err
= hci_do_inquiry(hdev
, INQUIRY_LEN_BREDR
);
2500 case DISCOV_TYPE_LE
:
2501 err
= hci_le_scan(hdev
, LE_SCAN_TYPE
, LE_SCAN_INT
,
2502 LE_SCAN_WIN
, LE_SCAN_TIMEOUT_LE_ONLY
);
2505 case DISCOV_TYPE_INTERLEAVED
:
2506 err
= discovery(hdev
);
2514 mgmt_pending_remove(cmd
);
2516 hci_discovery_set_state(hdev
, DISCOVERY_STARTING
);
2519 hci_dev_unlock(hdev
);
2525 static int stop_discovery(struct sock
*sk
, u16 index
, void *data
, u16 len
)
2527 struct mgmt_cp_stop_discovery
*mgmt_cp
= data
;
2528 struct hci_dev
*hdev
;
2529 struct pending_cmd
*cmd
;
2530 struct hci_cp_remote_name_req_cancel cp
;
2531 struct inquiry_entry
*e
;
2534 BT_DBG("hci%u", index
);
2536 if (len
!= sizeof(*mgmt_cp
))
2537 return cmd_status(sk
, index
, MGMT_OP_STOP_DISCOVERY
,
2538 MGMT_STATUS_INVALID_PARAMS
);
2540 hdev
= hci_dev_get(index
);
2542 return cmd_status(sk
, index
, MGMT_OP_STOP_DISCOVERY
,
2543 MGMT_STATUS_INVALID_PARAMS
);
2547 if (!hci_discovery_active(hdev
)) {
2548 err
= cmd_complete(sk
, index
, MGMT_OP_STOP_DISCOVERY
,
2549 MGMT_STATUS_REJECTED
,
2550 &mgmt_cp
->type
, sizeof(mgmt_cp
->type
));
2554 if (hdev
->discovery
.type
!= mgmt_cp
->type
) {
2555 err
= cmd_complete(sk
, index
, MGMT_OP_STOP_DISCOVERY
,
2556 MGMT_STATUS_INVALID_PARAMS
,
2557 &mgmt_cp
->type
, sizeof(mgmt_cp
->type
));
2561 cmd
= mgmt_pending_add(sk
, MGMT_OP_STOP_DISCOVERY
, hdev
, NULL
, 0);
2567 if (hdev
->discovery
.state
== DISCOVERY_FINDING
) {
2568 err
= hci_cancel_inquiry(hdev
);
2570 mgmt_pending_remove(cmd
);
2572 hci_discovery_set_state(hdev
, DISCOVERY_STOPPING
);
2576 e
= hci_inquiry_cache_lookup_resolve(hdev
, BDADDR_ANY
, NAME_PENDING
);
2578 mgmt_pending_remove(cmd
);
2579 err
= cmd_complete(sk
, index
, MGMT_OP_STOP_DISCOVERY
, 0,
2580 &mgmt_cp
->type
, sizeof(mgmt_cp
->type
));
2581 hci_discovery_set_state(hdev
, DISCOVERY_STOPPED
);
2585 bacpy(&cp
.bdaddr
, &e
->data
.bdaddr
);
2586 err
= hci_send_cmd(hdev
, HCI_OP_REMOTE_NAME_REQ_CANCEL
,
2589 mgmt_pending_remove(cmd
);
2591 hci_discovery_set_state(hdev
, DISCOVERY_STOPPING
);
2594 hci_dev_unlock(hdev
);
2600 static int confirm_name(struct sock
*sk
, u16 index
, void *data
, u16 len
)
2602 struct mgmt_cp_confirm_name
*cp
= data
;
2603 struct inquiry_entry
*e
;
2604 struct hci_dev
*hdev
;
2607 BT_DBG("hci%u", index
);
2609 if (len
!= sizeof(*cp
))
2610 return cmd_status(sk
, index
, MGMT_OP_CONFIRM_NAME
,
2611 MGMT_STATUS_INVALID_PARAMS
);
2613 hdev
= hci_dev_get(index
);
2615 return cmd_status(sk
, index
, MGMT_OP_CONFIRM_NAME
,
2616 MGMT_STATUS_INVALID_PARAMS
);
2620 if (!hci_discovery_active(hdev
)) {
2621 err
= cmd_status(sk
, index
, MGMT_OP_CONFIRM_NAME
,
2622 MGMT_STATUS_FAILED
);
2626 e
= hci_inquiry_cache_lookup_unknown(hdev
, &cp
->addr
.bdaddr
);
2628 err
= cmd_status(sk
, index
, MGMT_OP_CONFIRM_NAME
,
2629 MGMT_STATUS_INVALID_PARAMS
);
2633 if (cp
->name_known
) {
2634 e
->name_state
= NAME_KNOWN
;
2637 e
->name_state
= NAME_NEEDED
;
2638 hci_inquiry_cache_update_resolve(hdev
, e
);
2644 hci_dev_unlock(hdev
);
2649 static int block_device(struct sock
*sk
, u16 index
, void *data
, u16 len
)
2651 struct hci_dev
*hdev
;
2652 struct mgmt_cp_block_device
*cp
= data
;
2656 BT_DBG("hci%u", index
);
2658 if (len
!= sizeof(*cp
))
2659 return cmd_status(sk
, index
, MGMT_OP_BLOCK_DEVICE
,
2660 MGMT_STATUS_INVALID_PARAMS
);
2662 hdev
= hci_dev_get(index
);
2664 return cmd_complete(sk
, index
, MGMT_OP_BLOCK_DEVICE
,
2665 MGMT_STATUS_INVALID_PARAMS
,
2666 &cp
->addr
, sizeof(cp
->addr
));
2670 err
= hci_blacklist_add(hdev
, &cp
->addr
.bdaddr
, cp
->addr
.type
);
2672 status
= MGMT_STATUS_FAILED
;
2676 err
= cmd_complete(sk
, index
, MGMT_OP_BLOCK_DEVICE
, status
,
2677 &cp
->addr
, sizeof(cp
->addr
));
2679 hci_dev_unlock(hdev
);
2685 static int unblock_device(struct sock
*sk
, u16 index
, void *data
, u16 len
)
2687 struct hci_dev
*hdev
;
2688 struct mgmt_cp_unblock_device
*cp
= data
;
2692 BT_DBG("hci%u", index
);
2694 if (len
!= sizeof(*cp
))
2695 return cmd_status(sk
, index
, MGMT_OP_UNBLOCK_DEVICE
,
2696 MGMT_STATUS_INVALID_PARAMS
);
2698 hdev
= hci_dev_get(index
);
2700 return cmd_complete(sk
, index
, MGMT_OP_UNBLOCK_DEVICE
,
2701 MGMT_STATUS_INVALID_PARAMS
,
2702 &cp
->addr
, sizeof(cp
->addr
));
2706 err
= hci_blacklist_del(hdev
, &cp
->addr
.bdaddr
, cp
->addr
.type
);
2708 status
= MGMT_STATUS_INVALID_PARAMS
;
2712 err
= cmd_complete(sk
, index
, MGMT_OP_UNBLOCK_DEVICE
, status
,
2713 &cp
->addr
, sizeof(cp
->addr
));
2715 hci_dev_unlock(hdev
);
2721 static int set_fast_connectable(struct sock
*sk
, u16 index
,
2722 void *data
, u16 len
)
2724 struct hci_dev
*hdev
;
2725 struct mgmt_mode
*cp
= data
;
2726 struct hci_cp_write_page_scan_activity acp
;
2730 BT_DBG("hci%u", index
);
2732 if (len
!= sizeof(*cp
))
2733 return cmd_status(sk
, index
, MGMT_OP_SET_FAST_CONNECTABLE
,
2734 MGMT_STATUS_INVALID_PARAMS
);
2736 hdev
= hci_dev_get(index
);
2738 return cmd_status(sk
, index
, MGMT_OP_SET_FAST_CONNECTABLE
,
2739 MGMT_STATUS_INVALID_PARAMS
);
2740 if (!hdev_is_powered(hdev
))
2741 return cmd_status(sk
, index
, MGMT_OP_SET_FAST_CONNECTABLE
,
2742 MGMT_STATUS_NOT_POWERED
);
2744 if (!test_bit(HCI_CONNECTABLE
, &hdev
->dev_flags
))
2745 return cmd_status(sk
, index
, MGMT_OP_SET_FAST_CONNECTABLE
,
2746 MGMT_STATUS_REJECTED
);
2751 type
= PAGE_SCAN_TYPE_INTERLACED
;
2752 acp
.interval
= 0x0024; /* 22.5 msec page scan interval */
2754 type
= PAGE_SCAN_TYPE_STANDARD
; /* default */
2755 acp
.interval
= 0x0800; /* default 1.28 sec page scan */
2758 acp
.window
= 0x0012; /* default 11.25 msec page scan window */
2760 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY
,
2763 err
= cmd_status(sk
, index
, MGMT_OP_SET_FAST_CONNECTABLE
,
2764 MGMT_STATUS_FAILED
);
2768 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_PAGE_SCAN_TYPE
, 1, &type
);
2770 err
= cmd_status(sk
, index
, MGMT_OP_SET_FAST_CONNECTABLE
,
2771 MGMT_STATUS_FAILED
);
2775 err
= cmd_complete(sk
, index
, MGMT_OP_SET_FAST_CONNECTABLE
, 0,
2778 hci_dev_unlock(hdev
);
2784 static int load_long_term_keys(struct sock
*sk
, u16 index
,
2785 void *cp_data
, u16 len
)
2787 struct hci_dev
*hdev
;
2788 struct mgmt_cp_load_long_term_keys
*cp
= cp_data
;
2789 u16 key_count
, expected_len
;
2792 if (len
< sizeof(*cp
))
2793 return cmd_status(sk
, index
, MGMT_OP_LOAD_LONG_TERM_KEYS
,
2796 key_count
= get_unaligned_le16(&cp
->key_count
);
2798 expected_len
= sizeof(*cp
) + key_count
*
2799 sizeof(struct mgmt_ltk_info
);
2800 if (expected_len
!= len
) {
2801 BT_ERR("load_keys: expected %u bytes, got %u bytes",
2803 return cmd_status(sk
, index
, MGMT_OP_LOAD_LONG_TERM_KEYS
,
2807 hdev
= hci_dev_get(index
);
2809 return cmd_status(sk
, index
, MGMT_OP_LOAD_LONG_TERM_KEYS
,
2812 BT_DBG("hci%u key_count %u", index
, key_count
);
2816 hci_smp_ltks_clear(hdev
);
2818 for (i
= 0; i
< key_count
; i
++) {
2819 struct mgmt_ltk_info
*key
= &cp
->keys
[i
];
2825 type
= HCI_SMP_LTK_SLAVE
;
2827 hci_add_ltk(hdev
, &key
->addr
.bdaddr
, key
->addr
.type
,
2828 type
, 0, key
->authenticated
, key
->val
,
2829 key
->enc_size
, key
->ediv
, key
->rand
);
2832 hci_dev_unlock(hdev
);
2838 int mgmt_control(struct sock
*sk
, struct msghdr
*msg
, size_t msglen
)
2842 struct mgmt_hdr
*hdr
;
2843 u16 opcode
, index
, len
;
2846 BT_DBG("got %zu bytes", msglen
);
2848 if (msglen
< sizeof(*hdr
))
2851 buf
= kmalloc(msglen
, GFP_KERNEL
);
2855 if (memcpy_fromiovec(buf
, msg
->msg_iov
, msglen
)) {
2861 opcode
= get_unaligned_le16(&hdr
->opcode
);
2862 index
= get_unaligned_le16(&hdr
->index
);
2863 len
= get_unaligned_le16(&hdr
->len
);
2865 if (len
!= msglen
- sizeof(*hdr
)) {
2870 cp
= buf
+ sizeof(*hdr
);
2873 case MGMT_OP_READ_VERSION
:
2874 err
= read_version(sk
);
2876 case MGMT_OP_READ_COMMANDS
:
2877 err
= read_commands(sk
);
2879 case MGMT_OP_READ_INDEX_LIST
:
2880 err
= read_index_list(sk
);
2882 case MGMT_OP_READ_INFO
:
2883 err
= read_controller_info(sk
, index
);
2885 case MGMT_OP_SET_POWERED
:
2886 err
= set_powered(sk
, index
, cp
, len
);
2888 case MGMT_OP_SET_DISCOVERABLE
:
2889 err
= set_discoverable(sk
, index
, cp
, len
);
2891 case MGMT_OP_SET_CONNECTABLE
:
2892 err
= set_connectable(sk
, index
, cp
, len
);
2894 case MGMT_OP_SET_FAST_CONNECTABLE
:
2895 err
= set_fast_connectable(sk
, index
, cp
, len
);
2897 case MGMT_OP_SET_PAIRABLE
:
2898 err
= set_pairable(sk
, index
, cp
, len
);
2900 case MGMT_OP_SET_LINK_SECURITY
:
2901 err
= set_link_security(sk
, index
, cp
, len
);
2903 case MGMT_OP_SET_SSP
:
2904 err
= set_ssp(sk
, index
, cp
, len
);
2906 case MGMT_OP_SET_HS
:
2907 err
= set_hs(sk
, index
, cp
, len
);
2909 case MGMT_OP_SET_LE
:
2910 err
= set_le(sk
, index
, cp
, len
);
2912 case MGMT_OP_ADD_UUID
:
2913 err
= add_uuid(sk
, index
, cp
, len
);
2915 case MGMT_OP_REMOVE_UUID
:
2916 err
= remove_uuid(sk
, index
, cp
, len
);
2918 case MGMT_OP_SET_DEV_CLASS
:
2919 err
= set_dev_class(sk
, index
, cp
, len
);
2921 case MGMT_OP_LOAD_LINK_KEYS
:
2922 err
= load_link_keys(sk
, index
, cp
, len
);
2924 case MGMT_OP_DISCONNECT
:
2925 err
= disconnect(sk
, index
, cp
, len
);
2927 case MGMT_OP_GET_CONNECTIONS
:
2928 err
= get_connections(sk
, index
);
2930 case MGMT_OP_PIN_CODE_REPLY
:
2931 err
= pin_code_reply(sk
, index
, cp
, len
);
2933 case MGMT_OP_PIN_CODE_NEG_REPLY
:
2934 err
= pin_code_neg_reply(sk
, index
, cp
, len
);
2936 case MGMT_OP_SET_IO_CAPABILITY
:
2937 err
= set_io_capability(sk
, index
, cp
, len
);
2939 case MGMT_OP_PAIR_DEVICE
:
2940 err
= pair_device(sk
, index
, cp
, len
);
2942 case MGMT_OP_CANCEL_PAIR_DEVICE
:
2943 err
= cancel_pair_device(sk
, index
, buf
+ sizeof(*hdr
), len
);
2945 case MGMT_OP_UNPAIR_DEVICE
:
2946 err
= unpair_device(sk
, index
, cp
, len
);
2948 case MGMT_OP_USER_CONFIRM_REPLY
:
2949 err
= user_confirm_reply(sk
, index
, cp
, len
);
2951 case MGMT_OP_USER_CONFIRM_NEG_REPLY
:
2952 err
= user_confirm_neg_reply(sk
, index
, cp
, len
);
2954 case MGMT_OP_USER_PASSKEY_REPLY
:
2955 err
= user_passkey_reply(sk
, index
, cp
, len
);
2957 case MGMT_OP_USER_PASSKEY_NEG_REPLY
:
2958 err
= user_passkey_neg_reply(sk
, index
, cp
, len
);
2960 case MGMT_OP_SET_LOCAL_NAME
:
2961 err
= set_local_name(sk
, index
, cp
, len
);
2963 case MGMT_OP_READ_LOCAL_OOB_DATA
:
2964 err
= read_local_oob_data(sk
, index
);
2966 case MGMT_OP_ADD_REMOTE_OOB_DATA
:
2967 err
= add_remote_oob_data(sk
, index
, cp
, len
);
2969 case MGMT_OP_REMOVE_REMOTE_OOB_DATA
:
2970 err
= remove_remote_oob_data(sk
, index
, cp
, len
);
2972 case MGMT_OP_START_DISCOVERY
:
2973 err
= start_discovery(sk
, index
, cp
, len
);
2975 case MGMT_OP_STOP_DISCOVERY
:
2976 err
= stop_discovery(sk
, index
, cp
, len
);
2978 case MGMT_OP_CONFIRM_NAME
:
2979 err
= confirm_name(sk
, index
, cp
, len
);
2981 case MGMT_OP_BLOCK_DEVICE
:
2982 err
= block_device(sk
, index
, cp
, len
);
2984 case MGMT_OP_UNBLOCK_DEVICE
:
2985 err
= unblock_device(sk
, index
, cp
, len
);
2987 case MGMT_OP_LOAD_LONG_TERM_KEYS
:
2988 err
= load_long_term_keys(sk
, index
, cp
, len
);
2991 BT_DBG("Unknown op %u", opcode
);
2992 err
= cmd_status(sk
, index
, opcode
,
2993 MGMT_STATUS_UNKNOWN_COMMAND
);
3007 static void cmd_status_rsp(struct pending_cmd
*cmd
, void *data
)
3011 cmd_status(cmd
->sk
, cmd
->index
, cmd
->opcode
, *status
);
3012 mgmt_pending_remove(cmd
);
3015 int mgmt_index_added(struct hci_dev
*hdev
)
3017 return mgmt_event(MGMT_EV_INDEX_ADDED
, hdev
, NULL
, 0, NULL
);
3020 int mgmt_index_removed(struct hci_dev
*hdev
)
3024 mgmt_pending_foreach(0, hdev
, cmd_status_rsp
, &status
);
3026 return mgmt_event(MGMT_EV_INDEX_REMOVED
, hdev
, NULL
, 0, NULL
);
3031 struct hci_dev
*hdev
;
3034 static void settings_rsp(struct pending_cmd
*cmd
, void *data
)
3036 struct cmd_lookup
*match
= data
;
3038 send_settings_rsp(cmd
->sk
, cmd
->opcode
, match
->hdev
);
3040 list_del(&cmd
->list
);
3042 if (match
->sk
== NULL
) {
3043 match
->sk
= cmd
->sk
;
3044 sock_hold(match
->sk
);
3047 mgmt_pending_free(cmd
);
3050 int mgmt_powered(struct hci_dev
*hdev
, u8 powered
)
3052 struct cmd_lookup match
= { NULL
, hdev
};
3055 if (!test_bit(HCI_MGMT
, &hdev
->dev_flags
))
3058 mgmt_pending_foreach(MGMT_OP_SET_POWERED
, hdev
, settings_rsp
, &match
);
3063 if (test_bit(HCI_CONNECTABLE
, &hdev
->dev_flags
))
3065 if (test_bit(HCI_DISCOVERABLE
, &hdev
->dev_flags
))
3066 scan
|= SCAN_INQUIRY
;
3069 hci_send_cmd(hdev
, HCI_OP_WRITE_SCAN_ENABLE
, 1, &scan
);
3071 u8 status
= ENETDOWN
;
3072 mgmt_pending_foreach(0, hdev
, cmd_status_rsp
, &status
);
3075 err
= new_settings(hdev
, match
.sk
);
3083 int mgmt_discoverable(struct hci_dev
*hdev
, u8 discoverable
)
3085 struct cmd_lookup match
= { NULL
, hdev
};
3086 bool changed
= false;
3090 if (!test_and_set_bit(HCI_DISCOVERABLE
, &hdev
->dev_flags
))
3093 if (test_and_clear_bit(HCI_DISCOVERABLE
, &hdev
->dev_flags
))
3097 mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE
, hdev
, settings_rsp
,
3101 err
= new_settings(hdev
, match
.sk
);
3109 int mgmt_connectable(struct hci_dev
*hdev
, u8 connectable
)
3111 struct cmd_lookup match
= { NULL
, hdev
};
3112 bool changed
= false;
3116 if (!test_and_set_bit(HCI_CONNECTABLE
, &hdev
->dev_flags
))
3119 if (test_and_clear_bit(HCI_CONNECTABLE
, &hdev
->dev_flags
))
3123 mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE
, hdev
, settings_rsp
,
3127 err
= new_settings(hdev
, match
.sk
);
3135 int mgmt_write_scan_failed(struct hci_dev
*hdev
, u8 scan
, u8 status
)
3137 u8 mgmt_err
= mgmt_status(status
);
3139 if (scan
& SCAN_PAGE
)
3140 mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE
, hdev
,
3141 cmd_status_rsp
, &mgmt_err
);
3143 if (scan
& SCAN_INQUIRY
)
3144 mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE
, hdev
,
3145 cmd_status_rsp
, &mgmt_err
);
3150 int mgmt_new_link_key(struct hci_dev
*hdev
, struct link_key
*key
,
3153 struct mgmt_ev_new_link_key ev
;
3155 memset(&ev
, 0, sizeof(ev
));
3157 ev
.store_hint
= persistent
;
3158 bacpy(&ev
.key
.addr
.bdaddr
, &key
->bdaddr
);
3159 ev
.key
.addr
.type
= MGMT_ADDR_BREDR
;
3160 ev
.key
.type
= key
->type
;
3161 memcpy(ev
.key
.val
, key
->val
, 16);
3162 ev
.key
.pin_len
= key
->pin_len
;
3164 return mgmt_event(MGMT_EV_NEW_LINK_KEY
, hdev
, &ev
, sizeof(ev
), NULL
);
3167 int mgmt_new_ltk(struct hci_dev
*hdev
, struct smp_ltk
*key
, u8 persistent
)
3169 struct mgmt_ev_new_long_term_key ev
;
3171 memset(&ev
, 0, sizeof(ev
));
3173 ev
.store_hint
= persistent
;
3174 bacpy(&ev
.key
.addr
.bdaddr
, &key
->bdaddr
);
3175 ev
.key
.addr
.type
= key
->bdaddr_type
;
3176 ev
.key
.authenticated
= key
->authenticated
;
3177 ev
.key
.enc_size
= key
->enc_size
;
3178 ev
.key
.ediv
= key
->ediv
;
3180 if (key
->type
== HCI_SMP_LTK
)
3183 memcpy(ev
.key
.rand
, key
->rand
, sizeof(key
->rand
));
3184 memcpy(ev
.key
.val
, key
->val
, sizeof(key
->val
));
3186 return mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY
, hdev
,
3187 &ev
, sizeof(ev
), NULL
);
3190 int mgmt_device_connected(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
3191 u8 addr_type
, u8
*name
, u8 name_len
,
3195 struct mgmt_ev_device_connected
*ev
= (void *) buf
;
3198 bacpy(&ev
->addr
.bdaddr
, bdaddr
);
3199 ev
->addr
.type
= link_to_mgmt(link_type
, addr_type
);
3202 eir_len
= eir_append_data(ev
->eir
, 0, EIR_NAME_COMPLETE
,
3205 if (dev_class
&& memcmp(dev_class
, "\0\0\0", 3) != 0)
3206 eir_len
= eir_append_data(&ev
->eir
[eir_len
], eir_len
,
3207 EIR_CLASS_OF_DEV
, dev_class
, 3);
3209 put_unaligned_le16(eir_len
, &ev
->eir_len
);
3211 return mgmt_event(MGMT_EV_DEVICE_CONNECTED
, hdev
, buf
,
3212 sizeof(*ev
) + eir_len
, NULL
);
3215 static void disconnect_rsp(struct pending_cmd
*cmd
, void *data
)
3217 struct mgmt_cp_disconnect
*cp
= cmd
->param
;
3218 struct sock
**sk
= data
;
3219 struct mgmt_rp_disconnect rp
;
3221 bacpy(&rp
.addr
.bdaddr
, &cp
->addr
.bdaddr
);
3222 rp
.addr
.type
= cp
->addr
.type
;
3224 cmd_complete(cmd
->sk
, cmd
->index
, MGMT_OP_DISCONNECT
, 0, &rp
,
3230 mgmt_pending_remove(cmd
);
3233 static void unpair_device_rsp(struct pending_cmd
*cmd
, void *data
)
3235 struct hci_dev
*hdev
= data
;
3236 struct mgmt_cp_unpair_device
*cp
= cmd
->param
;
3237 struct mgmt_rp_unpair_device rp
;
3239 memset(&rp
, 0, sizeof(rp
));
3240 bacpy(&rp
.addr
.bdaddr
, &cp
->addr
.bdaddr
);
3241 rp
.addr
.type
= cp
->addr
.type
;
3243 device_unpaired(hdev
, &cp
->addr
.bdaddr
, cp
->addr
.type
, cmd
->sk
);
3245 cmd_complete(cmd
->sk
, cmd
->index
, cmd
->opcode
, 0, &rp
, sizeof(rp
));
3247 mgmt_pending_remove(cmd
);
3250 int mgmt_device_disconnected(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3251 u8 link_type
, u8 addr_type
)
3253 struct mgmt_addr_info ev
;
3254 struct sock
*sk
= NULL
;
3257 mgmt_pending_foreach(MGMT_OP_DISCONNECT
, hdev
, disconnect_rsp
, &sk
);
3259 bacpy(&ev
.bdaddr
, bdaddr
);
3260 ev
.type
= link_to_mgmt(link_type
, addr_type
);
3262 err
= mgmt_event(MGMT_EV_DEVICE_DISCONNECTED
, hdev
, &ev
, sizeof(ev
),
3268 mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE
, hdev
, unpair_device_rsp
,
3274 int mgmt_disconnect_failed(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3275 u8 link_type
, u8 addr_type
, u8 status
)
3277 struct mgmt_rp_disconnect rp
;
3278 struct pending_cmd
*cmd
;
3281 cmd
= mgmt_pending_find(MGMT_OP_DISCONNECT
, hdev
);
3285 bacpy(&rp
.addr
.bdaddr
, bdaddr
);
3286 rp
.addr
.type
= link_to_mgmt(link_type
, addr_type
);
3288 err
= cmd_complete(cmd
->sk
, cmd
->index
, MGMT_OP_DISCONNECT
,
3289 mgmt_status(status
), &rp
, sizeof(rp
));
3291 mgmt_pending_remove(cmd
);
3293 mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE
, hdev
, unpair_device_rsp
,
3298 int mgmt_connect_failed(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
3299 u8 addr_type
, u8 status
)
3301 struct mgmt_ev_connect_failed ev
;
3303 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3304 ev
.addr
.type
= link_to_mgmt(link_type
, addr_type
);
3305 ev
.status
= mgmt_status(status
);
3307 return mgmt_event(MGMT_EV_CONNECT_FAILED
, hdev
, &ev
, sizeof(ev
), NULL
);
3310 int mgmt_pin_code_request(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 secure
)
3312 struct mgmt_ev_pin_code_request ev
;
3314 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3315 ev
.addr
.type
= MGMT_ADDR_BREDR
;
3318 return mgmt_event(MGMT_EV_PIN_CODE_REQUEST
, hdev
, &ev
, sizeof(ev
),
3322 int mgmt_pin_code_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3325 struct pending_cmd
*cmd
;
3326 struct mgmt_rp_pin_code_reply rp
;
3329 cmd
= mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY
, hdev
);
3333 bacpy(&rp
.addr
.bdaddr
, bdaddr
);
3334 rp
.addr
.type
= MGMT_ADDR_BREDR
;
3336 err
= cmd_complete(cmd
->sk
, hdev
->id
, MGMT_OP_PIN_CODE_REPLY
,
3337 mgmt_status(status
), &rp
, sizeof(rp
));
3339 mgmt_pending_remove(cmd
);
3344 int mgmt_pin_code_neg_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3347 struct pending_cmd
*cmd
;
3348 struct mgmt_rp_pin_code_reply rp
;
3351 cmd
= mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY
, hdev
);
3355 bacpy(&rp
.addr
.bdaddr
, bdaddr
);
3356 rp
.addr
.type
= MGMT_ADDR_BREDR
;
3358 err
= cmd_complete(cmd
->sk
, hdev
->id
, MGMT_OP_PIN_CODE_NEG_REPLY
,
3359 mgmt_status(status
), &rp
, sizeof(rp
));
3361 mgmt_pending_remove(cmd
);
3366 int mgmt_user_confirm_request(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3367 u8 link_type
, u8 addr_type
, __le32 value
,
3370 struct mgmt_ev_user_confirm_request ev
;
3372 BT_DBG("%s", hdev
->name
);
3374 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3375 ev
.addr
.type
= link_to_mgmt(link_type
, addr_type
);
3376 ev
.confirm_hint
= confirm_hint
;
3377 put_unaligned_le32(value
, &ev
.value
);
3379 return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST
, hdev
, &ev
, sizeof(ev
),
3383 int mgmt_user_passkey_request(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3384 u8 link_type
, u8 addr_type
)
3386 struct mgmt_ev_user_passkey_request ev
;
3388 BT_DBG("%s", hdev
->name
);
3390 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3391 ev
.addr
.type
= link_to_mgmt(link_type
, addr_type
);
3393 return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST
, hdev
, &ev
, sizeof(ev
),
3397 static int user_pairing_resp_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3398 u8 link_type
, u8 addr_type
, u8 status
,
3401 struct pending_cmd
*cmd
;
3402 struct mgmt_rp_user_confirm_reply rp
;
3405 cmd
= mgmt_pending_find(opcode
, hdev
);
3409 bacpy(&rp
.addr
.bdaddr
, bdaddr
);
3410 rp
.addr
.type
= link_to_mgmt(link_type
, addr_type
);
3411 err
= cmd_complete(cmd
->sk
, hdev
->id
, opcode
, mgmt_status(status
),
3414 mgmt_pending_remove(cmd
);
3419 int mgmt_user_confirm_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3420 u8 link_type
, u8 addr_type
, u8 status
)
3422 return user_pairing_resp_complete(hdev
, bdaddr
, link_type
, addr_type
,
3423 status
, MGMT_OP_USER_CONFIRM_REPLY
);
3426 int mgmt_user_confirm_neg_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3427 u8 link_type
, u8 addr_type
, u8 status
)
3429 return user_pairing_resp_complete(hdev
, bdaddr
, link_type
, addr_type
,
3430 status
, MGMT_OP_USER_CONFIRM_NEG_REPLY
);
3433 int mgmt_user_passkey_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3434 u8 link_type
, u8 addr_type
, u8 status
)
3436 return user_pairing_resp_complete(hdev
, bdaddr
, link_type
, addr_type
,
3437 status
, MGMT_OP_USER_PASSKEY_REPLY
);
3440 int mgmt_user_passkey_neg_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3441 u8 link_type
, u8 addr_type
, u8 status
)
3443 return user_pairing_resp_complete(hdev
, bdaddr
, link_type
, addr_type
,
3444 status
, MGMT_OP_USER_PASSKEY_NEG_REPLY
);
3447 int mgmt_auth_failed(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
3448 u8 addr_type
, u8 status
)
3450 struct mgmt_ev_auth_failed ev
;
3452 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3453 ev
.addr
.type
= link_to_mgmt(link_type
, addr_type
);
3454 ev
.status
= mgmt_status(status
);
3456 return mgmt_event(MGMT_EV_AUTH_FAILED
, hdev
, &ev
, sizeof(ev
), NULL
);
3459 int mgmt_auth_enable_complete(struct hci_dev
*hdev
, u8 status
)
3461 struct cmd_lookup match
= { NULL
, hdev
};
3462 bool changed
= false;
3466 u8 mgmt_err
= mgmt_status(status
);
3467 mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY
, hdev
,
3468 cmd_status_rsp
, &mgmt_err
);
3472 if (test_bit(HCI_AUTH
, &hdev
->flags
)) {
3473 if (!test_and_set_bit(HCI_LINK_SECURITY
, &hdev
->dev_flags
))
3476 if (test_and_clear_bit(HCI_LINK_SECURITY
, &hdev
->dev_flags
))
3480 mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY
, hdev
, settings_rsp
,
3484 err
= new_settings(hdev
, match
.sk
);
3492 static int clear_eir(struct hci_dev
*hdev
)
3494 struct hci_cp_write_eir cp
;
3496 if (!(hdev
->features
[6] & LMP_EXT_INQ
))
3499 memset(hdev
->eir
, 0, sizeof(hdev
->eir
));
3501 memset(&cp
, 0, sizeof(cp
));
3503 return hci_send_cmd(hdev
, HCI_OP_WRITE_EIR
, sizeof(cp
), &cp
);
3506 int mgmt_ssp_enable_complete(struct hci_dev
*hdev
, u8 enable
, u8 status
)
3508 struct cmd_lookup match
= { NULL
, hdev
};
3509 bool changed
= false;
3513 u8 mgmt_err
= mgmt_status(status
);
3515 if (enable
&& test_and_clear_bit(HCI_SSP_ENABLED
,
3517 err
= new_settings(hdev
, NULL
);
3519 mgmt_pending_foreach(MGMT_OP_SET_SSP
, hdev
,
3520 cmd_status_rsp
, &mgmt_err
);
3526 if (!test_and_set_bit(HCI_SSP_ENABLED
, &hdev
->dev_flags
))
3529 if (test_and_clear_bit(HCI_SSP_ENABLED
, &hdev
->dev_flags
))
3533 mgmt_pending_foreach(MGMT_OP_SET_SSP
, hdev
, settings_rsp
, &match
);
3536 err
= new_settings(hdev
, match
.sk
);
3541 if (test_bit(HCI_SSP_ENABLED
, &hdev
->dev_flags
))
3549 int mgmt_set_local_name_complete(struct hci_dev
*hdev
, u8
*name
, u8 status
)
3551 struct pending_cmd
*cmd
;
3552 struct mgmt_cp_set_local_name ev
;
3555 memset(&ev
, 0, sizeof(ev
));
3556 memcpy(ev
.name
, name
, HCI_MAX_NAME_LENGTH
);
3558 cmd
= mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME
, hdev
);
3563 err
= cmd_status(cmd
->sk
, hdev
->id
, MGMT_OP_SET_LOCAL_NAME
,
3564 mgmt_status(status
));
3570 err
= cmd_complete(cmd
->sk
, hdev
->id
, MGMT_OP_SET_LOCAL_NAME
, 0, &ev
,
3576 err
= mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED
, hdev
, &ev
, sizeof(ev
),
3577 cmd
? cmd
->sk
: NULL
);
3582 mgmt_pending_remove(cmd
);
3586 int mgmt_read_local_oob_data_reply_complete(struct hci_dev
*hdev
, u8
*hash
,
3587 u8
*randomizer
, u8 status
)
3589 struct pending_cmd
*cmd
;
3592 BT_DBG("%s status %u", hdev
->name
, status
);
3594 cmd
= mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA
, hdev
);
3599 err
= cmd_status(cmd
->sk
, hdev
->id
,
3600 MGMT_OP_READ_LOCAL_OOB_DATA
,
3601 mgmt_status(status
));
3603 struct mgmt_rp_read_local_oob_data rp
;
3605 memcpy(rp
.hash
, hash
, sizeof(rp
.hash
));
3606 memcpy(rp
.randomizer
, randomizer
, sizeof(rp
.randomizer
));
3608 err
= cmd_complete(cmd
->sk
, hdev
->id
,
3609 MGMT_OP_READ_LOCAL_OOB_DATA
,
3610 0, &rp
, sizeof(rp
));
3613 mgmt_pending_remove(cmd
);
3618 int mgmt_le_enable_complete(struct hci_dev
*hdev
, u8 enable
, u8 status
)
3620 struct cmd_lookup match
= { NULL
, hdev
};
3621 bool changed
= false;
3625 u8 mgmt_err
= mgmt_status(status
);
3627 if (enable
&& test_and_clear_bit(HCI_LE_ENABLED
,
3629 err
= new_settings(hdev
, NULL
);
3631 mgmt_pending_foreach(MGMT_OP_SET_LE
, hdev
,
3632 cmd_status_rsp
, &mgmt_err
);
3638 if (!test_and_set_bit(HCI_LE_ENABLED
, &hdev
->dev_flags
))
3641 if (test_and_clear_bit(HCI_LE_ENABLED
, &hdev
->dev_flags
))
3645 mgmt_pending_foreach(MGMT_OP_SET_LE
, hdev
, settings_rsp
, &match
);
3648 err
= new_settings(hdev
, match
.sk
);
3656 int mgmt_device_found(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
3657 u8 addr_type
, u8
*dev_class
, s8 rssi
,
3658 u8 cfm_name
, u8
*eir
, u16 eir_len
)
3661 struct mgmt_ev_device_found
*ev
= (void *) buf
;
3664 /* Leave 5 bytes for a potential CoD field */
3665 if (sizeof(*ev
) + eir_len
+ 5 > sizeof(buf
))
3668 memset(buf
, 0, sizeof(buf
));
3670 bacpy(&ev
->addr
.bdaddr
, bdaddr
);
3671 ev
->addr
.type
= link_to_mgmt(link_type
, addr_type
);
3673 ev
->confirm_name
= cfm_name
;
3676 memcpy(ev
->eir
, eir
, eir_len
);
3678 if (dev_class
&& !eir_has_data_type(ev
->eir
, eir_len
, EIR_CLASS_OF_DEV
))
3679 eir_len
= eir_append_data(ev
->eir
, eir_len
, EIR_CLASS_OF_DEV
,
3682 put_unaligned_le16(eir_len
, &ev
->eir_len
);
3684 ev_size
= sizeof(*ev
) + eir_len
;
3686 return mgmt_event(MGMT_EV_DEVICE_FOUND
, hdev
, ev
, ev_size
, NULL
);
3689 int mgmt_remote_name(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
3690 u8 addr_type
, s8 rssi
, u8
*name
, u8 name_len
)
3692 struct mgmt_ev_device_found
*ev
;
3693 char buf
[sizeof(*ev
) + HCI_MAX_NAME_LENGTH
+ 2];
3696 ev
= (struct mgmt_ev_device_found
*) buf
;
3698 memset(buf
, 0, sizeof(buf
));
3700 bacpy(&ev
->addr
.bdaddr
, bdaddr
);
3701 ev
->addr
.type
= link_to_mgmt(link_type
, addr_type
);
3704 eir_len
= eir_append_data(ev
->eir
, 0, EIR_NAME_COMPLETE
, name
,
3707 put_unaligned_le16(eir_len
, &ev
->eir_len
);
3709 return mgmt_event(MGMT_EV_DEVICE_FOUND
, hdev
, ev
,
3710 sizeof(*ev
) + eir_len
, NULL
);
3713 int mgmt_start_discovery_failed(struct hci_dev
*hdev
, u8 status
)
3715 struct pending_cmd
*cmd
;
3719 hci_discovery_set_state(hdev
, DISCOVERY_STOPPED
);
3721 cmd
= mgmt_pending_find(MGMT_OP_START_DISCOVERY
, hdev
);
3725 type
= hdev
->discovery
.type
;
3727 err
= cmd_complete(cmd
->sk
, hdev
->id
, cmd
->opcode
, mgmt_status(status
),
3728 &type
, sizeof(type
));
3729 mgmt_pending_remove(cmd
);
3734 int mgmt_stop_discovery_failed(struct hci_dev
*hdev
, u8 status
)
3736 struct pending_cmd
*cmd
;
3739 cmd
= mgmt_pending_find(MGMT_OP_STOP_DISCOVERY
, hdev
);
3743 err
= cmd_complete(cmd
->sk
, hdev
->id
, cmd
->opcode
, mgmt_status(status
),
3744 &hdev
->discovery
.type
,
3745 sizeof(hdev
->discovery
.type
));
3746 mgmt_pending_remove(cmd
);
3751 int mgmt_discovering(struct hci_dev
*hdev
, u8 discovering
)
3753 struct mgmt_ev_discovering ev
;
3754 struct pending_cmd
*cmd
;
3756 BT_DBG("%s discovering %u", hdev
->name
, discovering
);
3759 cmd
= mgmt_pending_find(MGMT_OP_START_DISCOVERY
, hdev
);
3761 cmd
= mgmt_pending_find(MGMT_OP_STOP_DISCOVERY
, hdev
);
3764 u8 type
= hdev
->discovery
.type
;
3766 cmd_complete(cmd
->sk
, hdev
->id
, cmd
->opcode
, 0,
3767 &type
, sizeof(type
));
3768 mgmt_pending_remove(cmd
);
3771 memset(&ev
, 0, sizeof(ev
));
3772 ev
.type
= hdev
->discovery
.type
;
3773 ev
.discovering
= discovering
;
3775 return mgmt_event(MGMT_EV_DISCOVERING
, hdev
, &ev
, sizeof(ev
), NULL
);
3778 int mgmt_device_blocked(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 type
)
3780 struct pending_cmd
*cmd
;
3781 struct mgmt_ev_device_blocked ev
;
3783 cmd
= mgmt_pending_find(MGMT_OP_BLOCK_DEVICE
, hdev
);
3785 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3786 ev
.addr
.type
= type
;
3788 return mgmt_event(MGMT_EV_DEVICE_BLOCKED
, hdev
, &ev
, sizeof(ev
),
3789 cmd
? cmd
->sk
: NULL
);
3792 int mgmt_device_unblocked(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 type
)
3794 struct pending_cmd
*cmd
;
3795 struct mgmt_ev_device_unblocked ev
;
3797 cmd
= mgmt_pending_find(MGMT_OP_UNBLOCK_DEVICE
, hdev
);
3799 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3800 ev
.addr
.type
= type
;
3802 return mgmt_event(MGMT_EV_DEVICE_UNBLOCKED
, hdev
, &ev
, sizeof(ev
),
3803 cmd
? cmd
->sk
: NULL
);
3806 module_param(enable_hs
, bool, 0644);
3807 MODULE_PARM_DESC(enable_hs
, "Enable High Speed support");
3809 module_param(enable_le
, bool, 0644);
3810 MODULE_PARM_DESC(enable_le
, "Enable Low Energy support");