static bt_status_t _btc_storage_remove_remote_addr_type(bt_bdaddr_t *remote_bd_addr, bool flush) { bool ret = true; bdstr_t bdstr; uint32_t dev_type = 0; bdaddr_to_string(remote_bd_addr, bdstr, sizeof(bdstr)); ret = btc_config_get_int(bdstr, BTC_BLE_STORAGE_ADDR_TYPE_STR, (int *)&dev_type); if (ret == false) { //cannot find the key, just return SUCCESS, indicate already removed return BT_STATUS_SUCCESS; } ret = btc_config_remove(bdstr, BTC_BLE_STORAGE_ADDR_TYPE_STR); if (ret == false) { return BT_STATUS_FAIL; } if (flush) { _btc_storage_save(); } return BT_STATUS_SUCCESS; }
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; } LOG_DEBUG("%s, name = %s", __func__, name); if (_btc_storage_in_fetch_bonded_ble_device(name, add) != BT_STATUS_SUCCESS) { LOG_DEBUG("Remote device:%s, no link key or ble key found", name); } else { status = BT_STATUS_SUCCESS; } } btc_config_unlock(); return status; }
static bt_status_t _btc_storage_remove_ble_dev_type(bt_bdaddr_t *remote_bd_addr, bool flush) { bool ret = true; bdstr_t bdstr; uint32_t dev_type = 0; bdaddr_to_string(remote_bd_addr, bdstr, sizeof(bdstr)); BTIF_TRACE_DEBUG(" %s in bd addr:%s",__FUNCTION__, bdstr); ret = btc_config_get_int(bdstr, BTC_BLE_STORAGE_DEV_TYPE_STR, (int *)&dev_type); if (ret == false) { //cannot find the key, just return SUCCESS, indicate already removed return BT_STATUS_SUCCESS; } if (dev_type == BT_DEVICE_TYPE_DUMO) { ret = btc_config_set_int(bdstr, BTC_BLE_STORAGE_DEV_TYPE_STR, BT_DEVICE_TYPE_BREDR); } else if (dev_type == BT_DEVICE_TYPE_BLE) { ret = btc_config_remove(bdstr, BTC_BLE_STORAGE_DEV_TYPE_STR); } if (ret == false) { return BT_STATUS_FAIL; } if (flush) { _btc_storage_save(); } return BT_STATUS_SUCCESS; }
static bt_status_t _btc_storage_get_remote_addr_type(bt_bdaddr_t *remote_bd_addr, int*addr_type) { bdstr_t bdstr; bdaddr_to_string(remote_bd_addr, bdstr, sizeof(bdstr)); int ret = btc_config_get_int(bdstr, BTC_BLE_STORAGE_ADDR_TYPE_STR, addr_type); return ret ? BT_STATUS_SUCCESS : BT_STATUS_FAIL; }
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; uint32_t device_type = 0; char buffer[sizeof(tBTM_LE_KEY_VALUE)] = {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)) { if (dev_num-- <= 0) { break; } 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)) { continue; } string_to_bdaddr(name, &bd_addr); memcpy(bond_dev->bd_addr, bd_addr.address, sizeof(bt_bdaddr_t)); //resolve the peer device long term key if (_btc_storage_get_ble_bonding_key(&bd_addr, BTM_LE_KEY_PENC, buffer, sizeof(tBTM_LE_PENC_KEYS)) == BT_STATUS_SUCCESS) { bond_dev->bond_key.key_mask |= ESP_BLE_ENC_KEY_MASK; memcpy(&bond_dev->bond_key.penc_key, buffer, sizeof(tBTM_LE_PENC_KEYS)); } //resolve the peer device csrk if (_btc_storage_get_ble_bonding_key(&bd_addr, BTM_LE_KEY_PCSRK, buffer, sizeof(tBTM_LE_PCSRK_KEYS)) == BT_STATUS_SUCCESS) { bond_dev->bond_key.key_mask |= ESP_BLE_CSR_KEY_MASK; memcpy(&bond_dev->bond_key.pcsrk_key, buffer, sizeof(tBTM_LE_PCSRK_KEYS)); } //resolve the peer device irk if (_btc_storage_get_ble_bonding_key(&bd_addr, BTM_LE_KEY_PID, buffer, sizeof(tBTM_LE_PID_KEYS)) == BT_STATUS_SUCCESS) { bond_dev->bond_key.key_mask |= ESP_BLE_ID_KEY_MASK; memcpy(&bond_dev->bond_key.pid_key, buffer, sizeof(tBTM_LE_PID_KEYS)); } //serch for the next bond device bond_dev++; } btc_config_unlock(); return BT_STATUS_SUCCESS; }
static bt_status_t _btc_storage_in_fetch_bonded_ble_device(const char *remote_bd_addr, int add) { uint32_t device_type; int addr_type; bt_bdaddr_t bd_addr; BD_ADDR bta_bd_addr; bool device_added = false; bool key_found = false; if (!btc_config_get_int(remote_bd_addr, BTC_BLE_STORAGE_DEV_TYPE_STR, (int *)&device_type)) { LOG_ERROR("%s, device_type = %x", __func__, device_type); return BT_STATUS_FAIL; } string_to_bdaddr(remote_bd_addr, &bd_addr); bdcpy(bta_bd_addr, bd_addr.address); if (_btc_storage_get_remote_addr_type(&bd_addr, &addr_type) != BT_STATUS_SUCCESS) { addr_type = BLE_ADDR_PUBLIC; _btc_storage_set_remote_addr_type(&bd_addr, BLE_ADDR_PUBLIC, true); } _btc_read_le_key(BTM_LE_KEY_PENC, sizeof(tBTM_LE_PENC_KEYS), bd_addr, addr_type, add, &device_added, &key_found); _btc_read_le_key(BTM_LE_KEY_PID, sizeof(tBTM_LE_PID_KEYS), bd_addr, addr_type, add, &device_added, &key_found); _btc_read_le_key(BTM_LE_KEY_LID, sizeof(tBTM_LE_PID_KEYS), bd_addr, addr_type, add, &device_added, &key_found); _btc_read_le_key(BTM_LE_KEY_PCSRK, sizeof(tBTM_LE_PCSRK_KEYS), bd_addr, addr_type, add, &device_added, &key_found); _btc_read_le_key(BTM_LE_KEY_LENC, sizeof(tBTM_LE_LENC_KEYS), bd_addr, addr_type, add, &device_added, &key_found); _btc_read_le_key(BTM_LE_KEY_LCSRK, sizeof(tBTM_LE_LCSRK_KEYS), bd_addr, addr_type, add, &device_added, &key_found); if (key_found) { return BT_STATUS_SUCCESS; } return BT_STATUS_FAIL; }
static bool _btc_storage_get_ble_dev_type(bt_bdaddr_t *bd_addr) { bool ret = 1; bdstr_t bdstr; uint32_t dev_type = 0; bdaddr_to_string(bd_addr, bdstr, sizeof(bdstr)); BTIF_TRACE_DEBUG(" %s in bd addr:%s",__FUNCTION__, bdstr); ret = btc_config_get_int(bdstr, BTC_BLE_STORAGE_DEV_TYPE_STR, (int *)&dev_type); if (ret == false) { return false; } return (dev_type & BT_DEVICE_TYPE_BLE); }
bool btc_get_address_type(const BD_ADDR bd_addr, int *p_addr_type) { if (p_addr_type == NULL) { return FALSE; } bt_bdaddr_t bda; bdcpy(bda.address, bd_addr); bdstr_t bd_addr_str; bdaddr_to_string(&bda, bd_addr_str, sizeof(bd_addr_str)); if (!btc_config_get_int(bd_addr_str, "AddrType", p_addr_type)) { return FALSE; } LOG_DEBUG("%s: Device [%s] address type %d\n", __FUNCTION__, bd_addr_str, *p_addr_type); return TRUE; }
static bt_status_t _btc_storage_set_ble_dev_type(bt_bdaddr_t *bd_addr, bool flush) { bool ret = 1; bdstr_t bdstr; uint32_t dev_type = 0; bdaddr_to_string(bd_addr, bdstr, sizeof(bdstr)); btc_config_get_int(bdstr, BTC_BLE_STORAGE_DEV_TYPE_STR, (int *)&dev_type); ret = btc_config_set_int(bdstr, BTC_BLE_STORAGE_DEV_TYPE_STR, BT_DEVICE_TYPE_BLE|dev_type); if (ret == false) { return BT_STATUS_FAIL; } if (flush) { _btc_storage_save(); } return BT_STATUS_SUCCESS; }
int btc_storage_get_num_ble_bond_devices(void) { int num_dev = 0; 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)) { continue; } num_dev++; } btc_config_unlock(); return num_dev; }