From 4b7702c0a470fb5eff6cf9ffe0d5ed453e765c47 Mon Sep 17 00:00:00 2001 From: chenjianhua Date: Wed, 19 Oct 2022 20:47:44 +0800 Subject: [PATCH 1/4] bluedroid: correct the length of att read by type pdu --- components/bt/host/bluedroid/stack/gatt/att_protocol.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/components/bt/host/bluedroid/stack/gatt/att_protocol.c b/components/bt/host/bluedroid/stack/gatt/att_protocol.c index 52ac13da1e..c6bb441105 100644 --- a/components/bt/host/bluedroid/stack/gatt/att_protocol.c +++ b/components/bt/host/bluedroid/stack/gatt/att_protocol.c @@ -134,8 +134,10 @@ BT_HDR *attp_build_browse_cmd(UINT8 op_code, UINT16 s_hdl, UINT16 e_hdl, tBT_UUI { BT_HDR *p_buf = NULL; UINT8 *p; + /* length of ATT_READ_BY_TYPE_REQ PDU: opcode(1) + start_handle (2) + end_handle (2) + uuid (2 or 16) */ + const UINT8 payload_size = 1 + 2 + 2 + ((uuid.len == LEN_UUID_16) ? LEN_UUID_16 : LEN_UUID_128); - if ((p_buf = (BT_HDR *)osi_malloc(sizeof(BT_HDR) + 8 + L2CAP_MIN_OFFSET)) != NULL) { + if ((p_buf = (BT_HDR *)osi_malloc(sizeof(BT_HDR) + payload_size + L2CAP_MIN_OFFSET)) != NULL) { p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; /* Describe the built message location and size */ p_buf->offset = L2CAP_MIN_OFFSET; From c97df72bb244f7f7f9668c12faefde2f6c1a1d86 Mon Sep 17 00:00:00 2001 From: chenjianhua Date: Fri, 25 Nov 2022 11:38:11 +0800 Subject: [PATCH 2/4] bluedroid: fix encrypt keysize of GATT characteristic permission --- components/bt/host/bluedroid/api/esp_gap_ble_api.c | 4 ++++ .../host/bluedroid/api/include/api/esp_gatt_defs.h | 1 + components/bt/host/bluedroid/bta/dm/bta_dm_co.c | 12 ------------ .../bt/host/bluedroid/bta/include/bta/bta_dm_co.h | 2 -- .../host/bluedroid/btc/profile/std/gap/btc_gap_ble.c | 6 ------ .../host/bluedroid/common/include/common/bte_appl.h | 1 - components/bt/host/bluedroid/stack/gatt/gatt_db.c | 9 --------- .../bt/host/bluedroid/stack/include/stack/btm_api.h | 1 - 8 files changed, 5 insertions(+), 31 deletions(-) diff --git a/components/bt/host/bluedroid/api/esp_gap_ble_api.c b/components/bt/host/bluedroid/api/esp_gap_ble_api.c index e97216266e..13a77e509a 100644 --- a/components/bt/host/bluedroid/api/esp_gap_ble_api.c +++ b/components/bt/host/bluedroid/api/esp_gap_ble_api.c @@ -561,6 +561,10 @@ esp_err_t esp_ble_gap_set_security_param(esp_ble_sm_param_t param_type, return ESP_ERR_INVALID_ARG; } } + if (param_type == ESP_BLE_APP_ENC_KEY_SIZE) { + LOG_ERROR("ESP_BLE_APP_ENC_KEY_SIZE is deprecated, use ESP_GATT_PERM_ENCRYPT_KEY_SIZE in characteristic definition"); + return ESP_ERR_NOT_SUPPORTED; + } btc_msg_t msg = {0}; btc_ble_gap_args_t arg; diff --git a/components/bt/host/bluedroid/api/include/api/esp_gatt_defs.h b/components/bt/host/bluedroid/api/include/api/esp_gatt_defs.h index 3e5a9c190f..f2d658a208 100644 --- a/components/bt/host/bluedroid/api/include/api/esp_gatt_defs.h +++ b/components/bt/host/bluedroid/api/include/api/esp_gatt_defs.h @@ -277,6 +277,7 @@ typedef enum { #define ESP_GATT_PERM_WRITE_SIGNED_MITM (1 << 8) /* bit 8 - 0x0100 */ /* relate to BTA_GATT_PERM_WRITE_SIGNED_MITM in bta/bta_gatt_api.h */ #define ESP_GATT_PERM_READ_AUTHORIZATION (1 << 9) /* bit 9 - 0x0200 */ #define ESP_GATT_PERM_WRITE_AUTHORIZATION (1 << 10) /* bit 10 - 0x0400 */ +#define ESP_GATT_PERM_ENCRYPT_KEY_SIZE(keysize) (((keysize - 6) & 0xF) << 12) /* bit 12:15 - 0xF000 */ typedef uint16_t esp_gatt_perm_t; /* relate to BTA_GATT_CHAR_PROP_BIT_xxx in bta/bta_gatt_api.h */ diff --git a/components/bt/host/bluedroid/bta/dm/bta_dm_co.c b/components/bt/host/bluedroid/bta/dm/bta_dm_co.c index c28369769c..3405e8de11 100644 --- a/components/bt/host/bluedroid/bta/dm/bta_dm_co.c +++ b/components/bt/host/bluedroid/bta/dm/bta_dm_co.c @@ -51,7 +51,6 @@ tBTE_APPL_CFG bte_appl_cfg = { BTM_BLE_MIN_KEY_SIZE, BTM_BLE_ONLY_ACCEPT_SPECIFIED_SEC_AUTH_DISABLE, BTM_BLE_OOB_DISABLE, - BTM_BLE_APPL_ENC_KEY_SIZE, }; #endif @@ -428,17 +427,6 @@ void bta_dm_co_ble_set_min_key_size(UINT8 ble_key_size) #endif ///SMP_INCLUDED == TRUE } -void bta_dm_co_ble_set_appl_enc_key_size(UINT8 ble_key_size) -{ -#if (SMP_INCLUDED == TRUE) - if(ble_key_size >= bte_appl_cfg.ble_min_key_size && ble_key_size <= bte_appl_cfg.ble_max_key_size) { - bte_appl_cfg.ble_appl_enc_key_size = ble_key_size; - } else { - APPL_TRACE_ERROR("%s error:Invalid key size value, key_size =%d",__func__, ble_key_size); - } -#endif ///SMP_INCLUDED == TRUE -} - void bta_dm_co_ble_set_accept_auth_enable(UINT8 enable) { #if (SMP_INCLUDED == TRUE) diff --git a/components/bt/host/bluedroid/bta/include/bta/bta_dm_co.h b/components/bt/host/bluedroid/bta/include/bta/bta_dm_co.h index f4cd15af25..124711ebb3 100644 --- a/components/bt/host/bluedroid/bta/include/bta/bta_dm_co.h +++ b/components/bt/host/bluedroid/bta/include/bta/bta_dm_co.h @@ -215,6 +215,4 @@ extern UINT8 bta_dm_co_ble_get_accept_auth_enable(void); extern UINT8 bta_dm_co_ble_get_auth_req(void); extern void bta_dm_co_ble_oob_support(UINT8 enable); - -extern void bta_dm_co_ble_set_appl_enc_key_size(UINT8 ble_key_size); #endif diff --git a/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_ble.c b/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_ble.c index 9517dddd9d..330b532397 100644 --- a/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_ble.c +++ b/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_ble.c @@ -1651,12 +1651,6 @@ void btc_gap_ble_call_handler(btc_msg_t *msg) bta_dm_co_ble_oob_support(enable); break; } - case ESP_BLE_APP_ENC_KEY_SIZE: { - uint8_t key_size = 0; - STREAM_TO_UINT8(key_size, value); - bta_dm_co_ble_set_appl_enc_key_size(key_size); - break; - } default: break; } diff --git a/components/bt/host/bluedroid/common/include/common/bte_appl.h b/components/bt/host/bluedroid/common/include/common/bte_appl.h index 573b86dba0..67f4108358 100644 --- a/components/bt/host/bluedroid/common/include/common/bte_appl.h +++ b/components/bt/host/bluedroid/common/include/common/bte_appl.h @@ -34,7 +34,6 @@ typedef struct { UINT8 ble_min_key_size; UINT8 ble_accept_auth_enable; UINT8 oob_support; - UINT8 ble_appl_enc_key_size; #endif } tBTE_APPL_CFG; diff --git a/components/bt/host/bluedroid/stack/gatt/gatt_db.c b/components/bt/host/bluedroid/stack/gatt/gatt_db.c index 2f78f26d32..d18a0ccf3d 100644 --- a/components/bt/host/bluedroid/stack/gatt/gatt_db.c +++ b/components/bt/host/bluedroid/stack/gatt/gatt_db.c @@ -34,7 +34,6 @@ #include "gatt_int.h" #include "stack/l2c_api.h" #include "btm_int.h" -#include "common/bte_appl.h" /******************************************************************************** ** L O C A L F U N C T I O N P R O T O T Y P E S * @@ -125,14 +124,10 @@ static tGATT_STATUS gatts_check_attr_readability(tGATT_ATTR16 *p_attr, tGATT_PERM perm = p_attr->permission; UNUSED(offset); -#if SMP_INCLUDED == TRUE - min_key_size = bte_appl_cfg.ble_appl_enc_key_size; -#else min_key_size = (((perm & GATT_ENCRYPT_KEY_SIZE_MASK) >> 12)); if (min_key_size != 0 ) { min_key_size += 6; } -#endif if (!(perm & GATT_READ_ALLOWED)) { GATT_TRACE_ERROR( "GATT_READ_NOT_PERMIT\n"); @@ -1077,14 +1072,10 @@ tGATT_STATUS gatts_write_attr_perm_check (tGATT_SVC_DB *p_db, UINT8 op_code, while (p_attr != NULL) { if (p_attr->handle == handle) { perm = p_attr->permission; - #if SMP_INCLUDED == TRUE - min_key_size = bte_appl_cfg.ble_appl_enc_key_size; - #else min_key_size = (((perm & GATT_ENCRYPT_KEY_SIZE_MASK) >> 12)); if (min_key_size != 0 ) { min_key_size += 6; } - #endif GATT_TRACE_DEBUG( "gatts_write_attr_perm_check p_attr->permission =0x%04x min_key_size==0x%04x", p_attr->permission, min_key_size); diff --git a/components/bt/host/bluedroid/stack/include/stack/btm_api.h b/components/bt/host/bluedroid/stack/include/stack/btm_api.h index 495e9d41e7..a987749246 100644 --- a/components/bt/host/bluedroid/stack/include/stack/btm_api.h +++ b/components/bt/host/bluedroid/stack/include/stack/btm_api.h @@ -1486,7 +1486,6 @@ typedef UINT8 tBTM_IO_CAP; #define BTM_BLE_RESPONDER_KEY_SIZE 15 #define BTM_BLE_MAX_KEY_SIZE 16 #define BTM_BLE_MIN_KEY_SIZE 7 -#define BTM_BLE_APPL_ENC_KEY_SIZE 7 typedef UINT8 tBTM_AUTH_REQ; From e8fef195a2f88d1e94273d060a52975079d7eb0c Mon Sep 17 00:00:00 2001 From: chenjianhua Date: Fri, 9 Dec 2022 14:30:56 +0800 Subject: [PATCH 3/4] examples: fix ble hid led output report --- .../main/ble_hidd_demo_main.c | 8 +++++++- .../main/esp_hidd_prf_api.h | 12 +++++++++++- .../main/hid_device_le_prf.c | 18 +++++++++++++----- .../ble_hid_device_demo/main/hidd_le_prf_int.h | 4 ++-- 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/examples/bluetooth/bluedroid/ble/ble_hid_device_demo/main/ble_hidd_demo_main.c b/examples/bluetooth/bluedroid/ble/ble_hid_device_demo/main/ble_hidd_demo_main.c index 711827ecb7..8624e480f6 100644 --- a/examples/bluetooth/bluedroid/ble/ble_hid_device_demo/main/ble_hidd_demo_main.c +++ b/examples/bluetooth/bluedroid/ble/ble_hid_device_demo/main/ble_hidd_demo_main.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -122,6 +122,12 @@ static void hidd_event_callback(esp_hidd_cb_event_t event, esp_hidd_cb_param_t * case ESP_HIDD_EVENT_BLE_VENDOR_REPORT_WRITE_EVT: { ESP_LOGI(HID_DEMO_TAG, "%s, ESP_HIDD_EVENT_BLE_VENDOR_REPORT_WRITE_EVT", __func__); ESP_LOG_BUFFER_HEX(HID_DEMO_TAG, param->vendor_write.data, param->vendor_write.length); + break; + } + case ESP_HIDD_EVENT_BLE_LED_REPORT_WRITE_EVT: { + ESP_LOGI(HID_DEMO_TAG, "ESP_HIDD_EVENT_BLE_LED_REPORT_WRITE_EVT"); + ESP_LOG_BUFFER_HEX(HID_DEMO_TAG, param->led_write.data, param->led_write.length); + break; } default: break; diff --git a/examples/bluetooth/bluedroid/ble/ble_hid_device_demo/main/esp_hidd_prf_api.h b/examples/bluetooth/bluedroid/ble/ble_hid_device_demo/main/esp_hidd_prf_api.h index 42d7bc6db7..c989891ee1 100644 --- a/examples/bluetooth/bluedroid/ble/ble_hid_device_demo/main/esp_hidd_prf_api.h +++ b/examples/bluetooth/bluedroid/ble/ble_hid_device_demo/main/esp_hidd_prf_api.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -22,6 +22,7 @@ typedef enum { ESP_HIDD_EVENT_BLE_CONNECT, ESP_HIDD_EVENT_BLE_DISCONNECT, ESP_HIDD_EVENT_BLE_VENDOR_REPORT_WRITE_EVT, + ESP_HIDD_EVENT_BLE_LED_REPORT_WRITE_EVT, } esp_hidd_cb_event_t; /// HID config status @@ -96,6 +97,15 @@ typedef union { uint8_t *data; /*!< The pointer to the data */ } vendor_write; /*!< HID callback param of ESP_HIDD_EVENT_BLE_VENDOR_REPORT_WRITE_EVT */ + /** + * @brief ESP_HIDD_EVENT_BLE_LED_REPORT_WRITE_EVT + */ + struct hidd_led_write_evt_param { + uint16_t conn_id; + uint8_t report_id; + uint8_t length; + uint8_t *data; + } led_write; } esp_hidd_cb_param_t; diff --git a/examples/bluetooth/bluedroid/ble/ble_hid_device_demo/main/hid_device_le_prf.c b/examples/bluetooth/bluedroid/ble/ble_hid_device_demo/main/hid_device_le_prf.c index d27f1c41fd..5ba30316eb 100644 --- a/examples/bluetooth/bluedroid/ble/ble_hid_device_demo/main/hid_device_le_prf.c +++ b/examples/bluetooth/bluedroid/ble/ble_hid_device_demo/main/hid_device_le_prf.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -80,11 +80,11 @@ static const uint8_t hidReportMap[] = { 0x81, 0x01, // Input: (Constant) // // LED report - 0x95, 0x05, // Report Count (5) - 0x75, 0x01, // Report Size (1) 0x05, 0x08, // Usage Pg (LEDs) 0x19, 0x01, // Usage Min (1) 0x29, 0x05, // Usage Max (5) + 0x95, 0x05, // Report Count (5) + 0x75, 0x01, // Report Size (1) 0x91, 0x02, // Output: (Data, Variable, Absolute) // // LED report padding @@ -283,6 +283,7 @@ static const uint8_t char_prop_write_nr = ESP_GATT_CHAR_PROP_BIT_WRITE_NR; static const uint8_t char_prop_read_write = ESP_GATT_CHAR_PROP_BIT_WRITE|ESP_GATT_CHAR_PROP_BIT_READ; static const uint8_t char_prop_read_notify = ESP_GATT_CHAR_PROP_BIT_READ|ESP_GATT_CHAR_PROP_BIT_NOTIFY; static const uint8_t char_prop_read_write_notify = ESP_GATT_CHAR_PROP_BIT_READ|ESP_GATT_CHAR_PROP_BIT_WRITE|ESP_GATT_CHAR_PROP_BIT_NOTIFY; +static const uint8_t char_prop_read_write_write_nr = ESP_GATT_CHAR_PROP_BIT_READ|ESP_GATT_CHAR_PROP_BIT_WRITE|ESP_GATT_CHAR_PROP_BIT_WRITE_NR; /// battary Service static const uint16_t battary_svc = ESP_GATT_UUID_BATTERY_SERVICE_SVC; @@ -425,7 +426,7 @@ static esp_gatts_attr_db_t hidd_le_gatt_db[HIDD_LE_IDX_NB] = [HIDD_LE_IDX_REPORT_LED_OUT_CHAR] = {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&character_declaration_uuid, ESP_GATT_PERM_READ, CHAR_DECLARATION_SIZE, CHAR_DECLARATION_SIZE, - (uint8_t *)&char_prop_read_write}}, + (uint8_t *)&char_prop_read_write_write_nr}}, [HIDD_LE_IDX_REPORT_LED_OUT_VAL] = {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&hid_report_uuid, ESP_GATT_PERM_READ|ESP_GATT_PERM_WRITE, @@ -585,8 +586,15 @@ void esp_hidd_prf_cb_hdl(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, case ESP_GATTS_CLOSE_EVT: break; case ESP_GATTS_WRITE_EVT: { -#if (SUPPORT_REPORT_VENDOR == true) esp_hidd_cb_param_t cb_param = {0}; + if (param->write.handle == hidd_le_env.hidd_inst.att_tbl[HIDD_LE_IDX_REPORT_LED_OUT_VAL]) { + cb_param.led_write.conn_id = param->write.conn_id; + cb_param.led_write.report_id = HID_RPT_ID_LED_OUT; + cb_param.led_write.length = param->write.len; + cb_param.led_write.data = param->write.value; + (hidd_le_env.hidd_cb)(ESP_HIDD_EVENT_BLE_LED_REPORT_WRITE_EVT, &cb_param); + } +#if (SUPPORT_REPORT_VENDOR == true) if (param->write.handle == hidd_le_env.hidd_inst.att_tbl[HIDD_LE_IDX_REPORT_VENDOR_OUT_VAL] && hidd_le_env.hidd_cb != NULL) { cb_param.vendor_write.conn_id = param->write.conn_id; diff --git a/examples/bluetooth/bluedroid/ble/ble_hid_device_demo/main/hidd_le_prf_int.h b/examples/bluetooth/bluedroid/ble/ble_hid_device_demo/main/hidd_le_prf_int.h index d769714845..6b48ac4342 100644 --- a/examples/bluetooth/bluedroid/ble/ble_hid_device_demo/main/hidd_le_prf_int.h +++ b/examples/bluetooth/bluedroid/ble/ble_hid_device_demo/main/hidd_le_prf_int.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -40,7 +40,7 @@ #define HID_RPT_ID_KEY_IN 2 // Keyboard input report ID #define HID_RPT_ID_CC_IN 3 //Consumer Control input report ID #define HID_RPT_ID_VENDOR_OUT 4 // Vendor output report ID -#define HID_RPT_ID_LED_OUT 0 // LED output report ID +#define HID_RPT_ID_LED_OUT 2 // LED output report ID #define HID_RPT_ID_FEATURE 0 // Feature report ID #define HIDD_APP_ID 0x1812//ATT_SVC_HID From 938d912daaf46fa55d2478583ae2077cec62a4d1 Mon Sep 17 00:00:00 2001 From: chenjianhua Date: Tue, 29 Nov 2022 12:14:19 +0800 Subject: [PATCH 4/4] bluedroid: fix ble connection update with same params --- .../bt/host/bluedroid/stack/l2cap/l2c_ble.c | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/components/bt/host/bluedroid/stack/l2cap/l2c_ble.c b/components/bt/host/bluedroid/stack/l2cap/l2c_ble.c index e2bc1f0b0b..32dd20073c 100644 --- a/components/bt/host/bluedroid/stack/l2cap/l2c_ble.c +++ b/components/bt/host/bluedroid/stack/l2cap/l2c_ble.c @@ -116,6 +116,8 @@ BOOLEAN L2CA_UpdateBleConnParams (BD_ADDR rem_bda, UINT16 min_int, UINT16 max_in { tL2C_LCB *p_lcb; tACL_CONN *p_acl_cb = btm_bda_to_acl(rem_bda, BT_TRANSPORT_LE); + UINT8 status = HCI_SUCCESS; + BOOLEAN need_cb = false; /* See if we have a link control block for the remote device */ p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_LE); @@ -135,19 +137,29 @@ BOOLEAN L2CA_UpdateBleConnParams (BD_ADDR rem_bda, UINT16 min_int, UINT16 max_in return (FALSE); } + /* Check whether the request conn params is already set */ + if ((max_int == p_lcb->current_used_conn_interval) && (latency == p_lcb->current_used_conn_latency) && + (timeout == p_lcb->current_used_conn_timeout)) { + status = HCI_SUCCESS; + need_cb = true; + L2CAP_TRACE_WARNING("%s connection parameter already set", __func__); + } + if (p_lcb->conn_update_mask & L2C_BLE_UPDATE_PARAM_FULL){ - UINT8 status = HCI_ERR_ILLEGAL_COMMAND; + status = HCI_ERR_ILLEGAL_COMMAND; + need_cb = true; L2CAP_TRACE_ERROR("There are two connection parameter requests that are being updated, please try later "); - if (conn_param_update_cb.update_conn_param_cb != NULL) { - tBTM_LE_UPDATE_CONN_PRAMS update_param; - update_param.max_conn_int = max_int; - update_param.min_conn_int = min_int; - update_param.conn_int = p_lcb->current_used_conn_interval; - update_param.slave_latency = p_lcb->current_used_conn_latency; - update_param.supervision_tout = p_lcb->current_used_conn_timeout; - (conn_param_update_cb.update_conn_param_cb)(status, p_lcb->remote_bd_addr, &update_param); - } - return (FALSE); + } + + if ((need_cb == TRUE) && (conn_param_update_cb.update_conn_param_cb != NULL)) { + tBTM_LE_UPDATE_CONN_PRAMS update_param; + update_param.max_conn_int = max_int; + update_param.min_conn_int = min_int; + update_param.conn_int = p_lcb->current_used_conn_interval; + update_param.slave_latency = p_lcb->current_used_conn_latency; + update_param.supervision_tout = p_lcb->current_used_conn_timeout; + (conn_param_update_cb.update_conn_param_cb)(status, p_lcb->remote_bd_addr, &update_param); + return (status == HCI_SUCCESS); } p_lcb->waiting_update_conn_min_interval = min_int;