15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 1999-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains functions for the Bluetooth Device Manager 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h> 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h> 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stddef.h> 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h" 3179ecab5d0418fde77e9afcdd451bd713af73e180Chris Manton#include "device/include/controller.h" 32258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcidefs.h" 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h" 392d5c3f2261c2f34023c8acfad30c9999e29131f2Nitin Arora 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_DEV_REC *btm_find_oldest_dev (void); 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecAddDevice 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Add/modify device. This function will be normally called 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** during host startup to restore all required information 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** stored in the NVRAM. 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - BD address of the peer 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** dev_class - Device Class 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bd_name - Name of the peer device. NULL if unknown. 533aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach** features - Remote device's features (up to 3 pages). NULL if not known 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** trusted_mask - Bitwise OR of services that do not 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** require authorization. (array of UINT32) 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** link_key - Connection link key. NULL if unknown. 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if added OK, else FALSE 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SecAddDevice (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, 623aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach UINT8 *features, UINT32 trusted_mask[], 63818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde LINK_KEY link_key, UINT8 key_type, tBTM_IO_CAP io_cap, 64818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde UINT8 pin_length) 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 673aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach int i, j; 683aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach BOOLEAN found = FALSE; 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 70cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski BTM_TRACE_API("%s: link key type:%x", __func__, key_type); 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev (bd_addr); 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 74cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if (list_length(btm_cb.sec_dev_rec) > BTM_SEC_MAX_DEVICE_RECORDS) { 75cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski BTM_TRACE_DEBUG("%s: Max devices reached!", __func__); 76cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return FALSE; 77cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski } 78cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 79cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski BTM_TRACE_DEBUG ("%s: allocate a new dev rec", __func__); 805fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_dev_rec = osi_calloc(sizeof(tBTM_SEC_DEV_REC)); 81cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski list_append(btm_cb.sec_dev_rec, p_dev_rec); 82cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 83cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski memcpy (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN); 84cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr, BT_TRANSPORT_BR_EDR); 85c9f86da73bfb637426c83b86497c50fede4e0f63Jakub Pawlowski 867db2548c0346c1d33a46cc35b250e71fd24adae4Andre Eisenbach#if BLE_INCLUDED == TRUE 87cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski /* use default value for background connection params */ 88cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski /* update conn params, use default value for background connection params */ 89cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski memset(&p_dev_rec->conn_params, 0xff, sizeof(tBTM_LE_CONN_PRAMS)); 907db2548c0346c1d33a46cc35b250e71fd24adae4Andre Eisenbach#endif 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9365f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov p_dev_rec->bond_type = BOND_TYPE_UNKNOWN; /* Default value */ 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->timestamp = btm_cb.dev_rec_count++; 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (dev_class) 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->dev_class, dev_class, DEV_CLASS_LEN); 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_dev_rec->sec_bd_name, 0, sizeof(tBTM_BD_NAME)); 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bd_name && bd_name[0]) 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; 10466209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach strlcpy ((char *)p_dev_rec->sec_bd_name, 10566209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach (char *)bd_name, BTM_MAX_REM_BD_NAME_LEN); 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1083aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach p_dev_rec->num_read_pages = 0; 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (features) 1103aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 1113aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach memcpy (p_dev_rec->features, features, sizeof (p_dev_rec->features)); 1123aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach for (i = HCI_EXT_FEATURES_PAGE_MAX; i >= 0; i--) 1133aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 1143aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach for (j = 0; j < HCI_FEATURE_BYTES_PER_PAGE; j++) 1153aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 1163aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach if (p_dev_rec->features[i][j] != 0) 1173aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 1183aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach found = TRUE; 1193aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach break; 1203aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 1213aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 1223aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach if (found) 1233aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 1243aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach p_dev_rec->num_read_pages = i + 1; 1253aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach break; 1263aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 1273aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 1283aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1303aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach memset (p_dev_rec->features, 0, sizeof (p_dev_rec->features)); 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask); 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (link_key) 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 136cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski BTM_TRACE_EVENT ("%s: BDA: %02x:%02x:%02x:%02x:%02x:%02x", __func__, 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[0], bd_addr[1], bd_addr[2], 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[3], bd_addr[4], bd_addr[5]); 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN; 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->link_key, link_key, LINK_KEY_LEN); 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_type = key_type; 142818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->pin_code_length = pin_length; 143818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde 144818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if (pin_length >= 16 || 145818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde key_type == BTM_LKEY_TYPE_AUTH_COMB || 146818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { 14713bb0897a951f267680268b800084302c071e4ccAndre Eisenbach // Set the flag if the link key was made by using either a 16 digit 148818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde // pin or MITM. 14913bb0897a951f267680268b800084302c071e4ccAndre Eisenbach p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED | BTM_SEC_LINK_KEY_AUTHED; 150818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTIF_MIXED_MODE_INCLUDED) && (BTIF_MIXED_MODE_INCLUDED == TRUE) 154ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (key_type < BTM_MAX_PRE_SM4_LKEY_TYPE) 155ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sm4 = BTM_SM4_KNOWN; 156ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 157ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sm4 = BTM_SM4_TRUE; 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rmt_io_caps = io_cap; 161e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun p_dev_rec->device_type |= BT_DEVICE_TYPE_BREDR; 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecDeleteDevice 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Free resources associated with the device. 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - BD address of the peer 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if removed OK, FALSE if not found or ACL link is active 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SecDeleteDevice (BD_ADDR bd_addr) 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1806fc9526bba383fdb33c0536ed050489aa2215554Satya Calloji tBTM_SEC_DEV_REC *p_dev_rec; 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1826fc9526bba383fdb33c0536ed050489aa2215554Satya Calloji if (BTM_IsAclConnectionUp(bd_addr, BT_TRANSPORT_LE) || 1836fc9526bba383fdb33c0536ed050489aa2215554Satya Calloji BTM_IsAclConnectionUp(bd_addr, BT_TRANSPORT_BR_EDR)) 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1856fc9526bba383fdb33c0536ed050489aa2215554Satya Calloji BTM_TRACE_WARNING("%s FAILED: Cannot Delete when connection is active", __func__); 1866fc9526bba383fdb33c0536ed050489aa2215554Satya Calloji return FALSE; 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1896fc9526bba383fdb33c0536ed050489aa2215554Satya Calloji if ((p_dev_rec = btm_find_dev(bd_addr)) != NULL) 1906fc9526bba383fdb33c0536ed050489aa2215554Satya Calloji { 1916fc9526bba383fdb33c0536ed050489aa2215554Satya Calloji btm_sec_free_dev(p_dev_rec); 1926fc9526bba383fdb33c0536ed050489aa2215554Satya Calloji /* Tell controller to get rid of the link key, if it has one stored */ 1936fc9526bba383fdb33c0536ed050489aa2215554Satya Calloji BTM_DeleteStoredLinkKey (p_dev_rec->bd_addr, NULL); 1946fc9526bba383fdb33c0536ed050489aa2215554Satya Calloji } 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1966fc9526bba383fdb33c0536ed050489aa2215554Satya Calloji return TRUE; 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecReadDevName 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Looks for the device name in the security database for the 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** specified BD address. 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the name or NULL 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectchar *BTM_SecReadDevName (BD_ADDR bd_addr) 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p_name = NULL; 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_srec; 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_srec = btm_find_dev(bd_addr)) != NULL) 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_name = (char *)p_srec->sec_bd_name; 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_name); 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 220cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowskibool is_bd_addr_equal(void *data, void *context) 221cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski{ 222cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski tBTM_SEC_DEV_REC *p_dev_rec = data; 223cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski BD_ADDR *bd_addr = context; 224cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 225cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if (!memcmp(p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN)) 226cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return false; 227cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 228cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return true; 229cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski} 230cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_alloc_dev 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the record in the device database for the record 2368fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta** with specified address 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2388fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta** Returns Pointer to the record or NULL 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_sec_alloc_dev (BD_ADDR bd_addr) 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = NULL; 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_INQ_INFO *p_inq_info; 24583c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_alloc_dev"); 246c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta 247cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if (list_length(btm_cb.sec_dev_rec) > BTM_SEC_MAX_DEVICE_RECORDS) { 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_oldest_dev(); 249cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski } else { 250cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski BTM_TRACE_DEBUG ("allocate a new dev rec"); 2515fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_dev_rec = osi_calloc(sizeof(tBTM_SEC_DEV_REC)); 252cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski list_append(btm_cb.sec_dev_rec, p_dev_rec); 253c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta } 254c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta 25565f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov p_dev_rec->bond_type = BOND_TYPE_UNKNOWN; /* Default value */ 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags = BTM_SEC_IN_USE; 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check with the BT manager if details about remote device are known */ 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* outgoing connection */ 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_inq_info = BTM_InqDbRead(bd_addr)) != NULL) 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->dev_class, p_inq_info->results.dev_class, DEV_CLASS_LEN); 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2647db2548c0346c1d33a46cc35b250e71fd24adae4Andre Eisenbach#if BLE_INCLUDED == TRUE 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->device_type = p_inq_info->results.device_type; 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->ble.ble_addr_type = p_inq_info->results.ble_addr_type; 2677db2548c0346c1d33a46cc35b250e71fd24adae4Andre Eisenbach#endif 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 269cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski else if (!memcmp (bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN)) 270cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN); 271cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 2727db2548c0346c1d33a46cc35b250e71fd24adae4Andre Eisenbach#if BLE_INCLUDED == TRUE 273cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski /* update conn params, use default value for background connection params */ 274cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski memset(&p_dev_rec->conn_params, 0xff, sizeof(tBTM_LE_CONN_PRAMS)); 2757db2548c0346c1d33a46cc35b250e71fd24adae4Andre Eisenbach#endif 276c9f86da73bfb637426c83b86497c50fede4e0f63Jakub Pawlowski 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN); 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2797db2548c0346c1d33a46cc35b250e71fd24adae4Andre Eisenbach#if BLE_INCLUDED == TRUE 2808fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p_dev_rec->ble_hci_handle = BTM_GetHCIConnHandle (bd_addr, BT_TRANSPORT_LE); 2817db2548c0346c1d33a46cc35b250e71fd24adae4Andre Eisenbach#endif 2828fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr, BT_TRANSPORT_BR_EDR); 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->timestamp = btm_cb.dev_rec_count++; 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_dev_rec); 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_free_dev 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Mark device record as not used 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_free_dev (tBTM_SEC_DEV_REC *p_dev_rec) 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 29865f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov p_dev_rec->bond_type = BOND_TYPE_UNKNOWN; 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags = 0; 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Clear out any saved BLE keys */ 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_clear_ble_keys (p_dev_rec); 304f3052eb33890b3f5f5ce5a25914bf208420b80dfNitin Arora /* clear the ble block */ 305f3052eb33890b3f5f5ce5a25914bf208420b80dfNitin Arora memset(&p_dev_rec->ble, 0, sizeof(tBTM_SEC_BLE)); 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_dev_support_switch 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the L2CAP to check if remote 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** device supports role switch 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if device is known and role switch is supported 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_dev_support_switch (BD_ADDR bd_addr) 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 xx; 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN feature_empty = TRUE; 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SCO_INCLUDED == TRUE 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Role switch is not allowed if a SCO is up */ 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_is_sco_active_by_bdaddr(bd_addr)) 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev (bd_addr); 33530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (p_dev_rec && controller_get_interface()->supports_master_slave_role_switch()) 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3373aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach if (HCI_SWITCH_SUPPORTED(p_dev_rec->features[HCI_EXT_FEATURES_PAGE_0])) 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 33983c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_DEBUG("btm_dev_support_switch return TRUE (feature found)"); 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (TRUE); 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the feature field is all zero, we never received them */ 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0 ; xx < BD_FEATURES_LEN ; xx++) 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3463aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach if (p_dev_rec->features[HCI_EXT_FEATURES_PAGE_0][xx] != 0x00) 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project feature_empty = FALSE; /* at least one is != 0 */ 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we don't know peer's capabilities, assume it supports Role-switch */ 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (feature_empty) 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 35683c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_DEBUG("btm_dev_support_switch return TRUE (feature empty)"); 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (TRUE); 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36183c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_DEBUG("btm_dev_support_switch return FALSE"); 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 365cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowskibool is_handle_equal(void *data, void *context) 366cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski{ 367cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski tBTM_SEC_DEV_REC *p_dev_rec = data; 368cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski UINT16 *handle = context; 369cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 370cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if (p_dev_rec->hci_handle == *handle 371cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski#if BLE_INCLUDED == TRUE 372cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski || p_dev_rec->ble_hci_handle == *handle 373cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski#endif 374cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski ) 375cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return false; 376cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 377cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return true; 378cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski} 379cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_find_dev_by_handle 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the record in the device database for the record 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with specified handle 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_find_dev_by_handle (UINT16 handle) 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 392cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski list_node_t *n = list_foreach(btm_cb.sec_dev_rec, is_handle_equal, &handle); 393cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if (n) 394cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return list_node(n); 395c9f86da73bfb637426c83b86497c50fede4e0f63Jakub Pawlowski 396cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return NULL; 397cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski} 398cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 399cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowskibool is_address_equal(void *data, void *context) 400cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski{ 401cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski tBTM_SEC_DEV_REC *p_dev_rec = data; 402cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski BD_ADDR *bd_addr = context; 403cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 404cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if (!memcmp (p_dev_rec->bd_addr, *bd_addr, BD_ADDR_LEN)) 405cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return false; 4067db2548c0346c1d33a46cc35b250e71fd24adae4Andre Eisenbach#if BLE_INCLUDED == TRUE 407cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski // If a LE random address is looking for device record 408cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if (!memcmp(p_dev_rec->ble.pseudo_addr, *bd_addr, BD_ADDR_LEN)) 409cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return false; 410cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 411cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if (btm_ble_addr_resolvable(*bd_addr, p_dev_rec)) 412cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return false; 4137db2548c0346c1d33a46cc35b250e71fd24adae4Andre Eisenbach#endif 414cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return true; 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_find_dev 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the record in the device database for the record 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with specified BD address 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 427e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing SuntBTM_SEC_DEV_REC *btm_find_dev(BD_ADDR bd_addr) 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 429cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if (!bd_addr) 430cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return NULL; 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 432cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski list_node_t *n = list_foreach(btm_cb.sec_dev_rec, is_address_equal, bd_addr); 433cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if (n) 434cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return list_node(n); 4357db2548c0346c1d33a46cc35b250e71fd24adae4Andre Eisenbach 436cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return NULL; 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 441e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun** Function btm_consolidate_dev 442cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski5** 443e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun** Description combine security records if identified as same peer 444e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun** 445e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun** Returns none 446e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun** 447e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun*******************************************************************************/ 448e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sunvoid btm_consolidate_dev(tBTM_SEC_DEV_REC *p_target_rec) 449e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun{ 4501287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#if BLE_INCLUDED == TRUE 451e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun tBTM_SEC_DEV_REC temp_rec = *p_target_rec; 452e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 453e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BTM_TRACE_DEBUG("%s", __func__); 454e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 455cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski list_node_t *end = list_end(btm_cb.sec_dev_rec); 456cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski for (list_node_t *node = list_begin(btm_cb.sec_dev_rec); node != end; node = list_next(node)) { 457cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski tBTM_SEC_DEV_REC *p_dev_rec = list_node(node); 458cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 459cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if (p_target_rec == p_dev_rec) 460cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski continue; 461cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 462cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if (!memcmp (p_dev_rec->bd_addr, p_target_rec->bd_addr, BD_ADDR_LEN)) 463c9f86da73bfb637426c83b86497c50fede4e0f63Jakub Pawlowski { 464cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski memcpy(p_target_rec, p_dev_rec, sizeof(tBTM_SEC_DEV_REC)); 465cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski p_target_rec->ble = temp_rec.ble; 466cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski p_target_rec->ble_hci_handle = temp_rec.ble_hci_handle; 467cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski p_target_rec->enc_key_size = temp_rec.enc_key_size; 468cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski p_target_rec->conn_params = temp_rec.conn_params; 469cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski p_target_rec->device_type |= temp_rec.device_type; 470cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski p_target_rec->sec_flags |= temp_rec.sec_flags; 471cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 472cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski p_target_rec->new_encryption_key_is_p256 = temp_rec.new_encryption_key_is_p256; 473cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski p_target_rec->no_smp_on_br = temp_rec.no_smp_on_br; 474cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski p_target_rec->bond_type = temp_rec.bond_type; 475cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 476cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski /* remove the combined record */ 477cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski list_remove(btm_cb.sec_dev_rec, p_dev_rec); 478cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 479cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski p_dev_rec->bond_type = BOND_TYPE_UNKNOWN; 480cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski break; 481cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski } 4827db2548c0346c1d33a46cc35b250e71fd24adae4Andre Eisenbach 483cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski /* an RPA device entry is a duplicate of the target record */ 484cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if (btm_ble_addr_resolvable(p_dev_rec->bd_addr, p_target_rec)) 485cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski { 486cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if (memcmp(p_target_rec->ble.pseudo_addr, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0) 4877db2548c0346c1d33a46cc35b250e71fd24adae4Andre Eisenbach { 488cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski p_target_rec->ble.ble_addr_type = p_dev_rec->ble.ble_addr_type; 489cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski p_target_rec->device_type |= p_dev_rec->device_type; 490cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 491cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski /* remove the combined record */ 492cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski list_remove(btm_cb.sec_dev_rec, p_dev_rec); 493cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 494cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski p_dev_rec->bond_type = BOND_TYPE_UNKNOWN; 495e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 496cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski break; 497e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 498e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 4991287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#endif 500e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun} 501e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 502e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun/******************************************************************************* 503e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun** 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_find_or_alloc_dev 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the record in the device database for the record 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with specified BD address 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_find_or_alloc_dev (BD_ADDR bd_addr) 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 51583c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_EVENT ("btm_find_or_alloc_dev"); 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL) 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Allocate a new device record or reuse the oldest one */ 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_sec_alloc_dev (bd_addr); 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_dev_rec); 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_find_oldest_dev 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Locates the oldest device in use. It first looks for 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the oldest non-paired device. If all devices are paired it 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** deletes the oldest paired device. 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5338fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta** Returns Pointer to the record or NULL 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_find_oldest_dev (void) 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 538cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski tBTM_SEC_DEV_REC *p_oldest = NULL; 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 ot = 0xFFFFFFFF; 540cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski tBTM_SEC_DEV_REC *p_oldest_paired = NULL; 541cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski UINT32 ot_paired = 0xFFFFFFFF; 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* First look for the non-paired devices for the oldest entry */ 544cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski list_node_t *end = list_end(btm_cb.sec_dev_rec); 545cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski for (list_node_t *node = list_begin(btm_cb.sec_dev_rec); node != end; node = list_next(node)) { 546cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski tBTM_SEC_DEV_REC *p_dev_rec = list_node(node); 547cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski /* Device is not paired */ 548cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if ((p_dev_rec->sec_flags & (BTM_SEC_LINK_KEY_KNOWN |BTM_SEC_LE_LINK_KEY_KNOWN)) == 0) { 549cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if (p_dev_rec->timestamp < ot) { 550cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski p_oldest = p_dev_rec; 551cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski ot = p_dev_rec->timestamp; 552cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski } 553cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski continue; 554cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski } 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 556cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if (p_dev_rec->timestamp < ot_paired) { 557cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski p_oldest_paired = p_dev_rec; 558cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski ot_paired = p_dev_rec->timestamp; 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 560cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 563cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski /* if non-paired device return oldest */ 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ot != 0xFFFFFFFF) 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_oldest); 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 567cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski /* only paired devices present, return oldest */ 568cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return p_oldest_paired; 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57165f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov/******************************************************************************* 57265f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov** 57365f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov** Function btm_get_bond_type_dev 57465f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov** 57565f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov** Description Get the bond type for a device in the device database 57665f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov** with specified BD address 57765f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov** 57865f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov** Returns The device bond type if known, otherwise BOND_TYPE_UNKNOWN 57965f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov** 58065f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov*******************************************************************************/ 58165f9c04aa36af5379ba3a28dba36a5de16686024Pavlin RadoslavovtBTM_BOND_TYPE btm_get_bond_type_dev(BD_ADDR bd_addr) 58265f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov{ 58365f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev(bd_addr); 58465f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov 58565f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov if (p_dev_rec == NULL) 58665f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov return BOND_TYPE_UNKNOWN; 58765f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov 58865f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov return p_dev_rec->bond_type; 58965f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov} 59065f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov 59165f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov/******************************************************************************* 59265f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov** 59365f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov** Function btm_set_bond_type_dev 59465f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov** 59565f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov** Description Set the bond type for a device in the device database 59665f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov** with specified BD address 59765f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov** 59865f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov** Returns TRUE on success, otherwise FALSE 59965f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov** 60065f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov*******************************************************************************/ 60165f9c04aa36af5379ba3a28dba36a5de16686024Pavlin RadoslavovBOOLEAN btm_set_bond_type_dev(BD_ADDR bd_addr, tBTM_BOND_TYPE bond_type) 60265f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov{ 60365f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev(bd_addr); 60465f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov 60565f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov if (p_dev_rec == NULL) 60665f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov return FALSE; 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60865f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov p_dev_rec->bond_type = bond_type; 60965f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov return TRUE; 61065f9c04aa36af5379ba3a28dba36a5de16686024Pavlin Radoslavov} 611