diff --git a/components/bt/host/bluedroid/btc/core/btc_ble_storage.c b/components/bt/host/bluedroid/btc/core/btc_ble_storage.c index c4b67c4f1a..658185465f 100644 --- a/components/bt/host/bluedroid/btc/core/btc_ble_storage.c +++ b/components/bt/host/bluedroid/btc/core/btc_ble_storage.c @@ -1,16 +1,8 @@ -// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// 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. +/* + * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include @@ -55,9 +47,7 @@ static void _btc_storage_save(void) continue; } - 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)) { + if (!string_is_bdaddr(section)) { iter = btc_config_section_next(iter); continue; } @@ -72,16 +62,15 @@ static void _btc_storage_save(void) if (need_remove_iter) { while(need_remove_iter != btc_config_section_end()) { const char *need_remove_section = btc_config_section_name(need_remove_iter); - 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)) { + if (!string_is_bdaddr(need_remove_section)) { need_remove_iter = btc_config_section_next(need_remove_iter); continue; } need_remove_iter = btc_config_section_next(need_remove_iter); //delete device info 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 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); @@ -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; } } -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; int addr_type; @@ -808,6 +797,8 @@ static bt_status_t _btc_storage_in_fetch_bonded_ble_device(const char *remote_bd if (key_found) { 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; diff --git a/components/bt/host/bluedroid/btc/core/btc_dm.c b/components/bt/host/bluedroid/btc/core/btc_dm.c index f270576517..763e826874 100644 --- a/components/bt/host/bluedroid/btc/core/btc_dm.c +++ b/components/bt/host/bluedroid/btc/core/btc_dm.c @@ -745,11 +745,8 @@ void btc_dm_sec_cb_handler(btc_msg_t *msg) case BTA_DM_ENABLE_EVT: { btc_clear_services_mask(); #if (SMP_INCLUDED == TRUE) + //load the bonding device to the btm layer btc_storage_load_bonded_devices(); -#if (BLE_INCLUDED == TRUE) - //load the bonding device to the btm layer - btc_storage_load_bonded_ble_devices(); -#endif ///BLE_INCLUDED == TRUE #endif ///SMP_INCLUDED == TRUE /* Set initial device name, it can be overwritten later */ diff --git a/components/bt/host/bluedroid/btc/core/btc_storage.c b/components/bt/host/bluedroid/btc/core/btc_storage.c index 97bef05fc7..a1d144bdc5 100644 --- a/components/bt/host/bluedroid/btc/core/btc_storage.c +++ b/components/bt/host/bluedroid/btc/core/btc_storage.c @@ -1,19 +1,12 @@ -// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// 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. +/* + * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include "btc/btc_storage.h" +#include "btc/btc_ble_storage.h" #include "btc/btc_util.h" #include "osi/osi.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) { bdstr_t bdstr; - + bt_bdaddr_t bd_addr; bdaddr_to_string(remote_bd_addr, bdstr, sizeof(bdstr)); + + /* device not in bond list and exceed the maximum number of bonded devices, delete the first 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_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; } +#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 @@ -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) { - BOOLEAN bt_linkkey_file_found = FALSE; - UINT8 sc_support = 0; + bt_status_t status = BT_STATUS_FAIL; + uint16_t dev_cnt = 0; + const btc_config_section_iter_t *remove_iter = NULL; 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)) { @@ -79,45 +136,44 @@ static bt_status_t btc_in_fetch_bonded_devices(int add) if (!string_is_bdaddr(name)) { continue; } - - BTC_TRACE_DEBUG("Remote device:%s\n", name); - LINK_KEY link_key; - size_t size = sizeof(link_key); - if (btc_config_get_bin(name, BTC_STORAGE_LINK_KEY_STR, link_key, &size)) { - int linkkey_type; - if (btc_config_get_int(name, BTC_STORAGE_LINK_KEY_TYPE_STR, &linkkey_type)) { - 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); - size = sizeof(sc_support); - btc_config_get_bin(name, BTC_STORAGE_SC_SUPPORT, &sc_support, &size); -#if (SMP_INCLUDED == TRUE) - BTA_DmAddDevice(bd_addr.address, dev_class, link_key, 0, 0, - (UINT8)linkkey_type, 0, pin_length, (UINT8)sc_support); -#endif ///SMP_INCLUDED == TRUE - } - bt_linkkey_file_found = TRUE; + dev_cnt ++; + /* if the number of device stored in nvs not exceed to BTM_SEC_MAX_DEVICE_RECORDS, load it */ + if (dev_cnt <= BTM_SEC_MAX_DEVICE_RECORDS) { + if (btc_config_exist(name, BTC_STORAGE_LINK_KEY_TYPE_STR) && btc_config_exist(name, BTC_STORAGE_PIN_LENGTH_STR) && + btc_config_exist(name, BTC_STORAGE_SC_SUPPORT) && btc_config_exist(name, BTC_STORAGE_LINK_KEY_STR)) { + /* load bt device */ + status = _btc_storage_in_fetch_bonded_bt_device(name, add); } else { - BTC_TRACE_ERROR("bounded device:%s, LinkKeyType or PinLength is invalid\n", name); +#if (BLE_INCLUDED == TRUE) + /* load ble device */ + status = _btc_storage_in_fetch_bonded_ble_device(name, add); +#endif ///BLE_INCLUDED == TRUE } - } - if (!bt_linkkey_file_found) { - BTC_TRACE_DEBUG("Remote device:%s, no link key\n", name); + } else { + /* 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); + } + } + /* write into nvs */ + btc_config_flush(); + break; } } btc_config_unlock(); - return BT_STATUS_SUCCESS; + return status; } - /******************************************************************************* ** ** Function btc_storage_load_bonded_devices @@ -137,6 +193,7 @@ bt_status_t btc_storage_load_bonded_devices(void) BTC_TRACE_DEBUG("Storage load rslt %d\n", status); return status; } +#endif ///SMP_INCLUDED == TRUE /******************************************************************************* ** @@ -247,3 +304,18 @@ bt_status_t btc_storage_get_bonded_bt_devices_list(bt_bdaddr_t *bond_dev, int *d return BT_STATUS_SUCCESS; } + +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; +} diff --git a/components/bt/host/bluedroid/btc/include/btc/btc_ble_storage.h b/components/bt/host/bluedroid/btc/include/btc/btc_ble_storage.h index 490e97fd5f..ee064d01b5 100644 --- a/components/bt/host/bluedroid/btc/include/btc/btc_ble_storage.h +++ b/components/bt/host/bluedroid/btc/include/btc/btc_ble_storage.h @@ -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); +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_remove_ble_local_keys(void); diff --git a/components/bt/host/bluedroid/btc/include/btc/btc_storage.h b/components/bt/host/bluedroid/btc/include/btc/btc_storage.h index f74c3eeb36..1720b517ce 100644 --- a/components/bt/host/bluedroid/btc/include/btc/btc_storage.h +++ b/components/bt/host/bluedroid/btc/include/btc/btc_storage.h @@ -1,16 +1,8 @@ -// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// 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. +/* + * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef __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, -** BT_STATUS_FAIL otherwise +** Returns BT_STATUS_SUCCESS if successful, BT_STATUS_FAIL otherwise ** *******************************************************************************/ bt_status_t btc_storage_load_bonded_devices(void); @@ -91,4 +85,15 @@ 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); +/******************************************************************************* +** +** 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); + #endif /* BTC_STORAGE_H */