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