mirror of
https://github.com/espressif/esp-idf.git
synced 2025-07-31 19:24:33 +02:00
Merge branch 'bugfix/unable_to_load_bonded_ble_devices_from_nvs_v4.3' into 'release/v4.3'
fix(bt/bluedroid): ble fails to load bonded device info after reboot(backport v4.3) See merge request espressif/esp-idf!26474
This commit is contained in:
@@ -262,6 +262,32 @@ bool config_remove_section(config_t *config, const char *section)
|
|||||||
return list_remove(config->sections, sec);
|
return list_remove(config->sections, sec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool config_update_newest_section(config_t *config, const char *section)
|
||||||
|
{
|
||||||
|
assert(config != NULL);
|
||||||
|
assert(section != NULL);
|
||||||
|
|
||||||
|
list_node_t *first_node = list_begin(config->sections);
|
||||||
|
if (first_node == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
section_t *first_sec = list_node(first_node);
|
||||||
|
if (strcmp(first_sec->name, section) == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const list_node_t *node = list_begin(config->sections); node != list_end(config->sections); node = list_next(node)) {
|
||||||
|
section_t *sec = list_node(node);
|
||||||
|
if (strcmp(sec->name, section) == 0) {
|
||||||
|
list_delete(config->sections, sec);
|
||||||
|
list_prepend(config->sections, sec);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool config_remove_key(config_t *config, const char *section, const char *key)
|
bool config_remove_key(config_t *config, const char *section, const char *key)
|
||||||
{
|
{
|
||||||
assert(config != NULL);
|
assert(config != NULL);
|
||||||
|
@@ -107,6 +107,11 @@ void config_set_string(config_t *config, const char *section, const char *key, c
|
|||||||
// Neither |config| nor |section| may be NULL.
|
// Neither |config| nor |section| may be NULL.
|
||||||
bool config_remove_section(config_t *config, const char *section);
|
bool config_remove_section(config_t *config, const char *section);
|
||||||
|
|
||||||
|
// Updates |section| to be the first section in |config|. Return true if |section| is in
|
||||||
|
// |config| and updated successfully, false otherwise.
|
||||||
|
// Neither |config| nor |section| may be NULL.
|
||||||
|
bool config_update_newest_section(config_t *config, const char *section);
|
||||||
|
|
||||||
// Removes one specific |key| residing in |section| of the |config|. Returns true
|
// Removes one specific |key| residing in |section| of the |config|. Returns true
|
||||||
// if the section and key were found and the key was removed, false otherwise.
|
// if the section and key were found and the key was removed, false otherwise.
|
||||||
// None of |config|, |section|, or |key| may be NULL.
|
// None of |config|, |section|, or |key| may be NULL.
|
||||||
|
@@ -1,16 +1,8 @@
|
|||||||
// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
|
/*
|
||||||
//
|
* SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
*
|
||||||
// you may not use this file except in compliance with the License.
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
// You may obtain a copy of the License at
|
*/
|
||||||
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@@ -30,7 +22,7 @@ static void _btc_storage_save(void)
|
|||||||
{
|
{
|
||||||
uint16_t addr_section_count = 0;
|
uint16_t addr_section_count = 0;
|
||||||
bt_bdaddr_t bd_addr;
|
bt_bdaddr_t bd_addr;
|
||||||
uint32_t device_type = 0;
|
|
||||||
const btc_config_section_iter_t *need_remove_iter = NULL;
|
const btc_config_section_iter_t *need_remove_iter = NULL;
|
||||||
const btc_config_section_iter_t *iter = btc_config_section_begin();
|
const btc_config_section_iter_t *iter = btc_config_section_begin();
|
||||||
|
|
||||||
@@ -55,9 +47,7 @@ static void _btc_storage_save(void)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!string_is_bdaddr(section) ||
|
if (!string_is_bdaddr(section)) {
|
||||||
!btc_config_get_int(section, BTC_BLE_STORAGE_DEV_TYPE_STR, (int *)&device_type) ||
|
|
||||||
((device_type & BT_DEVICE_TYPE_BLE) != BT_DEVICE_TYPE_BLE)) {
|
|
||||||
iter = btc_config_section_next(iter);
|
iter = btc_config_section_next(iter);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -72,16 +62,15 @@ static void _btc_storage_save(void)
|
|||||||
if (need_remove_iter) {
|
if (need_remove_iter) {
|
||||||
while(need_remove_iter != btc_config_section_end()) {
|
while(need_remove_iter != btc_config_section_end()) {
|
||||||
const char *need_remove_section = btc_config_section_name(need_remove_iter);
|
const char *need_remove_section = btc_config_section_name(need_remove_iter);
|
||||||
if (!string_is_bdaddr(need_remove_section) ||
|
if (!string_is_bdaddr(need_remove_section)) {
|
||||||
!btc_config_get_int(need_remove_section, BTC_BLE_STORAGE_DEV_TYPE_STR, (int *)&device_type) ||
|
|
||||||
((device_type & BT_DEVICE_TYPE_BLE) != BT_DEVICE_TYPE_BLE)) {
|
|
||||||
need_remove_iter = btc_config_section_next(need_remove_iter);
|
need_remove_iter = btc_config_section_next(need_remove_iter);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
need_remove_iter = btc_config_section_next(need_remove_iter);
|
need_remove_iter = btc_config_section_next(need_remove_iter);
|
||||||
//delete device info
|
//delete device info
|
||||||
string_to_bdaddr(need_remove_section, &bd_addr);
|
string_to_bdaddr(need_remove_section, &bd_addr);
|
||||||
BTM_SecDeleteDevice(bd_addr.address, BT_TRANSPORT_LE);
|
BTA_DmRemoveDevice(bd_addr.address, BT_TRANSPORT_LE);
|
||||||
|
BTA_DmRemoveDevice(bd_addr.address, BT_TRANSPORT_BR_EDR);
|
||||||
//delete config info
|
//delete config info
|
||||||
if(btc_config_remove_section(need_remove_section)) {
|
if(btc_config_remove_section(need_remove_section)) {
|
||||||
BTIF_TRACE_WARNING("exceeded the maximum nubmer of bonded devices, delete the last device info : %s", need_remove_section);
|
BTIF_TRACE_WARNING("exceeded the maximum nubmer of bonded devices, delete the last device info : %s", need_remove_section);
|
||||||
@@ -766,7 +755,7 @@ static void _btc_read_le_key(const uint8_t key_type, const size_t key_len, bt_bd
|
|||||||
*key_found = true;
|
*key_found = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static bt_status_t _btc_storage_in_fetch_bonded_ble_device(const char *remote_bd_addr, int add)
|
bt_status_t _btc_storage_in_fetch_bonded_ble_device(const char *remote_bd_addr, int add)
|
||||||
{
|
{
|
||||||
uint32_t device_type;
|
uint32_t device_type;
|
||||||
int addr_type;
|
int addr_type;
|
||||||
@@ -808,58 +797,13 @@ static bt_status_t _btc_storage_in_fetch_bonded_ble_device(const char *remote_bd
|
|||||||
|
|
||||||
if (key_found) {
|
if (key_found) {
|
||||||
return BT_STATUS_SUCCESS;
|
return BT_STATUS_SUCCESS;
|
||||||
|
} else {
|
||||||
|
BTC_TRACE_DEBUG("Remote device:%s, no link key or ble key found", remote_bd_addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
return BT_STATUS_FAIL;
|
return BT_STATUS_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bt_status_t btc_storage_in_fetch_bonded_ble_devices(int add)
|
|
||||||
{
|
|
||||||
bt_status_t status = BT_STATUS_FAIL;
|
|
||||||
uint32_t device_type = 0;
|
|
||||||
|
|
||||||
btc_config_lock();
|
|
||||||
for (const btc_config_section_iter_t *iter = btc_config_section_begin(); iter != btc_config_section_end();
|
|
||||||
iter = btc_config_section_next(iter)) {
|
|
||||||
const char *name = btc_config_section_name(iter);
|
|
||||||
|
|
||||||
if (!string_is_bdaddr(name) ||
|
|
||||||
!btc_config_get_int(name, BTC_BLE_STORAGE_DEV_TYPE_STR, (int *)&device_type) ||
|
|
||||||
((device_type & BT_DEVICE_TYPE_BLE) != BT_DEVICE_TYPE_BLE)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
BTC_TRACE_DEBUG("%s, name = %s", __func__, name);
|
|
||||||
if (_btc_storage_in_fetch_bonded_ble_device(name, add) != BT_STATUS_SUCCESS) {
|
|
||||||
BTC_TRACE_DEBUG("Remote device:%s, no link key or ble key found", name);
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
btc_config_unlock();
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
**
|
|
||||||
** Function btc_storage_load_bonded_devices
|
|
||||||
**
|
|
||||||
** Description btc storage API - Loads all the bonded devices from NVRAM
|
|
||||||
** and adds to the BTA.
|
|
||||||
** Additionally, this API also invokes the adaper_properties_cb
|
|
||||||
** and remote_device_properties_cb for each of the bonded devices.
|
|
||||||
**
|
|
||||||
** Returns BT_STATUS_SUCCESS if successful, BT_STATUS_FAIL otherwise
|
|
||||||
**
|
|
||||||
*******************************************************************************/
|
|
||||||
bt_status_t btc_storage_load_bonded_ble_devices(void)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
status = btc_storage_in_fetch_bonded_ble_devices(1);
|
|
||||||
BTC_TRACE_DEBUG("Storage load rslt %d\n", status);
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
bt_status_t btc_storage_get_bonded_ble_devices_list(esp_ble_bond_dev_t *bond_dev, int dev_num)
|
bt_status_t btc_storage_get_bonded_ble_devices_list(esp_ble_bond_dev_t *bond_dev, int dev_num)
|
||||||
{
|
{
|
||||||
bt_bdaddr_t bd_addr;
|
bt_bdaddr_t bd_addr;
|
||||||
|
@@ -307,6 +307,14 @@ bool btc_config_remove_section(const char *section)
|
|||||||
return config_remove_section(config, section);
|
return config_remove_section(config, section);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool btc_config_update_newest_section(const char *section)
|
||||||
|
{
|
||||||
|
assert(config != NULL);
|
||||||
|
assert(section != NULL);
|
||||||
|
|
||||||
|
return config_update_newest_section(config, section);
|
||||||
|
}
|
||||||
|
|
||||||
void btc_config_flush(void)
|
void btc_config_flush(void)
|
||||||
{
|
{
|
||||||
assert(config != NULL);
|
assert(config != NULL);
|
||||||
|
@@ -692,6 +692,7 @@ static void btc_dm_acl_link_stat(tBTA_DM_ACL_LINK_STAT *p_acl_link_stat)
|
|||||||
#if (BTC_GAP_BT_INCLUDED == TRUE)
|
#if (BTC_GAP_BT_INCLUDED == TRUE)
|
||||||
esp_bt_gap_cb_param_t param;
|
esp_bt_gap_cb_param_t param;
|
||||||
esp_bt_gap_cb_event_t event = ESP_BT_GAP_EVT_MAX;
|
esp_bt_gap_cb_event_t event = ESP_BT_GAP_EVT_MAX;
|
||||||
|
bt_bdaddr_t bt_addr;
|
||||||
|
|
||||||
switch (p_acl_link_stat->event) {
|
switch (p_acl_link_stat->event) {
|
||||||
case BTA_ACL_LINK_STAT_CONN_CMPL: {
|
case BTA_ACL_LINK_STAT_CONN_CMPL: {
|
||||||
@@ -714,6 +715,17 @@ static void btc_dm_acl_link_stat(tBTA_DM_ACL_LINK_STAT *p_acl_link_stat)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (p_acl_link_stat->event == BTA_ACL_LINK_STAT_CONN_CMPL &&
|
||||||
|
p_acl_link_stat->link_act.conn_cmpl.status == HCI_SUCCESS) {
|
||||||
|
memcpy(bt_addr.address, p_acl_link_stat->link_act.conn_cmpl.bd_addr, sizeof(bt_addr.address));
|
||||||
|
if (btc_storage_update_active_device(&bt_addr)) {
|
||||||
|
BTC_TRACE_EVENT("Device: %02x:%02x:%02x:%02x:%02x:%02x, is not in bond list",
|
||||||
|
bt_addr.address[0], bt_addr.address[1],
|
||||||
|
bt_addr.address[2], bt_addr.address[3],
|
||||||
|
bt_addr.address[4], bt_addr.address[5]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
esp_bt_gap_cb_t cb = (esp_bt_gap_cb_t)btc_profile_cb_get(BTC_PID_GAP_BT);
|
esp_bt_gap_cb_t cb = (esp_bt_gap_cb_t)btc_profile_cb_get(BTC_PID_GAP_BT);
|
||||||
if (cb) {
|
if (cb) {
|
||||||
cb(event, ¶m);
|
cb(event, ¶m);
|
||||||
@@ -745,11 +757,8 @@ void btc_dm_sec_cb_handler(btc_msg_t *msg)
|
|||||||
case BTA_DM_ENABLE_EVT: {
|
case BTA_DM_ENABLE_EVT: {
|
||||||
btc_clear_services_mask();
|
btc_clear_services_mask();
|
||||||
#if (SMP_INCLUDED == TRUE)
|
#if (SMP_INCLUDED == TRUE)
|
||||||
btc_storage_load_bonded_devices();
|
|
||||||
#if (BLE_INCLUDED == TRUE)
|
|
||||||
//load the bonding device to the btm layer
|
//load the bonding device to the btm layer
|
||||||
btc_storage_load_bonded_ble_devices();
|
btc_storage_load_bonded_devices();
|
||||||
#endif ///BLE_INCLUDED == TRUE
|
|
||||||
#endif ///SMP_INCLUDED == TRUE
|
#endif ///SMP_INCLUDED == TRUE
|
||||||
|
|
||||||
/* Set initial device name, it can be overwritten later */
|
/* Set initial device name, it can be overwritten later */
|
||||||
|
@@ -1,19 +1,12 @@
|
|||||||
// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
|
/*
|
||||||
//
|
* SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
*
|
||||||
// you may not use this file except in compliance with the License.
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
// You may obtain a copy of the License at
|
*/
|
||||||
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "btc/btc_storage.h"
|
#include "btc/btc_storage.h"
|
||||||
|
#include "btc/btc_ble_storage.h"
|
||||||
#include "btc/btc_util.h"
|
#include "btc/btc_util.h"
|
||||||
#include "osi/osi.h"
|
#include "osi/osi.h"
|
||||||
#include "common/bt_trace.h"
|
#include "common/bt_trace.h"
|
||||||
@@ -41,8 +34,31 @@ bt_status_t btc_storage_add_bonded_device(bt_bdaddr_t *remote_bd_addr,
|
|||||||
BOOLEAN sc_support)
|
BOOLEAN sc_support)
|
||||||
{
|
{
|
||||||
bdstr_t bdstr;
|
bdstr_t bdstr;
|
||||||
|
bt_bdaddr_t bd_addr;
|
||||||
bdaddr_to_string(remote_bd_addr, bdstr, sizeof(bdstr));
|
bdaddr_to_string(remote_bd_addr, bdstr, sizeof(bdstr));
|
||||||
|
|
||||||
|
/* device not in bond list and exceed the maximum number of bonded devices, delete the inactive bonded device */
|
||||||
|
if (btc_storage_get_num_all_bond_devices() >= BTM_SEC_MAX_DEVICE_RECORDS && !btc_config_has_section(bdstr)) {
|
||||||
|
const btc_config_section_iter_t *iter = btc_config_section_begin();
|
||||||
|
const btc_config_section_iter_t *remove_iter = iter;
|
||||||
|
/* find the first device(the last node) */
|
||||||
|
while (iter != btc_config_section_end()) {
|
||||||
|
remove_iter = iter;
|
||||||
|
iter = btc_config_section_next(iter);
|
||||||
|
}
|
||||||
|
const char *remove_section = btc_config_section_name(remove_iter);
|
||||||
|
|
||||||
|
// delete device info
|
||||||
|
string_to_bdaddr(remove_section, &bd_addr);
|
||||||
|
BTA_DmRemoveDevice(bd_addr.address, BT_TRANSPORT_BR_EDR);
|
||||||
|
BTA_DmRemoveDevice(bd_addr.address, BT_TRANSPORT_LE);
|
||||||
|
|
||||||
|
// delete config info
|
||||||
|
if (btc_config_remove_section(remove_section)) {
|
||||||
|
BTC_TRACE_WARNING("exceeded the maximum nubmer of bonded devices, delete the first device info : %s\n", remove_section);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BTC_TRACE_DEBUG("add to storage: Remote device:%s\n", bdstr);
|
BTC_TRACE_DEBUG("add to storage: Remote device:%s\n", bdstr);
|
||||||
|
|
||||||
btc_config_lock();
|
btc_config_lock();
|
||||||
@@ -58,6 +74,46 @@ bt_status_t btc_storage_add_bonded_device(bt_bdaddr_t *remote_bd_addr,
|
|||||||
return ret ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
|
return ret ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (SMP_INCLUDED == TRUE)
|
||||||
|
static bt_status_t _btc_storage_in_fetch_bonded_bt_device(const char *remote_bd_addr, int add)
|
||||||
|
{
|
||||||
|
BOOLEAN bt_linkkey_file_found = FALSE;
|
||||||
|
UINT8 sc_support = 0;
|
||||||
|
|
||||||
|
BTC_TRACE_DEBUG("Remote device:%s\n", remote_bd_addr);
|
||||||
|
LINK_KEY link_key;
|
||||||
|
size_t size = sizeof(link_key);
|
||||||
|
if (btc_config_get_bin(remote_bd_addr, BTC_STORAGE_LINK_KEY_STR, link_key, &size)) {
|
||||||
|
int linkkey_type;
|
||||||
|
if (btc_config_get_int(remote_bd_addr, BTC_STORAGE_LINK_KEY_TYPE_STR, &linkkey_type)) {
|
||||||
|
bt_bdaddr_t bd_addr;
|
||||||
|
string_to_bdaddr(remote_bd_addr, &bd_addr);
|
||||||
|
if (add) {
|
||||||
|
DEV_CLASS dev_class = {0, 0, 0};
|
||||||
|
int cod;
|
||||||
|
int pin_length = 0;
|
||||||
|
if (btc_config_get_int(remote_bd_addr, BTC_STORAGE_DEV_CLASS_STR, &cod)) {
|
||||||
|
uint2devclass((UINT32)cod, dev_class);
|
||||||
|
}
|
||||||
|
btc_config_get_int(remote_bd_addr, BTC_STORAGE_PIN_LENGTH_STR, &pin_length);
|
||||||
|
size = sizeof(sc_support);
|
||||||
|
btc_config_get_bin(remote_bd_addr, BTC_STORAGE_SC_SUPPORT, &sc_support, &size);
|
||||||
|
|
||||||
|
BTA_DmAddDevice(bd_addr.address, dev_class, link_key, 0, 0,
|
||||||
|
(UINT8)linkkey_type, 0, pin_length, (UINT8)sc_support);
|
||||||
|
}
|
||||||
|
bt_linkkey_file_found = TRUE;
|
||||||
|
} else {
|
||||||
|
BTC_TRACE_ERROR("bounded device:%s, LinkKeyType or PinLength is invalid\n", remote_bd_addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!bt_linkkey_file_found) {
|
||||||
|
BTC_TRACE_DEBUG("Remote device:%s, no link key\n", remote_bd_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return BT_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
**
|
**
|
||||||
** Function btc_in_fetch_bonded_devices
|
** Function btc_in_fetch_bonded_devices
|
||||||
@@ -70,8 +126,9 @@ bt_status_t btc_storage_add_bonded_device(bt_bdaddr_t *remote_bd_addr,
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
static bt_status_t btc_in_fetch_bonded_devices(int add)
|
static bt_status_t btc_in_fetch_bonded_devices(int add)
|
||||||
{
|
{
|
||||||
BOOLEAN bt_linkkey_file_found = FALSE;
|
bt_status_t status = BT_STATUS_FAIL;
|
||||||
UINT8 sc_support = 0;
|
uint16_t dev_cnt = 0;
|
||||||
|
const btc_config_section_iter_t *remove_iter = NULL;
|
||||||
|
|
||||||
btc_config_lock();
|
btc_config_lock();
|
||||||
for (const btc_config_section_iter_t *iter = btc_config_section_begin(); iter != btc_config_section_end(); iter = btc_config_section_next(iter)) {
|
for (const btc_config_section_iter_t *iter = btc_config_section_begin(); iter != btc_config_section_end(); iter = btc_config_section_next(iter)) {
|
||||||
@@ -79,45 +136,45 @@ static bt_status_t btc_in_fetch_bonded_devices(int add)
|
|||||||
if (!string_is_bdaddr(name)) {
|
if (!string_is_bdaddr(name)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
dev_cnt ++;
|
||||||
BTC_TRACE_DEBUG("Remote device:%s\n", name);
|
/* if the number of device stored in nvs not exceed to BTM_SEC_MAX_DEVICE_RECORDS, load it */
|
||||||
LINK_KEY link_key;
|
if (dev_cnt <= BTM_SEC_MAX_DEVICE_RECORDS) {
|
||||||
size_t size = sizeof(link_key);
|
if (btc_config_exist(name, BTC_STORAGE_LINK_KEY_TYPE_STR) && btc_config_exist(name, BTC_STORAGE_PIN_LENGTH_STR) &&
|
||||||
if (btc_config_get_bin(name, BTC_STORAGE_LINK_KEY_STR, link_key, &size)) {
|
btc_config_exist(name, BTC_STORAGE_SC_SUPPORT) && btc_config_exist(name, BTC_STORAGE_LINK_KEY_STR)) {
|
||||||
int linkkey_type;
|
/* load bt device */
|
||||||
if (btc_config_get_int(name, BTC_STORAGE_LINK_KEY_TYPE_STR, &linkkey_type)) {
|
status = _btc_storage_in_fetch_bonded_bt_device(name, add);
|
||||||
bt_bdaddr_t bd_addr;
|
|
||||||
string_to_bdaddr(name, &bd_addr);
|
|
||||||
if (add) {
|
|
||||||
DEV_CLASS dev_class = {0, 0, 0};
|
|
||||||
int cod;
|
|
||||||
int pin_length = 0;
|
|
||||||
if (btc_config_get_int(name, BTC_STORAGE_DEV_CLASS_STR, &cod)) {
|
|
||||||
uint2devclass((UINT32)cod, dev_class);
|
|
||||||
}
|
}
|
||||||
btc_config_get_int(name, BTC_STORAGE_PIN_LENGTH_STR, &pin_length);
|
if (btc_config_exist(name, BTC_BLE_STORAGE_DEV_TYPE_STR)) {
|
||||||
size = sizeof(sc_support);
|
#if (BLE_INCLUDED == TRUE)
|
||||||
btc_config_get_bin(name, BTC_STORAGE_SC_SUPPORT, &sc_support, &size);
|
/* load ble device */
|
||||||
#if (SMP_INCLUDED == TRUE)
|
status = _btc_storage_in_fetch_bonded_ble_device(name, add);
|
||||||
BTA_DmAddDevice(bd_addr.address, dev_class, link_key, 0, 0,
|
#endif ///BLE_INCLUDED == TRUE
|
||||||
(UINT8)linkkey_type, 0, pin_length, (UINT8)sc_support);
|
|
||||||
#endif ///SMP_INCLUDED == TRUE
|
|
||||||
}
|
}
|
||||||
bt_linkkey_file_found = TRUE;
|
|
||||||
} else {
|
} else {
|
||||||
BTC_TRACE_ERROR("bounded device:%s, LinkKeyType or PinLength is invalid\n", name);
|
/* delete the exceeded device info from nvs */
|
||||||
|
remove_iter = iter;
|
||||||
|
while (remove_iter != btc_config_section_end()) {
|
||||||
|
const char *remove_section = btc_config_section_name(remove_iter);
|
||||||
|
if (!string_is_bdaddr(remove_section)) {
|
||||||
|
remove_iter = btc_config_section_next(remove_iter);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
remove_iter = btc_config_section_next(remove_iter);
|
||||||
|
/* delete config info */
|
||||||
|
if (btc_config_remove_section(remove_section)) {
|
||||||
|
BTC_TRACE_WARNING("exceeded the maximum number of bonded devices, delete the exceed device info : %s", remove_section);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!bt_linkkey_file_found) {
|
/* write into nvs */
|
||||||
BTC_TRACE_DEBUG("Remote device:%s, no link key\n", name);
|
btc_config_flush();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
btc_config_unlock();
|
btc_config_unlock();
|
||||||
|
|
||||||
return BT_STATUS_SUCCESS;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
**
|
**
|
||||||
** Function btc_storage_load_bonded_devices
|
** Function btc_storage_load_bonded_devices
|
||||||
@@ -137,6 +194,7 @@ bt_status_t btc_storage_load_bonded_devices(void)
|
|||||||
BTC_TRACE_DEBUG("Storage load rslt %d\n", status);
|
BTC_TRACE_DEBUG("Storage load rslt %d\n", status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
#endif ///SMP_INCLUDED == TRUE
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
**
|
**
|
||||||
@@ -247,3 +305,44 @@ bt_status_t btc_storage_get_bonded_bt_devices_list(bt_bdaddr_t *bond_dev, int *d
|
|||||||
|
|
||||||
return BT_STATUS_SUCCESS;
|
return BT_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
** Function btc_storage_update_active_device
|
||||||
|
**
|
||||||
|
** Description BTC storage API - Once an ACL link is established and remote
|
||||||
|
** bd_addr is already stored in NVRAM, update the config and update
|
||||||
|
** the remote device to be the newest active device, The updates will
|
||||||
|
** not be stored into NVRAM immediately.
|
||||||
|
**
|
||||||
|
** Returns BT_STATUS_SUCCESS if successful, BT_STATUS_FAIL otherwise
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
bool btc_storage_update_active_device(bt_bdaddr_t *remote_bd_addr)
|
||||||
|
{
|
||||||
|
bdstr_t bdstr;
|
||||||
|
bdaddr_to_string(remote_bd_addr, bdstr, sizeof(bdstr));
|
||||||
|
bool ret = false;
|
||||||
|
BTC_TRACE_DEBUG("Update active device: Remote device:%s\n", bdstr);
|
||||||
|
|
||||||
|
btc_config_lock();
|
||||||
|
ret = btc_config_update_newest_section(bdstr);
|
||||||
|
btc_config_unlock();
|
||||||
|
|
||||||
|
return ret ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int btc_storage_get_num_all_bond_devices(void) {
|
||||||
|
int num_dev = 0;
|
||||||
|
|
||||||
|
btc_config_lock();
|
||||||
|
for (const btc_config_section_iter_t *iter = btc_config_section_begin(); iter != btc_config_section_end();
|
||||||
|
iter = btc_config_section_next(iter)) {
|
||||||
|
const char *name = btc_config_section_name(iter);
|
||||||
|
if (string_is_bdaddr(name)) {
|
||||||
|
num_dev++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
btc_config_unlock();
|
||||||
|
return num_dev;
|
||||||
|
}
|
||||||
|
@@ -61,6 +61,8 @@ bt_status_t btc_storage_remove_ble_bonding_keys(bt_bdaddr_t *remote_bd_addr);
|
|||||||
|
|
||||||
bool btc_storage_compare_address_key_value(bt_bdaddr_t *remote_bd_addr, uint8_t key_type, void *key_value, int key_length);
|
bool btc_storage_compare_address_key_value(bt_bdaddr_t *remote_bd_addr, uint8_t key_type, void *key_value, int key_length);
|
||||||
|
|
||||||
|
bt_status_t _btc_storage_in_fetch_bonded_ble_device(const char *remote_bd_addr, int add);
|
||||||
|
|
||||||
bt_status_t btc_storage_add_ble_local_key(char *key, uint8_t key_type, uint8_t key_length);
|
bt_status_t btc_storage_add_ble_local_key(char *key, uint8_t key_type, uint8_t key_length);
|
||||||
|
|
||||||
bt_status_t btc_storage_remove_ble_local_keys(void);
|
bt_status_t btc_storage_remove_ble_local_keys(void);
|
||||||
@@ -83,8 +85,6 @@ bt_status_t btc_storage_set_ble_dev_type(bt_bdaddr_t *bd_addr, bool flush);
|
|||||||
|
|
||||||
bt_status_t btc_storage_remove_ble_dev_type(bt_bdaddr_t *remote_bd_addr, bool flush);
|
bt_status_t btc_storage_remove_ble_dev_type(bt_bdaddr_t *remote_bd_addr, bool flush);
|
||||||
|
|
||||||
bt_status_t btc_storage_load_bonded_ble_devices(void);
|
|
||||||
|
|
||||||
bt_status_t btc_storage_get_bonded_ble_devices_list(esp_ble_bond_dev_t *bond_dev, int dev_num);
|
bt_status_t btc_storage_get_bonded_ble_devices_list(esp_ble_bond_dev_t *bond_dev, int dev_num);
|
||||||
|
|
||||||
int btc_storage_get_num_ble_bond_devices(void);
|
int btc_storage_get_num_ble_bond_devices(void);
|
||||||
|
@@ -36,6 +36,7 @@ bool btc_config_get_bin(const char *section, const char *key, uint8_t *value, si
|
|||||||
bool btc_config_set_bin(const char *section, const char *key, const uint8_t *value, size_t length);
|
bool btc_config_set_bin(const char *section, const char *key, const uint8_t *value, size_t length);
|
||||||
bool btc_config_remove(const char *section, const char *key);
|
bool btc_config_remove(const char *section, const char *key);
|
||||||
bool btc_config_remove_section(const char *section);
|
bool btc_config_remove_section(const char *section);
|
||||||
|
bool btc_config_update_newest_section(const char *section);
|
||||||
|
|
||||||
size_t btc_config_get_bin_length(const char *section, const char *key);
|
size_t btc_config_get_bin_length(const char *section, const char *key);
|
||||||
|
|
||||||
|
@@ -1,16 +1,8 @@
|
|||||||
// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
|
/*
|
||||||
//
|
* SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
*
|
||||||
// you may not use this file except in compliance with the License.
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
// You may obtain a copy of the License at
|
*/
|
||||||
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
#ifndef __BTC_STORAGE_H__
|
#ifndef __BTC_STORAGE_H__
|
||||||
#define __BTC_STORAGE_H__
|
#define __BTC_STORAGE_H__
|
||||||
@@ -58,12 +50,14 @@ bt_status_t btc_storage_remove_bonded_device(bt_bdaddr_t *remote_bd_addr);
|
|||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
**
|
**
|
||||||
** Function btc_storage_remove_bonded_device
|
** Function btc_storage_load_bonded_devices
|
||||||
**
|
**
|
||||||
** Description BTC storage API - Deletes the bonded device from NVRAM
|
** Description BTC storage API - Loads all the bonded devices from NVRAM
|
||||||
|
** and adds to the BTA.
|
||||||
|
** Additionally, this API also invokes the adaper_properties_cb
|
||||||
|
** and remote_device_properties_cb for each of the bonded devices.
|
||||||
**
|
**
|
||||||
** Returns BT_STATUS_SUCCESS if the deletion was successful,
|
** Returns BT_STATUS_SUCCESS if successful, BT_STATUS_FAIL otherwise
|
||||||
** BT_STATUS_FAIL otherwise
|
|
||||||
**
|
**
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
bt_status_t btc_storage_load_bonded_devices(void);
|
bt_status_t btc_storage_load_bonded_devices(void);
|
||||||
@@ -91,4 +85,29 @@ int btc_storage_get_num_bt_bond_devices(void);
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
bt_status_t btc_storage_get_bonded_bt_devices_list(bt_bdaddr_t *bond_dev, int *dev_num);
|
bt_status_t btc_storage_get_bonded_bt_devices_list(bt_bdaddr_t *bond_dev, int *dev_num);
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
** Function btc_storage_get_num_all_bond_devices
|
||||||
|
**
|
||||||
|
** Description BTC storage API - get all the num of the bonded device from NVRAM
|
||||||
|
**
|
||||||
|
** Returns the num of the bonded device
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
int btc_storage_get_num_all_bond_devices(void);
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
** Function btc_storage_update_active_device
|
||||||
|
**
|
||||||
|
** Description BTC storage API - Once an ACL link is established and remote
|
||||||
|
** bd_addr is already stored in NVRAM, update the config and update
|
||||||
|
** the remote device to be the newest active device. The updates will
|
||||||
|
** not be stored into NVRAM immediately.
|
||||||
|
**
|
||||||
|
** Returns BT_STATUS_SUCCESS if successful, BT_STATUS_FAIL otherwise
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
bool btc_storage_update_active_device(bt_bdaddr_t *remote_bd_addr);
|
||||||
|
|
||||||
#endif /* BTC_STORAGE_H */
|
#endif /* BTC_STORAGE_H */
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD
|
||||||
|
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
@@ -15,6 +15,8 @@
|
|||||||
#include "common/bt_trace.h"
|
#include "common/bt_trace.h"
|
||||||
#include "osi/allocator.h"
|
#include "osi/allocator.h"
|
||||||
#include "esp_gattc_api.h"
|
#include "esp_gattc_api.h"
|
||||||
|
#include "btc/btc_storage.h"
|
||||||
|
#include "common/bt_defs.h"
|
||||||
|
|
||||||
#if (GATTC_INCLUDED == TRUE)
|
#if (GATTC_INCLUDED == TRUE)
|
||||||
static inline void btc_gattc_cb_to_app(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param)
|
static inline void btc_gattc_cb_to_app(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param)
|
||||||
@@ -924,6 +926,15 @@ void btc_gattc_cb_handler(btc_msg_t *msg)
|
|||||||
}
|
}
|
||||||
case BTA_GATTC_CONNECT_EVT: {
|
case BTA_GATTC_CONNECT_EVT: {
|
||||||
tBTA_GATTC_CONNECT *connect = &arg->connect;
|
tBTA_GATTC_CONNECT *connect = &arg->connect;
|
||||||
|
bt_bdaddr_t bt_addr;
|
||||||
|
|
||||||
|
memcpy(bt_addr.address, connect->remote_bda, sizeof(bt_addr.address));
|
||||||
|
if (btc_storage_update_active_device(&bt_addr)) {
|
||||||
|
BTC_TRACE_EVENT("Device: %02x:%02x:%02x:%02x:%02x:%02x, is not in bond list",
|
||||||
|
bt_addr.address[0], bt_addr.address[1],
|
||||||
|
bt_addr.address[2], bt_addr.address[3],
|
||||||
|
bt_addr.address[4], bt_addr.address[5]);
|
||||||
|
}
|
||||||
|
|
||||||
gattc_if = connect->client_if;
|
gattc_if = connect->client_if;
|
||||||
param.connect.conn_id = BTC_GATT_GET_CONN_ID(connect->conn_id);
|
param.connect.conn_id = BTC_GATT_GET_CONN_ID(connect->conn_id);
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@@ -16,6 +16,8 @@
|
|||||||
#include "osi/allocator.h"
|
#include "osi/allocator.h"
|
||||||
#include "btc/btc_main.h"
|
#include "btc/btc_main.h"
|
||||||
#include "esp_gatts_api.h"
|
#include "esp_gatts_api.h"
|
||||||
|
#include "btc/btc_storage.h"
|
||||||
|
#include "common/bt_defs.h"
|
||||||
|
|
||||||
#if (GATTS_INCLUDED == TRUE)
|
#if (GATTS_INCLUDED == TRUE)
|
||||||
|
|
||||||
@@ -898,7 +900,16 @@ void btc_gatts_cb_handler(btc_msg_t *msg)
|
|||||||
|
|
||||||
btc_gatts_cb_to_app(ESP_GATTS_STOP_EVT, gatts_if, ¶m);
|
btc_gatts_cb_to_app(ESP_GATTS_STOP_EVT, gatts_if, ¶m);
|
||||||
break;
|
break;
|
||||||
case BTA_GATTS_CONNECT_EVT:
|
case BTA_GATTS_CONNECT_EVT: {
|
||||||
|
bt_bdaddr_t bt_addr;
|
||||||
|
memcpy(bt_addr.address, p_data->conn.remote_bda, sizeof(bt_addr.address));
|
||||||
|
if (btc_storage_update_active_device(&bt_addr)) {
|
||||||
|
BTC_TRACE_EVENT("Device: %02x:%02x:%02x:%02x:%02x:%02x, is not in bond list",
|
||||||
|
bt_addr.address[0], bt_addr.address[1],
|
||||||
|
bt_addr.address[2], bt_addr.address[3],
|
||||||
|
bt_addr.address[4], bt_addr.address[5]);
|
||||||
|
}
|
||||||
|
|
||||||
gatts_if = p_data->conn.server_if;
|
gatts_if = p_data->conn.server_if;
|
||||||
param.connect.conn_id = BTC_GATT_GET_CONN_ID(p_data->conn.conn_id);
|
param.connect.conn_id = BTC_GATT_GET_CONN_ID(p_data->conn.conn_id);
|
||||||
param.connect.link_role = p_data->conn.link_role;
|
param.connect.link_role = p_data->conn.link_role;
|
||||||
@@ -910,6 +921,7 @@ void btc_gatts_cb_handler(btc_msg_t *msg)
|
|||||||
param.connect.conn_handle = p_data->conn.conn_handle;
|
param.connect.conn_handle = p_data->conn.conn_handle;
|
||||||
btc_gatts_cb_to_app(ESP_GATTS_CONNECT_EVT, gatts_if, ¶m);
|
btc_gatts_cb_to_app(ESP_GATTS_CONNECT_EVT, gatts_if, ¶m);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case BTA_GATTS_DISCONNECT_EVT:
|
case BTA_GATTS_DISCONNECT_EVT:
|
||||||
gatts_if = p_data->conn.server_if;
|
gatts_if = p_data->conn.server_if;
|
||||||
param.disconnect.conn_id = BTC_GATT_GET_CONN_ID(p_data->conn.conn_id);
|
param.disconnect.conn_id = BTC_GATT_GET_CONN_ID(p_data->conn.conn_id);
|
||||||
|
Reference in New Issue
Block a user