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