Skip to content

Commit 1a065dc

Browse files
committed
Merge branch 'feat/support_blecrt_242' into 'master'
fix(bt/bluedroid): Fixed access fault when reading BLE controller information fails Closes BLERP-1019 and BLERP-1020 See merge request espressif/esp-idf!33406
2 parents 5f865a8 + e4e2308 commit 1a065dc

File tree

5 files changed

+38
-19
lines changed

5 files changed

+38
-19
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ typedef union {
242242
*/
243243
struct gatts_rsp_evt_param {
244244
esp_gatt_status_t status; /*!< Operation status */
245+
uint16_t conn_id; /*!< Connection id */
245246
uint16_t handle; /*!< Attribute handle which send response */
246247
} rsp; /*!< Gatt server callback param of ESP_GATTS_RESPONSE_EVT */
247248

components/bt/host/bluedroid/btc/profile/std/gatt/btc_gatts.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -469,7 +469,7 @@ static esp_gatt_status_t btc_gatts_check_valid_attr_tab(esp_gatts_attr_db_t *gat
469469
if(gatts_attr_db[i+1].att_desc.uuid_length != ESP_UUID_LEN_16 &&
470470
gatts_attr_db[i+1].att_desc.uuid_length != ESP_UUID_LEN_32 &&
471471
gatts_attr_db[i+1].att_desc.uuid_length != ESP_UUID_LEN_128) {
472-
BTC_TRACE_ERROR("%s, The Charateristic uuid length = %d is invalid", __func__,\
472+
BTC_TRACE_ERROR("%s, The Characteristic uuid length = %d is invalid", __func__,\
473473
gatts_attr_db[i+1].att_desc.uuid_length);
474474
return ESP_GATT_INVALID_ATTR_LEN;
475475
}
@@ -481,7 +481,7 @@ static esp_gatt_status_t btc_gatts_check_valid_attr_tab(esp_gatts_attr_db_t *gat
481481
uuid == ESP_GATT_UUID_CHAR_SRVR_CONFIG || uuid == ESP_GATT_UUID_CHAR_PRESENT_FORMAT ||
482482
uuid == ESP_GATT_UUID_CHAR_AGG_FORMAT || uuid == ESP_GATT_UUID_CHAR_VALID_RANGE ||
483483
uuid == ESP_GATT_UUID_EXT_RPT_REF_DESCR || uuid == ESP_GATT_UUID_RPT_REF_DESCR) {
484-
BTC_TRACE_ERROR("%s, The charateristic value uuid = %d is invalid", __func__, uuid);
484+
BTC_TRACE_ERROR("%s, The characteristic value uuid = %d is invalid", __func__, uuid);
485485
return ESP_GATT_INVALID_PDU;
486486
}
487487
}
@@ -694,6 +694,7 @@ void btc_gatts_call_handler(btc_msg_t *msg)
694694
}
695695

696696
param.rsp.status = 0;
697+
param.rsp.conn_id = BTC_GATT_GET_CONN_ID(arg->send_rsp.conn_id);
697698
btc_gatts_cb_to_app(ESP_GATTS_RESPONSE_EVT, BTC_GATT_GET_GATT_IF(arg->send_rsp.conn_id), &param);
698699
break;
699700
}

components/bt/host/bluedroid/device/controller.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ static void start_up(void)
269269
#endif //#if (BLE_50_FEATURE_SUPPORT == TRUE)
270270

271271
#if (BLE_50_FEATURE_SUPPORT == TRUE && BLE_42_FEATURE_SUPPORT == FALSE)
272-
if (HCI_LE_ENHANCED_PRIVACY_SUPPORTED(controller_param.features_ble.as_array)) {
272+
if (HCI_LE_EXT_ADV_SUPPORTED(controller_param.features_ble.as_array)) {
273273
response = AWAIT_COMMAND(controller_param.packet_factory->make_read_max_adv_data_len());
274274
controller_param.packet_parser->parse_ble_read_adv_max_len_response(
275275
response,

components/bt/host/bluedroid/hci/hci_packet_parser.c

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,9 @@ static void parse_ble_read_resolving_list_size_response(
186186
{
187187

188188
uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_RESOLVING_LIST_SIZE, 1 /* bytes after */);
189-
STREAM_TO_UINT8(*resolving_list_size_ptr, stream);
189+
if (stream) {
190+
STREAM_TO_UINT8(*resolving_list_size_ptr, stream);
191+
}
190192

191193
osi_free(response);
192194
}
@@ -198,19 +200,25 @@ static void parse_ble_read_suggested_default_data_length_response(
198200
{
199201

200202
uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_DEFAULT_DATA_LENGTH, 2 /* bytes after */);
201-
STREAM_TO_UINT16(*ble_default_packet_length_ptr, stream);
202-
STREAM_TO_UINT16(*ble_default_packet_txtime_ptr, stream);
203+
if (stream) {
204+
STREAM_TO_UINT16(*ble_default_packet_length_ptr, stream);
205+
STREAM_TO_UINT16(*ble_default_packet_txtime_ptr, stream);
206+
}
207+
203208
osi_free(response);
204209
}
210+
205211
#if (BLE_50_FEATURE_SUPPORT == TRUE)
206212
static void parse_ble_read_adv_max_len_response(
207213
BT_HDR *response,
208214
uint16_t *adv_max_len_ptr)
209215
{
210216

211217
uint8_t *stream = read_command_complete_header(response, HCI_BLE_RD_MAX_ADV_DATA_LEN, 1 /* bytes after */);
212-
// Size: 2 Octets ; Value: 0x001F – 0x0672 ; Maximum supported advertising data length
213-
STREAM_TO_UINT16(*adv_max_len_ptr, stream);
218+
if (stream) {
219+
// Size: 2 Octets ; Value: 0x001F – 0x0672 ; Maximum supported advertising data length
220+
STREAM_TO_UINT16(*adv_max_len_ptr, stream);
221+
}
214222

215223
osi_free(response);
216224
}
@@ -254,6 +262,7 @@ static uint8_t *read_command_complete_header(
254262
STREAM_TO_UINT8(status, stream);
255263

256264
if (status != HCI_SUCCESS) {
265+
HCI_TRACE_ERROR("%s failed: opcode 0x%04x, status 0x%02x", __func__, opcode, status);
257266
return NULL;
258267
}
259268

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

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1871,42 +1871,50 @@ typedef struct {
18711871
#define HCI_PING_SUPPORTED(x) ((x)[HCI_EXT_FEATURE_PING_OFF] & HCI_EXT_FEATURE_PING_MASK)
18721872

18731873
/*
1874-
** LE features encoding - page 0 (the only page for now)
1874+
** LE features encoding - page 0
18751875
*/
1876-
/* LE Encryption */
1876+
/* LE Encryption: bit 0 */
18771877
#define HCI_LE_FEATURE_LE_ENCRYPTION_MASK 0x01
18781878
#define HCI_LE_FEATURE_LE_ENCRYPTION_OFF 0
18791879
#define HCI_LE_ENCRYPTION_SUPPORTED(x) ((x)[HCI_LE_FEATURE_LE_ENCRYPTION_OFF] & HCI_LE_FEATURE_LE_ENCRYPTION_MASK)
18801880

1881-
/* Connection Parameters Request Procedure */
1881+
/* Connection Parameters Request Procedure: bit 1 */
18821882
#define HCI_LE_FEATURE_CONN_PARAM_REQ_MASK 0x02
18831883
#define HCI_LE_FEATURE_CONN_PARAM_REQ_OFF 0
18841884
#define HCI_LE_CONN_PARAM_REQ_SUPPORTED(x) ((x)[HCI_LE_FEATURE_CONN_PARAM_REQ_OFF] & HCI_LE_FEATURE_CONN_PARAM_REQ_MASK)
18851885

1886-
/* Extended Reject Indication */
1886+
/* Extended Reject Indication: bit 2 */
18871887
#define HCI_LE_FEATURE_EXT_REJ_IND_MASK 0x04
18881888
#define HCI_LE_FEATURE_EXT_REJ_IND_OFF 0
18891889
#define HCI_LE_EXT_REJ_IND_SUPPORTED(x) ((x)[HCI_LE_FEATURE_EXT_REJ_IND_OFF] & HCI_LE_FEATURE_EXT_REJ_IND_MASK)
18901890

1891-
/* Slave-initiated Features Exchange */
1891+
/* Slave-initiated Features Exchange: bit 3 */
18921892
#define HCI_LE_FEATURE_SLAVE_INIT_FEAT_EXC_MASK 0x08
18931893
#define HCI_LE_FEATURE_SLAVE_INIT_FEAT_EXC_OFF 0
18941894
#define HCI_LE_SLAVE_INIT_FEAT_EXC_SUPPORTED(x) ((x)[HCI_LE_FEATURE_SLAVE_INIT_FEAT_EXC_OFF] & HCI_LE_FEATURE_SLAVE_INIT_FEAT_EXC_MASK)
18951895

1896+
/* LE Data Packet Length Extension: bit 5 */
1897+
#define HCI_LE_FEATURE_DATA_LEN_EXT_MASK 0x20
1898+
#define HCI_LE_FEATURE_DATA_LEN_EXT_OFF 0
1899+
#define HCI_LE_DATA_LEN_EXT_SUPPORTED(x) ((x)[HCI_LE_FEATURE_DATA_LEN_EXT_OFF] & HCI_LE_FEATURE_DATA_LEN_EXT_MASK)
1900+
18961901
/* Enhanced privacy Feature: bit 6 */
18971902
#define HCI_LE_FEATURE_ENHANCED_PRIVACY_MASK 0x40
18981903
#define HCI_LE_FEATURE_ENHANCED_PRIVACY_OFF 0
18991904
#define HCI_LE_ENHANCED_PRIVACY_SUPPORTED(x) ((x)[HCI_LE_FEATURE_ENHANCED_PRIVACY_OFF] & HCI_LE_FEATURE_ENHANCED_PRIVACY_MASK)
19001905

1901-
/* Extended scanner filter policy : 7 */
1906+
/* Extended scanner filter policy: bit 7 */
19021907
#define HCI_LE_FEATURE_EXT_SCAN_FILTER_POLICY_MASK 0x80
19031908
#define HCI_LE_FEATURE_EXT_SCAN_FILTER_POLICY_OFF 0
19041909
#define HCI_LE_EXT_SCAN_FILTER_POLICY_SUPPORTED(x) ((x)[HCI_LE_FEATURE_EXT_SCAN_FILTER_POLICY_OFF] & HCI_LE_FEATURE_EXT_SCAN_FILTER_POLICY_MASK)
19051910

1906-
/* Slave-initiated Features Exchange */
1907-
#define HCI_LE_FEATURE_DATA_LEN_EXT_MASK 0x20
1908-
#define HCI_LE_FEATURE_DATA_LEN_EXT_OFF 0
1909-
#define HCI_LE_DATA_LEN_EXT_SUPPORTED(x) ((x)[HCI_LE_FEATURE_DATA_LEN_EXT_OFF] & HCI_LE_FEATURE_DATA_LEN_EXT_MASK)
1911+
/*
1912+
** LE features encoding - page 1
1913+
*/
1914+
/* LE Extended Advertising: bit 12 */
1915+
#define HCI_LE_FEATURE_EXT_ADV_MASK 0x10
1916+
#define HCI_LE_FEATURE_EXT_ADV_OFF 1
1917+
#define HCI_LE_EXT_ADV_SUPPORTED(x) ((x)[HCI_LE_FEATURE_EXT_ADV_OFF] & HCI_LE_FEATURE_EXT_ADV_MASK)
19101918

19111919
/*
19121920
** Local Supported Commands encoding

0 commit comments

Comments
 (0)