16ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/****************************************************************************** 26ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 36ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Copyright (C) 1999-2012 Broadcom Corporation 46ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 56ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Licensed under the Apache License, Version 2.0 (the "License"); 66ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * you may not use this file except in compliance with the License. 76ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * You may obtain a copy of the License at: 86ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 96ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * http://www.apache.org/licenses/LICENSE-2.0 106ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 116ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Unless required by applicable law or agreed to in writing, software 126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * distributed under the License is distributed on an "AS IS" BASIS, 136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * See the License for the specific language governing permissions and 156ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * limitations under the License. 166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/ 186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/****************************************************************************** 206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 216ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * This file contains functions for the Bluetooth Device Manager 226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/ 24e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 25e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <stdlib.h> 26e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <string.h> 27e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <stdio.h> 28e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <stddef.h> 29e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 30e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bt_types.h" 31e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "gki.h" 32e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "hcimsgs.h" 33e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "btu.h" 34e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "btm_api.h" 35e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "btm_int.h" 36e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "hcidefs.h" 37e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "l2c_api.h" 38e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic tBTM_SEC_DEV_REC *btm_find_oldest_dev (void); 39e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 40e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 41e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 42e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function BTM_SecAddDevice 43e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 44e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Add/modify device. This function will be normally called 45e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** during host startup to restore all required information 46e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** stored in the NVRAM. 47e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 48e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters: bd_addr - BD address of the peer 49e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** dev_class - Device Class 50e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** bd_name - Name of the peer device. NULL if unknown. 51e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** features - Remote device's supported features. NULL if not known 526ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** trusted_mask - Bitwise OR of services that do not 53e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** require authorization. (array of UINT32) 54e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** link_key - Connection link key. NULL if unknown. 55e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 56e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns TRUE if added OK, else FALSE 57e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 58e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 596ef101187774e30ddba6b46bbedef549a42196adAndre EisenbachBOOLEAN BTM_SecAddDevice (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, 60e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BD_FEATURES features, UINT32 trusted_mask[], 61e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach LINK_KEY link_key, UINT8 key_type, tBTM_IO_CAP io_cap) 62e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 63e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_SEC_DEV_REC *p_dev_rec; 64e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach int i; 65e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 66e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec = btm_find_dev (bd_addr); 67e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!p_dev_rec) 68e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 69e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* There is no device record, allocate one. 70e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach * If we can not find an empty spot for this one, let it fail. */ 71e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++) 72e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 73e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE)) 74e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 75e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec = &btm_cb.sec_dev_rec[i]; 76e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 77e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Mark this record as in use and initialize */ 78e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset (p_dev_rec, 0, sizeof (tBTM_SEC_DEV_REC)); 79e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec->sec_flags = BTM_SEC_IN_USE; 80e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN); 81e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr); 82e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 83e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BLE_INCLUDED == TRUE 84e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* use default value for background connection params */ 85e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* update conn params, use default value for background connection params */ 86e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&p_dev_rec->conn_params, 0xff, sizeof(tBTM_LE_CONN_PRAMS)); 87e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 88e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 89e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 90e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 91e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 92e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!p_dev_rec) 93e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return(FALSE); 94e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 95e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 96e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec->timestamp = btm_cb.dev_rec_count++; 97e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 98e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (dev_class) 99e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy (p_dev_rec->dev_class, dev_class, DEV_CLASS_LEN); 100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(p_dev_rec->sec_bd_name, 0, sizeof(tBTM_BD_NAME)); 102e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bd_name && bd_name[0]) 104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; 106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BCM_STRNCPY_S ((char *)p_dev_rec->sec_bd_name, sizeof (p_dev_rec->sec_bd_name), 107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (char *)bd_name, BTM_MAX_REM_BD_NAME_LEN); 108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (features) 111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy (p_dev_rec->features, features, sizeof (BD_FEATURES)); 112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset (p_dev_rec->features, 0, sizeof (BD_FEATURES)); 114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask); 116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (link_key) 118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_EVENT6 ("BTM_SecAddDevice() BDA: %02x:%02x:%02x:%02x:%02x:%02x", 120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bd_addr[0], bd_addr[1], bd_addr[2], 121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bd_addr[3], bd_addr[4], bd_addr[5]); 122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN; 123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy (p_dev_rec->link_key, link_key, LINK_KEY_LEN); 124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec->link_key_type = key_type; 125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 12795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#if defined(BTIF_MIXED_MODE_INCLUDED) && (BTIF_MIXED_MODE_INCLUDED == TRUE) 128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec->sm4 = BTM_SM4_KNOWN; 129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec->rmt_io_caps = io_cap; 132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return(TRUE); 134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function BTM_SecDeleteDevice 140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Free resources associated with the device. 142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters: bd_addr - BD address of the peer 144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns TRUE if removed OK, FALSE if not found or ACL link is active 146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 148e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachBOOLEAN BTM_SecDeleteDevice (BD_ADDR bd_addr) 149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_SEC_DEV_REC *p_dev_rec; 151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (BTM_IsAclConnectionUp(bd_addr)) 153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_WARNING0("BTM_SecDeleteDevice FAILED: Cannot Delete when connection is active"); 155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return(FALSE); 156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL) 159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return(FALSE); 160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_sec_free_dev (p_dev_rec); 162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Tell controller to get rid of the link key if it has one stored */ 164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_DeleteStoredLinkKey (bd_addr, NULL); 165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return(TRUE); 167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function BTM_SecReadDevName 172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Looks for the device name in the security database for the 174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** specified BD address. 175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns Pointer to the name or NULL 177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachchar *BTM_SecReadDevName (BD_ADDR bd_addr) 180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach char *p_name = NULL; 182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_SEC_DEV_REC *p_srec; 183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_srec = btm_find_dev(bd_addr)) != NULL) 185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_name = (char *)p_srec->sec_bd_name; 186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return(p_name); 188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_sec_alloc_dev 193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1946ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description Look for the record in the device database for the record 195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** with specified handle 196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns Pointer to the record or NULL 198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 200e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBTM_SEC_DEV_REC *btm_sec_alloc_dev (BD_ADDR bd_addr) 201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_SEC_DEV_REC *p_dev_rec = NULL; 203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_INQ_INFO *p_inq_info; 204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach int i; 205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_EVENT0 ("btm_sec_alloc_dev"); 206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++) 207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!(btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE)) 209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec = &btm_cb.sec_dev_rec[i]; 211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!p_dev_rec) 216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec = btm_find_oldest_dev(); 217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset (p_dev_rec, 0, sizeof (tBTM_SEC_DEV_REC)); 219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec->sec_flags = BTM_SEC_IN_USE; 221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Check with the BT manager if details about remote device are known */ 223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* outgoing connection */ 224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_inq_info = BTM_InqDbRead(bd_addr)) != NULL) 225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy (p_dev_rec->dev_class, p_inq_info->results.dev_class, DEV_CLASS_LEN); 227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BLE_INCLUDED == TRUE 229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec->device_type = p_inq_info->results.device_type; 230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec->ble.ble_addr_type = p_inq_info->results.ble_addr_type; 231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* update conn params, use default value for background connection params */ 233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&p_dev_rec->conn_params, 0xff, sizeof(tBTM_LE_CONN_PRAMS)); 234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BTM_INQ_GET_REMOTE_NAME == TRUE 237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_inq_info->remote_name_state == BTM_INQ_RMT_NAME_DONE) 238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BCM_STRNCPY_S ((char *)p_dev_rec->sec_bd_name, sizeof (p_dev_rec->sec_bd_name), 240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (char *)p_inq_info->remote_name, BTM_MAX_REM_BD_NAME_LEN); 241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; 242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BLE_INCLUDED == TRUE 248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec->device_type = BT_DEVICE_TYPE_BREDR; /* initialize it as BR/EDR device */ 249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* update conn params, use default value for background connection params */ 250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&p_dev_rec->conn_params, 0xff, sizeof(tBTM_LE_CONN_PRAMS)); 251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!memcmp (bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN)) 254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN); 255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN); 258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr); 260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec->timestamp = btm_cb.dev_rec_count++; 261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return(p_dev_rec); 263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_sec_free_dev 269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Mark device record as not used 271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_sec_free_dev (tBTM_SEC_DEV_REC *p_dev_rec) 274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec->sec_flags = 0; 276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BLE_INCLUDED == TRUE 278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Clear out any saved BLE keys */ 279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_sec_clear_ble_keys (p_dev_rec); 280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_dev_support_switch 288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is called by the L2CAP to check if remote 290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** device supports role switch 291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters: bd_addr - Address of the peer device 293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns TRUE if device is known and role switch is supported 295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 297e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachBOOLEAN btm_dev_support_switch (BD_ADDR bd_addr) 298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_SEC_DEV_REC *p_dev_rec; 300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 xx; 301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN feature_empty = TRUE; 302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BTM_SCO_INCLUDED == TRUE 304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Role switch is not allowed if a SCO is up */ 305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (btm_is_sco_active_by_bdaddr(bd_addr)) 306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return(FALSE); 307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec = btm_find_dev (bd_addr); 309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_dev_rec && HCI_SWITCH_SUPPORTED(btm_cb.devcb.local_features)) 310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (HCI_SWITCH_SUPPORTED(p_dev_rec->features)) 312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_DEBUG0("btm_dev_support_switch return TRUE (feature found)"); 314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (TRUE); 315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* If the feature field is all zero, we never received them */ 318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (xx = 0 ; xx < BD_FEATURES_LEN ; xx++) 319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_dev_rec->features[xx] != 0x00) 321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 322e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach feature_empty = FALSE; /* at least one is != 0 */ 323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3266ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* If we don't know peer's capabilities, assume it supports Role-switch */ 328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (feature_empty) 329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_DEBUG0("btm_dev_support_switch return TRUE (feature empty)"); 331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (TRUE); 332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_DEBUG0("btm_dev_support_switch return FALSE"); 336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return(FALSE); 337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_find_dev_by_handle 342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3436ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description Look for the record in the device database for the record 344e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** with specified handle 345e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 346e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns Pointer to the record or NULL 347e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 349e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBTM_SEC_DEV_REC *btm_find_dev_by_handle (UINT16 handle) 350e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 351e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0]; 352e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach int i; 353e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 354e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) 355e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3566ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE) 357e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach && (p_dev_rec->hci_handle == handle)) 358e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return(p_dev_rec); 359e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 360e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return(NULL); 361e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 362e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 363e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 364e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 365e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_find_dev 366e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3676ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description Look for the record in the device database for the record 368e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** with specified BD address 369e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 370e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns Pointer to the record or NULL 371e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 372e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 373e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBTM_SEC_DEV_REC *btm_find_dev (BD_ADDR bd_addr) 374e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 375e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0]; 376e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach int i; 377e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 378e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bd_addr) 379e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 380e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) 381e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3826ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE) 383e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach && (!memcmp (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN))) 384e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return(p_dev_rec); 385e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 386e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 387e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return(NULL); 388e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 389e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 390e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 391e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 392e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_find_or_alloc_dev 393e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3946ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description Look for the record in the device database for the record 395e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** with specified BD address 396e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 397e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns Pointer to the record or NULL 398e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 399e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 400e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBTM_SEC_DEV_REC *btm_find_or_alloc_dev (BD_ADDR bd_addr) 401e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 402e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_SEC_DEV_REC *p_dev_rec; 403e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_EVENT0 ("btm_find_or_alloc_dev"); 404e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL) 405e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 406e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 407e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Allocate a new device record or reuse the oldest one */ 408e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec = btm_sec_alloc_dev (bd_addr); 409e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 410e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return(p_dev_rec); 411e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 412e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 413e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 414e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 415e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_find_oldest_dev 416e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 417e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Locates the oldest device in use. It first looks for 418e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** the oldest non-paired device. If all devices are paired it 419e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** deletes the oldest paired device. 420e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 421e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns Pointer to the record or NULL 422e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 423e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 424e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBTM_SEC_DEV_REC *btm_find_oldest_dev (void) 425e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 426e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0]; 427e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_SEC_DEV_REC *p_oldest = p_dev_rec; 428e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT32 ot = 0xFFFFFFFF; 429e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach int i; 430e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 431e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* First look for the non-paired devices for the oldest entry */ 432e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) 433e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4346ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if (((p_dev_rec->sec_flags & BTM_SEC_IN_USE) == 0) 435e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach || ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0)) 436e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach continue; /* Device is paired so skip it */ 437e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 438e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_dev_rec->timestamp < ot) 439e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 440e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_oldest = p_dev_rec; 441e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ot = p_dev_rec->timestamp; 442e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 443e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 444e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 445e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (ot != 0xFFFFFFFF) 446e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return(p_oldest); 447e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 448e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* All devices are paired; find the oldest */ 449e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec = &btm_cb.sec_dev_rec[0]; 450e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) 451e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 452e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE) == 0) 453e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach continue; 454e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 455e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_dev_rec->timestamp < ot) 456e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 457e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_oldest = p_dev_rec; 458e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ot = p_dev_rec->timestamp; 459e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 460e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 461e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return(p_oldest); 462e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 463e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 464e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 465