Commit a4790360 authored by Marcel Holtmann's avatar Marcel Holtmann Committed by Johan Hedberg

Bluetooth: Add support for Read Local Simple Pairing Options

With the Read Local Simple Pairing Options command it is possible to
retrieve the support for max encryption key size supported by the
controller and also if the controller correctly verifies the ECDH public
key during pairing.
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
Reviewed-by: default avatarAlain Michaud <alainm@chromium.org>
Signed-off-by: default avatarJohan Hedberg <johan.hedberg@intel.com>
parent fc04590e
...@@ -1275,6 +1275,13 @@ struct hci_rp_read_data_block_size { ...@@ -1275,6 +1275,13 @@ struct hci_rp_read_data_block_size {
#define HCI_OP_READ_LOCAL_CODECS 0x100b #define HCI_OP_READ_LOCAL_CODECS 0x100b
#define HCI_OP_READ_LOCAL_PAIRING_OPTS 0x100c
struct hci_rp_read_local_pairing_opts {
__u8 status;
__u8 pairing_opts;
__u8 max_key_size;
} __packed;
#define HCI_OP_READ_PAGE_SCAN_ACTIVITY 0x0c1b #define HCI_OP_READ_PAGE_SCAN_ACTIVITY 0x0c1b
struct hci_rp_read_page_scan_activity { struct hci_rp_read_page_scan_activity {
__u8 status; __u8 status;
......
...@@ -312,6 +312,8 @@ struct hci_dev { ...@@ -312,6 +312,8 @@ struct hci_dev {
__u16 conn_info_max_age; __u16 conn_info_max_age;
__u16 auth_payload_timeout; __u16 auth_payload_timeout;
__u8 min_enc_key_size; __u8 min_enc_key_size;
__u8 max_enc_key_size;
__u8 pairing_opts;
__u8 ssp_debug_mode; __u8 ssp_debug_mode;
__u8 hw_error_code; __u8 hw_error_code;
__u32 clock; __u32 clock;
......
...@@ -827,6 +827,10 @@ static int hci_init4_req(struct hci_request *req, unsigned long opt) ...@@ -827,6 +827,10 @@ static int hci_init4_req(struct hci_request *req, unsigned long opt)
if (hdev->commands[29] & 0x20) if (hdev->commands[29] & 0x20)
hci_req_add(req, HCI_OP_READ_LOCAL_CODECS, 0, NULL); hci_req_add(req, HCI_OP_READ_LOCAL_CODECS, 0, NULL);
/* Read local pairing options if the HCI command is supported */
if (hdev->commands[41] & 0x08)
hci_req_add(req, HCI_OP_READ_LOCAL_PAIRING_OPTS, 0, NULL);
/* Get MWS transport configuration if the HCI command is supported */ /* Get MWS transport configuration if the HCI command is supported */
if (hdev->commands[30] & 0x08) if (hdev->commands[30] & 0x08)
hci_req_add(req, HCI_OP_GET_MWS_TRANSPORT_CONFIG, 0, NULL); hci_req_add(req, HCI_OP_GET_MWS_TRANSPORT_CONFIG, 0, NULL);
......
...@@ -747,6 +747,23 @@ static void hci_cc_read_bd_addr(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -747,6 +747,23 @@ static void hci_cc_read_bd_addr(struct hci_dev *hdev, struct sk_buff *skb)
bacpy(&hdev->setup_addr, &rp->bdaddr); bacpy(&hdev->setup_addr, &rp->bdaddr);
} }
static void hci_cc_read_local_pairing_opts(struct hci_dev *hdev,
struct sk_buff *skb)
{
struct hci_rp_read_local_pairing_opts *rp = (void *) skb->data;
BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
if (rp->status)
return;
if (hci_dev_test_flag(hdev, HCI_SETUP) ||
hci_dev_test_flag(hdev, HCI_CONFIG)) {
hdev->pairing_opts = rp->pairing_opts;
hdev->max_enc_key_size = rp->max_key_size;
}
}
static void hci_cc_read_page_scan_activity(struct hci_dev *hdev, static void hci_cc_read_page_scan_activity(struct hci_dev *hdev,
struct sk_buff *skb) struct sk_buff *skb)
{ {
...@@ -3343,6 +3360,10 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb, ...@@ -3343,6 +3360,10 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb,
hci_cc_read_bd_addr(hdev, skb); hci_cc_read_bd_addr(hdev, skb);
break; break;
case HCI_OP_READ_LOCAL_PAIRING_OPTS:
hci_cc_read_local_pairing_opts(hdev, skb);
break;
case HCI_OP_READ_PAGE_SCAN_ACTIVITY: case HCI_OP_READ_PAGE_SCAN_ACTIVITY:
hci_cc_read_page_scan_activity(hdev, skb); hci_cc_read_page_scan_activity(hdev, skb);
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment