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