2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2010 Nokia Corporation
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License version 2 as
7 published by the Free Software Foundation;
9 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
10 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
11 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
12 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
13 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
19 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
20 SOFTWARE IS DISCLAIMED.
23 /* Bluetooth HCI Management interface */
25 #include <linux/kernel.h>
26 #include <linux/uaccess.h>
27 #include <linux/module.h>
28 #include <asm/unaligned.h>
30 #include <net/bluetooth/bluetooth.h>
31 #include <net/bluetooth/hci_core.h>
32 #include <net/bluetooth/mgmt.h>
33 #include <net/bluetooth/smp.h>
35 #define MGMT_VERSION 0
36 #define MGMT_REVISION 1
38 static const u16 mgmt_commands
[] = {
39 MGMT_OP_READ_INDEX_LIST
,
42 MGMT_OP_SET_DISCOVERABLE
,
43 MGMT_OP_SET_CONNECTABLE
,
44 MGMT_OP_SET_FAST_CONNECTABLE
,
46 MGMT_OP_SET_LINK_SECURITY
,
50 MGMT_OP_SET_DEV_CLASS
,
51 MGMT_OP_SET_LOCAL_NAME
,
54 MGMT_OP_LOAD_LINK_KEYS
,
55 MGMT_OP_LOAD_LONG_TERM_KEYS
,
57 MGMT_OP_GET_CONNECTIONS
,
58 MGMT_OP_PIN_CODE_REPLY
,
59 MGMT_OP_PIN_CODE_NEG_REPLY
,
60 MGMT_OP_SET_IO_CAPABILITY
,
62 MGMT_OP_CANCEL_PAIR_DEVICE
,
63 MGMT_OP_UNPAIR_DEVICE
,
64 MGMT_OP_USER_CONFIRM_REPLY
,
65 MGMT_OP_USER_CONFIRM_NEG_REPLY
,
66 MGMT_OP_USER_PASSKEY_REPLY
,
67 MGMT_OP_USER_PASSKEY_NEG_REPLY
,
68 MGMT_OP_READ_LOCAL_OOB_DATA
,
69 MGMT_OP_ADD_REMOTE_OOB_DATA
,
70 MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
71 MGMT_OP_START_DISCOVERY
,
72 MGMT_OP_STOP_DISCOVERY
,
75 MGMT_OP_UNBLOCK_DEVICE
,
78 static const u16 mgmt_events
[] = {
79 MGMT_EV_CONTROLLER_ERROR
,
81 MGMT_EV_INDEX_REMOVED
,
83 MGMT_EV_CLASS_OF_DEV_CHANGED
,
84 MGMT_EV_LOCAL_NAME_CHANGED
,
86 MGMT_EV_NEW_LONG_TERM_KEY
,
87 MGMT_EV_DEVICE_CONNECTED
,
88 MGMT_EV_DEVICE_DISCONNECTED
,
89 MGMT_EV_CONNECT_FAILED
,
90 MGMT_EV_PIN_CODE_REQUEST
,
91 MGMT_EV_USER_CONFIRM_REQUEST
,
92 MGMT_EV_USER_PASSKEY_REQUEST
,
96 MGMT_EV_DEVICE_BLOCKED
,
97 MGMT_EV_DEVICE_UNBLOCKED
,
98 MGMT_EV_DEVICE_UNPAIRED
,
102 * These LE scan and inquiry parameters were chosen according to LE General
103 * Discovery Procedure specification.
105 #define LE_SCAN_TYPE 0x01
106 #define LE_SCAN_WIN 0x12
107 #define LE_SCAN_INT 0x12
108 #define LE_SCAN_TIMEOUT_LE_ONLY 10240 /* TGAP(gen_disc_scan_min) */
110 #define INQUIRY_LEN_BREDR 0x08 /* TGAP(100) */
112 #define SERVICE_CACHE_TIMEOUT (5 * 1000)
115 struct list_head list
;
123 /* HCI to MGMT error code conversion table */
124 static u8 mgmt_status_table
[] = {
126 MGMT_STATUS_UNKNOWN_COMMAND
, /* Unknown Command */
127 MGMT_STATUS_NOT_CONNECTED
, /* No Connection */
128 MGMT_STATUS_FAILED
, /* Hardware Failure */
129 MGMT_STATUS_CONNECT_FAILED
, /* Page Timeout */
130 MGMT_STATUS_AUTH_FAILED
, /* Authentication Failed */
131 MGMT_STATUS_NOT_PAIRED
, /* PIN or Key Missing */
132 MGMT_STATUS_NO_RESOURCES
, /* Memory Full */
133 MGMT_STATUS_TIMEOUT
, /* Connection Timeout */
134 MGMT_STATUS_NO_RESOURCES
, /* Max Number of Connections */
135 MGMT_STATUS_NO_RESOURCES
, /* Max Number of SCO Connections */
136 MGMT_STATUS_ALREADY_CONNECTED
, /* ACL Connection Exists */
137 MGMT_STATUS_BUSY
, /* Command Disallowed */
138 MGMT_STATUS_NO_RESOURCES
, /* Rejected Limited Resources */
139 MGMT_STATUS_REJECTED
, /* Rejected Security */
140 MGMT_STATUS_REJECTED
, /* Rejected Personal */
141 MGMT_STATUS_TIMEOUT
, /* Host Timeout */
142 MGMT_STATUS_NOT_SUPPORTED
, /* Unsupported Feature */
143 MGMT_STATUS_INVALID_PARAMS
, /* Invalid Parameters */
144 MGMT_STATUS_DISCONNECTED
, /* OE User Ended Connection */
145 MGMT_STATUS_NO_RESOURCES
, /* OE Low Resources */
146 MGMT_STATUS_DISCONNECTED
, /* OE Power Off */
147 MGMT_STATUS_DISCONNECTED
, /* Connection Terminated */
148 MGMT_STATUS_BUSY
, /* Repeated Attempts */
149 MGMT_STATUS_REJECTED
, /* Pairing Not Allowed */
150 MGMT_STATUS_FAILED
, /* Unknown LMP PDU */
151 MGMT_STATUS_NOT_SUPPORTED
, /* Unsupported Remote Feature */
152 MGMT_STATUS_REJECTED
, /* SCO Offset Rejected */
153 MGMT_STATUS_REJECTED
, /* SCO Interval Rejected */
154 MGMT_STATUS_REJECTED
, /* Air Mode Rejected */
155 MGMT_STATUS_INVALID_PARAMS
, /* Invalid LMP Parameters */
156 MGMT_STATUS_FAILED
, /* Unspecified Error */
157 MGMT_STATUS_NOT_SUPPORTED
, /* Unsupported LMP Parameter Value */
158 MGMT_STATUS_FAILED
, /* Role Change Not Allowed */
159 MGMT_STATUS_TIMEOUT
, /* LMP Response Timeout */
160 MGMT_STATUS_FAILED
, /* LMP Error Transaction Collision */
161 MGMT_STATUS_FAILED
, /* LMP PDU Not Allowed */
162 MGMT_STATUS_REJECTED
, /* Encryption Mode Not Accepted */
163 MGMT_STATUS_FAILED
, /* Unit Link Key Used */
164 MGMT_STATUS_NOT_SUPPORTED
, /* QoS Not Supported */
165 MGMT_STATUS_TIMEOUT
, /* Instant Passed */
166 MGMT_STATUS_NOT_SUPPORTED
, /* Pairing Not Supported */
167 MGMT_STATUS_FAILED
, /* Transaction Collision */
168 MGMT_STATUS_INVALID_PARAMS
, /* Unacceptable Parameter */
169 MGMT_STATUS_REJECTED
, /* QoS Rejected */
170 MGMT_STATUS_NOT_SUPPORTED
, /* Classification Not Supported */
171 MGMT_STATUS_REJECTED
, /* Insufficient Security */
172 MGMT_STATUS_INVALID_PARAMS
, /* Parameter Out Of Range */
173 MGMT_STATUS_BUSY
, /* Role Switch Pending */
174 MGMT_STATUS_FAILED
, /* Slot Violation */
175 MGMT_STATUS_FAILED
, /* Role Switch Failed */
176 MGMT_STATUS_INVALID_PARAMS
, /* EIR Too Large */
177 MGMT_STATUS_NOT_SUPPORTED
, /* Simple Pairing Not Supported */
178 MGMT_STATUS_BUSY
, /* Host Busy Pairing */
179 MGMT_STATUS_REJECTED
, /* Rejected, No Suitable Channel */
180 MGMT_STATUS_BUSY
, /* Controller Busy */
181 MGMT_STATUS_INVALID_PARAMS
, /* Unsuitable Connection Interval */
182 MGMT_STATUS_TIMEOUT
, /* Directed Advertising Timeout */
183 MGMT_STATUS_AUTH_FAILED
, /* Terminated Due to MIC Failure */
184 MGMT_STATUS_CONNECT_FAILED
, /* Connection Establishment Failed */
185 MGMT_STATUS_CONNECT_FAILED
, /* MAC Connection Failed */
188 static u8
mgmt_status(u8 hci_status
)
190 if (hci_status
< ARRAY_SIZE(mgmt_status_table
))
191 return mgmt_status_table
[hci_status
];
193 return MGMT_STATUS_FAILED
;
196 static int cmd_status(struct sock
*sk
, u16 index
, u16 cmd
, u8 status
)
199 struct mgmt_hdr
*hdr
;
200 struct mgmt_ev_cmd_status
*ev
;
203 BT_DBG("sock %p, index %u, cmd %u, status %u", sk
, index
, cmd
, status
);
205 skb
= alloc_skb(sizeof(*hdr
) + sizeof(*ev
), GFP_ATOMIC
);
209 hdr
= (void *) skb_put(skb
, sizeof(*hdr
));
211 hdr
->opcode
= cpu_to_le16(MGMT_EV_CMD_STATUS
);
212 hdr
->index
= cpu_to_le16(index
);
213 hdr
->len
= cpu_to_le16(sizeof(*ev
));
215 ev
= (void *) skb_put(skb
, sizeof(*ev
));
217 put_unaligned_le16(cmd
, &ev
->opcode
);
219 err
= sock_queue_rcv_skb(sk
, skb
);
226 static int cmd_complete(struct sock
*sk
, u16 index
, u16 cmd
, void *rp
,
230 struct mgmt_hdr
*hdr
;
231 struct mgmt_ev_cmd_complete
*ev
;
234 BT_DBG("sock %p", sk
);
236 skb
= alloc_skb(sizeof(*hdr
) + sizeof(*ev
) + rp_len
, GFP_ATOMIC
);
240 hdr
= (void *) skb_put(skb
, sizeof(*hdr
));
242 hdr
->opcode
= cpu_to_le16(MGMT_EV_CMD_COMPLETE
);
243 hdr
->index
= cpu_to_le16(index
);
244 hdr
->len
= cpu_to_le16(sizeof(*ev
) + rp_len
);
246 ev
= (void *) skb_put(skb
, sizeof(*ev
) + rp_len
);
247 put_unaligned_le16(cmd
, &ev
->opcode
);
250 memcpy(ev
->data
, rp
, rp_len
);
252 err
= sock_queue_rcv_skb(sk
, skb
);
259 static int read_version(struct sock
*sk
)
261 struct mgmt_rp_read_version rp
;
263 BT_DBG("sock %p", sk
);
265 rp
.version
= MGMT_VERSION
;
266 put_unaligned_le16(MGMT_REVISION
, &rp
.revision
);
268 return cmd_complete(sk
, MGMT_INDEX_NONE
, MGMT_OP_READ_VERSION
, &rp
,
272 static int read_commands(struct sock
*sk
)
274 struct mgmt_rp_read_commands
*rp
;
275 u16 num_commands
= ARRAY_SIZE(mgmt_commands
);
276 u16 num_events
= ARRAY_SIZE(mgmt_events
);
281 BT_DBG("sock %p", sk
);
283 rp_size
= sizeof(*rp
) + ((num_commands
+ num_events
) * sizeof(u16
));
285 rp
= kmalloc(rp_size
, GFP_KERNEL
);
289 put_unaligned_le16(num_commands
, &rp
->num_commands
);
290 put_unaligned_le16(num_events
, &rp
->num_events
);
292 for (i
= 0, opcode
= rp
->opcodes
; i
< num_commands
; i
++, opcode
++)
293 put_unaligned_le16(mgmt_commands
[i
], opcode
);
295 for (i
= 0; i
< num_events
; i
++, opcode
++)
296 put_unaligned_le16(mgmt_events
[i
], opcode
);
298 err
= cmd_complete(sk
, MGMT_INDEX_NONE
, MGMT_OP_READ_COMMANDS
, rp
,
305 static int read_index_list(struct sock
*sk
)
307 struct mgmt_rp_read_index_list
*rp
;
314 BT_DBG("sock %p", sk
);
316 read_lock(&hci_dev_list_lock
);
319 list_for_each(p
, &hci_dev_list
) {
323 rp_len
= sizeof(*rp
) + (2 * count
);
324 rp
= kmalloc(rp_len
, GFP_ATOMIC
);
326 read_unlock(&hci_dev_list_lock
);
330 put_unaligned_le16(count
, &rp
->num_controllers
);
333 list_for_each_entry(d
, &hci_dev_list
, list
) {
334 if (test_and_clear_bit(HCI_AUTO_OFF
, &d
->dev_flags
))
335 cancel_delayed_work(&d
->power_off
);
337 if (test_bit(HCI_SETUP
, &d
->dev_flags
))
340 put_unaligned_le16(d
->id
, &rp
->index
[i
++]);
341 BT_DBG("Added hci%u", d
->id
);
344 read_unlock(&hci_dev_list_lock
);
346 err
= cmd_complete(sk
, MGMT_INDEX_NONE
, MGMT_OP_READ_INDEX_LIST
, rp
,
354 static u32
get_supported_settings(struct hci_dev
*hdev
)
358 settings
|= MGMT_SETTING_POWERED
;
359 settings
|= MGMT_SETTING_CONNECTABLE
;
360 settings
|= MGMT_SETTING_FAST_CONNECTABLE
;
361 settings
|= MGMT_SETTING_DISCOVERABLE
;
362 settings
|= MGMT_SETTING_PAIRABLE
;
364 if (hdev
->features
[6] & LMP_SIMPLE_PAIR
)
365 settings
|= MGMT_SETTING_SSP
;
367 if (!(hdev
->features
[4] & LMP_NO_BREDR
)) {
368 settings
|= MGMT_SETTING_BREDR
;
369 settings
|= MGMT_SETTING_LINK_SECURITY
;
372 if (hdev
->features
[4] & LMP_LE
)
373 settings
|= MGMT_SETTING_LE
;
378 static u32
get_current_settings(struct hci_dev
*hdev
)
382 if (test_bit(HCI_UP
, &hdev
->flags
))
383 settings
|= MGMT_SETTING_POWERED
;
387 if (test_bit(HCI_PSCAN
, &hdev
->flags
))
388 settings
|= MGMT_SETTING_CONNECTABLE
;
390 if (test_bit(HCI_ISCAN
, &hdev
->flags
))
391 settings
|= MGMT_SETTING_DISCOVERABLE
;
393 if (test_bit(HCI_PAIRABLE
, &hdev
->dev_flags
))
394 settings
|= MGMT_SETTING_PAIRABLE
;
396 if (!(hdev
->features
[4] & LMP_NO_BREDR
))
397 settings
|= MGMT_SETTING_BREDR
;
399 if (hdev
->host_features
[0] & LMP_HOST_LE
)
400 settings
|= MGMT_SETTING_LE
;
402 if (test_bit(HCI_AUTH
, &hdev
->flags
))
403 settings
|= MGMT_SETTING_LINK_SECURITY
;
405 if (test_bit(HCI_SSP_ENABLED
, &hdev
->dev_flags
))
406 settings
|= MGMT_SETTING_SSP
;
411 #define PNP_INFO_SVCLASS_ID 0x1200
413 static u8 bluetooth_base_uuid
[] = {
414 0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80,
415 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
418 static u16
get_uuid16(u8
*uuid128
)
423 for (i
= 0; i
< 12; i
++) {
424 if (bluetooth_base_uuid
[i
] != uuid128
[i
])
428 memcpy(&val
, &uuid128
[12], 4);
430 val
= le32_to_cpu(val
);
437 static void create_eir(struct hci_dev
*hdev
, u8
*data
)
441 u16 uuid16_list
[HCI_MAX_EIR_LENGTH
/ sizeof(u16
)];
442 int i
, truncated
= 0;
443 struct bt_uuid
*uuid
;
446 name_len
= strlen(hdev
->dev_name
);
452 ptr
[1] = EIR_NAME_SHORT
;
454 ptr
[1] = EIR_NAME_COMPLETE
;
456 /* EIR Data length */
457 ptr
[0] = name_len
+ 1;
459 memcpy(ptr
+ 2, hdev
->dev_name
, name_len
);
461 eir_len
+= (name_len
+ 2);
462 ptr
+= (name_len
+ 2);
465 memset(uuid16_list
, 0, sizeof(uuid16_list
));
467 /* Group all UUID16 types */
468 list_for_each_entry(uuid
, &hdev
->uuids
, list
) {
471 uuid16
= get_uuid16(uuid
->uuid
);
478 if (uuid16
== PNP_INFO_SVCLASS_ID
)
481 /* Stop if not enough space to put next UUID */
482 if (eir_len
+ 2 + sizeof(u16
) > HCI_MAX_EIR_LENGTH
) {
487 /* Check for duplicates */
488 for (i
= 0; uuid16_list
[i
] != 0; i
++)
489 if (uuid16_list
[i
] == uuid16
)
492 if (uuid16_list
[i
] == 0) {
493 uuid16_list
[i
] = uuid16
;
494 eir_len
+= sizeof(u16
);
498 if (uuid16_list
[0] != 0) {
502 ptr
[1] = truncated
? EIR_UUID16_SOME
: EIR_UUID16_ALL
;
507 for (i
= 0; uuid16_list
[i
] != 0; i
++) {
508 *ptr
++ = (uuid16_list
[i
] & 0x00ff);
509 *ptr
++ = (uuid16_list
[i
] & 0xff00) >> 8;
512 /* EIR Data length */
513 *length
= (i
* sizeof(u16
)) + 1;
517 static int update_eir(struct hci_dev
*hdev
)
519 struct hci_cp_write_eir cp
;
521 if (!(hdev
->features
[6] & LMP_EXT_INQ
))
524 if (!test_bit(HCI_SSP_ENABLED
, &hdev
->dev_flags
))
527 if (test_bit(HCI_SERVICE_CACHE
, &hdev
->dev_flags
))
530 memset(&cp
, 0, sizeof(cp
));
532 create_eir(hdev
, cp
.data
);
534 if (memcmp(cp
.data
, hdev
->eir
, sizeof(cp
.data
)) == 0)
537 memcpy(hdev
->eir
, cp
.data
, sizeof(cp
.data
));
539 return hci_send_cmd(hdev
, HCI_OP_WRITE_EIR
, sizeof(cp
), &cp
);
542 static u8
get_service_classes(struct hci_dev
*hdev
)
544 struct bt_uuid
*uuid
;
547 list_for_each_entry(uuid
, &hdev
->uuids
, list
)
548 val
|= uuid
->svc_hint
;
553 static int update_class(struct hci_dev
*hdev
)
557 BT_DBG("%s", hdev
->name
);
559 if (test_bit(HCI_SERVICE_CACHE
, &hdev
->dev_flags
))
562 cod
[0] = hdev
->minor_class
;
563 cod
[1] = hdev
->major_class
;
564 cod
[2] = get_service_classes(hdev
);
566 if (memcmp(cod
, hdev
->dev_class
, 3) == 0)
569 return hci_send_cmd(hdev
, HCI_OP_WRITE_CLASS_OF_DEV
, sizeof(cod
), cod
);
572 static void service_cache_off(struct work_struct
*work
)
574 struct hci_dev
*hdev
= container_of(work
, struct hci_dev
,
577 if (!test_and_clear_bit(HCI_SERVICE_CACHE
, &hdev
->dev_flags
))
585 hci_dev_unlock(hdev
);
588 static void mgmt_init_hdev(struct hci_dev
*hdev
)
590 if (!test_and_set_bit(HCI_MGMT
, &hdev
->dev_flags
))
591 INIT_DELAYED_WORK(&hdev
->service_cache
, service_cache_off
);
593 if (!test_and_set_bit(HCI_SERVICE_CACHE
, &hdev
->dev_flags
))
594 schedule_delayed_work(&hdev
->service_cache
,
595 msecs_to_jiffies(SERVICE_CACHE_TIMEOUT
));
598 static int read_controller_info(struct sock
*sk
, u16 index
)
600 struct mgmt_rp_read_info rp
;
601 struct hci_dev
*hdev
;
603 BT_DBG("sock %p hci%u", sk
, index
);
605 hdev
= hci_dev_get(index
);
607 return cmd_status(sk
, index
, MGMT_OP_READ_INFO
,
608 MGMT_STATUS_INVALID_PARAMS
);
610 if (test_and_clear_bit(HCI_AUTO_OFF
, &hdev
->dev_flags
))
611 cancel_delayed_work_sync(&hdev
->power_off
);
615 if (test_and_clear_bit(HCI_PI_MGMT_INIT
, &hci_pi(sk
)->flags
))
616 mgmt_init_hdev(hdev
);
618 memset(&rp
, 0, sizeof(rp
));
620 bacpy(&rp
.bdaddr
, &hdev
->bdaddr
);
622 rp
.version
= hdev
->hci_ver
;
624 put_unaligned_le16(hdev
->manufacturer
, &rp
.manufacturer
);
626 rp
.supported_settings
= cpu_to_le32(get_supported_settings(hdev
));
627 rp
.current_settings
= cpu_to_le32(get_current_settings(hdev
));
629 memcpy(rp
.dev_class
, hdev
->dev_class
, 3);
631 memcpy(rp
.name
, hdev
->dev_name
, sizeof(hdev
->dev_name
));
633 hci_dev_unlock(hdev
);
636 return cmd_complete(sk
, index
, MGMT_OP_READ_INFO
, &rp
, sizeof(rp
));
639 static void mgmt_pending_free(struct pending_cmd
*cmd
)
646 static struct pending_cmd
*mgmt_pending_add(struct sock
*sk
, u16 opcode
,
647 struct hci_dev
*hdev
,
650 struct pending_cmd
*cmd
;
652 cmd
= kmalloc(sizeof(*cmd
), GFP_ATOMIC
);
656 cmd
->opcode
= opcode
;
657 cmd
->index
= hdev
->id
;
659 cmd
->param
= kmalloc(len
, GFP_ATOMIC
);
666 memcpy(cmd
->param
, data
, len
);
671 list_add(&cmd
->list
, &hdev
->mgmt_pending
);
676 static void mgmt_pending_foreach(u16 opcode
, struct hci_dev
*hdev
,
677 void (*cb
)(struct pending_cmd
*cmd
, void *data
),
680 struct list_head
*p
, *n
;
682 list_for_each_safe(p
, n
, &hdev
->mgmt_pending
) {
683 struct pending_cmd
*cmd
;
685 cmd
= list_entry(p
, struct pending_cmd
, list
);
687 if (opcode
> 0 && cmd
->opcode
!= opcode
)
694 static struct pending_cmd
*mgmt_pending_find(u16 opcode
, struct hci_dev
*hdev
)
696 struct pending_cmd
*cmd
;
698 list_for_each_entry(cmd
, &hdev
->mgmt_pending
, list
) {
699 if (cmd
->opcode
== opcode
)
706 static void mgmt_pending_remove(struct pending_cmd
*cmd
)
708 list_del(&cmd
->list
);
709 mgmt_pending_free(cmd
);
712 static int send_settings_rsp(struct sock
*sk
, u16 opcode
, struct hci_dev
*hdev
)
714 __le32 settings
= cpu_to_le32(get_current_settings(hdev
));
716 return cmd_complete(sk
, hdev
->id
, opcode
, &settings
, sizeof(settings
));
719 static int set_powered(struct sock
*sk
, u16 index
, void *data
, u16 len
)
721 struct mgmt_mode
*cp
= data
;
722 struct hci_dev
*hdev
;
723 struct pending_cmd
*cmd
;
726 BT_DBG("request for hci%u", index
);
728 if (len
!= sizeof(*cp
))
729 return cmd_status(sk
, index
, MGMT_OP_SET_POWERED
,
730 MGMT_STATUS_INVALID_PARAMS
);
732 hdev
= hci_dev_get(index
);
734 return cmd_status(sk
, index
, MGMT_OP_SET_POWERED
,
735 MGMT_STATUS_INVALID_PARAMS
);
739 up
= test_bit(HCI_UP
, &hdev
->flags
);
740 if ((cp
->val
&& up
) || (!cp
->val
&& !up
)) {
741 err
= send_settings_rsp(sk
, MGMT_OP_SET_POWERED
, hdev
);
745 if (mgmt_pending_find(MGMT_OP_SET_POWERED
, hdev
)) {
746 err
= cmd_status(sk
, index
, MGMT_OP_SET_POWERED
,
751 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_POWERED
, hdev
, data
, len
);
758 schedule_work(&hdev
->power_on
);
760 schedule_work(&hdev
->power_off
.work
);
765 hci_dev_unlock(hdev
);
770 static int set_discoverable(struct sock
*sk
, u16 index
, void *data
, u16 len
)
772 struct mgmt_cp_set_discoverable
*cp
= data
;
773 struct hci_dev
*hdev
;
774 struct pending_cmd
*cmd
;
778 BT_DBG("request for hci%u", index
);
780 if (len
!= sizeof(*cp
))
781 return cmd_status(sk
, index
, MGMT_OP_SET_DISCOVERABLE
,
782 MGMT_STATUS_INVALID_PARAMS
);
784 hdev
= hci_dev_get(index
);
786 return cmd_status(sk
, index
, MGMT_OP_SET_DISCOVERABLE
,
787 MGMT_STATUS_INVALID_PARAMS
);
791 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
792 err
= cmd_status(sk
, index
, MGMT_OP_SET_DISCOVERABLE
,
793 MGMT_STATUS_NOT_POWERED
);
797 if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE
, hdev
) ||
798 mgmt_pending_find(MGMT_OP_SET_CONNECTABLE
, hdev
)) {
799 err
= cmd_status(sk
, index
, MGMT_OP_SET_DISCOVERABLE
,
804 if (cp
->val
== test_bit(HCI_ISCAN
, &hdev
->flags
) &&
805 test_bit(HCI_PSCAN
, &hdev
->flags
)) {
806 err
= send_settings_rsp(sk
, MGMT_OP_SET_DISCOVERABLE
, hdev
);
810 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_DISCOVERABLE
, hdev
, data
, len
);
819 scan
|= SCAN_INQUIRY
;
821 cancel_delayed_work(&hdev
->discov_off
);
823 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_SCAN_ENABLE
, 1, &scan
);
825 mgmt_pending_remove(cmd
);
828 hdev
->discov_timeout
= get_unaligned_le16(&cp
->timeout
);
831 hci_dev_unlock(hdev
);
837 static int set_connectable(struct sock
*sk
, u16 index
, void *data
, u16 len
)
839 struct mgmt_mode
*cp
= data
;
840 struct hci_dev
*hdev
;
841 struct pending_cmd
*cmd
;
845 BT_DBG("request for hci%u", index
);
847 if (len
!= sizeof(*cp
))
848 return cmd_status(sk
, index
, MGMT_OP_SET_CONNECTABLE
,
849 MGMT_STATUS_INVALID_PARAMS
);
851 hdev
= hci_dev_get(index
);
853 return cmd_status(sk
, index
, MGMT_OP_SET_CONNECTABLE
,
854 MGMT_STATUS_INVALID_PARAMS
);
858 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
859 err
= cmd_status(sk
, index
, MGMT_OP_SET_CONNECTABLE
,
860 MGMT_STATUS_NOT_POWERED
);
864 if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE
, hdev
) ||
865 mgmt_pending_find(MGMT_OP_SET_CONNECTABLE
, hdev
)) {
866 err
= cmd_status(sk
, index
, MGMT_OP_SET_CONNECTABLE
,
871 if (cp
->val
== test_bit(HCI_PSCAN
, &hdev
->flags
)) {
872 err
= send_settings_rsp(sk
, MGMT_OP_SET_CONNECTABLE
, hdev
);
876 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_CONNECTABLE
, hdev
, data
, len
);
887 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_SCAN_ENABLE
, 1, &scan
);
889 mgmt_pending_remove(cmd
);
892 hci_dev_unlock(hdev
);
898 static int mgmt_event(u16 event
, struct hci_dev
*hdev
, void *data
,
899 u16 data_len
, struct sock
*skip_sk
)
902 struct mgmt_hdr
*hdr
;
904 skb
= alloc_skb(sizeof(*hdr
) + data_len
, GFP_ATOMIC
);
908 bt_cb(skb
)->channel
= HCI_CHANNEL_CONTROL
;
910 hdr
= (void *) skb_put(skb
, sizeof(*hdr
));
911 hdr
->opcode
= cpu_to_le16(event
);
913 hdr
->index
= cpu_to_le16(hdev
->id
);
915 hdr
->index
= cpu_to_le16(MGMT_INDEX_NONE
);
916 hdr
->len
= cpu_to_le16(data_len
);
919 memcpy(skb_put(skb
, data_len
), data
, data_len
);
921 hci_send_to_sock(NULL
, skb
, skip_sk
);
927 static int set_pairable(struct sock
*sk
, u16 index
, void *data
, u16 len
)
929 struct mgmt_mode
*cp
= data
;
930 struct hci_dev
*hdev
;
934 BT_DBG("request for hci%u", index
);
936 if (len
!= sizeof(*cp
))
937 return cmd_status(sk
, index
, MGMT_OP_SET_PAIRABLE
,
938 MGMT_STATUS_INVALID_PARAMS
);
940 hdev
= hci_dev_get(index
);
942 return cmd_status(sk
, index
, MGMT_OP_SET_PAIRABLE
,
943 MGMT_STATUS_INVALID_PARAMS
);
948 set_bit(HCI_PAIRABLE
, &hdev
->dev_flags
);
950 clear_bit(HCI_PAIRABLE
, &hdev
->dev_flags
);
952 err
= send_settings_rsp(sk
, MGMT_OP_SET_PAIRABLE
, hdev
);
956 ev
= cpu_to_le32(get_current_settings(hdev
));
958 err
= mgmt_event(MGMT_EV_NEW_SETTINGS
, hdev
, &ev
, sizeof(ev
), sk
);
961 hci_dev_unlock(hdev
);
967 static int set_link_security(struct sock
*sk
, u16 index
, void *data
, u16 len
)
969 struct mgmt_mode
*cp
= data
;
970 struct pending_cmd
*cmd
;
971 struct hci_dev
*hdev
;
975 BT_DBG("request for hci%u", index
);
977 if (len
!= sizeof(*cp
))
978 return cmd_status(sk
, index
, MGMT_OP_SET_LINK_SECURITY
,
979 MGMT_STATUS_INVALID_PARAMS
);
981 hdev
= hci_dev_get(index
);
983 return cmd_status(sk
, index
, MGMT_OP_SET_LINK_SECURITY
,
984 MGMT_STATUS_INVALID_PARAMS
);
988 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
989 err
= cmd_status(sk
, index
, MGMT_OP_SET_LINK_SECURITY
,
990 MGMT_STATUS_NOT_POWERED
);
994 if (mgmt_pending_find(MGMT_OP_SET_LINK_SECURITY
, hdev
)) {
995 err
= cmd_status(sk
, index
, MGMT_OP_SET_LINK_SECURITY
,
1002 if (test_bit(HCI_AUTH
, &hdev
->flags
) == val
) {
1003 err
= send_settings_rsp(sk
, MGMT_OP_SET_LINK_SECURITY
, hdev
);
1007 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_LINK_SECURITY
, hdev
, data
, len
);
1013 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_AUTH_ENABLE
, sizeof(val
), &val
);
1015 mgmt_pending_remove(cmd
);
1020 hci_dev_unlock(hdev
);
1026 static int set_ssp(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1028 struct mgmt_mode
*cp
= data
;
1029 struct pending_cmd
*cmd
;
1030 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_SSP
,
1038 MGMT_STATUS_INVALID_PARAMS
);
1040 hdev
= hci_dev_get(index
);
1042 return cmd_status(sk
, index
, MGMT_OP_SET_SSP
,
1043 MGMT_STATUS_INVALID_PARAMS
);
1047 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1048 err
= cmd_status(sk
, index
, MGMT_OP_SET_SSP
,
1049 MGMT_STATUS_NOT_POWERED
);
1053 if (mgmt_pending_find(MGMT_OP_SET_SSP
, hdev
)) {
1054 err
= cmd_status(sk
, index
, MGMT_OP_SET_SSP
, MGMT_STATUS_BUSY
);
1060 if (test_bit(HCI_SSP_ENABLED
, &hdev
->dev_flags
) == val
) {
1061 err
= send_settings_rsp(sk
, MGMT_OP_SET_SSP
, hdev
);
1065 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_SSP
, hdev
, data
, len
);
1071 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_SSP_MODE
, sizeof(val
), &val
);
1073 mgmt_pending_remove(cmd
);
1078 hci_dev_unlock(hdev
);
1084 static int add_uuid(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1086 struct mgmt_cp_add_uuid
*cp
= data
;
1087 struct hci_dev
*hdev
;
1088 struct bt_uuid
*uuid
;
1091 BT_DBG("request for hci%u", index
);
1093 if (len
!= sizeof(*cp
))
1094 return cmd_status(sk
, index
, MGMT_OP_ADD_UUID
,
1095 MGMT_STATUS_INVALID_PARAMS
);
1097 hdev
= hci_dev_get(index
);
1099 return cmd_status(sk
, index
, MGMT_OP_ADD_UUID
,
1100 MGMT_STATUS_INVALID_PARAMS
);
1104 uuid
= kmalloc(sizeof(*uuid
), GFP_ATOMIC
);
1110 memcpy(uuid
->uuid
, cp
->uuid
, 16);
1111 uuid
->svc_hint
= cp
->svc_hint
;
1113 list_add(&uuid
->list
, &hdev
->uuids
);
1115 err
= update_class(hdev
);
1119 err
= update_eir(hdev
);
1123 err
= cmd_complete(sk
, index
, MGMT_OP_ADD_UUID
, NULL
, 0);
1126 hci_dev_unlock(hdev
);
1132 static int remove_uuid(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1134 struct mgmt_cp_remove_uuid
*cp
= data
;
1135 struct list_head
*p
, *n
;
1136 struct hci_dev
*hdev
;
1137 u8 bt_uuid_any
[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1140 BT_DBG("request for hci%u", index
);
1142 if (len
!= sizeof(*cp
))
1143 return cmd_status(sk
, index
, MGMT_OP_REMOVE_UUID
,
1144 MGMT_STATUS_INVALID_PARAMS
);
1146 hdev
= hci_dev_get(index
);
1148 return cmd_status(sk
, index
, MGMT_OP_REMOVE_UUID
,
1149 MGMT_STATUS_INVALID_PARAMS
);
1153 if (memcmp(cp
->uuid
, bt_uuid_any
, 16) == 0) {
1154 err
= hci_uuids_clear(hdev
);
1160 list_for_each_safe(p
, n
, &hdev
->uuids
) {
1161 struct bt_uuid
*match
= list_entry(p
, struct bt_uuid
, list
);
1163 if (memcmp(match
->uuid
, cp
->uuid
, 16) != 0)
1166 list_del(&match
->list
);
1171 err
= cmd_status(sk
, index
, MGMT_OP_REMOVE_UUID
,
1172 MGMT_STATUS_INVALID_PARAMS
);
1176 err
= update_class(hdev
);
1180 err
= update_eir(hdev
);
1184 err
= cmd_complete(sk
, index
, MGMT_OP_REMOVE_UUID
, NULL
, 0);
1187 hci_dev_unlock(hdev
);
1193 static int set_dev_class(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1195 struct hci_dev
*hdev
;
1196 struct mgmt_cp_set_dev_class
*cp
= data
;
1199 BT_DBG("request for hci%u", index
);
1201 if (len
!= sizeof(*cp
))
1202 return cmd_status(sk
, index
, MGMT_OP_SET_DEV_CLASS
,
1203 MGMT_STATUS_INVALID_PARAMS
);
1205 hdev
= hci_dev_get(index
);
1207 return cmd_status(sk
, index
, MGMT_OP_SET_DEV_CLASS
,
1208 MGMT_STATUS_INVALID_PARAMS
);
1212 hdev
->major_class
= cp
->major
;
1213 hdev
->minor_class
= cp
->minor
;
1215 if (test_and_clear_bit(HCI_SERVICE_CACHE
, &hdev
->dev_flags
)) {
1216 hci_dev_unlock(hdev
);
1217 cancel_delayed_work_sync(&hdev
->service_cache
);
1222 err
= update_class(hdev
);
1225 err
= cmd_complete(sk
, index
, MGMT_OP_SET_DEV_CLASS
, NULL
, 0);
1227 hci_dev_unlock(hdev
);
1233 static int load_link_keys(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1235 struct hci_dev
*hdev
;
1236 struct mgmt_cp_load_link_keys
*cp
= data
;
1237 u16 key_count
, expected_len
;
1240 if (len
< sizeof(*cp
))
1241 return cmd_status(sk
, index
, MGMT_OP_LOAD_LINK_KEYS
,
1242 MGMT_STATUS_INVALID_PARAMS
);
1244 key_count
= get_unaligned_le16(&cp
->key_count
);
1246 expected_len
= sizeof(*cp
) + key_count
*
1247 sizeof(struct mgmt_link_key_info
);
1248 if (expected_len
!= len
) {
1249 BT_ERR("load_link_keys: expected %u bytes, got %u bytes",
1251 return cmd_status(sk
, index
, MGMT_OP_LOAD_LINK_KEYS
,
1252 MGMT_STATUS_INVALID_PARAMS
);
1255 hdev
= hci_dev_get(index
);
1257 return cmd_status(sk
, index
, MGMT_OP_LOAD_LINK_KEYS
,
1258 MGMT_STATUS_INVALID_PARAMS
);
1260 BT_DBG("hci%u debug_keys %u key_count %u", index
, cp
->debug_keys
,
1265 hci_link_keys_clear(hdev
);
1267 set_bit(HCI_LINK_KEYS
, &hdev
->dev_flags
);
1270 set_bit(HCI_DEBUG_KEYS
, &hdev
->dev_flags
);
1272 clear_bit(HCI_DEBUG_KEYS
, &hdev
->dev_flags
);
1274 for (i
= 0; i
< key_count
; i
++) {
1275 struct mgmt_link_key_info
*key
= &cp
->keys
[i
];
1277 hci_add_link_key(hdev
, NULL
, 0, &key
->bdaddr
, key
->val
, key
->type
,
1281 cmd_complete(sk
, index
, MGMT_OP_LOAD_LINK_KEYS
, NULL
, 0);
1283 hci_dev_unlock(hdev
);
1289 static int device_unpaired(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
1290 u8 addr_type
, struct sock
*skip_sk
)
1292 struct mgmt_ev_device_unpaired ev
;
1294 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
1295 ev
.addr
.type
= addr_type
;
1297 return mgmt_event(MGMT_EV_DEVICE_UNPAIRED
, hdev
, &ev
, sizeof(ev
),
1301 static int unpair_device(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1303 struct hci_dev
*hdev
;
1304 struct mgmt_cp_unpair_device
*cp
= data
;
1305 struct mgmt_rp_unpair_device rp
;
1306 struct hci_cp_disconnect dc
;
1307 struct pending_cmd
*cmd
;
1308 struct hci_conn
*conn
;
1311 if (len
!= sizeof(*cp
))
1312 return cmd_status(sk
, index
, MGMT_OP_UNPAIR_DEVICE
,
1313 MGMT_STATUS_INVALID_PARAMS
);
1315 hdev
= hci_dev_get(index
);
1317 return cmd_status(sk
, index
, MGMT_OP_UNPAIR_DEVICE
,
1318 MGMT_STATUS_INVALID_PARAMS
);
1322 memset(&rp
, 0, sizeof(rp
));
1323 bacpy(&rp
.addr
.bdaddr
, &cp
->addr
.bdaddr
);
1324 rp
.addr
.type
= cp
->addr
.type
;
1326 if (cp
->addr
.type
== MGMT_ADDR_BREDR
)
1327 err
= hci_remove_link_key(hdev
, &cp
->addr
.bdaddr
);
1329 err
= hci_remove_ltk(hdev
, &cp
->addr
.bdaddr
);
1332 rp
.status
= MGMT_STATUS_NOT_PAIRED
;
1336 if (!test_bit(HCI_UP
, &hdev
->flags
) || !cp
->disconnect
) {
1337 err
= cmd_complete(sk
, index
, MGMT_OP_UNPAIR_DEVICE
, &rp
,
1339 device_unpaired(hdev
, &cp
->addr
.bdaddr
, cp
->addr
.type
, sk
);
1343 if (cp
->addr
.type
== MGMT_ADDR_BREDR
)
1344 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
,
1347 conn
= hci_conn_hash_lookup_ba(hdev
, LE_LINK
,
1351 err
= cmd_complete(sk
, index
, MGMT_OP_UNPAIR_DEVICE
, &rp
,
1353 device_unpaired(hdev
, &cp
->addr
.bdaddr
, cp
->addr
.type
, sk
);
1357 cmd
= mgmt_pending_add(sk
, MGMT_OP_UNPAIR_DEVICE
, hdev
, cp
,
1364 put_unaligned_le16(conn
->handle
, &dc
.handle
);
1365 dc
.reason
= 0x13; /* Remote User Terminated Connection */
1366 err
= hci_send_cmd(hdev
, HCI_OP_DISCONNECT
, sizeof(dc
), &dc
);
1368 mgmt_pending_remove(cmd
);
1372 err
= cmd_complete(sk
, index
, MGMT_OP_UNPAIR_DEVICE
, &rp
,
1374 hci_dev_unlock(hdev
);
1380 static int disconnect(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1382 struct hci_dev
*hdev
;
1383 struct mgmt_cp_disconnect
*cp
= data
;
1384 struct hci_cp_disconnect dc
;
1385 struct pending_cmd
*cmd
;
1386 struct hci_conn
*conn
;
1391 if (len
!= sizeof(*cp
))
1392 return cmd_status(sk
, index
, MGMT_OP_DISCONNECT
,
1393 MGMT_STATUS_INVALID_PARAMS
);
1395 hdev
= hci_dev_get(index
);
1397 return cmd_status(sk
, index
, MGMT_OP_DISCONNECT
,
1398 MGMT_STATUS_INVALID_PARAMS
);
1402 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1403 err
= cmd_status(sk
, index
, MGMT_OP_DISCONNECT
,
1404 MGMT_STATUS_NOT_POWERED
);
1408 if (mgmt_pending_find(MGMT_OP_DISCONNECT
, hdev
)) {
1409 err
= cmd_status(sk
, index
, MGMT_OP_DISCONNECT
,
1414 if (cp
->addr
.type
== MGMT_ADDR_BREDR
)
1415 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
, &cp
->addr
.bdaddr
);
1417 conn
= hci_conn_hash_lookup_ba(hdev
, LE_LINK
, &cp
->addr
.bdaddr
);
1420 err
= cmd_status(sk
, index
, MGMT_OP_DISCONNECT
,
1421 MGMT_STATUS_NOT_CONNECTED
);
1425 cmd
= mgmt_pending_add(sk
, MGMT_OP_DISCONNECT
, hdev
, data
, len
);
1431 put_unaligned_le16(conn
->handle
, &dc
.handle
);
1432 dc
.reason
= 0x13; /* Remote User Terminated Connection */
1434 err
= hci_send_cmd(hdev
, HCI_OP_DISCONNECT
, sizeof(dc
), &dc
);
1436 mgmt_pending_remove(cmd
);
1439 hci_dev_unlock(hdev
);
1445 static u8
link_to_mgmt(u8 link_type
, u8 addr_type
)
1447 switch (link_type
) {
1449 switch (addr_type
) {
1450 case ADDR_LE_DEV_PUBLIC
:
1451 return MGMT_ADDR_LE_PUBLIC
;
1452 case ADDR_LE_DEV_RANDOM
:
1453 return MGMT_ADDR_LE_RANDOM
;
1455 return MGMT_ADDR_INVALID
;
1458 return MGMT_ADDR_BREDR
;
1460 return MGMT_ADDR_INVALID
;
1464 static int get_connections(struct sock
*sk
, u16 index
)
1466 struct mgmt_rp_get_connections
*rp
;
1467 struct hci_dev
*hdev
;
1475 hdev
= hci_dev_get(index
);
1477 return cmd_status(sk
, index
, MGMT_OP_GET_CONNECTIONS
,
1478 MGMT_STATUS_INVALID_PARAMS
);
1483 list_for_each_entry(c
, &hdev
->conn_hash
.list
, list
) {
1484 if (test_bit(HCI_CONN_MGMT_CONNECTED
, &c
->flags
))
1488 rp_len
= sizeof(*rp
) + (count
* sizeof(struct mgmt_addr_info
));
1489 rp
= kmalloc(rp_len
, GFP_ATOMIC
);
1495 put_unaligned_le16(count
, &rp
->conn_count
);
1498 list_for_each_entry(c
, &hdev
->conn_hash
.list
, list
) {
1499 if (!test_bit(HCI_CONN_MGMT_CONNECTED
, &c
->flags
))
1501 bacpy(&rp
->addr
[i
].bdaddr
, &c
->dst
);
1502 rp
->addr
[i
].type
= link_to_mgmt(c
->type
, c
->dst_type
);
1503 if (rp
->addr
[i
].type
== MGMT_ADDR_INVALID
)
1508 /* Recalculate length in case of filtered SCO connections, etc */
1509 rp_len
= sizeof(*rp
) + (i
* sizeof(struct mgmt_addr_info
));
1511 err
= cmd_complete(sk
, index
, MGMT_OP_GET_CONNECTIONS
, rp
, rp_len
);
1515 hci_dev_unlock(hdev
);
1520 static int send_pin_code_neg_reply(struct sock
*sk
, u16 index
,
1521 struct hci_dev
*hdev
, struct mgmt_cp_pin_code_neg_reply
*cp
)
1523 struct pending_cmd
*cmd
;
1526 cmd
= mgmt_pending_add(sk
, MGMT_OP_PIN_CODE_NEG_REPLY
, hdev
, cp
,
1531 err
= hci_send_cmd(hdev
, HCI_OP_PIN_CODE_NEG_REPLY
, sizeof(cp
->bdaddr
),
1534 mgmt_pending_remove(cmd
);
1539 static int pin_code_reply(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1541 struct hci_dev
*hdev
;
1542 struct hci_conn
*conn
;
1543 struct mgmt_cp_pin_code_reply
*cp
= data
;
1544 struct mgmt_cp_pin_code_neg_reply ncp
;
1545 struct hci_cp_pin_code_reply reply
;
1546 struct pending_cmd
*cmd
;
1551 if (len
!= sizeof(*cp
))
1552 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
,
1553 MGMT_STATUS_INVALID_PARAMS
);
1555 hdev
= hci_dev_get(index
);
1557 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
,
1558 MGMT_STATUS_INVALID_PARAMS
);
1562 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1563 err
= cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
,
1564 MGMT_STATUS_NOT_POWERED
);
1568 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
, &cp
->bdaddr
);
1570 err
= cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
,
1571 MGMT_STATUS_NOT_CONNECTED
);
1575 if (conn
->pending_sec_level
== BT_SECURITY_HIGH
&& cp
->pin_len
!= 16) {
1576 bacpy(&ncp
.bdaddr
, &cp
->bdaddr
);
1578 BT_ERR("PIN code is not 16 bytes long");
1580 err
= send_pin_code_neg_reply(sk
, index
, hdev
, &ncp
);
1582 err
= cmd_status(sk
, index
, MGMT_OP_PIN_CODE_REPLY
,
1583 MGMT_STATUS_INVALID_PARAMS
);
1588 cmd
= mgmt_pending_add(sk
, MGMT_OP_PIN_CODE_REPLY
, hdev
, data
,
1595 bacpy(&reply
.bdaddr
, &cp
->bdaddr
);
1596 reply
.pin_len
= cp
->pin_len
;
1597 memcpy(reply
.pin_code
, cp
->pin_code
, sizeof(reply
.pin_code
));
1599 err
= hci_send_cmd(hdev
, HCI_OP_PIN_CODE_REPLY
, sizeof(reply
), &reply
);
1601 mgmt_pending_remove(cmd
);
1604 hci_dev_unlock(hdev
);
1610 static int pin_code_neg_reply(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1612 struct hci_dev
*hdev
;
1613 struct mgmt_cp_pin_code_neg_reply
*cp
= data
;
1618 if (len
!= sizeof(*cp
))
1619 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_NEG_REPLY
,
1620 MGMT_STATUS_INVALID_PARAMS
);
1622 hdev
= hci_dev_get(index
);
1624 return cmd_status(sk
, index
, MGMT_OP_PIN_CODE_NEG_REPLY
,
1625 MGMT_STATUS_INVALID_PARAMS
);
1629 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1630 err
= cmd_status(sk
, index
, MGMT_OP_PIN_CODE_NEG_REPLY
,
1631 MGMT_STATUS_NOT_POWERED
);
1635 err
= send_pin_code_neg_reply(sk
, index
, hdev
, cp
);
1638 hci_dev_unlock(hdev
);
1644 static int set_io_capability(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1646 struct hci_dev
*hdev
;
1647 struct mgmt_cp_set_io_capability
*cp
= data
;
1651 if (len
!= sizeof(*cp
))
1652 return cmd_status(sk
, index
, MGMT_OP_SET_IO_CAPABILITY
,
1653 MGMT_STATUS_INVALID_PARAMS
);
1655 hdev
= hci_dev_get(index
);
1657 return cmd_status(sk
, index
, MGMT_OP_SET_IO_CAPABILITY
,
1658 MGMT_STATUS_INVALID_PARAMS
);
1662 hdev
->io_capability
= cp
->io_capability
;
1664 BT_DBG("%s IO capability set to 0x%02x", hdev
->name
,
1665 hdev
->io_capability
);
1667 hci_dev_unlock(hdev
);
1670 return cmd_complete(sk
, index
, MGMT_OP_SET_IO_CAPABILITY
, NULL
, 0);
1673 static inline struct pending_cmd
*find_pairing(struct hci_conn
*conn
)
1675 struct hci_dev
*hdev
= conn
->hdev
;
1676 struct pending_cmd
*cmd
;
1678 list_for_each_entry(cmd
, &hdev
->mgmt_pending
, list
) {
1679 if (cmd
->opcode
!= MGMT_OP_PAIR_DEVICE
)
1682 if (cmd
->user_data
!= conn
)
1691 static void pairing_complete(struct pending_cmd
*cmd
, u8 status
)
1693 struct mgmt_rp_pair_device rp
;
1694 struct hci_conn
*conn
= cmd
->user_data
;
1696 bacpy(&rp
.addr
.bdaddr
, &conn
->dst
);
1697 rp
.addr
.type
= link_to_mgmt(conn
->type
, conn
->dst_type
);
1700 cmd_complete(cmd
->sk
, cmd
->index
, MGMT_OP_PAIR_DEVICE
, &rp
, sizeof(rp
));
1702 /* So we don't get further callbacks for this connection */
1703 conn
->connect_cfm_cb
= NULL
;
1704 conn
->security_cfm_cb
= NULL
;
1705 conn
->disconn_cfm_cb
= NULL
;
1709 mgmt_pending_remove(cmd
);
1712 static void pairing_complete_cb(struct hci_conn
*conn
, u8 status
)
1714 struct pending_cmd
*cmd
;
1716 BT_DBG("status %u", status
);
1718 cmd
= find_pairing(conn
);
1720 BT_DBG("Unable to find a pending command");
1722 pairing_complete(cmd
, status
);
1725 static int pair_device(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1727 struct hci_dev
*hdev
;
1728 struct mgmt_cp_pair_device
*cp
= data
;
1729 struct mgmt_rp_pair_device rp
;
1730 struct pending_cmd
*cmd
;
1731 u8 sec_level
, auth_type
;
1732 struct hci_conn
*conn
;
1737 if (len
!= sizeof(*cp
))
1738 return cmd_status(sk
, index
, MGMT_OP_PAIR_DEVICE
,
1739 MGMT_STATUS_INVALID_PARAMS
);
1741 hdev
= hci_dev_get(index
);
1743 return cmd_status(sk
, index
, MGMT_OP_PAIR_DEVICE
,
1744 MGMT_STATUS_INVALID_PARAMS
);
1748 sec_level
= BT_SECURITY_MEDIUM
;
1749 if (cp
->io_cap
== 0x03)
1750 auth_type
= HCI_AT_DEDICATED_BONDING
;
1752 auth_type
= HCI_AT_DEDICATED_BONDING_MITM
;
1754 if (cp
->addr
.type
== MGMT_ADDR_BREDR
)
1755 conn
= hci_connect(hdev
, ACL_LINK
, &cp
->addr
.bdaddr
, sec_level
,
1758 conn
= hci_connect(hdev
, LE_LINK
, &cp
->addr
.bdaddr
, sec_level
,
1761 memset(&rp
, 0, sizeof(rp
));
1762 bacpy(&rp
.addr
.bdaddr
, &cp
->addr
.bdaddr
);
1763 rp
.addr
.type
= cp
->addr
.type
;
1766 rp
.status
= -PTR_ERR(conn
);
1767 err
= cmd_complete(sk
, index
, MGMT_OP_PAIR_DEVICE
,
1772 if (conn
->connect_cfm_cb
) {
1775 err
= cmd_complete(sk
, index
, MGMT_OP_PAIR_DEVICE
,
1780 cmd
= mgmt_pending_add(sk
, MGMT_OP_PAIR_DEVICE
, hdev
, data
, len
);
1787 /* For LE, just connecting isn't a proof that the pairing finished */
1788 if (cp
->addr
.type
== MGMT_ADDR_BREDR
)
1789 conn
->connect_cfm_cb
= pairing_complete_cb
;
1791 conn
->security_cfm_cb
= pairing_complete_cb
;
1792 conn
->disconn_cfm_cb
= pairing_complete_cb
;
1793 conn
->io_capability
= cp
->io_cap
;
1794 cmd
->user_data
= conn
;
1796 if (conn
->state
== BT_CONNECTED
&&
1797 hci_conn_security(conn
, sec_level
, auth_type
))
1798 pairing_complete(cmd
, 0);
1803 hci_dev_unlock(hdev
);
1809 static int cancel_pair_device(struct sock
*sk
, u16 index
,
1810 unsigned char *data
, u16 len
)
1812 struct mgmt_addr_info
*addr
= (void *) data
;
1813 struct hci_dev
*hdev
;
1814 struct pending_cmd
*cmd
;
1815 struct hci_conn
*conn
;
1820 if (len
!= sizeof(*addr
))
1821 return cmd_status(sk
, index
, MGMT_OP_CANCEL_PAIR_DEVICE
,
1822 MGMT_STATUS_INVALID_PARAMS
);
1824 hdev
= hci_dev_get(index
);
1826 return cmd_status(sk
, index
, MGMT_OP_CANCEL_PAIR_DEVICE
,
1827 MGMT_STATUS_INVALID_PARAMS
);
1831 cmd
= mgmt_pending_find(MGMT_OP_PAIR_DEVICE
, hdev
);
1833 err
= cmd_status(sk
, index
, MGMT_OP_CANCEL_PAIR_DEVICE
,
1834 MGMT_STATUS_INVALID_PARAMS
);
1838 conn
= cmd
->user_data
;
1840 if (bacmp(&addr
->bdaddr
, &conn
->dst
) != 0) {
1841 err
= cmd_status(sk
, index
, MGMT_OP_CANCEL_PAIR_DEVICE
,
1842 MGMT_STATUS_INVALID_PARAMS
);
1846 pairing_complete(cmd
, MGMT_STATUS_CANCELLED
);
1848 err
= cmd_complete(sk
, index
, MGMT_OP_CANCEL_PAIR_DEVICE
, addr
,
1851 hci_dev_unlock(hdev
);
1857 static int user_pairing_resp(struct sock
*sk
, u16 index
, bdaddr_t
*bdaddr
,
1858 u8 type
, u16 mgmt_op
, u16 hci_op
,
1861 struct pending_cmd
*cmd
;
1862 struct hci_dev
*hdev
;
1863 struct hci_conn
*conn
;
1866 hdev
= hci_dev_get(index
);
1868 return cmd_status(sk
, index
, mgmt_op
,
1869 MGMT_STATUS_INVALID_PARAMS
);
1873 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
1874 err
= cmd_status(sk
, index
, mgmt_op
, MGMT_STATUS_NOT_POWERED
);
1878 if (type
== MGMT_ADDR_BREDR
)
1879 conn
= hci_conn_hash_lookup_ba(hdev
, ACL_LINK
, bdaddr
);
1881 conn
= hci_conn_hash_lookup_ba(hdev
, LE_LINK
, bdaddr
);
1884 err
= cmd_status(sk
, index
, mgmt_op
,
1885 MGMT_STATUS_NOT_CONNECTED
);
1889 if (type
== MGMT_ADDR_LE_PUBLIC
|| type
== MGMT_ADDR_LE_RANDOM
) {
1890 /* Continue with pairing via SMP */
1891 err
= smp_user_confirm_reply(conn
, mgmt_op
, passkey
);
1894 err
= cmd_status(sk
, index
, mgmt_op
,
1895 MGMT_STATUS_SUCCESS
);
1897 err
= cmd_status(sk
, index
, mgmt_op
,
1898 MGMT_STATUS_FAILED
);
1903 cmd
= mgmt_pending_add(sk
, mgmt_op
, hdev
, bdaddr
, sizeof(*bdaddr
));
1909 /* Continue with pairing via HCI */
1910 if (hci_op
== HCI_OP_USER_PASSKEY_REPLY
) {
1911 struct hci_cp_user_passkey_reply cp
;
1913 bacpy(&cp
.bdaddr
, bdaddr
);
1914 cp
.passkey
= passkey
;
1915 err
= hci_send_cmd(hdev
, hci_op
, sizeof(cp
), &cp
);
1917 err
= hci_send_cmd(hdev
, hci_op
, sizeof(*bdaddr
), bdaddr
);
1920 mgmt_pending_remove(cmd
);
1923 hci_dev_unlock(hdev
);
1929 static int user_confirm_reply(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1931 struct mgmt_cp_user_confirm_reply
*cp
= data
;
1935 if (len
!= sizeof(*cp
))
1936 return cmd_status(sk
, index
, MGMT_OP_USER_CONFIRM_REPLY
,
1937 MGMT_STATUS_INVALID_PARAMS
);
1939 return user_pairing_resp(sk
, index
, &cp
->addr
.bdaddr
, cp
->addr
.type
,
1940 MGMT_OP_USER_CONFIRM_REPLY
,
1941 HCI_OP_USER_CONFIRM_REPLY
, 0);
1944 static int user_confirm_neg_reply(struct sock
*sk
, u16 index
, void *data
,
1947 struct mgmt_cp_user_confirm_neg_reply
*cp
= data
;
1951 if (len
!= sizeof(*cp
))
1952 return cmd_status(sk
, index
, MGMT_OP_USER_CONFIRM_NEG_REPLY
,
1953 MGMT_STATUS_INVALID_PARAMS
);
1955 return user_pairing_resp(sk
, index
, &cp
->addr
.bdaddr
, cp
->addr
.type
,
1956 MGMT_OP_USER_CONFIRM_NEG_REPLY
,
1957 HCI_OP_USER_CONFIRM_NEG_REPLY
, 0);
1960 static int user_passkey_reply(struct sock
*sk
, u16 index
, void *data
, u16 len
)
1962 struct mgmt_cp_user_passkey_reply
*cp
= data
;
1966 if (len
!= sizeof(*cp
))
1967 return cmd_status(sk
, index
, MGMT_OP_USER_PASSKEY_REPLY
,
1970 return user_pairing_resp(sk
, index
, &cp
->addr
.bdaddr
, cp
->addr
.type
,
1971 MGMT_OP_USER_PASSKEY_REPLY
,
1972 HCI_OP_USER_PASSKEY_REPLY
,
1976 static int user_passkey_neg_reply(struct sock
*sk
, u16 index
, void *data
,
1979 struct mgmt_cp_user_passkey_neg_reply
*cp
= data
;
1983 if (len
!= sizeof(*cp
))
1984 return cmd_status(sk
, index
, MGMT_OP_USER_PASSKEY_NEG_REPLY
,
1987 return user_pairing_resp(sk
, index
, &cp
->addr
.bdaddr
, cp
->addr
.type
,
1988 MGMT_OP_USER_PASSKEY_NEG_REPLY
,
1989 HCI_OP_USER_PASSKEY_NEG_REPLY
, 0);
1992 static int set_local_name(struct sock
*sk
, u16 index
, void *data
,
1995 struct mgmt_cp_set_local_name
*mgmt_cp
= data
;
1996 struct hci_cp_write_local_name hci_cp
;
1997 struct hci_dev
*hdev
;
1998 struct pending_cmd
*cmd
;
2003 if (len
!= sizeof(*mgmt_cp
))
2004 return cmd_status(sk
, index
, MGMT_OP_SET_LOCAL_NAME
,
2005 MGMT_STATUS_INVALID_PARAMS
);
2007 hdev
= hci_dev_get(index
);
2009 return cmd_status(sk
, index
, MGMT_OP_SET_LOCAL_NAME
,
2010 MGMT_STATUS_INVALID_PARAMS
);
2014 cmd
= mgmt_pending_add(sk
, MGMT_OP_SET_LOCAL_NAME
, hdev
, data
,
2021 memcpy(hci_cp
.name
, mgmt_cp
->name
, sizeof(hci_cp
.name
));
2022 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_LOCAL_NAME
, sizeof(hci_cp
),
2025 mgmt_pending_remove(cmd
);
2028 hci_dev_unlock(hdev
);
2034 static int read_local_oob_data(struct sock
*sk
, u16 index
)
2036 struct hci_dev
*hdev
;
2037 struct pending_cmd
*cmd
;
2040 BT_DBG("hci%u", index
);
2042 hdev
= hci_dev_get(index
);
2044 return cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
2045 MGMT_STATUS_INVALID_PARAMS
);
2049 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
2050 err
= cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
2051 MGMT_STATUS_NOT_POWERED
);
2055 if (!(hdev
->features
[6] & LMP_SIMPLE_PAIR
)) {
2056 err
= cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
2057 MGMT_STATUS_NOT_SUPPORTED
);
2061 if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA
, hdev
)) {
2062 err
= cmd_status(sk
, index
, MGMT_OP_READ_LOCAL_OOB_DATA
,
2067 cmd
= mgmt_pending_add(sk
, MGMT_OP_READ_LOCAL_OOB_DATA
, hdev
, NULL
, 0);
2073 err
= hci_send_cmd(hdev
, HCI_OP_READ_LOCAL_OOB_DATA
, 0, NULL
);
2075 mgmt_pending_remove(cmd
);
2078 hci_dev_unlock(hdev
);
2084 static int add_remote_oob_data(struct sock
*sk
, u16 index
, void *data
,
2087 struct hci_dev
*hdev
;
2088 struct mgmt_cp_add_remote_oob_data
*cp
= data
;
2091 BT_DBG("hci%u ", index
);
2093 if (len
!= sizeof(*cp
))
2094 return cmd_status(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
,
2095 MGMT_STATUS_INVALID_PARAMS
);
2097 hdev
= hci_dev_get(index
);
2099 return cmd_status(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
,
2100 MGMT_STATUS_INVALID_PARAMS
);
2104 err
= hci_add_remote_oob_data(hdev
, &cp
->addr
.bdaddr
, cp
->hash
,
2107 err
= cmd_status(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
,
2108 MGMT_STATUS_FAILED
);
2110 err
= cmd_complete(sk
, index
, MGMT_OP_ADD_REMOTE_OOB_DATA
, NULL
,
2113 hci_dev_unlock(hdev
);
2119 static int remove_remote_oob_data(struct sock
*sk
, u16 index
,
2120 void *data
, u16 len
)
2122 struct hci_dev
*hdev
;
2123 struct mgmt_cp_remove_remote_oob_data
*cp
= data
;
2126 BT_DBG("hci%u ", index
);
2128 if (len
!= sizeof(*cp
))
2129 return cmd_status(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
2130 MGMT_STATUS_INVALID_PARAMS
);
2132 hdev
= hci_dev_get(index
);
2134 return cmd_status(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
2135 MGMT_STATUS_INVALID_PARAMS
);
2139 err
= hci_remove_remote_oob_data(hdev
, &cp
->addr
.bdaddr
);
2141 err
= cmd_status(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
2142 MGMT_STATUS_INVALID_PARAMS
);
2144 err
= cmd_complete(sk
, index
, MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
2147 hci_dev_unlock(hdev
);
2153 static int start_discovery(struct sock
*sk
, u16 index
,
2154 void *data
, u16 len
)
2156 struct mgmt_cp_start_discovery
*cp
= data
;
2157 unsigned long discov_type
= cp
->type
;
2158 struct pending_cmd
*cmd
;
2159 struct hci_dev
*hdev
;
2162 BT_DBG("hci%u", index
);
2164 if (len
!= sizeof(*cp
))
2165 return cmd_status(sk
, index
, MGMT_OP_START_DISCOVERY
,
2166 MGMT_STATUS_INVALID_PARAMS
);
2168 hdev
= hci_dev_get(index
);
2170 return cmd_status(sk
, index
, MGMT_OP_START_DISCOVERY
,
2171 MGMT_STATUS_INVALID_PARAMS
);
2175 if (!test_bit(HCI_UP
, &hdev
->flags
)) {
2176 err
= cmd_status(sk
, index
, MGMT_OP_START_DISCOVERY
,
2177 MGMT_STATUS_NOT_POWERED
);
2181 if (hdev
->discovery
.state
!= DISCOVERY_STOPPED
) {
2182 err
= cmd_status(sk
, index
, MGMT_OP_START_DISCOVERY
,
2187 cmd
= mgmt_pending_add(sk
, MGMT_OP_START_DISCOVERY
, hdev
, NULL
, 0);
2193 if (test_bit(MGMT_ADDR_BREDR
, &discov_type
))
2194 err
= hci_do_inquiry(hdev
, INQUIRY_LEN_BREDR
);
2195 else if (test_bit(MGMT_ADDR_LE_PUBLIC
, &discov_type
) &&
2196 test_bit(MGMT_ADDR_LE_RANDOM
, &discov_type
))
2197 err
= hci_le_scan(hdev
, LE_SCAN_TYPE
, LE_SCAN_INT
,
2198 LE_SCAN_WIN
, LE_SCAN_TIMEOUT_LE_ONLY
);
2203 mgmt_pending_remove(cmd
);
2205 hci_discovery_set_state(hdev
, DISCOVERY_STARTING
);
2208 hci_dev_unlock(hdev
);
2214 static int stop_discovery(struct sock
*sk
, u16 index
)
2216 struct hci_dev
*hdev
;
2217 struct pending_cmd
*cmd
;
2218 struct hci_cp_remote_name_req_cancel cp
;
2219 struct inquiry_entry
*e
;
2222 BT_DBG("hci%u", index
);
2224 hdev
= hci_dev_get(index
);
2226 return cmd_status(sk
, index
, MGMT_OP_STOP_DISCOVERY
,
2227 MGMT_STATUS_INVALID_PARAMS
);
2231 if (!hci_discovery_active(hdev
)) {
2232 err
= cmd_status(sk
, index
, MGMT_OP_STOP_DISCOVERY
,
2233 MGMT_STATUS_REJECTED
);
2237 cmd
= mgmt_pending_add(sk
, MGMT_OP_STOP_DISCOVERY
, hdev
, NULL
, 0);
2243 if (hdev
->discovery
.state
== DISCOVERY_INQUIRY
) {
2244 err
= hci_cancel_inquiry(hdev
);
2246 mgmt_pending_remove(cmd
);
2248 hci_discovery_set_state(hdev
, DISCOVERY_STOPPING
);
2252 e
= hci_inquiry_cache_lookup_resolve(hdev
, BDADDR_ANY
, NAME_PENDING
);
2254 mgmt_pending_remove(cmd
);
2255 err
= cmd_complete(sk
, index
, MGMT_OP_STOP_DISCOVERY
, NULL
, 0);
2256 hci_discovery_set_state(hdev
, DISCOVERY_STOPPED
);
2260 bacpy(&cp
.bdaddr
, &e
->data
.bdaddr
);
2261 err
= hci_send_cmd(hdev
, HCI_OP_REMOTE_NAME_REQ_CANCEL
,
2264 mgmt_pending_remove(cmd
);
2266 hci_discovery_set_state(hdev
, DISCOVERY_STOPPING
);
2269 hci_dev_unlock(hdev
);
2275 static int confirm_name(struct sock
*sk
, u16 index
, void *data
, u16 len
)
2277 struct mgmt_cp_confirm_name
*cp
= data
;
2278 struct inquiry_entry
*e
;
2279 struct hci_dev
*hdev
;
2282 BT_DBG("hci%u", index
);
2284 if (len
!= sizeof(*cp
))
2285 return cmd_status(sk
, index
, MGMT_OP_CONFIRM_NAME
,
2286 MGMT_STATUS_INVALID_PARAMS
);
2288 hdev
= hci_dev_get(index
);
2290 return cmd_status(sk
, index
, MGMT_OP_CONFIRM_NAME
,
2291 MGMT_STATUS_INVALID_PARAMS
);
2295 if (!hci_discovery_active(hdev
)) {
2296 err
= cmd_status(sk
, index
, MGMT_OP_CONFIRM_NAME
,
2297 MGMT_STATUS_FAILED
);
2301 e
= hci_inquiry_cache_lookup_unknown(hdev
, &cp
->bdaddr
);
2303 err
= cmd_status (sk
, index
, MGMT_OP_CONFIRM_NAME
,
2304 MGMT_STATUS_INVALID_PARAMS
);
2308 if (cp
->name_known
) {
2309 e
->name_state
= NAME_KNOWN
;
2312 e
->name_state
= NAME_NEEDED
;
2313 hci_inquiry_cache_update_resolve(hdev
, e
);
2319 hci_dev_unlock(hdev
);
2324 static int block_device(struct sock
*sk
, u16 index
, void *data
, u16 len
)
2326 struct hci_dev
*hdev
;
2327 struct mgmt_cp_block_device
*cp
= data
;
2330 BT_DBG("hci%u", index
);
2332 if (len
!= sizeof(*cp
))
2333 return cmd_status(sk
, index
, MGMT_OP_BLOCK_DEVICE
,
2334 MGMT_STATUS_INVALID_PARAMS
);
2336 hdev
= hci_dev_get(index
);
2338 return cmd_status(sk
, index
, MGMT_OP_BLOCK_DEVICE
,
2339 MGMT_STATUS_INVALID_PARAMS
);
2343 err
= hci_blacklist_add(hdev
, &cp
->addr
.bdaddr
, cp
->addr
.type
);
2345 err
= cmd_status(sk
, index
, MGMT_OP_BLOCK_DEVICE
,
2346 MGMT_STATUS_FAILED
);
2348 err
= cmd_complete(sk
, index
, MGMT_OP_BLOCK_DEVICE
,
2351 hci_dev_unlock(hdev
);
2357 static int unblock_device(struct sock
*sk
, u16 index
, void *data
, u16 len
)
2359 struct hci_dev
*hdev
;
2360 struct mgmt_cp_unblock_device
*cp
= data
;
2363 BT_DBG("hci%u", index
);
2365 if (len
!= sizeof(*cp
))
2366 return cmd_status(sk
, index
, MGMT_OP_UNBLOCK_DEVICE
,
2367 MGMT_STATUS_INVALID_PARAMS
);
2369 hdev
= hci_dev_get(index
);
2371 return cmd_status(sk
, index
, MGMT_OP_UNBLOCK_DEVICE
,
2372 MGMT_STATUS_INVALID_PARAMS
);
2376 err
= hci_blacklist_del(hdev
, &cp
->addr
.bdaddr
, cp
->addr
.type
);
2379 err
= cmd_status(sk
, index
, MGMT_OP_UNBLOCK_DEVICE
,
2380 MGMT_STATUS_INVALID_PARAMS
);
2382 err
= cmd_complete(sk
, index
, MGMT_OP_UNBLOCK_DEVICE
,
2385 hci_dev_unlock(hdev
);
2391 static int set_fast_connectable(struct sock
*sk
, u16 index
,
2392 void *data
, u16 len
)
2394 struct hci_dev
*hdev
;
2395 struct mgmt_mode
*cp
= data
;
2396 struct hci_cp_write_page_scan_activity acp
;
2400 BT_DBG("hci%u", index
);
2402 if (len
!= sizeof(*cp
))
2403 return cmd_status(sk
, index
, MGMT_OP_SET_FAST_CONNECTABLE
,
2404 MGMT_STATUS_INVALID_PARAMS
);
2406 hdev
= hci_dev_get(index
);
2408 return cmd_status(sk
, index
, MGMT_OP_SET_FAST_CONNECTABLE
,
2409 MGMT_STATUS_INVALID_PARAMS
);
2414 type
= PAGE_SCAN_TYPE_INTERLACED
;
2415 acp
.interval
= 0x0024; /* 22.5 msec page scan interval */
2417 type
= PAGE_SCAN_TYPE_STANDARD
; /* default */
2418 acp
.interval
= 0x0800; /* default 1.28 sec page scan */
2421 acp
.window
= 0x0012; /* default 11.25 msec page scan window */
2423 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY
,
2426 err
= cmd_status(sk
, index
, MGMT_OP_SET_FAST_CONNECTABLE
,
2427 MGMT_STATUS_FAILED
);
2431 err
= hci_send_cmd(hdev
, HCI_OP_WRITE_PAGE_SCAN_TYPE
, 1, &type
);
2433 err
= cmd_status(sk
, index
, MGMT_OP_SET_FAST_CONNECTABLE
,
2434 MGMT_STATUS_FAILED
);
2438 err
= cmd_complete(sk
, index
, MGMT_OP_SET_FAST_CONNECTABLE
,
2441 hci_dev_unlock(hdev
);
2447 static int load_long_term_keys(struct sock
*sk
, u16 index
,
2448 void *cp_data
, u16 len
)
2450 struct hci_dev
*hdev
;
2451 struct mgmt_cp_load_long_term_keys
*cp
= cp_data
;
2452 u16 key_count
, expected_len
;
2455 if (len
< sizeof(*cp
))
2456 return cmd_status(sk
, index
, MGMT_OP_LOAD_LONG_TERM_KEYS
,
2459 key_count
= get_unaligned_le16(&cp
->key_count
);
2461 expected_len
= sizeof(*cp
) + key_count
*
2462 sizeof(struct mgmt_ltk_info
);
2463 if (expected_len
!= len
) {
2464 BT_ERR("load_keys: expected %u bytes, got %u bytes",
2466 return cmd_status(sk
, index
, MGMT_OP_LOAD_LONG_TERM_KEYS
,
2470 hdev
= hci_dev_get(index
);
2472 return cmd_status(sk
, index
, MGMT_OP_LOAD_LONG_TERM_KEYS
,
2475 BT_DBG("hci%u key_count %u", index
, key_count
);
2479 hci_smp_ltks_clear(hdev
);
2481 for (i
= 0; i
< key_count
; i
++) {
2482 struct mgmt_ltk_info
*key
= &cp
->keys
[i
];
2488 type
= HCI_SMP_LTK_SLAVE
;
2490 hci_add_ltk(hdev
, &key
->addr
.bdaddr
, key
->addr
.type
,
2491 type
, 0, key
->authenticated
, key
->val
,
2492 key
->enc_size
, key
->ediv
, key
->rand
);
2495 hci_dev_unlock(hdev
);
2501 int mgmt_control(struct sock
*sk
, struct msghdr
*msg
, size_t msglen
)
2505 struct mgmt_hdr
*hdr
;
2506 u16 opcode
, index
, len
;
2509 BT_DBG("got %zu bytes", msglen
);
2511 if (msglen
< sizeof(*hdr
))
2514 buf
= kmalloc(msglen
, GFP_KERNEL
);
2518 if (memcpy_fromiovec(buf
, msg
->msg_iov
, msglen
)) {
2524 opcode
= get_unaligned_le16(&hdr
->opcode
);
2525 index
= get_unaligned_le16(&hdr
->index
);
2526 len
= get_unaligned_le16(&hdr
->len
);
2528 if (len
!= msglen
- sizeof(*hdr
)) {
2533 cp
= buf
+ sizeof(*hdr
);
2536 case MGMT_OP_READ_VERSION
:
2537 err
= read_version(sk
);
2539 case MGMT_OP_READ_COMMANDS
:
2540 err
= read_commands(sk
);
2542 case MGMT_OP_READ_INDEX_LIST
:
2543 err
= read_index_list(sk
);
2545 case MGMT_OP_READ_INFO
:
2546 err
= read_controller_info(sk
, index
);
2548 case MGMT_OP_SET_POWERED
:
2549 err
= set_powered(sk
, index
, cp
, len
);
2551 case MGMT_OP_SET_DISCOVERABLE
:
2552 err
= set_discoverable(sk
, index
, cp
, len
);
2554 case MGMT_OP_SET_CONNECTABLE
:
2555 err
= set_connectable(sk
, index
, cp
, len
);
2557 case MGMT_OP_SET_FAST_CONNECTABLE
:
2558 err
= set_fast_connectable(sk
, index
, cp
, len
);
2560 case MGMT_OP_SET_PAIRABLE
:
2561 err
= set_pairable(sk
, index
, cp
, len
);
2563 case MGMT_OP_SET_LINK_SECURITY
:
2564 err
= set_link_security(sk
, index
, cp
, len
);
2566 case MGMT_OP_SET_SSP
:
2567 err
= set_ssp(sk
, index
, cp
, len
);
2569 case MGMT_OP_ADD_UUID
:
2570 err
= add_uuid(sk
, index
, cp
, len
);
2572 case MGMT_OP_REMOVE_UUID
:
2573 err
= remove_uuid(sk
, index
, cp
, len
);
2575 case MGMT_OP_SET_DEV_CLASS
:
2576 err
= set_dev_class(sk
, index
, cp
, len
);
2578 case MGMT_OP_LOAD_LINK_KEYS
:
2579 err
= load_link_keys(sk
, index
, cp
, len
);
2581 case MGMT_OP_DISCONNECT
:
2582 err
= disconnect(sk
, index
, cp
, len
);
2584 case MGMT_OP_GET_CONNECTIONS
:
2585 err
= get_connections(sk
, index
);
2587 case MGMT_OP_PIN_CODE_REPLY
:
2588 err
= pin_code_reply(sk
, index
, cp
, len
);
2590 case MGMT_OP_PIN_CODE_NEG_REPLY
:
2591 err
= pin_code_neg_reply(sk
, index
, cp
, len
);
2593 case MGMT_OP_SET_IO_CAPABILITY
:
2594 err
= set_io_capability(sk
, index
, cp
, len
);
2596 case MGMT_OP_PAIR_DEVICE
:
2597 err
= pair_device(sk
, index
, cp
, len
);
2599 case MGMT_OP_CANCEL_PAIR_DEVICE
:
2600 err
= cancel_pair_device(sk
, index
, buf
+ sizeof(*hdr
), len
);
2602 case MGMT_OP_UNPAIR_DEVICE
:
2603 err
= unpair_device(sk
, index
, cp
, len
);
2605 case MGMT_OP_USER_CONFIRM_REPLY
:
2606 err
= user_confirm_reply(sk
, index
, cp
, len
);
2608 case MGMT_OP_USER_CONFIRM_NEG_REPLY
:
2609 err
= user_confirm_neg_reply(sk
, index
, cp
, len
);
2611 case MGMT_OP_USER_PASSKEY_REPLY
:
2612 err
= user_passkey_reply(sk
, index
, cp
, len
);
2614 case MGMT_OP_USER_PASSKEY_NEG_REPLY
:
2615 err
= user_passkey_neg_reply(sk
, index
, cp
, len
);
2617 case MGMT_OP_SET_LOCAL_NAME
:
2618 err
= set_local_name(sk
, index
, cp
, len
);
2620 case MGMT_OP_READ_LOCAL_OOB_DATA
:
2621 err
= read_local_oob_data(sk
, index
);
2623 case MGMT_OP_ADD_REMOTE_OOB_DATA
:
2624 err
= add_remote_oob_data(sk
, index
, cp
, len
);
2626 case MGMT_OP_REMOVE_REMOTE_OOB_DATA
:
2627 err
= remove_remote_oob_data(sk
, index
, cp
, len
);
2629 case MGMT_OP_START_DISCOVERY
:
2630 err
= start_discovery(sk
, index
, cp
, len
);
2632 case MGMT_OP_STOP_DISCOVERY
:
2633 err
= stop_discovery(sk
, index
);
2635 case MGMT_OP_CONFIRM_NAME
:
2636 err
= confirm_name(sk
, index
, cp
, len
);
2638 case MGMT_OP_BLOCK_DEVICE
:
2639 err
= block_device(sk
, index
, cp
, len
);
2641 case MGMT_OP_UNBLOCK_DEVICE
:
2642 err
= unblock_device(sk
, index
, cp
, len
);
2644 case MGMT_OP_LOAD_LONG_TERM_KEYS
:
2645 err
= load_long_term_keys(sk
, index
, cp
, len
);
2648 BT_DBG("Unknown op %u", opcode
);
2649 err
= cmd_status(sk
, index
, opcode
,
2650 MGMT_STATUS_UNKNOWN_COMMAND
);
2664 static void cmd_status_rsp(struct pending_cmd
*cmd
, void *data
)
2668 cmd_status(cmd
->sk
, cmd
->index
, cmd
->opcode
, *status
);
2669 mgmt_pending_remove(cmd
);
2672 int mgmt_index_added(struct hci_dev
*hdev
)
2674 return mgmt_event(MGMT_EV_INDEX_ADDED
, hdev
, NULL
, 0, NULL
);
2677 int mgmt_index_removed(struct hci_dev
*hdev
)
2681 mgmt_pending_foreach(0, hdev
, cmd_status_rsp
, &status
);
2683 return mgmt_event(MGMT_EV_INDEX_REMOVED
, hdev
, NULL
, 0, NULL
);
2688 struct hci_dev
*hdev
;
2691 static void settings_rsp(struct pending_cmd
*cmd
, void *data
)
2693 struct cmd_lookup
*match
= data
;
2695 send_settings_rsp(cmd
->sk
, cmd
->opcode
, match
->hdev
);
2697 list_del(&cmd
->list
);
2699 if (match
->sk
== NULL
) {
2700 match
->sk
= cmd
->sk
;
2701 sock_hold(match
->sk
);
2704 mgmt_pending_free(cmd
);
2707 int mgmt_powered(struct hci_dev
*hdev
, u8 powered
)
2709 struct cmd_lookup match
= { NULL
, hdev
};
2713 mgmt_pending_foreach(MGMT_OP_SET_POWERED
, hdev
, settings_rsp
, &match
);
2716 u8 status
= ENETDOWN
;
2717 mgmt_pending_foreach(0, hdev
, cmd_status_rsp
, &status
);
2720 ev
= cpu_to_le32(get_current_settings(hdev
));
2722 err
= mgmt_event(MGMT_EV_NEW_SETTINGS
, hdev
, &ev
, sizeof(ev
),
2731 int mgmt_discoverable(struct hci_dev
*hdev
, u8 discoverable
)
2733 struct cmd_lookup match
= { NULL
, hdev
};
2737 mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE
, hdev
, settings_rsp
, &match
);
2739 ev
= cpu_to_le32(get_current_settings(hdev
));
2741 err
= mgmt_event(MGMT_EV_NEW_SETTINGS
, hdev
, &ev
, sizeof(ev
),
2749 int mgmt_connectable(struct hci_dev
*hdev
, u8 connectable
)
2752 struct cmd_lookup match
= { NULL
, hdev
};
2755 mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE
, hdev
, settings_rsp
,
2758 ev
= cpu_to_le32(get_current_settings(hdev
));
2760 err
= mgmt_event(MGMT_EV_NEW_SETTINGS
, hdev
, &ev
, sizeof(ev
), match
.sk
);
2768 int mgmt_write_scan_failed(struct hci_dev
*hdev
, u8 scan
, u8 status
)
2770 u8 mgmt_err
= mgmt_status(status
);
2772 if (scan
& SCAN_PAGE
)
2773 mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE
, hdev
,
2774 cmd_status_rsp
, &mgmt_err
);
2776 if (scan
& SCAN_INQUIRY
)
2777 mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE
, hdev
,
2778 cmd_status_rsp
, &mgmt_err
);
2783 int mgmt_new_link_key(struct hci_dev
*hdev
, struct link_key
*key
,
2786 struct mgmt_ev_new_link_key ev
;
2788 memset(&ev
, 0, sizeof(ev
));
2790 ev
.store_hint
= persistent
;
2791 bacpy(&ev
.key
.bdaddr
, &key
->bdaddr
);
2792 ev
.key
.type
= key
->type
;
2793 memcpy(ev
.key
.val
, key
->val
, 16);
2794 ev
.key
.pin_len
= key
->pin_len
;
2796 return mgmt_event(MGMT_EV_NEW_LINK_KEY
, hdev
, &ev
, sizeof(ev
), NULL
);
2799 int mgmt_new_ltk(struct hci_dev
*hdev
, struct smp_ltk
*key
, u8 persistent
)
2801 struct mgmt_ev_new_long_term_key ev
;
2803 memset(&ev
, 0, sizeof(ev
));
2805 ev
.store_hint
= persistent
;
2806 bacpy(&ev
.key
.addr
.bdaddr
, &key
->bdaddr
);
2807 ev
.key
.addr
.type
= key
->bdaddr_type
;
2808 ev
.key
.authenticated
= key
->authenticated
;
2809 ev
.key
.enc_size
= key
->enc_size
;
2810 ev
.key
.ediv
= key
->ediv
;
2812 if (key
->type
== HCI_SMP_LTK
)
2815 memcpy(ev
.key
.rand
, key
->rand
, sizeof(key
->rand
));
2816 memcpy(ev
.key
.val
, key
->val
, sizeof(key
->val
));
2818 return mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY
, hdev
,
2819 &ev
, sizeof(ev
), NULL
);
2822 int mgmt_device_connected(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
2823 u8 addr_type
, u8
*name
, u8 name_len
,
2827 struct mgmt_ev_device_connected
*ev
= (void *) buf
;
2830 bacpy(&ev
->addr
.bdaddr
, bdaddr
);
2831 ev
->addr
.type
= link_to_mgmt(link_type
, addr_type
);
2834 eir_len
= eir_append_data(ev
->eir
, 0, EIR_NAME_COMPLETE
,
2837 if (dev_class
&& memcmp(dev_class
, "\0\0\0", 3) != 0)
2838 eir_len
= eir_append_data(&ev
->eir
[eir_len
], eir_len
,
2839 EIR_CLASS_OF_DEV
, dev_class
, 3);
2841 put_unaligned_le16(eir_len
, &ev
->eir_len
);
2843 return mgmt_event(MGMT_EV_DEVICE_CONNECTED
, hdev
, buf
,
2844 sizeof(*ev
) + eir_len
, NULL
);
2847 static void disconnect_rsp(struct pending_cmd
*cmd
, void *data
)
2849 struct mgmt_cp_disconnect
*cp
= cmd
->param
;
2850 struct sock
**sk
= data
;
2851 struct mgmt_rp_disconnect rp
;
2853 bacpy(&rp
.addr
.bdaddr
, &cp
->addr
.bdaddr
);
2854 rp
.addr
.type
= cp
->addr
.type
;
2857 cmd_complete(cmd
->sk
, cmd
->index
, MGMT_OP_DISCONNECT
, &rp
, sizeof(rp
));
2862 mgmt_pending_remove(cmd
);
2865 static void unpair_device_rsp(struct pending_cmd
*cmd
, void *data
)
2867 struct hci_dev
*hdev
= data
;
2868 struct mgmt_cp_unpair_device
*cp
= cmd
->param
;
2869 struct mgmt_rp_unpair_device rp
;
2871 memset(&rp
, 0, sizeof(rp
));
2872 bacpy(&rp
.addr
.bdaddr
, &cp
->addr
.bdaddr
);
2873 rp
.addr
.type
= cp
->addr
.type
;
2875 device_unpaired(hdev
, &cp
->addr
.bdaddr
, cp
->addr
.type
, cmd
->sk
);
2877 cmd_complete(cmd
->sk
, cmd
->index
, cmd
->opcode
, &rp
, sizeof(rp
));
2879 mgmt_pending_remove(cmd
);
2882 int mgmt_device_disconnected(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
2883 u8 link_type
, u8 addr_type
)
2885 struct mgmt_addr_info ev
;
2886 struct sock
*sk
= NULL
;
2889 mgmt_pending_foreach(MGMT_OP_DISCONNECT
, hdev
, disconnect_rsp
, &sk
);
2891 bacpy(&ev
.bdaddr
, bdaddr
);
2892 ev
.type
= link_to_mgmt(link_type
, addr_type
);
2894 err
= mgmt_event(MGMT_EV_DEVICE_DISCONNECTED
, hdev
, &ev
, sizeof(ev
),
2900 mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE
, hdev
, unpair_device_rsp
,
2906 int mgmt_disconnect_failed(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
2907 u8 link_type
, u8 addr_type
, u8 status
)
2909 struct mgmt_rp_disconnect rp
;
2910 struct pending_cmd
*cmd
;
2913 cmd
= mgmt_pending_find(MGMT_OP_DISCONNECT
, hdev
);
2917 bacpy(&rp
.addr
.bdaddr
, bdaddr
);
2918 rp
.addr
.type
= link_to_mgmt(link_type
, addr_type
);
2919 rp
.status
= mgmt_status(status
);
2921 err
= cmd_complete(cmd
->sk
, cmd
->index
, MGMT_OP_DISCONNECT
,
2924 mgmt_pending_remove(cmd
);
2926 mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE
, hdev
, unpair_device_rsp
,
2931 int mgmt_connect_failed(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
2932 u8 addr_type
, u8 status
)
2934 struct mgmt_ev_connect_failed ev
;
2936 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
2937 ev
.addr
.type
= link_to_mgmt(link_type
, addr_type
);
2938 ev
.status
= mgmt_status(status
);
2940 return mgmt_event(MGMT_EV_CONNECT_FAILED
, hdev
, &ev
, sizeof(ev
), NULL
);
2943 int mgmt_pin_code_request(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 secure
)
2945 struct mgmt_ev_pin_code_request ev
;
2947 bacpy(&ev
.bdaddr
, bdaddr
);
2950 return mgmt_event(MGMT_EV_PIN_CODE_REQUEST
, hdev
, &ev
, sizeof(ev
),
2954 int mgmt_pin_code_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
2957 struct pending_cmd
*cmd
;
2958 struct mgmt_rp_pin_code_reply rp
;
2961 cmd
= mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY
, hdev
);
2965 bacpy(&rp
.bdaddr
, bdaddr
);
2966 rp
.status
= mgmt_status(status
);
2968 err
= cmd_complete(cmd
->sk
, hdev
->id
, MGMT_OP_PIN_CODE_REPLY
, &rp
,
2971 mgmt_pending_remove(cmd
);
2976 int mgmt_pin_code_neg_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
2979 struct pending_cmd
*cmd
;
2980 struct mgmt_rp_pin_code_reply rp
;
2983 cmd
= mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY
, hdev
);
2987 bacpy(&rp
.bdaddr
, bdaddr
);
2988 rp
.status
= mgmt_status(status
);
2990 err
= cmd_complete(cmd
->sk
, hdev
->id
, MGMT_OP_PIN_CODE_NEG_REPLY
, &rp
,
2993 mgmt_pending_remove(cmd
);
2998 int mgmt_user_confirm_request(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
2999 u8 link_type
, u8 addr_type
, __le32 value
,
3002 struct mgmt_ev_user_confirm_request ev
;
3004 BT_DBG("%s", hdev
->name
);
3006 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3007 ev
.addr
.type
= link_to_mgmt(link_type
, addr_type
);
3008 ev
.confirm_hint
= confirm_hint
;
3009 put_unaligned_le32(value
, &ev
.value
);
3011 return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST
, hdev
, &ev
, sizeof(ev
),
3015 int mgmt_user_passkey_request(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3016 u8 link_type
, u8 addr_type
)
3018 struct mgmt_ev_user_passkey_request ev
;
3020 BT_DBG("%s", hdev
->name
);
3022 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3023 ev
.addr
.type
= link_to_mgmt(link_type
, addr_type
);
3025 return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST
, hdev
, &ev
, sizeof(ev
),
3029 static int user_pairing_resp_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3030 u8 link_type
, u8 addr_type
, u8 status
,
3033 struct pending_cmd
*cmd
;
3034 struct mgmt_rp_user_confirm_reply rp
;
3037 cmd
= mgmt_pending_find(opcode
, hdev
);
3041 bacpy(&rp
.addr
.bdaddr
, bdaddr
);
3042 rp
.addr
.type
= link_to_mgmt(link_type
, addr_type
);
3043 rp
.status
= mgmt_status(status
);
3044 err
= cmd_complete(cmd
->sk
, hdev
->id
, opcode
, &rp
, sizeof(rp
));
3046 mgmt_pending_remove(cmd
);
3051 int mgmt_user_confirm_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3052 u8 link_type
, u8 addr_type
, u8 status
)
3054 return user_pairing_resp_complete(hdev
, bdaddr
, link_type
, addr_type
,
3055 status
, MGMT_OP_USER_CONFIRM_REPLY
);
3058 int mgmt_user_confirm_neg_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3059 u8 link_type
, u8 addr_type
, u8 status
)
3061 return user_pairing_resp_complete(hdev
, bdaddr
, link_type
, addr_type
,
3062 status
, MGMT_OP_USER_CONFIRM_NEG_REPLY
);
3065 int mgmt_user_passkey_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3066 u8 link_type
, u8 addr_type
, u8 status
)
3068 return user_pairing_resp_complete(hdev
, bdaddr
, link_type
, addr_type
,
3069 status
, MGMT_OP_USER_PASSKEY_REPLY
);
3072 int mgmt_user_passkey_neg_reply_complete(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
,
3073 u8 link_type
, u8 addr_type
, u8 status
)
3075 return user_pairing_resp_complete(hdev
, bdaddr
, link_type
, addr_type
,
3076 status
, MGMT_OP_USER_PASSKEY_NEG_REPLY
);
3079 int mgmt_auth_failed(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
3080 u8 addr_type
, u8 status
)
3082 struct mgmt_ev_auth_failed ev
;
3084 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3085 ev
.addr
.type
= link_to_mgmt(link_type
, addr_type
);
3086 ev
.status
= mgmt_status(status
);
3088 return mgmt_event(MGMT_EV_AUTH_FAILED
, hdev
, &ev
, sizeof(ev
), NULL
);
3091 int mgmt_auth_enable_complete(struct hci_dev
*hdev
, u8 status
)
3093 struct cmd_lookup match
= { NULL
, hdev
};
3098 u8 mgmt_err
= mgmt_status(status
);
3099 mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY
, hdev
,
3100 cmd_status_rsp
, &mgmt_err
);
3104 mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY
, hdev
, settings_rsp
,
3107 ev
= cpu_to_le32(get_current_settings(hdev
));
3108 err
= mgmt_event(MGMT_EV_NEW_SETTINGS
, hdev
, &ev
, sizeof(ev
), match
.sk
);
3116 int mgmt_ssp_enable_complete(struct hci_dev
*hdev
, u8 status
)
3118 struct cmd_lookup match
= { NULL
, hdev
};
3123 u8 mgmt_err
= mgmt_status(status
);
3124 mgmt_pending_foreach(MGMT_OP_SET_SSP
, hdev
,
3125 cmd_status_rsp
, &mgmt_err
);
3129 mgmt_pending_foreach(MGMT_OP_SET_SSP
, hdev
, settings_rsp
, &match
);
3131 ev
= cpu_to_le32(get_current_settings(hdev
));
3132 err
= mgmt_event(MGMT_EV_NEW_SETTINGS
, hdev
, &ev
, sizeof(ev
), match
.sk
);
3140 int mgmt_set_local_name_complete(struct hci_dev
*hdev
, u8
*name
, u8 status
)
3142 struct pending_cmd
*cmd
;
3143 struct mgmt_cp_set_local_name ev
;
3146 memset(&ev
, 0, sizeof(ev
));
3147 memcpy(ev
.name
, name
, HCI_MAX_NAME_LENGTH
);
3149 cmd
= mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME
, hdev
);
3154 err
= cmd_status(cmd
->sk
, hdev
->id
, MGMT_OP_SET_LOCAL_NAME
,
3155 mgmt_status(status
));
3161 err
= cmd_complete(cmd
->sk
, hdev
->id
, MGMT_OP_SET_LOCAL_NAME
, &ev
,
3167 err
= mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED
, hdev
, &ev
, sizeof(ev
),
3168 cmd
? cmd
->sk
: NULL
);
3172 mgmt_pending_remove(cmd
);
3176 int mgmt_read_local_oob_data_reply_complete(struct hci_dev
*hdev
, u8
*hash
,
3177 u8
*randomizer
, u8 status
)
3179 struct pending_cmd
*cmd
;
3182 BT_DBG("%s status %u", hdev
->name
, status
);
3184 cmd
= mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA
, hdev
);
3189 err
= cmd_status(cmd
->sk
, hdev
->id
,
3190 MGMT_OP_READ_LOCAL_OOB_DATA
,
3191 mgmt_status(status
));
3193 struct mgmt_rp_read_local_oob_data rp
;
3195 memcpy(rp
.hash
, hash
, sizeof(rp
.hash
));
3196 memcpy(rp
.randomizer
, randomizer
, sizeof(rp
.randomizer
));
3198 err
= cmd_complete(cmd
->sk
, hdev
->id
,
3199 MGMT_OP_READ_LOCAL_OOB_DATA
,
3203 mgmt_pending_remove(cmd
);
3208 int mgmt_device_found(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
3209 u8 addr_type
, u8
*dev_class
, s8 rssi
,
3210 u8 cfm_name
, u8
*eir
, u16 eir_len
)
3213 struct mgmt_ev_device_found
*ev
= (void *) buf
;
3216 /* Leave 5 bytes for a potential CoD field */
3217 if (sizeof(*ev
) + eir_len
+ 5 > sizeof(buf
))
3220 memset(buf
, 0, sizeof(buf
));
3222 bacpy(&ev
->addr
.bdaddr
, bdaddr
);
3223 ev
->addr
.type
= link_to_mgmt(link_type
, addr_type
);
3225 ev
->confirm_name
= cfm_name
;
3228 memcpy(ev
->eir
, eir
, eir_len
);
3230 if (dev_class
&& !eir_has_data_type(ev
->eir
, eir_len
, EIR_CLASS_OF_DEV
))
3231 eir_len
= eir_append_data(ev
->eir
, eir_len
, EIR_CLASS_OF_DEV
,
3234 put_unaligned_le16(eir_len
, &ev
->eir_len
);
3236 ev_size
= sizeof(*ev
) + eir_len
;
3238 return mgmt_event(MGMT_EV_DEVICE_FOUND
, hdev
, ev
, ev_size
, NULL
);
3241 int mgmt_remote_name(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 link_type
,
3242 u8 addr_type
, s8 rssi
, u8
*name
, u8 name_len
)
3244 struct mgmt_ev_device_found
*ev
;
3245 char buf
[sizeof(*ev
) + HCI_MAX_NAME_LENGTH
+ 2];
3248 ev
= (struct mgmt_ev_device_found
*) buf
;
3250 memset(buf
, 0, sizeof(buf
));
3252 bacpy(&ev
->addr
.bdaddr
, bdaddr
);
3253 ev
->addr
.type
= link_to_mgmt(link_type
, addr_type
);
3256 eir_len
= eir_append_data(ev
->eir
, 0, EIR_NAME_COMPLETE
, name
,
3259 put_unaligned_le16(eir_len
, &ev
->eir_len
);
3261 return mgmt_event(MGMT_EV_DEVICE_FOUND
, hdev
, ev
,
3262 sizeof(*ev
) + eir_len
, NULL
);
3265 int mgmt_start_discovery_failed(struct hci_dev
*hdev
, u8 status
)
3267 struct pending_cmd
*cmd
;
3270 hci_discovery_set_state(hdev
, DISCOVERY_STOPPED
);
3272 cmd
= mgmt_pending_find(MGMT_OP_START_DISCOVERY
, hdev
);
3276 err
= cmd_status(cmd
->sk
, hdev
->id
, cmd
->opcode
, mgmt_status(status
));
3277 mgmt_pending_remove(cmd
);
3282 int mgmt_stop_discovery_failed(struct hci_dev
*hdev
, u8 status
)
3284 struct pending_cmd
*cmd
;
3287 cmd
= mgmt_pending_find(MGMT_OP_STOP_DISCOVERY
, hdev
);
3291 err
= cmd_status(cmd
->sk
, hdev
->id
, cmd
->opcode
, mgmt_status(status
));
3292 mgmt_pending_remove(cmd
);
3297 int mgmt_discovering(struct hci_dev
*hdev
, u8 discovering
)
3299 struct pending_cmd
*cmd
;
3301 BT_DBG("%s discovering %u", hdev
->name
, discovering
);
3304 cmd
= mgmt_pending_find(MGMT_OP_START_DISCOVERY
, hdev
);
3306 cmd
= mgmt_pending_find(MGMT_OP_STOP_DISCOVERY
, hdev
);
3309 cmd_complete(cmd
->sk
, hdev
->id
, cmd
->opcode
, NULL
, 0);
3310 mgmt_pending_remove(cmd
);
3313 return mgmt_event(MGMT_EV_DISCOVERING
, hdev
, &discovering
,
3314 sizeof(discovering
), NULL
);
3317 int mgmt_device_blocked(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 type
)
3319 struct pending_cmd
*cmd
;
3320 struct mgmt_ev_device_blocked ev
;
3322 cmd
= mgmt_pending_find(MGMT_OP_BLOCK_DEVICE
, hdev
);
3324 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3325 ev
.addr
.type
= type
;
3327 return mgmt_event(MGMT_EV_DEVICE_BLOCKED
, hdev
, &ev
, sizeof(ev
),
3328 cmd
? cmd
->sk
: NULL
);
3331 int mgmt_device_unblocked(struct hci_dev
*hdev
, bdaddr_t
*bdaddr
, u8 type
)
3333 struct pending_cmd
*cmd
;
3334 struct mgmt_ev_device_unblocked ev
;
3336 cmd
= mgmt_pending_find(MGMT_OP_UNBLOCK_DEVICE
, hdev
);
3338 bacpy(&ev
.addr
.bdaddr
, bdaddr
);
3339 ev
.addr
.type
= type
;
3341 return mgmt_event(MGMT_EV_DEVICE_UNBLOCKED
, hdev
, &ev
, sizeof(ev
),
3342 cmd
? cmd
->sk
: NULL
);