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 BLE address management.
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h"
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h"
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "smp_api.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #define BTM_BLE_PRIVATE_ADDR_INT    900             /* 15 minutes minimum for random address refreshing */
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_gen_resolve_paddr_cmpl
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This is callback functioin when resolvable private address
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  generation is complete.
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_gen_resolve_paddr_cmpl(tSMP_ENC *p)
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_LE_RANDOM_CB *p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB  *p_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT0 ("btm_gen_resolve_paddr_cmpl");
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p && p->param_buf)
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* get the high bytes of the random address */
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->private_addr[2] = p->param_buf[0];
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->private_addr[1] = p->param_buf[1];
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->private_addr[0] = p->param_buf[2];
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* mask off the 1st MSB */
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->private_addr[0] &= 0xfe;
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* set the 2nd MSB to be 1 */
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->private_addr[0] |= 0x02;
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* set it to controller */
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_ble_set_random_addr(p_cb->private_addr);
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq_cb->own_addr_type = BLE_ADDR_RANDOM;
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* start a periodical timer to refresh random addr */
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_stop_timer(&p_cb->raddr_timer_ent);
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_cb->raddr_timer_ent, BTU_TTYPE_BLE_RANDOM_ADDR,
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                         BTM_BLE_PRIVATE_ADDR_INT);
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if adv is active, restart adv with new private addr */
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_inq_cb->adv_mode == BTM_BLE_ADV_ENABLE)
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_DISABLE);
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_ble_write_adv_params (p_inq_cb->adv_interval_min,
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                             p_inq_cb->adv_interval_max,
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                             p_inq_cb->evt_type,
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                             p_inq_cb->own_addr_type,
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                             p_inq_cb->direct_bda.type,
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                             p_inq_cb->direct_bda.bda,
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                             p_inq_cb->adv_chnl_map,
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                             p_inq_cb->afp);
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* random address set failure */
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG0("set random address failed");
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_gen_resolve_paddr_low
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when random address has generate the
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  random number base for low 3 byte bd address.
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_gen_resolve_paddr_low(tBTM_RAND_ENC *p)
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE)
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_LE_RANDOM_CB *p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_ENC    output;
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT0 ("btm_gen_resolve_paddr_low");
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p && p->param_buf)
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->private_addr[5] = p->param_buf[0];
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->private_addr[4] = p->param_buf[1];
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->private_addr[3] = p->param_buf[2];
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* encrypt with ur IRK */
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!SMP_Encrypt(btm_cb.devcb.id_keys.irk, BT_OCTET16_LEN, p->param_buf, 3, &output))
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_gen_resolve_paddr_cmpl(NULL);
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_gen_resolve_paddr_cmpl(&output);
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_gen_resolvable_private_addr
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function generate a resolvable private address.
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_gen_resolvable_private_addr (void)
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT0 ("btm_gen_resolvable_private_addr");
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* generate 3B rand as BD LSB, SRK with it, get BD MSB */
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!btsnd_hcic_ble_rand((void *)btm_gen_resolve_paddr_low))
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_gen_resolve_paddr_cmpl(NULL);
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_gen_non_resolve_paddr_cmpl
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This is the callback function when non-resolvable private
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  function is generated and write to controller.
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_gen_non_resolve_paddr_cmpl(tBTM_RAND_ENC *p)
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_LE_RANDOM_CB *p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *pp;
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT0 ("btm_gen_non_resolve_paddr_cmpl");
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p && p->param_buf)
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pp = p->param_buf;
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_BDADDR(p_cb->private_addr, pp);
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* mask off the 2 MSB */
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->private_addr[0] &= 0xfc;
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* write to controller */
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_ble_set_random_addr(p_cb->private_addr);
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.ble_ctr_cb.inq_var.own_addr_type = BLE_ADDR_RANDOM;
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG0("btm_gen_non_resolvable_private_addr failed");
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_gen_non_resolvable_private_addr
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function generate a non-resolvable private address.
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_gen_non_resolvable_private_addr (void)
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT0 ("btm_gen_non_resolvable_private_addr");
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!btsnd_hcic_ble_rand((void *)btm_gen_non_resolve_paddr_cmpl))
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_gen_non_resolve_paddr_cmpl(NULL);
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #if SMP_INCLUDED == TRUE
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Utility functions for Random address resolving
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_resolve_address_cmpl
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function sends the random address resolving complete
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  callback.
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_resolve_address_cmpl(void)
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_LE_RANDOM_CB   *p_mgnt_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC    *p_dev_rec = NULL;
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT0 ("btm_ble_resolve_address_cmpl");
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_mgnt_cb->index < BTM_SEC_MAX_DEVICE_RECORDS)
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec = &btm_cb.sec_dev_rec[p_mgnt_cb->index];
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_mgnt_cb->busy = FALSE;
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    (* p_mgnt_cb->p_resolve_cback)(p_dev_rec, p_mgnt_cb->p);
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_proc_resolve_x
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function compares the X with random address 3 MSO bytes
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  to find a match, if not match, continue for next record.
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_ble_proc_resolve_x(tSMP_ENC *p)
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_LE_RANDOM_CB   *p_mgnt_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    comp[3];
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT0 ("btm_ble_proc_resolve_x");
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* compare the hash with 3 LSB of bd address */
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    comp[0] = p_mgnt_cb->random_bda[5];
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    comp[1] = p_mgnt_cb->random_bda[4];
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    comp[2] = p_mgnt_cb->random_bda[3];
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p && p->param_buf)
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!memcmp(p->param_buf, &comp[0], 3))
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* match is found */
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_TRACE_EVENT0 ("match is found");
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_ble_resolve_address_cmpl();
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return TRUE;
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return FALSE;
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_match_random_bda
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function match the random address to the appointed device
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  record, starting from calculating IRK. If record index exceed
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the maximum record number, matching failed and send callback.
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_ble_match_random_bda(UINT16 rec_index)
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE)
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC    *p_dev_rec;
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_LE_RANDOM_CB   *p_mgnt_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       rand[3];
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSMP_ENC    output;
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* use the 3 MSB of bd address as prand */
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    rand[0] = p_mgnt_cb->random_bda[2];
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    rand[1] = p_mgnt_cb->random_bda[1];
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    rand[2] = p_mgnt_cb->random_bda[0];
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT1("btm_ble_match_random_bda rec_index = %d", rec_index);
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (rec_index < BTM_SEC_MAX_DEVICE_RECORDS)
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec = &btm_cb.sec_dev_rec[rec_index];
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_ERROR2("sec_flags = %02x device_type = %d", p_dev_rec->sec_flags, p_dev_rec->device_type);
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_dev_rec->device_type == BT_DEVICE_TYPE_BLE) &&
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (p_dev_rec->ble.key_type & BTM_LE_KEY_PID))
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* generate X = E irk(R0, R1, R2) and R is random address 3 LSO */
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            SMP_Encrypt(p_dev_rec->ble.keys.irk, BT_OCTET16_LEN,
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        &rand[0], 3, &output);
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return btm_ble_proc_resolve_x(&output);
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            // not completed
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return FALSE;
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else /* no  match found */
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_ble_resolve_address_cmpl();
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return TRUE;
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
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** Function         btm_ble_resolve_random_addr
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to resolve a random address.
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer to the security record of the device whom a random
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  address is matched to.
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_resolve_random_addr(BD_ADDR random_bda, tBTM_BLE_RESOLVE_CBACK * p_cback, void *p)
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_LE_RANDOM_CB   *p_mgnt_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT0 ("btm_ble_resolve_random_addr");
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( !p_mgnt_cb->busy)
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mgnt_cb->p = p;
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mgnt_cb->busy = TRUE;
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mgnt_cb->index = 0;
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mgnt_cb->p_resolve_cback = p_cback;
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(p_mgnt_cb->random_bda, random_bda, BD_ADDR_LEN);
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* start to resolve random address */
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* check for next security record */
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        while (TRUE)
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_ble_match_random_bda(p_mgnt_cb->index++))
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                // match found or went through the list
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_cback)(NULL, p);
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #endif
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  address mapping between pseudo address and real connection address
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_map_bda_to_conn_bda
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function map a BD address to the real connection address
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  and return the connection address type.
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBLE_ADDR_TYPE btm_ble_map_bda_to_conn_bda(BD_ADDR bd_addr)
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC    *p_dev_rec = NULL;
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT0 ("btm_ble_map_bda_to_conn_bda");
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL &&
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->device_type == BT_DEVICE_TYPE_BLE)
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->ble.ble_addr_type != BLE_ADDR_PUBLIC)
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy(bd_addr, p_dev_rec->ble.static_addr, BD_ADDR_LEN);
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return p_dev_rec->ble.ble_addr_type;
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BLE_ADDR_PUBLIC;
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_map_bda_to_pseudo_bda
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function map a BD address to a pseudo address when the
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  address given is a random address.
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_map_bda_to_pseudo_bda(BD_ADDR bd_addr)
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT0 ("btm_ble_map_bda_to_pseudo_bda");
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
384