Skip to content

Commit b818abb

Browse files
committed
Merge branch 'bugfix/fix_some_ble_bugs_by_cjh_v4.4' into 'release/v4.4'
Fixed some BLE bugs (backport v4.4) See merge request espressif/esp-idf!21691
2 parents 202e1c1 + f44f3d1 commit b818abb

File tree

14 files changed

+60
-48
lines changed

14 files changed

+60
-48
lines changed

components/bt/host/bluedroid/api/esp_gap_ble_api.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,10 @@ esp_err_t esp_ble_gap_set_security_param(esp_ble_sm_param_t param_type,
569569
return ESP_ERR_INVALID_ARG;
570570
}
571571
}
572+
if (param_type == ESP_BLE_APP_ENC_KEY_SIZE) {
573+
LOG_ERROR("ESP_BLE_APP_ENC_KEY_SIZE is deprecated, use ESP_GATT_PERM_ENCRYPT_KEY_SIZE in characteristic definition");
574+
return ESP_ERR_NOT_SUPPORTED;
575+
}
572576

573577
btc_msg_t msg = {0};
574578
btc_ble_gap_args_t arg;

components/bt/host/bluedroid/api/include/api/esp_gatt_defs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ typedef enum {
285285
#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 */
286286
#define ESP_GATT_PERM_READ_AUTHORIZATION (1 << 9) /* bit 9 - 0x0200 */
287287
#define ESP_GATT_PERM_WRITE_AUTHORIZATION (1 << 10) /* bit 10 - 0x0400 */
288+
#define ESP_GATT_PERM_ENCRYPT_KEY_SIZE(keysize) (((keysize - 6) & 0xF) << 12) /* bit 12:15 - 0xF000 */
288289
typedef uint16_t esp_gatt_perm_t;
289290

290291
/* relate to BTA_GATT_CHAR_PROP_BIT_xxx in bta/bta_gatt_api.h */

components/bt/host/bluedroid/bta/dm/bta_dm_co.c

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ tBTE_APPL_CFG bte_appl_cfg = {
5151
BTM_BLE_MIN_KEY_SIZE,
5252
BTM_BLE_ONLY_ACCEPT_SPECIFIED_SEC_AUTH_DISABLE,
5353
BTM_BLE_OOB_DISABLE,
54-
BTM_BLE_APPL_ENC_KEY_SIZE,
5554
};
5655
#endif
5756

@@ -428,17 +427,6 @@ void bta_dm_co_ble_set_min_key_size(UINT8 ble_key_size)
428427
#endif ///SMP_INCLUDED == TRUE
429428
}
430429

431-
void bta_dm_co_ble_set_appl_enc_key_size(UINT8 ble_key_size)
432-
{
433-
#if (SMP_INCLUDED == TRUE)
434-
if(ble_key_size >= bte_appl_cfg.ble_min_key_size && ble_key_size <= bte_appl_cfg.ble_max_key_size) {
435-
bte_appl_cfg.ble_appl_enc_key_size = ble_key_size;
436-
} else {
437-
APPL_TRACE_ERROR("%s error:Invalid key size value, key_size =%d",__func__, ble_key_size);
438-
}
439-
#endif ///SMP_INCLUDED == TRUE
440-
}
441-
442430
void bta_dm_co_ble_set_accept_auth_enable(UINT8 enable)
443431
{
444432
#if (SMP_INCLUDED == TRUE)

components/bt/host/bluedroid/bta/include/bta/bta_dm_co.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,4 @@ extern UINT8 bta_dm_co_ble_get_accept_auth_enable(void);
215215
extern UINT8 bta_dm_co_ble_get_auth_req(void);
216216

217217
extern void bta_dm_co_ble_oob_support(UINT8 enable);
218-
219-
extern void bta_dm_co_ble_set_appl_enc_key_size(UINT8 ble_key_size);
220218
#endif

components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_ble.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1651,12 +1651,6 @@ void btc_gap_ble_call_handler(btc_msg_t *msg)
16511651
bta_dm_co_ble_oob_support(enable);
16521652
break;
16531653
}
1654-
case ESP_BLE_APP_ENC_KEY_SIZE: {
1655-
uint8_t key_size = 0;
1656-
STREAM_TO_UINT8(key_size, value);
1657-
bta_dm_co_ble_set_appl_enc_key_size(key_size);
1658-
break;
1659-
}
16601654
default:
16611655
break;
16621656
}

components/bt/host/bluedroid/common/include/common/bte_appl.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ typedef struct {
3434
UINT8 ble_min_key_size;
3535
UINT8 ble_accept_auth_enable;
3636
UINT8 oob_support;
37-
UINT8 ble_appl_enc_key_size;
3837
#endif
3938

4039
} tBTE_APPL_CFG;

components/bt/host/bluedroid/stack/gatt/att_protocol.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,10 @@ BT_HDR *attp_build_browse_cmd(UINT8 op_code, UINT16 s_hdl, UINT16 e_hdl, tBT_UUI
134134
{
135135
BT_HDR *p_buf = NULL;
136136
UINT8 *p;
137+
/* length of ATT_READ_BY_TYPE_REQ PDU: opcode(1) + start_handle (2) + end_handle (2) + uuid (2 or 16) */
138+
const UINT8 payload_size = 1 + 2 + 2 + ((uuid.len == LEN_UUID_16) ? LEN_UUID_16 : LEN_UUID_128);
137139

138-
if ((p_buf = (BT_HDR *)osi_malloc(sizeof(BT_HDR) + 8 + L2CAP_MIN_OFFSET)) != NULL) {
140+
if ((p_buf = (BT_HDR *)osi_malloc(sizeof(BT_HDR) + payload_size + L2CAP_MIN_OFFSET)) != NULL) {
139141
p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
140142
/* Describe the built message location and size */
141143
p_buf->offset = L2CAP_MIN_OFFSET;

components/bt/host/bluedroid/stack/gatt/gatt_db.c

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
#include "gatt_int.h"
3535
#include "stack/l2c_api.h"
3636
#include "btm_int.h"
37-
#include "common/bte_appl.h"
3837

3938
/********************************************************************************
4039
** 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,
125124
tGATT_PERM perm = p_attr->permission;
126125

127126
UNUSED(offset);
128-
#if SMP_INCLUDED == TRUE
129-
min_key_size = bte_appl_cfg.ble_appl_enc_key_size;
130-
#else
131127
min_key_size = (((perm & GATT_ENCRYPT_KEY_SIZE_MASK) >> 12));
132128
if (min_key_size != 0 ) {
133129
min_key_size += 6;
134130
}
135-
#endif
136131

137132
if (!(perm & GATT_READ_ALLOWED)) {
138133
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,
10771072
while (p_attr != NULL) {
10781073
if (p_attr->handle == handle) {
10791074
perm = p_attr->permission;
1080-
#if SMP_INCLUDED == TRUE
1081-
min_key_size = bte_appl_cfg.ble_appl_enc_key_size;
1082-
#else
10831075
min_key_size = (((perm & GATT_ENCRYPT_KEY_SIZE_MASK) >> 12));
10841076
if (min_key_size != 0 ) {
10851077
min_key_size += 6;
10861078
}
1087-
#endif
10881079
GATT_TRACE_DEBUG( "gatts_write_attr_perm_check p_attr->permission =0x%04x min_key_size==0x%04x",
10891080
p_attr->permission,
10901081
min_key_size);

components/bt/host/bluedroid/stack/include/stack/btm_api.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1486,7 +1486,6 @@ typedef UINT8 tBTM_IO_CAP;
14861486
#define BTM_BLE_RESPONDER_KEY_SIZE 15
14871487
#define BTM_BLE_MAX_KEY_SIZE 16
14881488
#define BTM_BLE_MIN_KEY_SIZE 7
1489-
#define BTM_BLE_APPL_ENC_KEY_SIZE 7
14901489

14911490
typedef UINT8 tBTM_AUTH_REQ;
14921491

components/bt/host/bluedroid/stack/l2cap/l2c_ble.c

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ BOOLEAN L2CA_UpdateBleConnParams (BD_ADDR rem_bda, UINT16 min_int, UINT16 max_in
116116
{
117117
tL2C_LCB *p_lcb;
118118
tACL_CONN *p_acl_cb = btm_bda_to_acl(rem_bda, BT_TRANSPORT_LE);
119+
UINT8 status = HCI_SUCCESS;
120+
BOOLEAN need_cb = false;
119121

120122
/* See if we have a link control block for the remote device */
121123
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
135137
return (FALSE);
136138
}
137139

140+
/* Check whether the request conn params is already set */
141+
if ((max_int == p_lcb->current_used_conn_interval) && (latency == p_lcb->current_used_conn_latency) &&
142+
(timeout == p_lcb->current_used_conn_timeout)) {
143+
status = HCI_SUCCESS;
144+
need_cb = true;
145+
L2CAP_TRACE_WARNING("%s connection parameter already set", __func__);
146+
}
147+
138148
if (p_lcb->conn_update_mask & L2C_BLE_UPDATE_PARAM_FULL){
139-
UINT8 status = HCI_ERR_ILLEGAL_COMMAND;
149+
status = HCI_ERR_ILLEGAL_COMMAND;
150+
need_cb = true;
140151
L2CAP_TRACE_ERROR("There are two connection parameter requests that are being updated, please try later ");
141-
if (conn_param_update_cb.update_conn_param_cb != NULL) {
142-
tBTM_LE_UPDATE_CONN_PRAMS update_param;
143-
update_param.max_conn_int = max_int;
144-
update_param.min_conn_int = min_int;
145-
update_param.conn_int = p_lcb->current_used_conn_interval;
146-
update_param.slave_latency = p_lcb->current_used_conn_latency;
147-
update_param.supervision_tout = p_lcb->current_used_conn_timeout;
148-
(conn_param_update_cb.update_conn_param_cb)(status, p_lcb->remote_bd_addr, &update_param);
149-
}
150-
return (FALSE);
152+
}
153+
154+
if ((need_cb == TRUE) && (conn_param_update_cb.update_conn_param_cb != NULL)) {
155+
tBTM_LE_UPDATE_CONN_PRAMS update_param;
156+
update_param.max_conn_int = max_int;
157+
update_param.min_conn_int = min_int;
158+
update_param.conn_int = p_lcb->current_used_conn_interval;
159+
update_param.slave_latency = p_lcb->current_used_conn_latency;
160+
update_param.supervision_tout = p_lcb->current_used_conn_timeout;
161+
(conn_param_update_cb.update_conn_param_cb)(status, p_lcb->remote_bd_addr, &update_param);
162+
return (status == HCI_SUCCESS);
151163
}
152164

153165
p_lcb->waiting_update_conn_min_interval = min_int;

examples/bluetooth/bluedroid/ble/ble_hid_device_demo/main/ble_hidd_demo_main.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,12 @@ static void hidd_event_callback(esp_hidd_cb_event_t event, esp_hidd_cb_param_t *
122122
case ESP_HIDD_EVENT_BLE_VENDOR_REPORT_WRITE_EVT: {
123123
ESP_LOGI(HID_DEMO_TAG, "%s, ESP_HIDD_EVENT_BLE_VENDOR_REPORT_WRITE_EVT", __func__);
124124
ESP_LOG_BUFFER_HEX(HID_DEMO_TAG, param->vendor_write.data, param->vendor_write.length);
125+
break;
126+
}
127+
case ESP_HIDD_EVENT_BLE_LED_REPORT_WRITE_EVT: {
128+
ESP_LOGI(HID_DEMO_TAG, "ESP_HIDD_EVENT_BLE_LED_REPORT_WRITE_EVT");
129+
ESP_LOG_BUFFER_HEX(HID_DEMO_TAG, param->led_write.data, param->led_write.length);
130+
break;
125131
}
126132
default:
127133
break;

examples/bluetooth/bluedroid/ble/ble_hid_device_demo/main/esp_hidd_prf_api.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ typedef enum {
3030
ESP_HIDD_EVENT_BLE_CONNECT,
3131
ESP_HIDD_EVENT_BLE_DISCONNECT,
3232
ESP_HIDD_EVENT_BLE_VENDOR_REPORT_WRITE_EVT,
33+
ESP_HIDD_EVENT_BLE_LED_REPORT_WRITE_EVT,
3334
} esp_hidd_cb_event_t;
3435

3536
/// HID config status
@@ -104,6 +105,15 @@ typedef union {
104105
uint8_t *data; /*!< The pointer to the data */
105106
} vendor_write; /*!< HID callback param of ESP_HIDD_EVENT_BLE_VENDOR_REPORT_WRITE_EVT */
106107

108+
/**
109+
* @brief ESP_HIDD_EVENT_BLE_LED_REPORT_WRITE_EVT
110+
*/
111+
struct hidd_led_write_evt_param {
112+
uint16_t conn_id;
113+
uint8_t report_id;
114+
uint8_t length;
115+
uint8_t *data;
116+
} led_write;
107117
} esp_hidd_cb_param_t;
108118

109119

examples/bluetooth/bluedroid/ble/ble_hid_device_demo/main/hid_device_le_prf.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,11 @@ static const uint8_t hidReportMap[] = {
8888
0x81, 0x01, // Input: (Constant)
8989
//
9090
// LED report
91-
0x95, 0x05, // Report Count (5)
92-
0x75, 0x01, // Report Size (1)
9391
0x05, 0x08, // Usage Pg (LEDs)
9492
0x19, 0x01, // Usage Min (1)
9593
0x29, 0x05, // Usage Max (5)
94+
0x95, 0x05, // Report Count (5)
95+
0x75, 0x01, // Report Size (1)
9696
0x91, 0x02, // Output: (Data, Variable, Absolute)
9797
//
9898
// LED report padding
@@ -291,6 +291,7 @@ static const uint8_t char_prop_write_nr = ESP_GATT_CHAR_PROP_BIT_WRITE_NR;
291291
static const uint8_t char_prop_read_write = ESP_GATT_CHAR_PROP_BIT_WRITE|ESP_GATT_CHAR_PROP_BIT_READ;
292292
static const uint8_t char_prop_read_notify = ESP_GATT_CHAR_PROP_BIT_READ|ESP_GATT_CHAR_PROP_BIT_NOTIFY;
293293
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;
294+
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;
294295

295296
/// battary Service
296297
static const uint16_t battary_svc = ESP_GATT_UUID_BATTERY_SERVICE_SVC;
@@ -433,7 +434,7 @@ static esp_gatts_attr_db_t hidd_le_gatt_db[HIDD_LE_IDX_NB] =
433434
[HIDD_LE_IDX_REPORT_LED_OUT_CHAR] = {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&character_declaration_uuid,
434435
ESP_GATT_PERM_READ,
435436
CHAR_DECLARATION_SIZE, CHAR_DECLARATION_SIZE,
436-
(uint8_t *)&char_prop_read_write}},
437+
(uint8_t *)&char_prop_read_write_write_nr}},
437438

438439
[HIDD_LE_IDX_REPORT_LED_OUT_VAL] = {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&hid_report_uuid,
439440
ESP_GATT_PERM_READ|ESP_GATT_PERM_WRITE,
@@ -593,8 +594,15 @@ void esp_hidd_prf_cb_hdl(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if,
593594
case ESP_GATTS_CLOSE_EVT:
594595
break;
595596
case ESP_GATTS_WRITE_EVT: {
596-
#if (SUPPORT_REPORT_VENDOR == true)
597597
esp_hidd_cb_param_t cb_param = {0};
598+
if (param->write.handle == hidd_le_env.hidd_inst.att_tbl[HIDD_LE_IDX_REPORT_LED_OUT_VAL]) {
599+
cb_param.led_write.conn_id = param->write.conn_id;
600+
cb_param.led_write.report_id = HID_RPT_ID_LED_OUT;
601+
cb_param.led_write.length = param->write.len;
602+
cb_param.led_write.data = param->write.value;
603+
(hidd_le_env.hidd_cb)(ESP_HIDD_EVENT_BLE_LED_REPORT_WRITE_EVT, &cb_param);
604+
}
605+
#if (SUPPORT_REPORT_VENDOR == true)
598606
if (param->write.handle == hidd_le_env.hidd_inst.att_tbl[HIDD_LE_IDX_REPORT_VENDOR_OUT_VAL] &&
599607
hidd_le_env.hidd_cb != NULL) {
600608
cb_param.vendor_write.conn_id = param->write.conn_id;

examples/bluetooth/bluedroid/ble/ble_hid_device_demo/main/hidd_le_prf_int.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
#define HID_RPT_ID_KEY_IN 2 // Keyboard input report ID
4949
#define HID_RPT_ID_CC_IN 3 //Consumer Control input report ID
5050
#define HID_RPT_ID_VENDOR_OUT 4 // Vendor output report ID
51-
#define HID_RPT_ID_LED_OUT 0 // LED output report ID
51+
#define HID_RPT_ID_LED_OUT 2 // LED output report ID
5252
#define HID_RPT_ID_FEATURE 0 // Feature report ID
5353

5454
#define HIDD_APP_ID 0x1812//ATT_SVC_HID

0 commit comments

Comments
 (0)