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" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcidefs.h" 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h" 382d5c3f2261c2f34023c8acfad30c9999e29131f2Nitin Arora#include "vendor_ble.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[], 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project LINK_KEY link_key, UINT8 key_type, tBTM_IO_CAP io_cap) 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 663aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach int i, j; 673aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach BOOLEAN found = FALSE; 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6983c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_API("%s, link key type:%x", __FUNCTION__,key_type); 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev (bd_addr); 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There is no device record, allocate one. 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * If we can not find an empty spot for this one, let it fail. */ 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++) 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE)) 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = &btm_cb.sec_dev_rec[i]; 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Mark this record as in use and initialize */ 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (p_dev_rec, 0, sizeof (tBTM_SEC_DEV_REC)); 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags = BTM_SEC_IN_USE; 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN); 858fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr, BT_TRANSPORT_BR_EDR); 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use default value for background connection params */ 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update conn params, use default value for background connection params */ 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&p_dev_rec->conn_params, 0xff, sizeof(tBTM_LE_CONN_PRAMS)); 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->timestamp = btm_cb.dev_rec_count++; 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (dev_class) 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->dev_class, dev_class, DEV_CLASS_LEN); 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_dev_rec->sec_bd_name, 0, sizeof(tBTM_BD_NAME)); 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bd_name && bd_name[0]) 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S ((char *)p_dev_rec->sec_bd_name, sizeof (p_dev_rec->sec_bd_name), 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (char *)bd_name, BTM_MAX_REM_BD_NAME_LEN); 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1143aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach p_dev_rec->num_read_pages = 0; 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (features) 1163aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 1173aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach memcpy (p_dev_rec->features, features, sizeof (p_dev_rec->features)); 1183aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach for (i = HCI_EXT_FEATURES_PAGE_MAX; i >= 0; i--) 1193aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 1203aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach for (j = 0; j < HCI_FEATURE_BYTES_PER_PAGE; j++) 1213aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 1223aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach if (p_dev_rec->features[i][j] != 0) 1233aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 1243aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach found = TRUE; 1253aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach break; 1263aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 1273aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 1283aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach if (found) 1293aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 1303aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach p_dev_rec->num_read_pages = i + 1; 1313aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach break; 1323aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 1333aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 1343aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1363aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach memset (p_dev_rec->features, 0, sizeof (p_dev_rec->features)); 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask); 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (link_key) 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14283c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_EVENT ("BTM_SecAddDevice() BDA: %02x:%02x:%02x:%02x:%02x:%02x", 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[0], bd_addr[1], bd_addr[2], 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[3], bd_addr[4], bd_addr[5]); 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN; 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->link_key, link_key, LINK_KEY_LEN); 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_type = key_type; 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTIF_MIXED_MODE_INCLUDED) && (BTIF_MIXED_MODE_INCLUDED == TRUE) 151ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (key_type < BTM_MAX_PRE_SM4_LKEY_TYPE) 152ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sm4 = BTM_SM4_KNOWN; 153ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 154ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sm4 = BTM_SM4_TRUE; 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rmt_io_caps = io_cap; 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecDeleteDevice 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Free resources associated with the device. 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - BD address of the peer 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if removed OK, FALSE if not found or ACL link is active 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SecDeleteDevice (BD_ADDR bd_addr) 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1788fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta if (BTM_IsAclConnectionUp(bd_addr, BT_TRANSPORT_LE) || BTM_IsAclConnectionUp(bd_addr, BT_TRANSPORT_BR_EDR)) 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18083c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_WARNING("BTM_SecDeleteDevice FAILED: Cannot Delete when connection is active"); 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL) 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1873313de78a750e858bea50c5bf54074c551b3137dAndre Eisenbach#if BLE_INCLUDED == TRUE && BLE_PRIVACY_SPT == TRUE 1882d5c3f2261c2f34023c8acfad30c9999e29131f2Nitin Arora btm_ble_vendor_irk_list_remove_dev(p_dev_rec); 1893313de78a750e858bea50c5bf54074c551b3137dAndre Eisenbach#endif 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_free_dev (p_dev_rec); 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Tell controller to get rid of the link key if it has one stored */ 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_DeleteStoredLinkKey (bd_addr, NULL); 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecReadDevName 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Looks for the device name in the security database for the 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** specified BD address. 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the name or NULL 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectchar *BTM_SecReadDevName (BD_ADDR bd_addr) 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p_name = NULL; 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_srec; 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_srec = btm_find_dev(bd_addr)) != NULL) 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_name = (char *)p_srec->sec_bd_name; 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_name); 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_alloc_dev 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the record in the device database for the record 2248fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta** with specified address 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2268fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta** Returns Pointer to the record or NULL 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_sec_alloc_dev (BD_ADDR bd_addr) 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = NULL; 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_INQ_INFO *p_inq_info; 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 234c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta DEV_CLASS old_cod; 235c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta int i_new_entry = BTM_SEC_MAX_DEVICE_RECORDS; 236c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta int i_old_entry = BTM_SEC_MAX_DEVICE_RECORDS; 23783c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_alloc_dev"); 238c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta 239c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++) 240c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta { 241c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta /* look for old entry where device details are present */ 242c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE) && 243c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta (!memcmp (btm_cb.sec_dev_rec[i].bd_addr, bd_addr, BD_ADDR_LEN))) 244c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta { 245c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta i_old_entry = i; 246c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta BTM_TRACE_EVENT ("btm_sec_alloc_dev old device found"); 247c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta break; 248c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta } 249c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta } 250c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++) 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE)) 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 255c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta i_new_entry = i; 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 260c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta if (i_new_entry == BTM_SEC_MAX_DEVICE_RECORDS) { 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_oldest_dev(); 262c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta } 263c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta else { 264c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta /* if the old device entry not present go with 265c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta new entry */ 266c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta if(i_old_entry == BTM_SEC_MAX_DEVICE_RECORDS) { 267c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta p_dev_rec = &btm_cb.sec_dev_rec[i_new_entry]; 268c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta } 269c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta else { 270c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta p_dev_rec = &btm_cb.sec_dev_rec[i_old_entry]; 271c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta memcpy (old_cod, p_dev_rec->dev_class, DEV_CLASS_LEN); 272c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta } 273c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta } 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (p_dev_rec, 0, sizeof (tBTM_SEC_DEV_REC)); 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 276c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta /* Retain the old COD for device */ 277c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta if(i_old_entry != BTM_SEC_MAX_DEVICE_RECORDS) { 278c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta BTM_TRACE_EVENT ("btm_sec_alloc_dev restoring cod "); 279c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta memcpy (p_dev_rec->dev_class, old_cod, DEV_CLASS_LEN); 280c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta 281c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta } 282c8fe2925af4f5b167b615a0677adebbd156a4387Hemant Gupta 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags = BTM_SEC_IN_USE; 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check with the BT manager if details about remote device are known */ 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* outgoing connection */ 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_inq_info = BTM_InqDbRead(bd_addr)) != NULL) 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->dev_class, p_inq_info->results.dev_class, DEV_CLASS_LEN); 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->device_type = p_inq_info->results.device_type; 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->ble.ble_addr_type = p_inq_info->results.ble_addr_type; 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update conn params, use default value for background connection params */ 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&p_dev_rec->conn_params, 0xff, sizeof(tBTM_LE_CONN_PRAMS)); 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_INQ_GET_REMOTE_NAME == TRUE 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_inq_info->remote_name_state == BTM_INQ_RMT_NAME_DONE) 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S ((char *)p_dev_rec->sec_bd_name, sizeof (p_dev_rec->sec_bd_name), 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (char *)p_inq_info->remote_name, BTM_MAX_REM_BD_NAME_LEN); 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update conn params, use default value for background connection params */ 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&p_dev_rec->conn_params, 0xff, sizeof(tBTM_LE_CONN_PRAMS)); 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!memcmp (bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN)) 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN); 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN); 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3218fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta#if BLE_INCLUDED == TRUE 3228fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p_dev_rec->ble_hci_handle = BTM_GetHCIConnHandle (bd_addr, BT_TRANSPORT_LE); 3238fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta#endif 3248fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr, BT_TRANSPORT_BR_EDR); 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->timestamp = btm_cb.dev_rec_count++; 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_dev_rec); 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_free_dev 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Mark device record as not used 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_free_dev (tBTM_SEC_DEV_REC *p_dev_rec) 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags = 0; 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Clear out any saved BLE keys */ 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_clear_ble_keys (p_dev_rec); 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_dev_support_switch 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the L2CAP to check if remote 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** device supports role switch 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if device is known and role switch is supported 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_dev_support_switch (BD_ADDR bd_addr) 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 xx; 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN feature_empty = TRUE; 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SCO_INCLUDED == TRUE 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Role switch is not allowed if a SCO is up */ 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_is_sco_active_by_bdaddr(bd_addr)) 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev (bd_addr); 3743aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach if (p_dev_rec && HCI_SWITCH_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0])) 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3763aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach if (HCI_SWITCH_SUPPORTED(p_dev_rec->features[HCI_EXT_FEATURES_PAGE_0])) 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37883c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_DEBUG("btm_dev_support_switch return TRUE (feature found)"); 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (TRUE); 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the feature field is all zero, we never received them */ 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0 ; xx < BD_FEATURES_LEN ; xx++) 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3853aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach if (p_dev_rec->features[HCI_EXT_FEATURES_PAGE_0][xx] != 0x00) 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project feature_empty = FALSE; /* at least one is != 0 */ 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we don't know peer's capabilities, assume it supports Role-switch */ 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (feature_empty) 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39583c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_DEBUG("btm_dev_support_switch return TRUE (feature empty)"); 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (TRUE); 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40083c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_DEBUG("btm_dev_support_switch return FALSE"); 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_find_dev_by_handle 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the record in the device database for the record 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with specified handle 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_find_dev_by_handle (UINT16 handle) 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0]; 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE) 4228fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta && ((p_dev_rec->hci_handle == handle) 4238fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta#if BLE_INCLUDED == TRUE 4248fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta ||(p_dev_rec->ble_hci_handle == handle) 4258fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta#endif 4268fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta )) 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_dev_rec); 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(NULL); 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_find_dev 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the record in the device database for the record 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with specified BD address 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_find_dev (BD_ADDR bd_addr) 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0]; 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bd_addr) 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE) 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (!memcmp (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN))) 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_dev_rec); 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(NULL); 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_find_or_alloc_dev 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the record in the device database for the record 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with specified BD address 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_find_or_alloc_dev (BD_ADDR bd_addr) 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 47283c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_EVENT ("btm_find_or_alloc_dev"); 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL) 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Allocate a new device record or reuse the oldest one */ 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_sec_alloc_dev (bd_addr); 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_dev_rec); 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_find_oldest_dev 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Locates the oldest device in use. It first looks for 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the oldest non-paired device. If all devices are paired it 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** deletes the oldest paired device. 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4908fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta** Returns Pointer to the record or NULL 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_find_oldest_dev (void) 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0]; 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_oldest = p_dev_rec; 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 ot = 0xFFFFFFFF; 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* First look for the non-paired devices for the oldest entry */ 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_dev_rec->sec_flags & BTM_SEC_IN_USE) == 0) 5048fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta || ((p_dev_rec->sec_flags & (BTM_SEC_LINK_KEY_KNOWN |BTM_SEC_LE_LINK_KEY_KNOWN)) != 0)) 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project continue; /* Device is paired so skip it */ 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->timestamp < ot) 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_oldest = p_dev_rec; 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ot = p_dev_rec->timestamp; 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ot != 0xFFFFFFFF) 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_oldest); 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* All devices are paired; find the oldest */ 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = &btm_cb.sec_dev_rec[0]; 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE) == 0) 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project continue; 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->timestamp < ot) 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_oldest = p_dev_rec; 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ot = p_dev_rec->timestamp; 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_oldest); 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 534