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" 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_DEV_REC *btm_find_oldest_dev (void); 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecAddDevice 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Add/modify device. This function will be normally called 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** during host startup to restore all required information 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** stored in the NVRAM. 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - BD address of the peer 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** dev_class - Device Class 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bd_name - Name of the peer device. NULL if unknown. 513aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach** features - Remote device's features (up to 3 pages). NULL if not known 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** trusted_mask - Bitwise OR of services that do not 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** require authorization. (array of UINT32) 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** link_key - Connection link key. NULL if unknown. 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if added OK, else FALSE 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SecAddDevice (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, 603aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach UINT8 *features, UINT32 trusted_mask[], 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project LINK_KEY link_key, UINT8 key_type, tBTM_IO_CAP io_cap) 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 643aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach int i, j; 653aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach BOOLEAN found = FALSE; 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev (bd_addr); 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There is no device record, allocate one. 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * If we can not find an empty spot for this one, let it fail. */ 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++) 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE)) 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = &btm_cb.sec_dev_rec[i]; 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Mark this record as in use and initialize */ 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (p_dev_rec, 0, sizeof (tBTM_SEC_DEV_REC)); 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags = BTM_SEC_IN_USE; 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN); 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr); 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use default value for background connection params */ 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update conn params, use default value for background connection params */ 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&p_dev_rec->conn_params, 0xff, sizeof(tBTM_LE_CONN_PRAMS)); 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->timestamp = btm_cb.dev_rec_count++; 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (dev_class) 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->dev_class, dev_class, DEV_CLASS_LEN); 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_dev_rec->sec_bd_name, 0, sizeof(tBTM_BD_NAME)); 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bd_name && bd_name[0]) 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S ((char *)p_dev_rec->sec_bd_name, sizeof (p_dev_rec->sec_bd_name), 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (char *)bd_name, BTM_MAX_REM_BD_NAME_LEN); 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1113aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach p_dev_rec->num_read_pages = 0; 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (features) 1133aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 1143aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach memcpy (p_dev_rec->features, features, sizeof (p_dev_rec->features)); 1153aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach for (i = HCI_EXT_FEATURES_PAGE_MAX; i >= 0; i--) 1163aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 1173aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach for (j = 0; j < HCI_FEATURE_BYTES_PER_PAGE; j++) 1183aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 1193aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach if (p_dev_rec->features[i][j] != 0) 1203aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 1213aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach found = TRUE; 1223aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach break; 1233aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 1243aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 1253aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach if (found) 1263aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 1273aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach p_dev_rec->num_read_pages = i + 1; 1283aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach break; 1293aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 1303aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 1313aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1333aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach memset (p_dev_rec->features, 0, sizeof (p_dev_rec->features)); 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask); 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (link_key) 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_EVENT6 ("BTM_SecAddDevice() BDA: %02x:%02x:%02x:%02x:%02x:%02x", 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[0], bd_addr[1], bd_addr[2], 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[3], bd_addr[4], bd_addr[5]); 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN; 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->link_key, link_key, LINK_KEY_LEN); 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_type = key_type; 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTIF_MIXED_MODE_INCLUDED) && (BTIF_MIXED_MODE_INCLUDED == TRUE) 148ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (key_type < BTM_MAX_PRE_SM4_LKEY_TYPE) 149ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sm4 = BTM_SM4_KNOWN; 150ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 151ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sm4 = BTM_SM4_TRUE; 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rmt_io_caps = io_cap; 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecDeleteDevice 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Free resources associated with the device. 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - BD address of the peer 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if removed OK, FALSE if not found or ACL link is active 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SecDeleteDevice (BD_ADDR bd_addr) 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_IsAclConnectionUp(bd_addr)) 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_WARNING0("BTM_SecDeleteDevice FAILED: Cannot Delete when connection is active"); 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL) 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_free_dev (p_dev_rec); 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Tell controller to get rid of the link key if it has one stored */ 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_DeleteStoredLinkKey (bd_addr, NULL); 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecReadDevName 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Looks for the device name in the security database for the 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** specified BD address. 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the name or NULL 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectchar *BTM_SecReadDevName (BD_ADDR bd_addr) 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p_name = NULL; 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_srec; 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_srec = btm_find_dev(bd_addr)) != NULL) 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_name = (char *)p_srec->sec_bd_name; 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_name); 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_alloc_dev 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the record in the device database for the record 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with specified handle 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2203aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach** Returns Pointer to the record 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_sec_alloc_dev (BD_ADDR bd_addr) 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = NULL; 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_INQ_INFO *p_inq_info; 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_EVENT0 ("btm_sec_alloc_dev"); 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++) 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE)) 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = &btm_cb.sec_dev_rec[i]; 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_oldest_dev(); 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (p_dev_rec, 0, sizeof (tBTM_SEC_DEV_REC)); 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags = BTM_SEC_IN_USE; 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check with the BT manager if details about remote device are known */ 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* outgoing connection */ 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_inq_info = BTM_InqDbRead(bd_addr)) != NULL) 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->dev_class, p_inq_info->results.dev_class, DEV_CLASS_LEN); 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->device_type = p_inq_info->results.device_type; 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->ble.ble_addr_type = p_inq_info->results.ble_addr_type; 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update conn params, use default value for background connection params */ 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&p_dev_rec->conn_params, 0xff, sizeof(tBTM_LE_CONN_PRAMS)); 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_INQ_GET_REMOTE_NAME == TRUE 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_inq_info->remote_name_state == BTM_INQ_RMT_NAME_DONE) 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S ((char *)p_dev_rec->sec_bd_name, sizeof (p_dev_rec->sec_bd_name), 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (char *)p_inq_info->remote_name, BTM_MAX_REM_BD_NAME_LEN); 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update conn params, use default value for background connection params */ 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&p_dev_rec->conn_params, 0xff, sizeof(tBTM_LE_CONN_PRAMS)); 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!memcmp (bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN)) 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN); 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN); 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr); 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->timestamp = btm_cb.dev_rec_count++; 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_dev_rec); 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 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** Function btm_sec_free_dev 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Mark device record as not used 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_free_dev (tBTM_SEC_DEV_REC *p_dev_rec) 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags = 0; 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Clear out any saved BLE keys */ 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_clear_ble_keys (p_dev_rec); 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_dev_support_switch 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the L2CAP to check if remote 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** device supports role switch 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if device is known and role switch is supported 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_dev_support_switch (BD_ADDR bd_addr) 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 xx; 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN feature_empty = TRUE; 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SCO_INCLUDED == TRUE 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Role switch is not allowed if a SCO is up */ 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_is_sco_active_by_bdaddr(bd_addr)) 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev (bd_addr); 3313aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach if (p_dev_rec && HCI_SWITCH_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0])) 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3333aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach if (HCI_SWITCH_SUPPORTED(p_dev_rec->features[HCI_EXT_FEATURES_PAGE_0])) 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0("btm_dev_support_switch return TRUE (feature found)"); 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (TRUE); 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the feature field is all zero, we never received them */ 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0 ; xx < BD_FEATURES_LEN ; xx++) 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3423aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach if (p_dev_rec->features[HCI_EXT_FEATURES_PAGE_0][xx] != 0x00) 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project feature_empty = FALSE; /* at least one is != 0 */ 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we don't know peer's capabilities, assume it supports Role-switch */ 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (feature_empty) 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0("btm_dev_support_switch return TRUE (feature empty)"); 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (TRUE); 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0("btm_dev_support_switch return FALSE"); 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_find_dev_by_handle 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the record in the device database for the record 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with specified handle 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_find_dev_by_handle (UINT16 handle) 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0]; 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE) 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->hci_handle == handle)) 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_dev_rec); 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(NULL); 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_find_dev 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the record in the device database for the record 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with specified BD address 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_find_dev (BD_ADDR bd_addr) 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0]; 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bd_addr) 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE) 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (!memcmp (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN))) 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_dev_rec); 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(NULL); 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_find_or_alloc_dev 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the record in the device database for the record 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with specified BD address 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_find_or_alloc_dev (BD_ADDR bd_addr) 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_EVENT0 ("btm_find_or_alloc_dev"); 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL) 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Allocate a new device record or reuse the oldest one */ 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_sec_alloc_dev (bd_addr); 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_dev_rec); 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_find_oldest_dev 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Locates the oldest device in use. It first looks for 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the oldest non-paired device. If all devices are paired it 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** deletes the oldest paired device. 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4433aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach** Returns Pointer to the record 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_find_oldest_dev (void) 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0]; 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_oldest = p_dev_rec; 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 ot = 0xFFFFFFFF; 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* First look for the non-paired devices for the oldest entry */ 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_dev_rec->sec_flags & BTM_SEC_IN_USE) == 0) 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0)) 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project continue; /* Device is paired so skip it */ 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->timestamp < ot) 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_oldest = p_dev_rec; 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ot = p_dev_rec->timestamp; 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ot != 0xFFFFFFFF) 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_oldest); 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* All devices are paired; find the oldest */ 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = &btm_cb.sec_dev_rec[0]; 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE) == 0) 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project continue; 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->timestamp < ot) 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_oldest = p_dev_rec; 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ot = p_dev_rec->timestamp; 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_oldest); 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 487