15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
3a6ce7751d84218c193eb90d390aef23217b1737eWei Wang *  Copyright (C) 2008-2014 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 GAP.
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#include <stdio.h>
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stddef.h>
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h"
305cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h"
3221015a484b3fa3d7aa7cdc291b30238089d14f4eWei Wang#include "btm_ble_api.h"
3321015a484b3fa3d7aa7cdc291b30238089d14f4eWei Wang#include "btu.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (GAP_INCLUDED == TRUE)
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gap_api.h"
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham
3916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_INCLUDED == TRUE
409c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera#include "l2c_int.h"
41ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang#include "vendor_ble.h"
4216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham
43ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "gattdefs.h"
44021e17a641e61e3f139717cd755bf6f9b9b9eb12Nitin Arora#include "gatt_int.h"
45ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#include "btm_ble_int.h"
477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_BLE_NAME_SHORT                  0x01
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_BLE_NAME_CMPL                   0x02
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_BLE_FILTER_TARGET_UNKNOWN       0xff
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_BLE_POLICY_UNKNOWN              0xff
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_EXT_BLE_RMT_NAME_TIMEOUT        30
55a6ce7751d84218c193eb90d390aef23217b1737eWei Wang#define MIN_ADV_LENGTH                       2
56a6ce7751d84218c193eb90d390aef23217b1737eWei Wang
57c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Callojistatic tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
588d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Battastatic tBTM_BLE_CTRL_FEATURES_CBACK    *p_ctrl_le_feature_rd_cmpl_cback = NULL;
598d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Local functions
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_update_adv_flag(UINT8 flag);
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_process_adv_pkt_cont(BD_ADDR bda, UINT8 addr_type, UINT8 evt_type, UINT8 *p);
65a6ce7751d84218c193eb90d390aef23217b1737eWei WangUINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst,
66a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                              tBTM_BLE_ADV_DATA *p_data);
67ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic UINT8 btm_set_conn_mode_adv_init_addr(tBTM_BLE_INQ_CB *p_cb,
68ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     BD_ADDR_PTR p_addr_ptr,
69ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     tBLE_ADDR_TYPE *p_init_addr_type,
70ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     tBLE_ADDR_TYPE *p_own_addr_type);
717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic void btm_ble_stop_observe(void);
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#define BTM_BLE_INQ_RESULT          0x01
747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#define BTM_BLE_OBS_RESULT          0x02
757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#define BTM_BLE_SEL_CONN_RESULT     0x04
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/* LE states combo bit to check */
787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battaconst UINT8 btm_le_state_combo_tbl[BTM_BLE_STATE_MAX][BTM_BLE_STATE_MAX][2] =
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {/* single state support */
817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_CONN_ADV_MASK, HCI_SUPP_LE_STATES_CONN_ADV_OFF},  /* conn_adv */
827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_INIT_MASK, HCI_SUPP_LE_STATES_INIT_OFF}, /* init */
837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_INIT_MASK, HCI_SUPP_LE_STATES_INIT_OFF}, /* master */
847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_SLAVE_MASK, HCI_SUPP_LE_STATES_SLAVE_OFF}, /* slave */
857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},                   /* todo: lo du dir adv, not covered ? */
867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_OFF}, /* hi duty dir adv */
877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_NON_CONN_ADV_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_OFF},  /* non connectable adv */
887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_OFF},   /*  passive scan */
897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_OFF},  /*   active scan */
907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_SCAN_ADV_MASK, HCI_SUPP_LE_STATESSCAN_ADV_OFF}   /* scanable adv */
917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    },
927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {    /* conn_adv =0 */
937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},                                                                           /* conn_adv */
947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF},      /* init: 32 */
957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_CONN_ADV_MASTER_OFF},  /* master: 35 */
967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF}, /* slave: 38,*/
977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},                                                                           /* lo du dir adv */
987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},                                                                            /* hi duty dir adv */
997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},  /* non connectable adv */
1007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_OFF},   /*  passive scan */
1017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_OFF},  /*   active scan */
1027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0}   /* scanable adv */
1037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    },
1047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {   /* init */
1057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF},      /* conn_adv: 32 */
1067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},                                                                             /* init */
1077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_INIT_MASTER_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_OFF},          /* master 28 */
1087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF}, /* slave 41 */
1097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_OFF} ,/* lo du dir adv 34 */
1107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_OFF},     /* hi duty dir adv 33 */
1117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_NON_CONN_INIT_MASK, HCI_SUPP_LE_STATES_NON_CONN_INIT_OFF},  /*  non connectable adv */
1127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_PASS_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_INIT_OFF},   /* passive scan */
1137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_OFF},  /*  active scan */
1147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_SCAN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_INIT_OFF}   /* scanable adv */
1157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    },
1177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {   /* master */
1187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_CONN_ADV_MASTER_OFF},  /* conn_adv: 35 */
1197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_INIT_MASTER_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_OFF},          /* init 28 */
1207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_INIT_MASTER_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_OFF},          /* master 28 */
1217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF},      /* slave: 32 */
1227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_OFF},  /* lo duty cycle adv 37 */
1237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_OFF},   /* hi duty cycle adv 36 */
1247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_OFF},  /*  non connectable adv */
1257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_OFF},   /*  passive scan */
1267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_OFF},  /*   active scan */
1277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_OFF}   /*  scanable adv */
1287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    },
1307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    { /* slave */
1317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF}, /* conn_adv: 38,*/
1327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF}, /* init 41 */
1337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF}, /* master 41 */
1347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF},        /* slave: 38,*/
1357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_OFF},  /* lo duty cycle adv 40 */
1367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_OFF},   /* hi duty cycle adv 39 */
1377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_OFF},  /* non connectable adv */
1387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_OFF},   /* passive scan */
1397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_OFF},  /*  active scan */
1407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_OFF}   /* scanable adv */
1417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    },
1437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    { /* lo duty cycle adv */
1447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0}, /* conn_adv: 38,*/
1457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_OFF} ,/* init 34 */
1467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_OFF}, /* master 37 */
1477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_OFF}, /* slave: 40 */
1487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},  /* lo duty cycle adv 40 */
1497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},   /* hi duty cycle adv 39 */
1507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},  /*  non connectable adv */
1517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},   /* TODO: passive scan, not covered? */
1527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},  /* TODO:  active scan, not covered? */
1537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0}   /*  scanable adv */
1547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    },
1557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    { /* hi duty cycle adv */
1567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0}, /* conn_adv: 38,*/
1577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_OFF}, /* init 33 */
1587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_OFF}, /* master 36 */
1597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_OFF},   /* slave: 39*/
1607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},  /* lo duty cycle adv 40 */
1617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},   /* hi duty cycle adv 39 */
1627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},  /* non connectable adv */
1637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_OFF},   /* passive scan */
1647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_OFF},  /* active scan */
1657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0}   /* scanable adv */
1667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    },
1677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    { /* non connectable adv */
1687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0}, /* conn_adv: */
1697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_NON_CONN_INIT_MASK, HCI_SUPP_LE_STATES_NON_CONN_INIT_OFF}, /* init  */
1707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_OFF}, /* master  */
1717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_OFF},   /* slave: */
1727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},  /* lo duty cycle adv */
1737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},   /* hi duty cycle adv */
1747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},  /* non connectable adv */
1757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_OFF},   /* passive scan */
1767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_OFF},  /*  active scan */
1777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0}   /* scanable adv */
1787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    },
1797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    { /* passive scan */
1807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_OFF}, /* conn_adv: */
1817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_PASS_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_INIT_OFF}, /* init  */
1827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_OFF}, /* master  */
1837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_OFF},   /* slave: */
1847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},  /* lo duty cycle adv */
1857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_OFF},   /* hi duty cycle adv */
1867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_OFF},  /*  non connectable adv */
1877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},   /* passive scan */
1887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},  /* active scan */
1897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         {HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_OFF}   /* scanable adv */
1907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    },
1917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    { /* active scan */
1927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_OFF}, /* conn_adv: */
1937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_OFF}, /* init  */
1947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_OFF}, /* master  */
1957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_OFF},   /* slave: */
1967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},  /* lo duty cycle adv */
1977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_OFF},   /* hi duty cycle adv */
1987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_OFF},  /*  non connectable adv */
1997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},   /* TODO: passive scan */
2007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},  /* TODO:  active scan */
2017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_OFF}   /*  scanable adv */
2027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    },
2037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    { /* scanable adv */
2047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0}, /* conn_adv: */
2057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_SCAN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_INIT_OFF}, /* init  */
2067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_OFF}, /* master  */
2077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_OFF},   /* slave: */
2087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},  /* lo duty cycle adv */
2097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},   /* hi duty cycle adv */
2107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0},  /* non connectable adv */
2117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_OFF},   /*  passive scan */
2127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_OFF},  /*  active scan */
2137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {0, 0}   /* scanable adv */
2147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
2157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
2167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta};
2177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/* check LE combo state supported */
2187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#define BTM_LE_STATES_SUPPORTED(x, y, z)      ((x)[(z)] & (y))
2197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
2207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
221ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
222ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
223ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         BTM_BleUpdateAdvWhitelist
224ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
225ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      Add or remove device from advertising white list
226ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
227ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void
228ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
229ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
230ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN BTM_BleUpdateAdvWhitelist(BOOLEAN add_remove, BD_ADDR remote_bda)
231ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
2325cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(add_remove);
2335cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(remote_bda);
2345cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
2355cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    return FALSE;
236ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
240ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         BTM_BleUpdateAdvFilterPolicy
241ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
242ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function update the filter policy of advertiser.
243ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
244ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameter        adv_policy: advertising filter policy
245ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
246ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Return           void
247ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
248ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid BTM_BleUpdateAdvFilterPolicy(tBTM_BLE_AFP adv_policy)
249ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
250ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
251ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBLE_ADDR_TYPE   init_addr_type = BLE_ADDR_PUBLIC;
252ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BD_ADDR          p_addr_ptr= {0};
253ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8            adv_mode = p_cb->adv_mode;
254ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2555344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("BTM_BleUpdateAdvFilterPolicy");
256ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2573aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
2583aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        return;
2593aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach
260ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_cb->afp != adv_policy)
261ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
262ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_cb->afp = adv_policy;
263ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
264ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* if adv active, stop and restart */
265ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        btm_ble_stop_adv ();
266ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
267ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (p_cb->connectable_mode & BTM_BLE_CONNECTABLE)
2687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type,
2697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                              &p_cb->adv_addr_type);
270ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min :
2727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                         BTM_BLE_GAP_ADV_SLOW_INT),
2737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                         (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max :
2747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                         BTM_BLE_GAP_ADV_SLOW_INT),
275ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                         p_cb->evt_type,
276ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                         p_cb->adv_addr_type,
277ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                         init_addr_type,
278ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                         p_addr_ptr,
279ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                         p_cb->adv_chnl_map,
280ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                         p_cb->afp);
281ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
282ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (adv_mode == BTM_BLE_ADV_ENABLE)
283ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            btm_ble_start_adv ();
284ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
285ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
286ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
287ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
288ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleObserve
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This procedure keep the device listening for advertising
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  events from a broadcast device.
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       start: start or stop observe.
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  white_list: use white list in observer mode or not.
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_BleObserve(BOOLEAN start, UINT8 duration,
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           tBTM_INQ_RESULTS_CB *p_results_cb, tBTM_CMPL_CB *p_cmpl_cb)
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
3047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTM_STATUS     status = BTM_WRONG_MODE;
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3065344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("BTM_BleObserve : scan_type:%d",btm_cb.btm_inq_vars.scan_type);
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3083aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
3093aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        return BTM_ILLEGAL_VALUE;
3103aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (start)
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
313ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* shared inquiry database, do not allow observe if any inquiry is active */
3147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
3150830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora        {
3165344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_ERROR("Observe Already Active");
3177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            return status;
3180830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora        }
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_cb.ble_ctr_cb.p_obs_results_cb = p_results_cb;
3217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_cb.ble_ctr_cb.p_obs_cmpl_cb = p_cmpl_cb;
3227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        status = BTM_CMD_STARTED;
3237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
3247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        /* scan is not started */
3257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (!BTM_BLE_IS_SCAN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
3267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
3277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_inq->scan_type = (p_inq->scan_type == BTM_BLE_SCAN_MODE_NONE) ? BTM_BLE_SCAN_MODE_ACTI: p_inq->scan_type;
3287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            /* allow config scanning type */
3297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btsnd_hcic_ble_set_scan_params (p_inq->scan_type,
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            (UINT16)(!p_inq->scan_interval ? BTM_BLE_GAP_DISC_SCAN_INT : p_inq->scan_interval),
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            (UINT16)(!p_inq->scan_window ? BTM_BLE_GAP_DISC_SCAN_WIN : p_inq->scan_window),
3327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                            btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,
3337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                            BTM_BLE_DEFAULT_SFP); /* assume observe always not using white list */
3347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
335ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
336ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang            /* enable IRK list */
337ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang            btm_ble_vendor_irk_list_known_dev (TRUE);
338ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang#endif
3397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            status = btm_ble_start_scan(BTM_BLE_DUPLICATE_DISABLE);
3407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
3417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (status == BTM_CMD_STARTED)
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_cb.ble_ctr_cb.scan_activity |= BTM_LE_OBSERVE_ACTIVE;
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (duration != 0)
3467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                /* start observer timer */
3477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                btu_start_timer (&btm_cb.ble_ctr_cb.obs_timer_ent, BTU_TTYPE_BLE_OBSERVE, duration);
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    else if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        status = BTM_CMD_STARTED;
3537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_ble_stop_observe();
3547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
3557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    else
3567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
3575344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR("Observe not active");
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
3617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleBroadcast
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is to start or stop broadcasting.
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       start: start or stop broadcasting.
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          status.
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_BleBroadcast(BOOLEAN start)
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS status = BTM_NO_RESOURCES;
378ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 evt_type = p_cb->scan_rsp ? BTM_BLE_DISCOVER_EVT: BTM_BLE_NON_CONNECT_EVT;
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3823aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
3833aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        return BTM_ILLEGAL_VALUE;
3843aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef  BTM_BLE_PC_ADV_TEST_MODE
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_BLE_PC_ADV_TEST_MODE)
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_type = p_cb->scan_rsp ? BTM_BLE_CONNECT_EVT: BTM_BLE_NON_CONNECT_EVT;
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (start && p_cb->adv_mode == BTM_BLE_ADV_DISABLE)
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* update adv params */
3957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (!btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min :
3967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                              BTM_BLE_GAP_ADV_INT),
3977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                              (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max :
3987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                              BTM_BLE_GAP_ADV_INT),
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              evt_type,
400ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                              p_addr_cb->own_addr_type,
401ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                              p_cb->direct_bda.type,
402ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                              p_cb->direct_bda.bda,
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              p_cb->adv_chnl_map,
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              p_cb->afp))
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTM_NO_RESOURCES;
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->evt_type = evt_type;
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
410ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        status = btm_ble_start_adv ();
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    else if (!start)
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
414ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        status = btm_ble_stop_adv();
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTM_WRONG_MODE;
4195344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR("Can not %s Broadcast, device %s in Broadcast mode",
4207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (start ? "Start" : "Stop"), (start ? "already" :"not"));
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
427a6ce7751d84218c193eb90d390aef23217b1737eWei Wang** Function         btm_vsc_brcm_features_complete
428a6ce7751d84218c193eb90d390aef23217b1737eWei Wang**
429a6ce7751d84218c193eb90d390aef23217b1737eWei Wang** Description      Command Complete callback for HCI_BLE_VENDOR_CAP_OCF
430a6ce7751d84218c193eb90d390aef23217b1737eWei Wang**
431a6ce7751d84218c193eb90d390aef23217b1737eWei Wang** Returns          void
432a6ce7751d84218c193eb90d390aef23217b1737eWei Wang**
433a6ce7751d84218c193eb90d390aef23217b1737eWei Wang*******************************************************************************/
434a6ce7751d84218c193eb90d390aef23217b1737eWei Wangstatic void btm_ble_vendor_capability_vsc_cmpl_cback (tBTM_VSC_CMPL *p_vcs_cplt_params)
435a6ce7751d84218c193eb90d390aef23217b1737eWei Wang{
436c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji#if BLE_VND_INCLUDED == TRUE
437a6ce7751d84218c193eb90d390aef23217b1737eWei Wang    UINT8  status = 0xFF, *p;
4388d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta
4398d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta    BTM_TRACE_DEBUG("btm_ble_vendor_capability_vsc_cmpl_cback");
4408d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta
441a6ce7751d84218c193eb90d390aef23217b1737eWei Wang    /* Check status of command complete event */
44216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if ((p_vcs_cplt_params->opcode == HCI_BLE_VENDOR_CAP_OCF) &&(p_vcs_cplt_params->param_len > 0))
443a6ce7751d84218c193eb90d390aef23217b1737eWei Wang    {
444a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        p = p_vcs_cplt_params->p_param_buf;
445a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        STREAM_TO_UINT8  (status, p);
446a6ce7751d84218c193eb90d390aef23217b1737eWei Wang    }
447a6ce7751d84218c193eb90d390aef23217b1737eWei Wang
44816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (status == HCI_SUCCESS)
449a6ce7751d84218c193eb90d390aef23217b1737eWei Wang    {
4508d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta        STREAM_TO_UINT8  (btm_cb.cmn_ble_vsc_cb.adv_inst_max, p);
4518d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta        STREAM_TO_UINT8  (btm_cb.cmn_ble_vsc_cb.rpa_offloading, p);
4528d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta        STREAM_TO_UINT16 (btm_cb.cmn_ble_vsc_cb.tot_scan_results_strg, p);
4538d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta        STREAM_TO_UINT8  (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz, p);
4548d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta        STREAM_TO_UINT8  (btm_cb.cmn_ble_vsc_cb.filter_support, p);
4558d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta        STREAM_TO_UINT8  (btm_cb.cmn_ble_vsc_cb.max_filter, p);
456e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji        STREAM_TO_UINT8  (btm_cb.cmn_ble_vsc_cb.energy_support, p);
4573f24f460ec3efedde25723e6a4297efc10873cd2Satya Calloji        btm_cb.cmn_ble_vsc_cb.values_read = TRUE;
458a6ce7751d84218c193eb90d390aef23217b1737eWei Wang    }
459c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji
46016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    BTM_TRACE_DEBUG("btm_ble_vnd_cap_vsc_cmpl_cback: stat=%d, irk=%d, ADV ins:%d, rpa=%d, ener=%d",
46116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham         status, btm_ble_vendor_cb.irk_avail_size, btm_cb.cmn_ble_vsc_cb.adv_inst_max,
46216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham         btm_cb.cmn_ble_vsc_cb.rpa_offloading, btm_cb.cmn_ble_vsc_cb.energy_support);
46316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham
46416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (BTM_BleMaxMultiAdvInstanceCount() > 0)
46516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham        btm_ble_multi_adv_init();
46616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham
46716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (btm_cb.cmn_ble_vsc_cb.max_filter > 0)
46816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    {
46916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham        btm_ble_adv_filter_init();
470d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji    }
471d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji
472d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji    if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz > 0)
473d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji    {
47416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham        btm_ble_vendor_init(btm_cb.cmn_ble_vsc_cb.max_irk_list_sz);
47516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    }
47616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham
47716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (btm_cb.cmn_ble_vsc_cb.tot_scan_results_strg > 0)
47816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham        btm_ble_batchscan_init();
4798d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta
4808d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta    if (p_ctrl_le_feature_rd_cmpl_cback != NULL)
4818d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta        p_ctrl_le_feature_rd_cmpl_cback(status);
482c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji
483c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji#else
484c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji    UNUSED(p_vcs_cplt_params);
485c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji#endif
486a6ce7751d84218c193eb90d390aef23217b1737eWei Wang}
487a6ce7751d84218c193eb90d390aef23217b1737eWei Wang
488a6ce7751d84218c193eb90d390aef23217b1737eWei Wang/*******************************************************************************
489a6ce7751d84218c193eb90d390aef23217b1737eWei Wang**
4908d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta** Function         BTM_BleGetVendorCapabilities
491a6ce7751d84218c193eb90d390aef23217b1737eWei Wang**
4928d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta** Description      This function reads local LE features
493a6ce7751d84218c193eb90d390aef23217b1737eWei Wang**
4948d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta** Parameters       p_cmn_vsc_cb : Locala LE capability structure
4958d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta**
4968d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta** Returns          void
497a6ce7751d84218c193eb90d390aef23217b1737eWei Wang**
498a6ce7751d84218c193eb90d390aef23217b1737eWei Wang*******************************************************************************/
4998d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi BattaBTM_API extern void BTM_BleGetVendorCapabilities(tBTM_BLE_VSC_CB *p_cmn_vsc_cb)
500a6ce7751d84218c193eb90d390aef23217b1737eWei Wang{
5011a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    BTM_TRACE_DEBUG("BTM_BleGetVendorCapabilities");
5028d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta
50316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (NULL != p_cmn_vsc_cb)
5048d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta    {
5058d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta        *p_cmn_vsc_cb = btm_cb.cmn_ble_vsc_cb;
5068d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta    }
5078d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta}
5088d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta
5098d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta/******************************************************************************
5108d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta**
5118d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta** Function         BTM_BleReadControllerFeatures
5128d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta**
5138d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta** Description      Reads BLE specific controller features
5148d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta**
5158d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta** Parameters:      tBTM_BLE_CTRL_FEATURES_CBACK : Callback to notify when features are read
5168d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta**
5178d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta** Returns          void
5188d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta**
5198d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta*******************************************************************************/
5208d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi BattaBTM_API extern void BTM_BleReadControllerFeatures(tBTM_BLE_CTRL_FEATURES_CBACK  *p_vsc_cback)
5218d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta{
5223f24f460ec3efedde25723e6a4297efc10873cd2Satya Calloji    if (TRUE == btm_cb.cmn_ble_vsc_cb.values_read)
5233f24f460ec3efedde25723e6a4297efc10873cd2Satya Calloji        return;
5243f24f460ec3efedde25723e6a4297efc10873cd2Satya Calloji
525c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji#if BLE_VND_INCLUDED == TRUE
5268d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta    BTM_TRACE_DEBUG("BTM_BleReadControllerFeatures");
5278d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta
5288d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta    p_ctrl_le_feature_rd_cmpl_cback = p_vsc_cback;
529a6ce7751d84218c193eb90d390aef23217b1737eWei Wang    if ( BTM_VendorSpecificCommand (HCI_BLE_VENDOR_CAP_OCF,
530a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                                    0,
531a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                                    NULL,
532a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                                    btm_ble_vendor_capability_vsc_cmpl_cback)
533a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                                    != BTM_CMD_STARTED)
534a6ce7751d84218c193eb90d390aef23217b1737eWei Wang    {
5355344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR("LE Get_Vendor Capabilities Command Failed.");
536a6ce7751d84218c193eb90d390aef23217b1737eWei Wang    }
537c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji#else
538c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji    UNUSED(p_vsc_cback);
539c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji#endif
540a6ce7751d84218c193eb90d390aef23217b1737eWei Wang    return ;
541a6ce7751d84218c193eb90d390aef23217b1737eWei Wang}
542a6ce7751d84218c193eb90d390aef23217b1737eWei Wang
543a6ce7751d84218c193eb90d390aef23217b1737eWei Wang/*******************************************************************************
544a6ce7751d84218c193eb90d390aef23217b1737eWei Wang**
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_RegisterScanReqEvt
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to register a scan request callback
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  on the advertiser.
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       p_scan_req_cback: scan request callback.  If NULL, remove the
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                    registration.
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_RegisterScanReqEvt(tBTM_BLE_SCAN_REQ_CBACK   *p_scan_req_cback)
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
558ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#ifdef BTM_BLE_PC_ADV_TEST_MODE /* For general stack code (e.g. BTInsight testing), we simply do not define it to exclude or set it to TRUE to include */
559ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (BTM_BLE_PC_ADV_TEST_MODE)   /* For stack component, it is always defined and maps to a global variable g_bDraculaAdvertisingMode */
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->p_scan_req_cback = p_scan_req_cback;
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5645cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#else
5655cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_scan_req_cback);
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
5707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
5717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         BTM_BleConfigPrivacy
5727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
5737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      This function is called to enable or disable the privacy in
5747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                   LE channel of the local device.
5757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
5767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Parameters       enable: TRUE to enable it; FALSE to disable it.
5777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
5787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          void
5797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
5807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
5817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battavoid BTM_BleConfigPrivacy(BOOLEAN enable)
5827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
5837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTM_BLE_CB     *p_cb = &btm_cb.ble_ctr_cb;
5847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
5855344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT (" BTM_BleConfigPrivacy");
5867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
5877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_cb->privacy != enable)
5887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
5897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_cb->privacy = enable;
5907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
5917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (p_cb->privacy)
5927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
5937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            /* generate resolvable private address */
5942bfa490a23a3b8ad6c992db4bb74f560a6a059e3Priti Aghera            btm_gen_resolvable_private_addr((void*)btm_gen_resolve_paddr_low);
5957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
5967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else /* if privacy disabled, always use public address */
5977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
5987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_cb->addr_mgnt_cb.own_addr_type = BLE_ADDR_PUBLIC;
5997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
60016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham
60116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham        if (BTM_BleMaxMultiAdvInstanceCount() > 0)
60216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham            btm_ble_multi_adv_enb_privacy(p_cb->privacy);
6037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
6047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
6057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
6068d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta/*******************************************************************************
6078d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta**
60816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** Function          BTM_BleMaxMultiAdvInstanceCount
60916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham**
61016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** Description        Returns max number of multi adv instances supported by controller
61116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham**
61216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** Returns          Max multi adv instance count
61316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham**
61416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham*******************************************************************************/
61516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa ViswanadhamBTM_API extern UINT8  BTM_BleMaxMultiAdvInstanceCount()
61616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham{
61721015a484b3fa3d7aa7cdc291b30238089d14f4eWei Wang    return btm_cb.cmn_ble_vsc_cb.adv_inst_max < BTM_BLE_MULTI_ADV_MAX ?
61821015a484b3fa3d7aa7cdc291b30238089d14f4eWei Wang        btm_cb.cmn_ble_vsc_cb.adv_inst_max : BTM_BLE_MULTI_ADV_MAX;
61916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham}
62016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham
62116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_PRIVACY_SPT == TRUE
62216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham/*******************************************************************************
62316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham**
6248b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu** Function         btm_ble_resolve_random_addr_on_adv
6258b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu**
6268b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu** Description      resolve random address complete callback.
6278b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu**
6288b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu** Returns          void
6298b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu**
6308b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu*******************************************************************************/
6318b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xustatic void btm_ble_resolve_random_addr_on_adv(void * p_rec, void *p)
6328b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu{
6338b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    tBTM_SEC_DEV_REC    *match_rec = (tBTM_SEC_DEV_REC *) p_rec;
6348b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    UINT8       addr_type = BLE_ADDR_RANDOM;
6358b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    BD_ADDR     bda;
6368b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    UINT8       *pp = (UINT8 *)p + 1;
6378b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    UINT8           evt_type;
6388b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu
6395344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_ble_resolve_random_addr_on_adv ");
6408b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu
6418b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    STREAM_TO_UINT8    (evt_type, pp);
6428b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    STREAM_TO_UINT8    (addr_type, pp);
6438b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    STREAM_TO_BDADDR   (bda, pp);
6448b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu
6458b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    if (match_rec)
6468b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    {
6475344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR("Random match");
6488b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu        match_rec->ble.active_addr_type = BTM_BLE_ADDR_RRA;
6498b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu        memcpy(match_rec->ble.cur_rand_addr, bda, BD_ADDR_LEN);
6508b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu        memcpy(bda, match_rec->bd_addr, BD_ADDR_LEN);
6518b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu        addr_type = match_rec->ble.ble_addr_type;
6528b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    }
6538b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    else
6548b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    {
6555344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR("Random unmatch");
6568b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    }
6578b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu
6588b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    btm_ble_process_adv_pkt_cont(bda, addr_type, evt_type, pp);
6598b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu
6608b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    return;
6618b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu}
6628b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#endif
6638b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
66626112633d80098314048914c0be33442a0048fb7Sharvil Nanavati** Function         BTM_BleLocalPrivacyEnabled
66726112633d80098314048914c0be33442a0048fb7Sharvil Nanavati**
66826112633d80098314048914c0be33442a0048fb7Sharvil Nanavati** Description        Checks if local device supports private address
66926112633d80098314048914c0be33442a0048fb7Sharvil Nanavati**
67026112633d80098314048914c0be33442a0048fb7Sharvil Nanavati** Returns          Return TRUE if local privacy is enabled else FALSE
67126112633d80098314048914c0be33442a0048fb7Sharvil Nanavati**
67226112633d80098314048914c0be33442a0048fb7Sharvil Nanavati*******************************************************************************/
67326112633d80098314048914c0be33442a0048fb7Sharvil NanavatiBOOLEAN BTM_BleLocalPrivacyEnabled()
67426112633d80098314048914c0be33442a0048fb7Sharvil Nanavati{
67526112633d80098314048914c0be33442a0048fb7Sharvil Nanavati#if BLE_PRIVACY_SPT == TRUE
67626112633d80098314048914c0be33442a0048fb7Sharvil Nanavati    return btm_cb.ble_ctr_cb.privacy;
67726112633d80098314048914c0be33442a0048fb7Sharvil Nanavati#else
67826112633d80098314048914c0be33442a0048fb7Sharvil Nanavati    return false;
67926112633d80098314048914c0be33442a0048fb7Sharvil Nanavati#endif
68026112633d80098314048914c0be33442a0048fb7Sharvil Nanavati}
68126112633d80098314048914c0be33442a0048fb7Sharvil Nanavati
68226112633d80098314048914c0be33442a0048fb7Sharvil Nanavati/*******************************************************************************
68326112633d80098314048914c0be33442a0048fb7Sharvil Nanavati**
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleSetBgConnType
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set BLE connectable mode for a
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  peripheral device.
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       bg_conn_type: it can be auto connection, or selective connection.
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_select_cback: callback function when selective connection procedure
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                              is being used.
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_BleSetBgConnType(tBTM_BLE_CONN_TYPE   bg_conn_type,
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             tBTM_BLE_SEL_CBACK   *p_select_cback)
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN started = TRUE;
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7015344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("BTM_BleSetBgConnType ");
7023aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
7033aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        return FALSE;
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.ble_ctr_cb.bg_conn_type != bg_conn_type)
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (bg_conn_type)
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_BLE_CONN_AUTO:
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_ble_start_auto_conn(TRUE);
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_BLE_CONN_SELECTIVE:
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_AUTO)
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_ble_start_auto_conn(FALSE);
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                started = btm_ble_start_select_conn(TRUE, p_select_cback);
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_BLE_CONN_NONE:
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_AUTO)
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_ble_start_auto_conn(FALSE);
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE)
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_ble_start_select_conn(FALSE, NULL);
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                started = TRUE;
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            default:
7345344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_ERROR("invalid bg connection type : %d ", bg_conn_type);
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                started = FALSE;
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (started)
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.ble_ctr_cb.bg_conn_type = bg_conn_type;
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return started;
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
747021e17a641e61e3f139717cd755bf6f9b9b9eb12Nitin Arora** Function         BTM_BleClearBgConnDev
748021e17a641e61e3f139717cd755bf6f9b9b9eb12Nitin Arora**
749021e17a641e61e3f139717cd755bf6f9b9b9eb12Nitin Arora** Description      This function is called to clear the whitelist,
750021e17a641e61e3f139717cd755bf6f9b9b9eb12Nitin Arora**                  end any pending whitelist connections,
751021e17a641e61e3f139717cd755bf6f9b9b9eb12Nitin Arora*                   and reset the local bg device list.
752021e17a641e61e3f139717cd755bf6f9b9b9eb12Nitin Arora**
753021e17a641e61e3f139717cd755bf6f9b9b9eb12Nitin Arora** Parameters       void
754021e17a641e61e3f139717cd755bf6f9b9b9eb12Nitin Arora**
755021e17a641e61e3f139717cd755bf6f9b9b9eb12Nitin Arora** Returns          void
756021e17a641e61e3f139717cd755bf6f9b9b9eb12Nitin Arora**
757021e17a641e61e3f139717cd755bf6f9b9b9eb12Nitin Arora*******************************************************************************/
758021e17a641e61e3f139717cd755bf6f9b9b9eb12Nitin Aroravoid BTM_BleClearBgConnDev(void)
759021e17a641e61e3f139717cd755bf6f9b9b9eb12Nitin Arora{
760021e17a641e61e3f139717cd755bf6f9b9b9eb12Nitin Arora    btm_ble_start_auto_conn(FALSE);
761021e17a641e61e3f139717cd755bf6f9b9b9eb12Nitin Arora    btm_ble_clear_white_list();
762021e17a641e61e3f139717cd755bf6f9b9b9eb12Nitin Arora    gatt_reset_bgdev_list();
763021e17a641e61e3f139717cd755bf6f9b9b9eb12Nitin Arora}
764021e17a641e61e3f139717cd755bf6f9b9b9eb12Nitin Arora
765021e17a641e61e3f139717cd755bf6f9b9b9eb12Nitin Arora/*******************************************************************************
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleUpdateBgConnDev
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add or remove a device into/from
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  background connection procedure. The background connection
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*                   procedure is decided by the background connection type, it can be
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*                   auto connection, or selective connection.
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       add_remove: TRUE to add; FALSE to remove.
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  remote_bda: device address to add/remove.
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_BleUpdateBgConnDev(BOOLEAN add_remove, BD_ADDR   remote_bda)
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN ret = TRUE;
7835344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT (" BTM_BleUpdateBgConnDev");
784946c681e59451164b343b7ab9415aa73b0d176bcAndre Eisenbach
785946c681e59451164b343b7ab9415aa73b0d176bcAndre Eisenbach    /* update white list */
786b5c2cdc900b368a45401cadb6fa00cd2ce574d61Nitin Arora    ret = btm_update_bg_conn_list(add_remove, remote_bda);
787946c681e59451164b343b7ab9415aa73b0d176bcAndre Eisenbach
788b5c2cdc900b368a45401cadb6fa00cd2ce574d61Nitin Arora    btm_update_dev_to_white_list(add_remove, remote_bda);
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return ret;
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleSetConnMode
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set BLE connectable mode for a
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  peripheral device.
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       directed: is directed connectable mode, or non-directed.
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_dir_bda: connectable direct initiator's LE device address
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
806ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattatBTM_STATUS BTM_BleSetConnMode(BOOLEAN is_directed)
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8105344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("BTM_BleSetConnMode is_directed = %d ", is_directed);
8113aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
8123aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        return BTM_ILLEGAL_VALUE;
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
814ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p_cb->directed_conn = is_directed;
815ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return btm_ble_set_connectability( p_cb->connectable_mode);
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
817ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
819ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
820ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
821ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_set_conn_mode_adv_init_addr
822ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
823ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      set initator address type and local address type based on adv
824ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  mode.
825ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
826ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
827ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
828ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic UINT8 btm_set_conn_mode_adv_init_addr(tBTM_BLE_INQ_CB *p_cb,
829ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     BD_ADDR_PTR p_addr_ptr,
830ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     tBLE_ADDR_TYPE *p_init_addr_type,
831ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     tBLE_ADDR_TYPE *p_own_addr_type)
832ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
833ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8 evt_type;
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UNUSED(p_own_addr_type);
8367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
837ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ( p_cb->directed_conn)
838ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
839ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /*  direct adv mode does not have privacy if privacy
8407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        is not enabled or no reconn addr config */
8417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
842ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        *p_init_addr_type  = p_cb->direct_bda.type;
843ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         memcpy(p_addr_ptr, p_cb->direct_bda.bda, BD_ADDR_LEN);
844ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        evt_type = BTM_BLE_CONNECT_DIR_EVT;
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
846ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    else /* undirect adv mode */
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
848ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        evt_type = BTM_BLE_CONNECT_EVT;
8497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
8507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        /* may need to reset random address if privacy is enabled */
8517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (btm_cb.ble_ctr_cb.privacy && /* own addr_type is random */
8527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            !BTM_BLE_IS_RESOLVE_BDA(btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr))
8537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
8547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            /* need to generate RRA and update random addresss in controller */
855a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low);
8567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
858ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
859ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return evt_type;
860ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleSetAdvParams
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set advertising parameters.
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       adv_int_min: minimum advertising interval
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  adv_int_max: maximum advertising interval
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_dir_bda: connectable direct initiator's LE device address
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  chnl_map: advertising channel map.
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_BleSetAdvParams(UINT16 adv_int_min, UINT16 adv_int_max,
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                tBLE_BD_ADDR *p_dir_bda,
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                tBTM_BLE_ADV_CHNL_MAP chnl_map)
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
881ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS status = BTM_SUCCESS;
884ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BD_ADDR     p_addr_ptr =  {0};
885ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBLE_ADDR_TYPE   init_addr_type = BLE_ADDR_PUBLIC;
886ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBLE_ADDR_TYPE   own_addr_type = p_addr_cb->own_addr_type;
887ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8            adv_mode = p_cb->adv_mode;
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8895344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("BTM_BleSetAdvParams");
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8913aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
8923aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        return BTM_ILLEGAL_VALUE;
8933aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!BTM_BLE_VALID_PRAM(adv_int_min, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX) ||
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        !BTM_BLE_VALID_PRAM(adv_int_max, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX))
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_ILLEGAL_VALUE;
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->adv_interval_min = adv_int_min;
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->adv_interval_max = adv_int_max;
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->adv_chnl_map = chnl_map;
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dir_bda)
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(&p_cb->direct_bda, p_dir_bda, sizeof(tBLE_BD_ADDR));
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9095344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("update params for an active adv");
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
911ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btm_ble_stop_adv();
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
913ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_cb->connectable_mode & BTM_BLE_CONNECTABLE)
914ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &own_addr_type);
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
916ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* update adv params */
917ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btsnd_hcic_ble_write_adv_params (p_cb->adv_interval_min,
918ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     p_cb->adv_interval_max,
919ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     p_cb->evt_type,
920ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     own_addr_type,
921ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     init_addr_type,
922ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     p_addr_ptr,
923ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     p_cb->adv_chnl_map,
924ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     p_cb->afp);
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
926ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (adv_mode == BTM_BLE_ADV_ENABLE)
927ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        btm_ble_start_adv();
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleReadAdvParams
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set advertising parameters.
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       adv_int_min: minimum advertising interval
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  adv_int_max: maximum advertising interval
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_dir_bda: connectable direct initiator's LE device address
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  chnl_map: advertising channel map.
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_BleReadAdvParams (UINT16 *adv_int_min, UINT16 *adv_int_max,
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           tBLE_BD_ADDR *p_dir_bda, tBTM_BLE_ADV_CHNL_MAP *p_chnl_map)
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9515344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("BTM_BleReadAdvParams ");
9523aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
9533aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        return ;
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *adv_int_min = p_cb->adv_interval_min;
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *adv_int_max = p_cb->adv_interval_max;
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p_chnl_map = p_cb->adv_chnl_map;
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dir_bda != NULL)
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(p_dir_bda, &p_cb->direct_bda, sizeof(tBLE_BD_ADDR));
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleSetScanParams
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set Scan parameters.
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       adv_int_min: minimum advertising interval
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  adv_int_max: maximum advertising interval
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_dir_bda: connectable direct initiator's LE device address
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  chnl_map: advertising channel map.
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  scan_type: active scan or passive scan
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_BleSetScanParams(UINT16 scan_interval, UINT16 scan_window, tBTM_BLE_SCAN_MODE scan_mode)
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9845344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT (" BTM_BleSetScanParams");
9853aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
9863aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        return ;
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_BLE_VALID_PRAM(scan_interval, BTM_BLE_SCAN_INT_MIN, BTM_BLE_SCAN_INT_MAX) &&
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_BLE_VALID_PRAM(scan_window, BTM_BLE_SCAN_WIN_MIN, BTM_BLE_SCAN_WIN_MAX) &&
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (scan_mode == BTM_BLE_SCAN_MODE_ACTI || scan_mode == BTM_BLE_SCAN_MODE_PASS))
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->scan_type     = scan_mode;
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (BTM_BLE_CONN_PARAM_UNDEF != scan_interval)
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->scan_interval = scan_interval;
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (BTM_BLE_CONN_PARAM_UNDEF != scan_window)
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->scan_window   = scan_window;
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10025344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR("Illegal params: scan_interval = %d scan_window = %d",
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        scan_interval, scan_window);
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleWriteScanRsp
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to write LE scan response.
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      p_scan_rsp: scan response information.
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_BleWriteScanRsp(tBTM_BLE_AD_MASK data_mask, tBTM_BLE_ADV_DATA *p_data)
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS     status = BTM_NO_RESOURCES;
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   rsp_data[BTM_BLE_AD_DATA_LEN],
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p = rsp_data;
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10255344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT (" BTM_BleWriteScanRsp");
10263aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach
10273aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
10283aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        return BTM_ILLEGAL_VALUE;
10293aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(rsp_data, 0, BTM_BLE_AD_DATA_LEN);
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_ble_build_adv_data(&data_mask, &p, p_data);
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btsnd_hcic_ble_set_scan_rsp_data((UINT8)(p - rsp_data), rsp_data))
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTM_SUCCESS;
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1037ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (data_mask != 0)
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.ble_ctr_cb.inq_var.scan_rsp = TRUE;
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.ble_ctr_cb.inq_var.scan_rsp = FALSE;
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTM_ILLEGAL_VALUE;
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleWriteAdvData
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to write advertising data.
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:       None.
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_BleWriteAdvData(tBTM_BLE_AD_MASK data_mask, tBTM_BLE_ADV_DATA *p_data)
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_LOCAL_ADV_DATA *p_cb_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8  *p;
10637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTM_BLE_AD_MASK   mask = data_mask;
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10655344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("BTM_BleWriteAdvData ");
10663aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach
10673aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
10683aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        return BTM_ILLEGAL_VALUE;
10693aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(p_cb_data, 0, sizeof(tBTM_BLE_LOCAL_ADV_DATA));
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p = p_cb_data->ad_data;
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb_data->data_mask = data_mask;
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb_data->p_flags = btm_ble_build_adv_data(&mask, &p, p_data);
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb_data->p_pad = p;
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1078a6ce7751d84218c193eb90d390aef23217b1737eWei Wang    if (mask != 0)
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10805344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR("Partial data write into ADV");
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb_data->data_mask &= ~mask;
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btsnd_hcic_ble_set_adv_data((UINT8)(p_cb_data->p_pad - p_cb_data->ad_data),
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    p_cb_data->ad_data))
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_SUCCESS;
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_NO_RESOURCES;
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_CheckAdvData
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to get ADV data for a specific type.
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       p_adv - pointer of ADV data
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  type   - finding ADV data type
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_length - return the length of ADV data not including type
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer of ADV data
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *BTM_CheckAdvData( UINT8 *p_adv, UINT8 type, UINT8 *p_length)
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p = p_adv;
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 length;
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 adv_type;
11115344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("BTM_CheckAdvData type=0x%02X", type);
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8(length, p);
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while ( length && (p - p_adv <= BTM_BLE_CACHE_ADV_DATA_MAX))
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT8(adv_type, p);
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( adv_type == type )
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* length doesn't include itself */
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p_length = length - 1; /* minus the length of type */
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return p;
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += length - 1; /* skip the length of data */
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT8(length, p);
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p_length = 0;
11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return NULL;
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_build_adv_data
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called build the adv data and rsp data.
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1139a6ce7751d84218c193eb90d390aef23217b1737eWei WangUINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst,
1140a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                              tBTM_BLE_ADV_DATA *p_data)
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1142a6ce7751d84218c193eb90d390aef23217b1737eWei Wang    UINT32 data_mask = *p_data_mask;
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p = *p_dst,
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p_flag = NULL;
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  len = BTM_BLE_AD_DATA_LEN, cp_len = 0;
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   i = 0;
11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_PROP_ELEM      *p_elem;
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11495344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT (" btm_ble_build_adv_data");
11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* build the adv data structure and build the data string */
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (data_mask)
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* flags */
11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (data_mask & BTM_BLE_AD_BIT_FLAGS)
11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1157a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            *p++ = MIN_ADV_LENGTH;
11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_BLE_AD_TYPE_FLAG;
11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_flag = p;
11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_data)
11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                *p++ = p_data->flag;
11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                *p++ = 0;
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len -= 3;
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            data_mask &= ~BTM_BLE_AD_BIT_FLAGS;
11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1169ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* appearance data */
1170ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (len > 3 && data_mask & BTM_BLE_AD_BIT_APPEARANCE)
1171ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
1172ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            *p++ = 3; /* length */
1173ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            *p++ = BTM_BLE_AD_TYPE_APPEARANCE;
1174ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            UINT16_TO_STREAM(p, p_data->appearance);
1175ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            len -= 4;
1176ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1177ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            data_mask &= ~BTM_BLE_AD_BIT_APPEARANCE;
1178ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* device name */
1180ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if BTM_MAX_LOC_BD_NAME_LEN > 0
1181a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_DEV_NAME)
11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1183a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            if (strlen(btm_cb.cfg.bd_name) > (UINT16)(len - MIN_ADV_LENGTH))
11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1185a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                *p++ = len - MIN_ADV_LENGTH + 1;
11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                *p++ = BTM_BLE_AD_TYPE_NAME_SHORT;
1187a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                ARRAY_TO_STREAM(p, btm_cb.cfg.bd_name, len - MIN_ADV_LENGTH);
11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cp_len = (UINT16)strlen(btm_cb.cfg.bd_name);
11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                *p++ = cp_len + 1;
11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                *p++ = BTM_BLE_AD_TYPE_NAME_CMPL;
11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ARRAY_TO_STREAM(p, btm_cb.cfg.bd_name, cp_len);
11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1196a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            len -= (cp_len + MIN_ADV_LENGTH);
11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            data_mask &= ~BTM_BLE_AD_BIT_DEV_NAME;
11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1199ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* manufacturer data */
1201a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_MANU &&
1202a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            p_data && p_data->p_manu &&
1203a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            p_data->p_manu->len != 0 && p_data->p_manu->p_val)
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1205a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            if (p_data->p_manu->len > (len - MIN_ADV_LENGTH))
1206a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                cp_len = len - MIN_ADV_LENGTH;
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
1208a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                cp_len = p_data->p_manu->len;
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = cp_len + 1;
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_BLE_AD_TYPE_MANU;
1212a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            ARRAY_TO_STREAM(p, p_data->p_manu->p_val, cp_len);
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1214a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            len -= (cp_len + MIN_ADV_LENGTH);
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            data_mask &= ~BTM_BLE_AD_BIT_MANU;
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* TX power */
1218a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_TX_PWR)
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1220a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            *p++ = MIN_ADV_LENGTH;
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_BLE_AD_TYPE_TX_PWR;
12224a7ad9be81cc2b515502f2c1fb1b7ec7e3104146Satya Calloji            if (p_data->tx_power > BTM_BLE_ADV_TX_POWER_MAX)
12234a7ad9be81cc2b515502f2c1fb1b7ec7e3104146Satya Calloji                p_data->tx_power = BTM_BLE_ADV_TX_POWER_MAX;
12244a7ad9be81cc2b515502f2c1fb1b7ec7e3104146Satya Calloji            *p++ = btm_ble_map_adv_tx_power(p_data->tx_power);
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len -= 3;
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            data_mask &= ~BTM_BLE_AD_BIT_TX_PWR;
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1228a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        /* 16 bits services */
1229a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE &&
1230a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            p_data && p_data->p_services &&
1231a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            p_data->p_services->num_service != 0 &&
1232a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            p_data->p_services->p_uuid)
12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1234a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            if (p_data->p_services->num_service * LEN_UUID_16 > (len - MIN_ADV_LENGTH))
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1236a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                cp_len = (len - MIN_ADV_LENGTH)/LEN_UUID_16;
1237a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                *p ++ = 1 + cp_len * LEN_UUID_16;
1238ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                *p++ = BTM_BLE_AD_TYPE_16SRV_PART;
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1242a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                cp_len = p_data->p_services->num_service;
1243a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                *p++ = 1 + cp_len * LEN_UUID_16;
1244ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                *p++ = BTM_BLE_AD_TYPE_16SRV_CMPL;
12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (i = 0; i < cp_len; i ++)
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1248a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                UINT16_TO_STREAM(p, *(p_data->p_services->p_uuid + i));
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1251a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            len -= (cp_len * MIN_ADV_LENGTH + MIN_ADV_LENGTH);
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            data_mask &= ~BTM_BLE_AD_BIT_SERVICE;
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1254a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        /* 32 bits service uuid */
1255a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_32 &&
1256a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            p_data && p_data->p_service_32b &&
1257a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            p_data->p_service_32b->num_service != 0 &&
1258a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            p_data->p_service_32b->p_uuid)
1259a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        {
1260a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            if ((p_data->p_service_32b->num_service * LEN_UUID_32) > (len - MIN_ADV_LENGTH))
1261a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            {
1262a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                cp_len = (len - MIN_ADV_LENGTH)/LEN_UUID_32;
1263a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                *p ++ = 1 + cp_len * LEN_UUID_32;
1264a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                *p++ = BTM_BLE_AD_TYPE_32SRV_PART;
1265a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            }
1266a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            else
1267a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            {
1268a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                cp_len = p_data->p_service_32b->num_service;
1269a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                *p++ = 1 + cp_len * LEN_UUID_32;
1270a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                *p++ = BTM_BLE_AD_TYPE_32SRV_CMPL;
1271a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            }
1272a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            for (i = 0; i < cp_len; i ++)
1273a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            {
1274a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                UINT32_TO_STREAM(p, *(p_data->p_service_32b->p_uuid + i));
1275a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            }
1276a6ce7751d84218c193eb90d390aef23217b1737eWei Wang
1277a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            len -= (cp_len * LEN_UUID_32 + MIN_ADV_LENGTH);
1278a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            data_mask &= ~BTM_BLE_AD_BIT_SERVICE_32;
1279a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        }
1280a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        /* 128 bits services */
1281a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        if (len >= (MAX_UUID_SIZE + 2) && data_mask & BTM_BLE_AD_BIT_SERVICE_128 &&
1282a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            p_data && p_data->p_services_128b)
1283a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        {
1284a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            *p ++ = 1 + MAX_UUID_SIZE;
1285a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            if (!p_data->p_services_128b->list_cmpl)
1286a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                *p++ = BTM_BLE_AD_TYPE_128SRV_PART;
1287a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            else
1288a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                *p++ = BTM_BLE_AD_TYPE_128SRV_CMPL;
1289a6ce7751d84218c193eb90d390aef23217b1737eWei Wang
1290a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            ARRAY_TO_STREAM(p, p_data->p_services_128b->uuid128, MAX_UUID_SIZE);
1291a6ce7751d84218c193eb90d390aef23217b1737eWei Wang
1292a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            len -= (MAX_UUID_SIZE + MIN_ADV_LENGTH);
1293a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            data_mask &= ~BTM_BLE_AD_BIT_SERVICE_128;
1294a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        }
1295a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        /* 32 bits Service Solicitation UUIDs */
1296a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_32SOL &&
1297a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            p_data && p_data->p_sol_service_32b &&
1298a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            p_data->p_sol_service_32b->num_service != 0 &&
1299a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            p_data->p_sol_service_32b->p_uuid)
1300a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        {
1301a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            if ((p_data->p_sol_service_32b->num_service * LEN_UUID_32) > (len - MIN_ADV_LENGTH))
1302a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            {
1303a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                cp_len = (len - MIN_ADV_LENGTH)/LEN_UUID_32;
1304a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                *p ++ = 1 + cp_len * LEN_UUID_32;
1305a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            }
1306a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            else
1307a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            {
1308a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                cp_len = p_data->p_sol_service_32b->num_service;
1309a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                *p++ = 1 + cp_len * LEN_UUID_32;
1310a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            }
1311a6ce7751d84218c193eb90d390aef23217b1737eWei Wang
1312a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            *p++ = BTM_BLE_AD_TYPE_32SOL_SRV_UUID;
1313a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            for (i = 0; i < cp_len; i ++)
1314a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            {
1315a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                UINT32_TO_STREAM(p, *(p_data->p_sol_service_32b->p_uuid + i));
1316a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            }
1317a6ce7751d84218c193eb90d390aef23217b1737eWei Wang
1318a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            len -= (cp_len * LEN_UUID_32 + MIN_ADV_LENGTH);
1319a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            data_mask &= ~BTM_BLE_AD_BIT_SERVICE_32SOL;
1320a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        }
1321a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        /* 128 bits Solicitation services UUID */
1322a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        if (len >= (MAX_UUID_SIZE + MIN_ADV_LENGTH) && data_mask & BTM_BLE_AD_BIT_SERVICE_128SOL &&
1323a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            p_data && p_data->p_sol_service_128b)
1324a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        {
1325a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            *p ++ = 1 + MAX_UUID_SIZE;
1326a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            *p++ = BTM_BLE_AD_TYPE_128SOL_SRV_UUID;
1327a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            ARRAY_TO_STREAM(p, p_data->p_sol_service_128b->uuid128, MAX_UUID_SIZE);
1328a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            len -= (MAX_UUID_SIZE + MIN_ADV_LENGTH);
1329a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            data_mask &= ~BTM_BLE_AD_BIT_SERVICE_128SOL;
1330a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        }
1331a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        /* 16bits/32bits/128bits Service Data */
1332a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_DATA &&
1333a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            p_data && p_data->p_service_data->len != 0 && p_data->p_service_data->p_val)
1334a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        {
1335a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            if (len  > (p_data->p_service_data->service_uuid.len + MIN_ADV_LENGTH))
1336a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            {
1337a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                if (p_data->p_service_data->len > (len - MIN_ADV_LENGTH))
1338a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                    cp_len = len - MIN_ADV_LENGTH- p_data->p_service_data->service_uuid.len;
1339a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                else
1340a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                    cp_len = p_data->p_service_data->len;
1341a6ce7751d84218c193eb90d390aef23217b1737eWei Wang
1342a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                *p++ = cp_len + 1 + p_data->p_service_data->service_uuid.len;
1343a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                if (p_data->p_service_data->service_uuid.len == LEN_UUID_16)
1344a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                {
1345a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                    *p++ = BTM_BLE_AD_TYPE_SERVICE_DATA;
1346a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                    UINT16_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid16);
1347a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                }
1348a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                else if (p_data->p_service_data->service_uuid.len == LEN_UUID_32)
1349a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                {
1350a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                    *p++ = BTM_BLE_AD_TYPE_32SERVICE_DATA;
1351a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                    UINT32_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid32);
1352a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                }
1353a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                else
1354a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                {
1355a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                    *p++ = BTM_BLE_AD_TYPE_128SERVICE_DATA;
1356a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                    ARRAY_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid128,
1357a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                                    LEN_UUID_128);
1358a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                }
1359a6ce7751d84218c193eb90d390aef23217b1737eWei Wang
1360a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                ARRAY_TO_STREAM(p, p_data->p_service_data->p_val, cp_len);
1361a6ce7751d84218c193eb90d390aef23217b1737eWei Wang
1362a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                len -= (cp_len + MIN_ADV_LENGTH + p_data->p_service_data->service_uuid.len);
1363a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                data_mask &= ~BTM_BLE_AD_BIT_SERVICE_DATA;
1364a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            }
1365a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            else
1366a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            {
13675344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_WARNING("service data does not fit");
1368a6ce7751d84218c193eb90d390aef23217b1737eWei Wang            }
1369a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        }
1370a6ce7751d84218c193eb90d390aef23217b1737eWei Wang
13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (len >= 6 && data_mask & BTM_BLE_AD_BIT_INT_RANGE &&
13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data)
13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = 5;
13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_BLE_AD_TYPE_INT_RANGE;
13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT16_TO_STREAM(p, p_data->int_range.low);
13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT16_TO_STREAM(p, p_data->int_range.hi);
13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len -= 6;
13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            data_mask &= ~BTM_BLE_AD_BIT_INT_RANGE;
13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (data_mask & BTM_BLE_AD_BIT_PROPRIETARY && p_data && p_data->p_proprietary)
13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (i = 0; i < p_data->p_proprietary->num_elem ; i ++)
13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_elem = p_data->p_proprietary->p_elem  + i;
13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1387a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                if (len >= (MIN_ADV_LENGTH + p_elem->len))/* len byte(1) + ATTR type(1) + Uuid len(2)
1388a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                                                          + value length */
13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    *p ++ = p_elem->len + 1; /* Uuid len + value length */
13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    *p ++ = p_elem->adv_type;
13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    ARRAY_TO_STREAM(p, p_elem->p_val, p_elem->len);
13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1394a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                    len -= (MIN_ADV_LENGTH + p_elem->len);
13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
13985344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                    BTM_TRACE_WARNING("data exceed max adv packet length");
13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            data_mask &= ~BTM_BLE_AD_BIT_PROPRIETARY;
14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p_data_mask = data_mask;
14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p_dst = p;
14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_flag;
14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
14127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
14137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_ble_select_adv_interval
14147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
14157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      select adv interval based on device mode
14167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
14177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          void
14187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
14197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
14207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battavoid btm_ble_select_adv_interval(tBTM_BLE_INQ_CB *p_cb, UINT8 evt_type, UINT16 *p_adv_int_min, UINT16 *p_adv_int_max)
14217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
14227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_cb->adv_interval_min && p_cb->adv_interval_max)
14237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
14247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        *p_adv_int_min = p_cb->adv_interval_min;
14257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        *p_adv_int_max = p_cb->adv_interval_max;
14267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
14277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    else
14287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
14297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        switch (evt_type)
14307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
14317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        case BTM_BLE_CONNECT_EVT:
14327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            *p_adv_int_min = *p_adv_int_max = BTM_BLE_GAP_ADV_FAST_INT_1;
14337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            break;
14347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
14357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        case BTM_BLE_NON_CONNECT_EVT:
14367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        case BTM_BLE_DISCOVER_EVT:
14377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            *p_adv_int_min = *p_adv_int_max = BTM_BLE_GAP_ADV_FAST_INT_2;
14387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            break;
14397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        /* connectable directed event */
14407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        case BTM_BLE_CONNECT_DIR_EVT:
14417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            *p_adv_int_min = BTM_BLE_GAP_ADV_DIR_MIN_INT;
14427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            *p_adv_int_max = BTM_BLE_GAP_ADV_DIR_MAX_INT;
14437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            break;
14447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
14457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        default:
14467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            *p_adv_int_min = *p_adv_int_max = BTM_BLE_GAP_ADV_SLOW_INT;
14477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            break;
14487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
14497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
14507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return;
14517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
14527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
14537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
14547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_ble_set_adv_flag
14557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
14567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      Set adv flag in adv data.
14577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
14587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          void
14597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
14607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
14617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battavoid btm_ble_set_adv_flag(UINT16 connect_mode, UINT16 disc_mode)
14627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
14637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT8 flag = 0, old_flag = 0;
14647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTM_BLE_LOCAL_ADV_DATA *p_adv_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
14657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
14667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_adv_data->p_flags != NULL)
14677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        flag = old_flag = *(p_adv_data->p_flags);
14687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
14697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    /* BR/EDR non-discoverable , non-connectable */
14707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((disc_mode & BTM_DISCOVERABLE_MASK) == 0 &&
14717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (connect_mode & BTM_CONNECTABLE_MASK) == 0)
14727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        flag |= BTM_BLE_BREDR_NOT_SPT;
14737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    else
14747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        flag &= ~BTM_BLE_BREDR_NOT_SPT;
14757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
14767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    /* if local controller support, mark both controller and host support in flag */
14777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (HCI_SIMUL_LE_BREDR_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
14787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        flag |= (BTM_BLE_DMT_CONTROLLER_SPT|BTM_BLE_DMT_HOST_SPT);
14797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    else
14807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        flag &= ~(BTM_BLE_DMT_CONTROLLER_SPT|BTM_BLE_DMT_HOST_SPT);
14817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1482720405962c82ab8d43995e8631b25a76a3dccebaMatthew Xie    BTM_TRACE_DEBUG("disc_mode %04x", disc_mode);
14837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    /* update discoverable flag */
14847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (disc_mode & BTM_BLE_LIMITED_DISCOVERABLE)
14857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
14867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        flag &= ~BTM_BLE_GEN_DISC_FLAG;
14877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        flag |= BTM_BLE_LIMIT_DISC_FLAG ;
14887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
14897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    else if (disc_mode & BTM_BLE_GENERAL_DISCOVERABLE)
14907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
14917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        flag |= BTM_BLE_GEN_DISC_FLAG;
14927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        flag &= ~BTM_BLE_LIMIT_DISC_FLAG;
14937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
14947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    else /* remove all discoverable flags */
14957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
14967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        flag &= ~(BTM_BLE_LIMIT_DISC_FLAG|BTM_BLE_GEN_DISC_FLAG);
14977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (flag != old_flag)
15007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
15017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_ble_update_adv_flag(flag);
15027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
15037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_set_discoverability
15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set BLE discoverable mode.
15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1510a6ce7751d84218c193eb90d390aef23217b1737eWei Wang** Parameters:      combined_mode: discoverability mode.
15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1512a6ce7751d84218c193eb90d390aef23217b1737eWei Wang** Returns          BTM_SUCCESS is status set successfully; otherwise failure.
15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_ble_set_discoverability(UINT16 combined_mode)
15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1517ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_LE_RANDOM_CB   *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB     *p_cb = &btm_cb.ble_ctr_cb.inq_var;
15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16              mode = (combined_mode &  BTM_BLE_DISCOVERABLE_MASK);
15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               new_mode = BTM_BLE_ADV_ENABLE;
15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               evt_type = (p_cb->connectable_mode == BTM_BLE_NON_CONNECTABLE) ? \
15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                   ((p_cb->scan_rsp) ? BTM_BLE_DISCOVER_EVT : BTM_BLE_NON_CONNECT_EVT )\
15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                   : BTM_BLE_CONNECT_EVT;
15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS         status = BTM_SUCCESS;
1525ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BD_ADDR             p_addr_ptr= {0};
1526ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBLE_ADDR_TYPE      init_addr_type = BLE_ADDR_PUBLIC,
15277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                        own_addr_type = p_addr_cb->own_addr_type;
15287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT16              adv_int_min, adv_int_max;
15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_ble_set_discoverability mode=0x%0x combined_mode=0x%x", mode, combined_mode);
15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*** Check mode parameter ***/
15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (mode > BTM_BLE_MAX_DISCOVERABLE)
15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_ILLEGAL_VALUE);
15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btm_ble_set_adv_flag (btm_cb.btm_inq_vars.connectable_mode, combined_mode);
15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &own_addr_type);
15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_cb->connectable_mode == BTM_BLE_NON_CONNECTABLE && mode == BTM_BLE_NON_DISCOVERABLE)
15417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        new_mode = BTM_BLE_ADV_DISABLE;
15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btm_ble_select_adv_interval(p_cb, evt_type, &adv_int_min, &adv_int_max);
15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btu_stop_timer(&p_cb->fast_adv_timer);
15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* update adv params if start advertising */
15485344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("evt_type=0x%x p-cb->evt_type=0x%x ", evt_type, p_cb->evt_type);
15497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1550ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (new_mode == BTM_BLE_ADV_ENABLE &&
15517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (evt_type != p_cb->evt_type ||p_cb->adv_addr_type != own_addr_type || !p_cb->fast_adv_on))
15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1553ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        btm_ble_stop_adv();
15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* update adv params */
15567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (!btsnd_hcic_ble_write_adv_params (adv_int_min,
15577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                              adv_int_max,
15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              evt_type,
1559ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                              own_addr_type,
1560ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                              init_addr_type,
1561ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                              p_addr_ptr,
15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              p_cb->adv_chnl_map,
15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              p_cb->afp))
15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTM_NO_RESOURCES;
15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
1567ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->evt_type = evt_type;
1569ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_cb->adv_addr_type = own_addr_type;
1570ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1573ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == BTM_SUCCESS && p_cb->adv_mode != new_mode)
15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1576ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (new_mode == BTM_BLE_ADV_ENABLE)
1577ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            status = btm_ble_start_adv();
15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
1579ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            status = btm_ble_stop_adv();
15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE)
15827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
15837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_cb->fast_adv_on = TRUE;
15847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        /* start initial GAP mode adv timer */
15857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btu_start_timer (&p_cb->fast_adv_timer, BTU_TTYPE_BLE_GAP_FAST_ADV,
15867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                          BTM_BLE_GAP_FAST_ADV_TOUT);
15877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set up stop advertising timer */
15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == BTM_SUCCESS && mode == BTM_BLE_LIMITED_DISCOVERABLE)
15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15925344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("start timer for limited disc mode duration=%d (180 secs)", BTM_BLE_GAP_LIM_TOUT);
15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* start Tgap(lim_timeout) */
15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_cb->inq_timer_ent, BTU_TTYPE_BLE_GAP_LIM_DISC,
15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                         BTM_BLE_GAP_LIM_TOUT);
15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_set_connectability
16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set BLE connectability mode.
16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1606a6ce7751d84218c193eb90d390aef23217b1737eWei Wang** Parameters:      combined_mode: connectability mode.
16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1608a6ce7751d84218c193eb90d390aef23217b1737eWei Wang** Returns          BTM_SUCCESS is status set successfully; otherwise failure.
16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_ble_set_connectability(UINT16 combined_mode)
16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1613ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_LE_RANDOM_CB       *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB         *p_cb = &btm_cb.ble_ctr_cb.inq_var;
16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  mode = (combined_mode & BTM_BLE_CONNECTABLE_MASK);
16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                   new_mode = BTM_BLE_ADV_ENABLE;
16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                   evt_type = (p_cb->scan_rsp) ? BTM_BLE_DISCOVER_EVT: BTM_BLE_NON_CONNECT_EVT;
16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS             status = BTM_SUCCESS;
1619ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BD_ADDR                 p_addr_ptr =  {0};
1620ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBLE_ADDR_TYPE          init_addr_type = BLE_ADDR_PUBLIC,
1621ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                            own_addr_type = p_addr_cb->own_addr_type;
16227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT16                  adv_int_min, adv_int_max;
16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16245344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_ble_set_connectability mode=0x%0x combined_mode=0x%x", mode, combined_mode);
16257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*** Check mode parameter ***/
16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (mode > BTM_BLE_MAX_CONNECTABLE)
16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_ILLEGAL_VALUE);
16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->connectable_mode = mode;
16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btm_ble_set_adv_flag (combined_mode,  btm_cb.btm_inq_vars.discoverable_mode);
1633ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
16347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &own_addr_type);
16357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
16367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (mode == BTM_BLE_NON_CONNECTABLE && p_cb->discoverable_mode == BTM_BLE_NON_DISCOVERABLE)
16377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        new_mode = BTM_BLE_ADV_DISABLE;
16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btm_ble_select_adv_interval(p_cb, evt_type, &adv_int_min, &adv_int_max);
16407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
16417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btu_stop_timer(&p_cb->fast_adv_timer);
16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* update adv params if needed */
16437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((p_cb->evt_type != evt_type || p_cb->adv_addr_type != p_addr_cb->own_addr_type || !p_cb->fast_adv_on))
16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1645ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        btm_ble_stop_adv();
16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (!btsnd_hcic_ble_write_adv_params (adv_int_min,
16487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                              adv_int_max,
16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              evt_type,
1650ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                              own_addr_type,
1651ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                              init_addr_type,
1652ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                              p_addr_ptr,
16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              p_cb->adv_chnl_map,
16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              p_cb->afp))
16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTM_NO_RESOURCES;
16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
1657ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->evt_type = evt_type;
1659ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_cb->adv_addr_type = own_addr_type;
1660ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1662ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* update advertising mode */
16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == BTM_SUCCESS && new_mode != p_cb->adv_mode)
16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (new_mode == BTM_BLE_ADV_ENABLE)
16677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            status = btm_ble_start_adv();
16687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
16697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            status = btm_ble_stop_adv();
16707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
16717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE)
16727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
16737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_cb->fast_adv_on = TRUE;
16747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        /* start initial GAP mode adv timer */
16757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btu_start_timer (&p_cb->fast_adv_timer, BTU_TTYPE_BLE_GAP_FAST_ADV,
16767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                             BTM_BLE_GAP_FAST_ADV_TOUT);
16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_start_inquiry
16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start BLE inquiry procedure.
16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the duration is zero, the periodic inquiry mode is cancelled.
16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      mode - GENERAL or LIMITED inquiry
16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_inq_params - pointer to the BLE inquiry parameter.
16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_results_cb - callback returning pointer to results (tBTM_INQ_RESULTS)
16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_cmpl_cb - callback indicating the end of an inquiry
16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_CMD_STARTED if successfully started
16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_NO_RESOURCES if could not allocate a message buffer
16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_BUSY - if an inquiry is already active
16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_ble_start_inquiry (UINT8 mode, UINT8   duration)
17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTM_STATUS status = BTM_CMD_STARTED;
17047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTM_BLE_CB *p_ble_cb = &btm_cb.ble_ctr_cb;
17057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTM_INQUIRY_VAR_ST      *p_inq = &btm_cb.btm_inq_vars;
17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17075344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG("btm_ble_start_inquiry: mode = %02x inq_active = 0x%02x", mode, btm_cb.btm_inq_vars.inq_active);
17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    /* if selective connection is active, or inquiry is already active, reject it */
17107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (BTM_BLE_IS_INQ_ACTIVE(p_ble_cb->scan_activity) ||
17117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        BTM_BLE_IS_SEL_CONN_ACTIVE (p_ble_cb->scan_activity))
17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17135344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR("LE Inquiry is active, can not start inquiry");
17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_BUSY);
17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity))
17187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
17197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_update_scanner_filter_policy(SP_ADV_ALL);
1720ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang
1721ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
1722ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang        /* enable IRK list */
1723d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji        btm_ble_vendor_irk_list_known_dev (TRUE);
1724ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang#endif
17257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        status = btm_ble_start_scan(BTM_BLE_DUPLICATE_DISABLE);
17267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (status == BTM_CMD_STARTED)
17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_inq->inq_active |= mode;
17317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_ble_cb->scan_activity |= mode;
17327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
17335344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG("btm_ble_start_inquiry inq_active = 0x%02x", p_inq->inq_active);
17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (duration != 0)
17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* start inquiry timer */
17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&p_inq->inq_timer_ent, BTU_TTYPE_BLE_INQUIRY, duration);
17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
17437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_read_remote_name_cmpl
17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when BLE remote name is received.
17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_read_remote_name_cmpl(BOOLEAN status, BD_ADDR bda, UINT16 length, char *p_name)
17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   hci_status = HCI_SUCCESS;
17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_NAME bd_name;
17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1760ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    memset(bd_name, 0, (BD_NAME_LEN + 1));
17617f9bcf85168b776133ebb8c7b3f2db16a1ec0f79Zhihai Xu    if (length > BD_NAME_LEN)
17627f9bcf85168b776133ebb8c7b3f2db16a1ec0f79Zhihai Xu    {
17637f9bcf85168b776133ebb8c7b3f2db16a1ec0f79Zhihai Xu        length = BD_NAME_LEN;
17647f9bcf85168b776133ebb8c7b3f2db16a1ec0f79Zhihai Xu    }
17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy((UINT8*)bd_name, p_name, length);
17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((!status) || (length==0))
17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hci_status = HCI_ERR_HOST_TIMEOUT;
17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1772ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btm_process_remote_name(bda, bd_name, length +1, hci_status);
17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_rmt_name_request_complete (bda, (UINT8 *)p_name, hci_status);
17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_read_remote_name
17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function read remote LE device name using GATT read
17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  procedure.
17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:       None.
17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_ble_read_remote_name(BD_ADDR remote_bda, tBTM_INQ_INFO *p_cur, tBTM_CMPL_CB *p_cb)
17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST      *p_inq = &btm_cb.btm_inq_vars;
17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17923aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
17933aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        return BTM_ERR_PROCESSING;
17943aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach
17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cur &&
17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cur->results.ble_evt_type != BTM_BLE_EVT_CONN_ADV &&
17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cur->results.ble_evt_type != BTM_BLE_EVT_CONN_DIR_ADV)
17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17995344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG("name request to non-connectable device failed.");
18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_ERR_PROCESSING;
18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* read remote device name using GATT procedure */
18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_inq->remname_active)
18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_BUSY;
18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!GAP_BleReadPeerDevName(remote_bda, btm_ble_read_remote_name_cmpl))
18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_BUSY;
18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->p_remname_cmpl_cb = p_cb;
18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->remname_active = TRUE;
18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(p_inq->remname_bda, remote_bda, BD_ADDR_LEN);
18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_start_timer (&p_inq->rmt_name_timer_ent,
18165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     BTU_TTYPE_BTM_RMT_NAME,
18175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     BTM_EXT_BLE_RMT_NAME_TIMEOUT);
18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return BTM_CMD_STARTED;
18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_cancel_remote_name
18255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function cancel read remote LE device name.
18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:       None.
18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
18315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_ble_cancel_remote_name(BD_ADDR remote_bda)
18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST      *p_inq = &btm_cb.btm_inq_vars;
18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN     status;
18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = GAP_BleCancelReadPeerDevName(remote_bda);
18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->remname_active = FALSE;
18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(p_inq->remname_bda, 0, BD_ADDR_LEN);
18425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_stop_timer(&p_inq->rmt_name_timer_ent);
18435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
18455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_update_adv_flag
18505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function update the limited discoverable flag in the adv
18525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  data.
18535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:       None.
18555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
18575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
18595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_update_adv_flag(UINT8 flag)
18605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_LOCAL_ADV_DATA *p_adv_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p;
18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18645344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("btm_ble_update_adv_flag new=0x%x", flag);
18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_adv_data->p_flags != NULL)
18675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18685344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("btm_ble_update_adv_flag old=0x%x",   *p_adv_data->p_flags);
18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_adv_data->p_flags = flag;
18705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else /* no FLAGS in ADV data*/
18725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = (p_adv_data->p_pad == NULL) ? p_adv_data->ad_data : p_adv_data->p_pad;
18745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* need 3 bytes space to stuff in the flags, if not */
18755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* erase all written data, just for flags */
18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((BTM_BLE_AD_DATA_LEN - (p - p_adv_data->ad_data)) < 3)
18775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p = p_adv_data->p_pad = p_adv_data->ad_data;
18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(p_adv_data->ad_data, 0, BTM_BLE_AD_DATA_LEN);
18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p++ = 2;
18835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p++ = BTM_BLE_AD_TYPE_FLAG;
18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_adv_data->p_flags = p;
18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p++ = flag;
18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_adv_data->p_pad = p;
18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btsnd_hcic_ble_set_adv_data((UINT8)(p_adv_data->p_pad - p_adv_data->ad_data),
18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    p_adv_data->ad_data))
18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_adv_data->data_mask |= BTM_BLE_AD_BIT_FLAGS;
18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if 0
18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_parse_adv_data
18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function parse the adv data into a structure.
19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer to entry, or NULL if not found
19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_parse_adv_data(tBTM_INQ_INFO *p_info, UINT8 *p_data,
19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                   UINT8 len, tBTM_BLE_INQ_DATA *p_adv_data, UINT8 *p_buf)
19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_cur = p_data;
19095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   ad_len, ad_type, ad_flag;
19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19115344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT (" btm_ble_parse_adv_data");
19125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (len > 0)
19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
19155344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG("btm_ble_parse_adv_data: len = %d", len);
19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((ad_len = *p_cur ++) == 0)
19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
19185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ad_type = *p_cur ++;
19205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19215344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG("     ad_type = %02x ad_len = %d", ad_type, ad_len);
19225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (ad_type)
19245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_BLE_AD_TYPE_NAME_SHORT:
19265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_BLE_AD_TYPE_NAME_CMPL:
19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_adv_data->ad_mask |= BTM_BLE_AD_BIT_DEV_NAME;
19295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_info)
19305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
19315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_info->remote_name_type =(ad_type == BTM_BLE_AD_TYPE_NAME_SHORT) ?
19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              BTM_BLE_NAME_SHORT: BTM_BLE_NAME_CMPL;
19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    memcpy(p_info->remote_name, p_cur, ad_len -1);
19345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_info->remote_name[ad_len] = 0;
19355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_adv_data->p_remote_name = p_info->remote_name;
19365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_info->remote_name_len = p_adv_data->remote_name_len = ad_len - 1;
19375344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                    BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_NAME name = %s",p_adv_data->p_remote_name);
19385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
19395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cur += (ad_len -1);
19405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
19425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_BLE_AD_TYPE_FLAG:
19445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_adv_data->ad_mask |= BTM_BLE_AD_BIT_FLAGS;
19455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ad_flag = *p_cur ++;
19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_adv_data->flag = (UINT8)(ad_flag & BTM_BLE_ADV_FLAG_MASK) ;
19475344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_FLAG flag = %s | %s | %s",
19485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 (p_adv_data->flag & BTM_BLE_LIMIT_DISC_FLAG)? "LE_LIMIT_DISC" : "",
19495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 (p_adv_data->flag & BTM_BLE_GEN_DISC_FLAG)? "LE_GENERAL_DISC" : "",
19505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 (p_adv_data->flag & BTM_BLE_BREDR_NOT_SPT)? "LE Only device" : "");
19515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
19525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_BLE_AD_TYPE_TX_PWR:
19545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_adv_data->ad_mask |= BTM_BLE_AD_BIT_TX_PWR;
19555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_adv_data->tx_power_level = (INT8)*p_cur ++;
19565344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_TX_PWR tx_level = %d", p_adv_data->tx_power_level);
19575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
19585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1959ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            case BTM_BLE_AD_TYPE_MANU:
19605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1961ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            case BTM_BLE_AD_TYPE_16SRV_PART:
1962ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            case BTM_BLE_AD_TYPE_16SRV_CMPL:
1963ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE;
1964ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                /* need allocate memory to store UUID list */
1965ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_adv_data->service.num_service = (ad_len - 1)/2;
19665344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service);
1967ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_cur += (ad_len - 1);
19685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
19695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1970ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            case BTM_BLE_AD_TYPE_SOL_SRV_UUID:
1971ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE_SOL;
19725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* need allocate memory to store UUID list */
19735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_adv_data->service.num_service = (ad_len - 1)/2;
19745344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service);
1975ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_cur += (ad_len - 1);
1976ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                break;
19775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1978ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            case BTM_BLE_AD_TYPE_128SOL_SRV_UUID:
1979ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE_128SOL;
1980ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                /* need allocate memory to store UUID list */
1981ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_adv_data->service.num_service = (ad_len - 1)/16;
19825344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service);
19835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cur += (ad_len - 1);
19845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
1985ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1986ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            case BTM_BLE_AD_TYPE_APPEARANCE:
1987ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            case BTM_BLE_AD_TYPE_PUBLIC_TARGET:
1988ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            case BTM_BLE_AD_TYPE_RANDOM_TARGET:
1989ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            default:
1990ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                break;
19915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len -= (ad_len + 1);
19935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
19965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
19985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_cache_adv_data
20005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Update advertising cache data.
20025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
20045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
20065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_cache_adv_data(tBTM_INQ_RESULTS *p_cur, UINT8 data_len, UINT8 *p, UINT8 evt_type)
20075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
20085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB     *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
20095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p_cache;
20105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 length;
20115cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_cur);
20125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* cache adv report/scan response data */
20145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (evt_type != BTM_BLE_SCAN_RSP_EVT)
20155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
20165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_le_inq_cb->adv_len = 0;
20175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(p_le_inq_cb->adv_data_cache, 0, BTM_BLE_CACHE_ADV_DATA_MAX);
20185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
20195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (data_len > 0)
20215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
20225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cache = &p_le_inq_cb->adv_data_cache[p_le_inq_cb->adv_len];
20235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT8(length, p);
20245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        while ( length && ((p_le_inq_cb->adv_len + length + 1) <= BTM_BLE_CACHE_ADV_DATA_MAX))
20255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
20265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* copy from the length byte & data into cache */
20275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy(p_cache, p-1, length+1);
20285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* advance the cache pointer past data */
20295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cache += length+1;
20305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* increment cache length */
20315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_le_inq_cb->adv_len += length+1;
20325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* skip the length of data */
20335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p += length;
20345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT8(length, p);
20355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
20365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
20375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* parse service UUID from adv packet and save it in inq db eir_uuid */
20395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* TODO */
20405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2041ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
20425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
20435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_is_discoverable
20455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      check ADV flag to make sure device is discoverable and match
20475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the search condition
20485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters
20505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
20525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
20547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaUINT8 btm_ble_is_discoverable(BD_ADDR bda, UINT8 evt_type, UINT8 *p)
20555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
20567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT8               *p_flag, flag = 0, rt = 0;
20575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                data_len;
20585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQ_PARMS      *p_cond = &btm_cb.btm_inq_vars.inqparms;
20597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTM_BLE_INQ_CB     *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
20605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UNUSED(p);
20625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* for observer, always "discoverable */
20647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
20657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        rt |= BTM_BLE_OBS_RESULT;
20667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
20677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (BTM_BLE_IS_SEL_CONN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity) &&
20687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_CONNECT_DIR_EVT))
20697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        rt |= BTM_BLE_SEL_CONN_RESULT;
20705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* does not match filter condition */
20725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cond->filter_cond_type == BTM_FILTER_COND_BD_ADDR &&
20735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcmp(bda, p_cond->filter_cond.bdaddr_cond, BD_ADDR_LEN) != 0)
20745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
20755344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG("BD ADDR does not meet filter condition");
20767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return rt;
20775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
20785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_le_inq_cb->adv_len != 0)
20805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
20817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if ((p_flag = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache,
20827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            BTM_BLE_AD_TYPE_FLAG, &data_len)) != NULL)
20835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
20845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            flag = * p_flag;
20855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if ((btm_cb.btm_inq_vars.inq_active & BTM_BLE_GENERAL_INQUIRY) &&
20875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (flag & (BTM_BLE_LIMIT_DISC_FLAG|BTM_BLE_GEN_DISC_FLAG)) != 0)
20885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
20895344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG("Find Generable Discoverable device");
20907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                rt |= BTM_BLE_INQ_RESULT;
20915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
20925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            else if (btm_cb.btm_inq_vars.inq_active & BTM_BLE_LIMITED_INQUIRY &&
20945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     (flag & BTM_BLE_LIMIT_DISC_FLAG) != 0)
20955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
20965344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG("Find limited discoverable device");
20977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                rt |= BTM_BLE_INQ_RESULT;
20985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
20995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
21005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
21017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return rt;
21025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2103ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2104e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampsonstatic void btm_ble_appearance_to_cod(UINT16 appearance, UINT8 *dev_class)
2105e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson{
2106e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson    dev_class[0] = 0;
2107e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson
2108e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson    switch (appearance)
2109e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson    {
2110e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_GENERIC_PHONE:
2111e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_PHONE;
2112e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
2113e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            break;
2114e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_GENERIC_COMPUTER:
2115e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_COMPUTER;
2116e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
2117e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            break;
2118e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_GENERIC_REMOTE:
2119e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2120e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_REMOTE_CONTROL;
2121e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            break;
2122e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_GENERIC_THERMOMETER:
2123e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_THERMOMETER_EAR:
2124e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_HEALTH;
2125e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_THERMOMETER;
2126e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            break;
2127e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_GENERIC_HEART_RATE:
2128e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_HEART_RATE_BELT:
2129e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_HEALTH;
2130e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_HEART_PULSE_MONITOR;
2131e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            break;
2132e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE:
2133e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_BLOOD_PRESSURE_ARM:
2134e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_BLOOD_PRESSURE_WRIST:
2135e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_HEALTH;
2136e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_BLOOD_MONITOR;
2137e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            break;
2138e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_GENERIC_PULSE_OXIMETER:
2139e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP:
2140e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_PULSE_OXIMETER_WRIST:
2141e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_HEALTH;
2142e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_PULSE_OXIMETER;
2143e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            break;
2144e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_GENERIC_GLUCOSE:
2145e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_HEALTH;
2146e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_GLUCOSE_METER;
2147e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            break;
2148e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_GENERIC_WEIGHT:
2149e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_HEALTH;
2150e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_WEIGHING_SCALE;
2151e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            break;
2152e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_GENERIC_WALKING:
2153e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_WALKING_IN_SHOE:
2154e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_WALKING_ON_SHOE:
2155e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_WALKING_ON_HIP:
2156e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_HEALTH;
2157e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_STEP_COUNTER;
2158e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            break;
2159e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_GENERIC_WATCH:
2160e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_SPORTS_WATCH:
2161e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_WEARABLE;
2162e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_WRIST_WATCH;
2163e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            break;
2164e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_GENERIC_EYEGLASSES:
2165e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_WEARABLE;
2166e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_GLASSES;
2167e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            break;
2168e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_GENERIC_DISPLAY:
2169e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_IMAGING;
2170e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_DISPLAY;
2171e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            break;
2172e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_GENERIC_MEDIA_PLAYER:
2173e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_AUDIO;
2174e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
2175e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            break;
2176e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_GENERIC_BARCODE_SCANNER:
2177e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_HID_BARCODE_SCANNER:
2178e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_GENERIC_HID:
2179e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2180e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
2181e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            break;
2182e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_HID_KEYBOARD:
2183e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2184e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_KEYBOARD;
2185e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            break;
2186e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_HID_MOUSE:
2187e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2188e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_POINTING;
2189e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            break;
2190e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_HID_JOYSTICK:
2191e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2192e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_JOYSTICK;
2193e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            break;
2194e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_HID_GAMEPAD:
2195e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2196e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_GAMEPAD;
2197e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            break;
2198e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_HID_DIGITIZER_TABLET:
2199e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2200e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_DIGITIZING_TABLET;
2201e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            break;
2202e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_HID_CARD_READER:
2203e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2204e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_CARD_READER;
2205e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            break;
2206e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_HID_DIGITAL_PEN:
2207e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2208e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_DIGITAL_PAN;
2209e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            break;
2210e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_UKNOWN:
2211e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_GENERIC_CLOCK:
2212e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_GENERIC_TAG:
2213e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_GENERIC_KEYRING:
2214e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_GENERIC_CYCLING:
2215e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_CYCLING_COMPUTER:
2216e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_CYCLING_SPEED:
2217e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_CYCLING_CADENCE:
2218e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_CYCLING_POWER:
2219e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_CYCLING_SPEED_CADENCE:
2220e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS:
2221e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION:
2222e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_AND_NAV:
2223e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD:
2224e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD_AND_NAV:
2225e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        default:
2226e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[1] = BTM_COD_MAJOR_UNCLASSIFIED;
2227e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
2228e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson    };
2229e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson}
2230e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson
22315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
22325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
22335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_update_inq_result
22345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
22355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Update adv packet information into inquiry result.
22365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
22375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters
22385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
22395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
22405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
22415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
22425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_ble_update_inq_result(tINQ_DB_ENT *p_i, UINT8 addr_type, UINT8 evt_type, UINT8 *p)
22435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
22445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN             to_report = TRUE;
22455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQ_RESULTS     *p_cur = &p_i->inq_info.results;
22465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               len;
22475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               *p_flag;
22485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST  *p_inq = &btm_cb.btm_inq_vars;
22495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                data_len, rssi;
22505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB     *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
22515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p1;
22521237ee3c4bf3c8b65c2e83409db76669b1f1dcfdZhihai Xu    UINT8               *p_uuid16;
22535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8    (data_len, p);
22555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (data_len > BTM_BLE_ADV_DATA_LEN_MAX)
22575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
22585344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING("EIR data too long %d. discard", data_len);
22595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
22605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
22615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_ble_cache_adv_data(p_cur, data_len, p, evt_type);
22625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p1 = (p + data_len);
22645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (rssi, p1);
22655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save the info */
22675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cur->inq_result_type = BTM_INQ_RESULT_BLE;
22685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cur->ble_addr_type    = addr_type;
22695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cur->rssi = rssi;
22705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* active scan, always wait until get scan_rsp to report the result */
22725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_cb.ble_ctr_cb.inq_var.scan_type == BTM_BLE_SCAN_MODE_ACTI &&
22735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_DISCOVER_EVT)))
22745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
22755344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG("btm_ble_update_inq_result scan_rsp=false, to_report=false,\
22760830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora                              scan_type_active=%d", btm_cb.ble_ctr_cb.inq_var.scan_type);
22775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_i->scan_rsp = FALSE;
22785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        to_report = FALSE;
22795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
22805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
22815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_i->scan_rsp = TRUE;
22825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_i->inq_count != p_inq->inq_counter)
22845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cur->device_type = BT_DEVICE_TYPE_BLE;
22855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
22865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cur->device_type |= BT_DEVICE_TYPE_BLE;
22875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (evt_type != BTM_BLE_SCAN_RSP_EVT)
22895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cur->ble_evt_type     = evt_type;
22905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_i->inq_count = p_inq->inq_counter;   /* Mark entry for current inquiry */
22925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_le_inq_cb->adv_len != 0)
22945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
22955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_flag = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache, BTM_BLE_AD_TYPE_FLAG, &len)) != NULL)
22965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cur->flag = * p_flag;
22975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
22985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22991237ee3c4bf3c8b65c2e83409db76669b1f1dcfdZhihai Xu    if (p_le_inq_cb->adv_len != 0)
23001237ee3c4bf3c8b65c2e83409db76669b1f1dcfdZhihai Xu    {
2301e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        /* Check to see the BLE device has the Appearance UUID in the advertising data.  If it does
2302e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson         * then try to convert the appearance value to a class of device value Bluedroid can use.
2303e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson         * Otherwise fall back to trying to infer if it is a HID device based on the service class.
2304e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson         */
2305e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        p_uuid16 = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache, BTM_BLE_AD_TYPE_APPEARANCE, &len);
2306e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        if (p_uuid16 && len == 2)
23071237ee3c4bf3c8b65c2e83409db76669b1f1dcfdZhihai Xu        {
2308e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            btm_ble_appearance_to_cod((UINT16)p_uuid16[0] | (p_uuid16[1] << 8), p_cur->dev_class);
2309e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        }
2310e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        else
2311e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson        {
2312e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson            if ((p_uuid16 = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache,
2313e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson                                             BTM_BLE_AD_TYPE_16SRV_CMPL, &len)) != NULL)
23141237ee3c4bf3c8b65c2e83409db76669b1f1dcfdZhihai Xu            {
2315e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson                UINT8 i;
2316e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson                for (i = 0; i + 2 <= len; i = i + 2)
23171237ee3c4bf3c8b65c2e83409db76669b1f1dcfdZhihai Xu                {
2318e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson                    /* if this BLE device support HID over LE, set HID Major in class of device */
2319e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson                    if ((p_uuid16[i] | (p_uuid16[i+1] << 8)) == UUID_SERVCLASS_LE_HID)
2320e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson                    {
2321e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson                        p_cur->dev_class[0] = 0;
2322e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson                        p_cur->dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2323e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson                        p_cur->dev_class[2] = 0;
2324e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson                        break;
2325e6c7450a2addbb856e68b66a726b71286f809b19Adam Hampson                    }
23261237ee3c4bf3c8b65c2e83409db76669b1f1dcfdZhihai Xu                }
23271237ee3c4bf3c8b65c2e83409db76669b1f1dcfdZhihai Xu            }
23281237ee3c4bf3c8b65c2e83409db76669b1f1dcfdZhihai Xu        }
23291237ee3c4bf3c8b65c2e83409db76669b1f1dcfdZhihai Xu    }
23301237ee3c4bf3c8b65c2e83409db76669b1f1dcfdZhihai Xu
23315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if BR/EDR not supported is not set, assume is a DUMO device */
2332ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((p_cur->flag & BTM_BLE_BREDR_NOT_SPT) == 0 &&
2333ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         evt_type != BTM_BLE_CONNECT_DIR_EVT)
23345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2335bf68ac75380057ad7b23669c0443ca585b84ccc3Andre Eisenbach        if (p_cur->ble_addr_type != BLE_ADDR_RANDOM)
2336bf68ac75380057ad7b23669c0443ca585b84ccc3Andre Eisenbach        {
23375344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG("BR/EDR NOT support bit not set, treat as DUMO");
2338bf68ac75380057ad7b23669c0443ca585b84ccc3Andre Eisenbach            p_cur->device_type |= BT_DEVICE_TYPE_DUMO;
2339bf68ac75380057ad7b23669c0443ca585b84ccc3Andre Eisenbach        } else {
23405344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG("Random address, treating device as LE only");
2341bf68ac75380057ad7b23669c0443ca585b84ccc3Andre Eisenbach        }
23425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
23445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23455344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG("BR/EDR NOT SUPPORT bit set, LE only device");
23465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return to_report;
23495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
23515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
23535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_send_sel_conn_callback
23555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      send selection connection request callback.
23575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters
23595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
23615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
23635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_send_sel_conn_callback(BD_ADDR remote_bda, UINT8 evt_type, UINT8 *p_data, UINT8 addr_type)
23645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
23655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   data_len, len;
23665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_dev_name, remname[31] = {0};
23675cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(addr_type);
23685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.ble_ctr_cb.p_select_cback == NULL ||
23705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* non-connectable device */
23715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (evt_type != BTM_BLE_EVT_CONN_ADV && evt_type != BTM_BLE_EVT_CONN_DIR_ADV))
23725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
23735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8    (data_len, p_data);
23755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* get the device name if exist in ADV data */
23775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (data_len != 0)
23785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_name = BTM_CheckAdvData(p_data, BTM_BLE_AD_TYPE_NAME_CMPL, &len);
23805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_name == NULL)
23825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_name = BTM_CheckAdvData(p_data, BTM_BLE_AD_TYPE_NAME_SHORT, &len);
23835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_name)
23855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy(remname, p_dev_name, len);
23865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* allow connection */
23885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((* btm_cb.ble_ctr_cb.p_select_cback)(remote_bda, remname))
23895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* terminate selective connection, initiate connection */
23915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_ble_initiate_select_conn(remote_bda);
23925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
23945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
23965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_process_adv_pkt
23985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when adv packet report events are
24005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  received from the device. It updates the inquiry database.
24015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the inquiry database is full, the oldest entry is discarded.
24025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters
24045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
24065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
24085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_process_adv_pkt (UINT8 *p_data)
24095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
24105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_ADDR             bda;
24115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               evt_type = 0, *p = p_data;
24125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               addr_type = 0;
2413186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson    UINT8               num_reports;
2414186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson    UINT8               data_len;
24157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
24168b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    BOOLEAN             match = FALSE;
24178b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#endif
24185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2419186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson    /* Extract the number of reports in this event. */
2420186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson    STREAM_TO_UINT8(num_reports, p);
24215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2422186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson    while (num_reports--)
2423186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson    {
2424186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson        /* Extract inquiry results */
2425186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson        STREAM_TO_UINT8    (evt_type, p);
2426186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson        STREAM_TO_UINT8    (addr_type, p);
2427186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson        STREAM_TO_BDADDR   (bda, p);
24285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2429ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#ifdef BTM_BLE_PC_ADV_TEST_MODE /* For general stack code (e.g. BTInsight testing), we simply do not define it to exclude or set it to TRUE to include */
2430186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson        if (BTM_BLE_PC_ADV_TEST_MODE)   /* For stack component, it is always defined and maps to a global variable g_bDraculaAdvertisingMode */
2431186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson        {
2432186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson            if (btm_cb.ble_ctr_cb.p_scan_req_cback)
2433186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson                (*btm_cb.ble_ctr_cb.p_scan_req_cback)(bda, addr_type, evt_type);
2434186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson        }
24355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
24365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2437ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
24385344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    /* map address to security record */
24395344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    btm_public_addr_to_random_pseudo(bda, &addr_type);
24405344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_ERROR("new address: %02x:%02x:%02x:%02x:%02x:%02x",
2441ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang                     bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
2442ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang#endif
2443ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2444186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson        /* Only process the results if the inquiry is still active */
2445186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson        if (!BTM_BLE_IS_SCAN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
2446186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson            return;
24475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24485344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG("btm_ble_process_adv_pkt:bda= %0x:%0x:%0x:%0x:%0x:%0x",
24490830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora                                     bda[0],bda[1],bda[2],bda[3],bda[4],bda[5]);
24507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
24518b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#if SMP_INCLUDED == TRUE
2452186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson        /* always do RRA resolution on host */
2453186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson        if (!match && BTM_BLE_IS_RESOLVE_BDA(bda))
2454186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson        {
2455186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson            btm_ble_resolve_random_addr(bda, btm_ble_resolve_random_addr_on_adv, p_data);
2456186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson        }
2457186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson        else
24588b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#endif
24598b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#endif
2460186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson        {
2461186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson            btm_ble_process_adv_pkt_cont(bda, addr_type, evt_type, p);
2462186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson        }
2463186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson
2464186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson        STREAM_TO_UINT8(data_len, p);
2465186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson
2466186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson        /* Advance to the next event data_len + rssi byte */
2467186cddb6f0e23f05742074b703c99805e3f37ac3Adam Hampson        p += data_len + 1;
24688b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    }
24695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
24705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
24725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_process_adv_pkt_cont
24745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called after random address resolution is
24765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  done, and proceed to process adv packet.
24775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters
24795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
24815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
24835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_process_adv_pkt_cont(BD_ADDR bda, UINT8 addr_type, UINT8 evt_type, UINT8 *p)
24845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
24855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tINQ_DB_ENT          *p_i;
24865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST  *p_inq = &btm_cb.btm_inq_vars;
24875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQ_RESULTS_CB  *p_inq_results_cb = p_inq->p_inq_results_cb;
24887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTM_INQ_RESULTS_CB  *p_obs_results_cb = btm_cb.ble_ctr_cb.p_obs_results_cb;
24895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB      *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
24907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    BOOLEAN     update = TRUE;
24917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT8       result = 0;
24925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_i = btm_inq_db_find (bda);
24945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if this address has already been processed for this inquiry */
24965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_inq_find_bdaddr(bda))
24975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
24985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* never been report as an LE device */
24997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (p_i &&
25005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (!(p_i->inq_info.results.device_type & BT_DEVICE_TYPE_BLE) ||
25015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              /* scan repsonse to be updated */
25025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              (!p_i->scan_rsp)))
25035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
25047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            update = TRUE;
25057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
25067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
25077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
25087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            update = FALSE;
25095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
25105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
25115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
25127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            /* if yes, skip it */
25137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            return; /* assumption: one result per event */
25145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
25155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If existing entry, use that, else get  a new one (possibly reusing the oldest) */
25175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_i == NULL)
25185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
25190830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora        if ((p_i = btm_inq_db_new (bda)) != NULL)
25205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
25210830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora            p_inq->inq_cmpl_info.num_resp++;
25220830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora        }
25230830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora        else
25240830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora            return;
25255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_i->inq_count != p_inq->inq_counter) /* first time seen in this inquiry */
25275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
25285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->inq_cmpl_info.num_resp++;
25295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* update the LE device information in inquiry database */
25317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (!btm_ble_update_inq_result(p_i, addr_type, evt_type, p))
25327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return;
25337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
25347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((result = btm_ble_is_discoverable(bda, evt_type, p)) == 0)
25357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
25365344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR("discard adv pkt");
25377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return;
25387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
25397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (!update)
25407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        result &= ~BTM_BLE_INQ_RESULT;
25415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_USE_INQ_RESULTS_FILTER == TRUE
25425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If the number of responses found and limited, issue a cancel inquiry */
25435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_inq->inqparms.max_resps &&
25445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->inq_cmpl_info.num_resp == p_inq->inqparms.max_resps)
25455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
25465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* new device */
25475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_i == NULL ||
25485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (/* assume a DUMO device, BR/EDR inquiry is always active */
25495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             p_i && p_i->inq_info.results.device_type == BT_DEVICE_TYPE_BLE && p_i->scan_rsp))
25505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
25515344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING("INQ RES: Extra Response Received...cancelling inquiry..");
25525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2553ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* if is non-periodic inquiry active, cancel now */
2554ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if ((p_inq->inq_active & BTM_BR_INQ_ACTIVE_MASK) != 0 &&
2555ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                (p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) == 0)
25565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btsnd_hcic_inq_cancel();
25575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_ble_stop_inquiry();
25595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE
25615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_acl_update_busy_level (BTM_BLI_INQ_DONE_EVT);
25625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
25635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
25645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
25665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* background connection in selective connection mode */
25675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE)
25685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
25697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (result & BTM_BLE_SEL_CONN_RESULT)
2570ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            btm_send_sel_conn_callback(bda, evt_type, p, addr_type);
2571ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        else
2572ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
25735344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG("None LE device, can not initiate selective connection");
2574ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
25755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    else
25775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
25787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (p_inq_results_cb && (result & BTM_BLE_INQ_RESULT))
25797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
25800830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora            (p_inq_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results, p_le_inq_cb->adv_data_cache);
25817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
25827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (p_obs_results_cb && (result & BTM_BLE_OBS_RESULT))
25837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
25847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (p_obs_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results, p_le_inq_cb->adv_data_cache);
25857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
25867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
25877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
25887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
25897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
25907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
25917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_ble_start_scan
25927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
25937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      Start the BLE scan.
25947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
25957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          void
25967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
25977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
25987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS btm_ble_start_scan (UINT8 filter_enable)
25997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
26007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
26017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTM_STATUS status = BTM_CMD_STARTED;
26027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
26037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    /* start scan, disable duplicate filtering */
2604dab87145ee90c71bcec1b78a55ad5a011322ce34Mike J. Chen    if (!btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_ENABLE, filter_enable)) {
26057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        status = BTM_NO_RESOURCES;
2606dab87145ee90c71bcec1b78a55ad5a011322ce34Mike J. Chen        btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_SCAN;
2607dab87145ee90c71bcec1b78a55ad5a011322ce34Mike J. Chen    }
26087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    else
26097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
2610dab87145ee90c71bcec1b78a55ad5a011322ce34Mike J. Chen        btm_cb.ble_ctr_cb.wl_state |= BTM_BLE_WL_SCAN;
26117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (p_inq->scan_type == BTM_BLE_SCAN_MODE_ACTI)
26127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_ble_set_topology_mask(BTM_BLE_STATE_ACTIVE_SCAN_BIT);
26137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
26147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_ble_set_topology_mask(BTM_BLE_STATE_PASSIVE_SCAN_BIT);
26155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return status;
26175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
26185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
26205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_stop_scan
26225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Stop the BLE scan.
26245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
26265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
26285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_stop_scan(void)
26295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
26305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_ble_stop_scan ");
26315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Clear the inquiry callback if set */
26337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btm_cb.ble_ctr_cb.inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE;
26345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* stop discovery now */
26365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_ENABLE);
26375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btm_update_scanner_filter_policy(SP_ADV_ALL);
2639dab87145ee90c71bcec1b78a55ad5a011322ce34Mike J. Chen
2640dab87145ee90c71bcec1b78a55ad5a011322ce34Mike J. Chen    btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_SCAN;
26417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
26427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
26437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
26447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_ble_stop_inquiry
26457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
26467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      Stop the BLE Inquiry.
26477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
26487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          void
26497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
26507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
26517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battavoid btm_ble_stop_inquiry(void)
26527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
26537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
26547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTM_BLE_CB *p_ble_cb = &btm_cb.ble_ctr_cb;
26557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
26567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btu_stop_timer (&p_ble_cb->inq_var.inq_timer_ent);
26577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
26587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_ble_cb->scan_activity &=  ~BTM_BLE_INQUIRY_MASK;
26597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
26607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    /* If no more scan activity, stop LE scan now */
26617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity))
26627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_ble_stop_scan();
26637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
26645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If we have a callback registered for inquiry complete, call it */
26655344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("BTM Inq Compl Callback: status 0x%02x, num results %d",
26665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_inq->inq_cmpl_info.status, p_inq->inq_cmpl_info.num_resp);
26675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_process_inq_complete(HCI_SUCCESS, (UINT8)(p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK));
26697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
26707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
26717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
26727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
26737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_ble_stop_observe
26747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
26757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      Stop the BLE Observe.
26767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
26777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          void
26787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
26797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
26807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic void btm_ble_stop_observe(void)
26817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
26827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTM_BLE_CB *p_ble_cb = & btm_cb.ble_ctr_cb;
26837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTM_CMPL_CB *p_obs_cb = p_ble_cb->p_obs_cmpl_cb;
26847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
26857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btu_stop_timer (&p_ble_cb->obs_timer_ent);
26865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_ble_cb->scan_activity &= ~BTM_LE_OBSERVE_ACTIVE;
26887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
26897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_ble_cb->p_obs_results_cb = NULL;
26907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_ble_cb->p_obs_cmpl_cb = NULL;
26917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
26927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity))
26937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_ble_stop_scan();
26947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
26957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_obs_cb)
26967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (p_obs_cb)((tBTM_INQUIRY_CMPL *) &btm_cb.btm_inq_vars.inq_cmpl_info);
26977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
26987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
26997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
27007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_ble_adv_states_operation
27017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
27027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      Set or clear adv states in topology mask
27037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
27047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          operation status. TRUE if sucessful, FALSE otherwise.
27057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
27067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
27077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battatypedef BOOLEAN (BTM_TOPOLOGY_FUNC_PTR)(tBTM_BLE_STATE_MASK);
27087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_ble_adv_states_operation(BTM_TOPOLOGY_FUNC_PTR *p_handler, UINT8 adv_evt)
27097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
27107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    BOOLEAN rt = FALSE;
27117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
27127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    switch (adv_evt)
27137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
27147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    case BTM_BLE_CONNECT_EVT:
27157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        rt  = (*p_handler)(BTM_BLE_STATE_CONN_ADV_BIT);
27167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        break;
27177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
27187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    case  BTM_BLE_NON_CONNECT_EVT:
27197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        rt  = (*p_handler) (BTM_BLE_STATE_NON_CONN_ADV_BIT);
27207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        break;
27217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    case BTM_BLE_CONNECT_DIR_EVT:
27227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        rt  =  (*p_handler) (BTM_BLE_STATE_HI_DUTY_DIR_ADV_BIT);
27237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        break;
27247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
27257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    case BTM_BLE_DISCOVER_EVT:
27267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        rt  =  (*p_handler) (BTM_BLE_STATE_SCAN_ADV_BIT);
27277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        break;
27287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
27297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    default:
27305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR("unknown adv event : %d", adv_evt);
27317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        break;
27327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
27337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
27347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return rt;
27355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
27365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
27385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
27395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2740ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_ble_start_adv
2741ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
27427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      start the BLE advertising.
2743ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2744ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void
2745ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2746ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
27477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS btm_ble_start_adv(void)
2748ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
2749ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
2750ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_STATUS     rt = BTM_NO_RESOURCES;
2751ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
27527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (!btm_ble_adv_states_operation (btm_ble_topology_check, p_cb->evt_type))
27537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return BTM_WRONG_MODE;
27547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
27557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_cb->afp != AP_SCAN_CONN_ALL)
27567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
27577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_execute_wl_dev_operation();
27587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_cb.ble_ctr_cb.wl_state |= BTM_BLE_WL_ADV;
27597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
27607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
2761ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_ENABLE))
2762ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
2763ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (p_cb->afp != AP_SCAN_CONN_ALL)
2764ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta             btm_cb.ble_ctr_cb.wl_state |= BTM_BLE_WL_ADV;
2765ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2766ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         p_cb->adv_mode = BTM_BLE_ADV_ENABLE;
2767ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2768ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         rt = BTM_SUCCESS;
27697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
27707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    else
27717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
27727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_cb->adv_mode = BTM_BLE_ADV_DISABLE;
27737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV;
27747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
27757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return rt;
2776ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
2777ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
2778ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
27795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_stop_adv
27805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Stop the BLE advertising.
27825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
27845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
27867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS btm_ble_stop_adv(void)
27875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2788ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
2789ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_STATUS rt = BTM_SUCCESS;
27905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2791ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE)
27925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2793ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_DISABLE))
2794ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
27957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_cb->fast_adv_on = FALSE;
2796ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_cb->adv_mode = BTM_BLE_ADV_DISABLE;
2797ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV;
27987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
27997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            /* clear all adv states */
28007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_ble_clear_topology_mask (BTM_BLE_STATE_ALL_ADV_MASK);
2801ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
2802ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        else
2803ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            rt = BTM_NO_RESOURCES;
28045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2805ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return rt;
28067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
28077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
28087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
28097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
28107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
28117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_ble_set_topology_mask
28127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
28137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      set BLE topology mask
28147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
28157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          TRUE is request is allowed, FALSE otherwise.
28167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
28177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
28187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN btm_ble_set_topology_mask(tBTM_BLE_STATE_MASK request_state_mask)
28197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
28207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    BOOLEAN rt = TRUE;
28217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
28227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    request_state_mask &= BTM_BLE_STATE_ALL_MASK;
28237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
28247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btm_cb.ble_ctr_cb.cur_states |= request_state_mask;
28257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
28267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return rt;
28277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
28287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
28297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
28307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_ble_clear_topology_mask
28317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
28327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      Clear BLE topology bit mask
28337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
28347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          TRUE is request is allowed, FALSE otherwise.
28357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
28367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
28377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN btm_ble_clear_topology_mask (tBTM_BLE_STATE_MASK request_state_mask)
28387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
28397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    request_state_mask &= BTM_BLE_STATE_ALL_MASK;
28407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
28417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btm_cb.ble_ctr_cb.cur_states &= ~request_state_mask;
28427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
28437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return TRUE;
28447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
28457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
28467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
28477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_ble_update_mode_operation
28487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
28497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      This function update the GAP role operation when a link status
28507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  is updated.
28517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
28527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          void
28537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
28547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
285524adb37e4106bf8544c7729d34451fdf2777c4dcPriti Agheravoid btm_ble_update_mode_operation(UINT8 link_role, BD_ADDR bd_addr, UINT8 status)
28567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
28577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tACL_CONN   *pa = &btm_cb.acl_db[0];
28587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT16       xx;
28597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT16       mask = BTM_BLE_STATE_ALL_CONN_MASK;
28607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
28617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UNUSED(bd_addr);
28627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
28637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (link_role == HCI_ROLE_SLAVE)
28647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
28657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_cb.ble_ctr_cb.inq_var.adv_mode  = BTM_BLE_ADV_DISABLE;
28667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        /* clear all adv states */
28677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        mask |= BTM_BLE_STATE_ALL_ADV_MASK;
28687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
28697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
28707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btm_ble_clear_topology_mask (mask);
28717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
28727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    /* check the device link role maps */
28737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, pa++)
28747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
28757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (pa->in_use && pa->transport == BT_TRANSPORT_LE)
28767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
28777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (pa->link_role == HCI_ROLE_MASTER)
28787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                btm_ble_set_topology_mask (BTM_BLE_STATE_MASTER_BIT);
28797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            else
28807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                btm_ble_set_topology_mask (BTM_BLE_STATE_SLAVE_BIT);
28817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
28827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
28837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
2884c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji    if (btm_cb.cmn_ble_vsc_cb.adv_inst_max == 0 &&
2885a6ce7751d84218c193eb90d390aef23217b1737eWei Wang        btm_cb.ble_ctr_cb.inq_var.connectable_mode == BTM_BLE_CONNECTABLE)
28867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
28877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_ble_set_connectability ( btm_cb.ble_ctr_cb.inq_var.connectable_mode );
28887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
2889ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
289024adb37e4106bf8544c7729d34451fdf2777c4dcPriti Aghera    if (btm_ble_get_conn_st() == BLE_CONN_IDLE && status != HCI_ERR_HOST_REJECT_RESOURCES)
28917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
28927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (!btm_send_pending_direct_conn())
28937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
28947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_ble_resume_bg_conn();
28957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
28967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
28975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
28985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_ble_start_slow_adv
29027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
29037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      Restart adv with slow adv interval
29047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
29057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          void
29067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
29077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
29087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic void btm_ble_start_slow_adv (void)
29097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
29107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTM_BLE_INQ_CB         *p_cb = &btm_cb.ble_ctr_cb.inq_var;
29117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    BD_ADDR                 p_addr_ptr= {0};
29127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
29137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE)
29147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
29157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_ble_stop_adv();
29167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
29177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btsnd_hcic_ble_write_adv_params (BTM_BLE_GAP_ADV_SLOW_INT,
29187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                         BTM_BLE_GAP_ADV_SLOW_INT,
29197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                         p_cb->evt_type,
29207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                         p_cb->adv_addr_type,
29217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                         btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,/* slow adv
29227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                         mode never goes into directed adv */
29237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                         p_addr_ptr,
29247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                         p_cb->adv_chnl_map,
29257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                         p_cb->afp);
29267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
29277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_ble_start_adv();
29287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
29297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
29307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
29317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
29325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_timeout
29335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Called when BTM BLE inquiry timer expires
29355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
29375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
29395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_timeout(TIMER_LIST_ENT *p_tle)
29405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
29415344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_ble_timeout");
29427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
29435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_tle->event)
29445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
29457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        case BTU_TTYPE_BLE_OBSERVE:
29467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_ble_stop_observe();
29477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            break;
29487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
29495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTU_TTYPE_BLE_INQUIRY:
29507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_ble_stop_inquiry();
29515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
29525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTU_TTYPE_BLE_GAP_LIM_DISC:
29545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* lim_timeout expiried, limited discovery should exit now */
29557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_cb.btm_inq_vars.discoverable_mode &= ~BTM_BLE_LIMITED_DISCOVERABLE;
29567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_ble_set_adv_flag(btm_cb.btm_inq_vars.connectable_mode, btm_cb.btm_inq_vars.discoverable_mode);
29575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
29585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTU_TTYPE_BLE_RANDOM_ADDR:
2960ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type == BLE_ADDR_RANDOM)
29615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
296216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham                if (NULL == (void *)(p_tle->param))
296316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham                {
296416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham                    /* refresh the random addr */
296516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham                    btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low);
296616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham                }
2967a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                else
2968a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                {
296916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham                    if (BTM_BleMaxMultiAdvInstanceCount() > 0)
297016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham                       btm_ble_multi_adv_configure_rpa((tBTM_BLE_MULTI_ADV_INST*)p_tle->param);
2971a6ce7751d84218c193eb90d390aef23217b1737eWei Wang                }
29725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
29735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
29745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        case BTU_TTYPE_BLE_GAP_FAST_ADV:
29767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            /* fast adv is completed, fall back to slow adv interval */
29777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_ble_start_slow_adv();
29787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            break;
29797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
29807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        default:
29817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            break;
29827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
29835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_read_remote_features_complete
29905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the command complete message
29925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is received from the HCI for the read LE remote feature supported
29935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  complete event.
29945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
29965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
29985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_read_remote_features_complete(UINT8 *p)
29995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
30005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tACL_CONN        *p_acl_cb = &btm_cb.acl_db[0];
30015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16            handle;
30029c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera    UINT8             status;
30033aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    int               xx;
30045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30055344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_ble_read_remote_features_complete ");
30065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30079c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera    STREAM_TO_UINT8(status, p);
30089c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera    /* if LE read remote feature failed, expect disconnect complete to be received */
30099c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera    if (status == HCI_SUCCESS)
30105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30119c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera        STREAM_TO_UINT16 (handle, p);
30129c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera
30139c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera        /* Look up the connection by handle and copy features */
30149c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera        for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_acl_cb++)
30155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
30169c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera            if ((p_acl_cb->in_use) && (p_acl_cb->hci_handle == handle))
30179c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera            {
30189c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera                STREAM_TO_ARRAY(p_acl_cb->peer_le_features, p, BD_FEATURES_LEN);
30197ae25156f4250af9d0e8cd8d559d916cfb847febPrerepa Viswanadham                /*notify link up here */
30209c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera                l2cble_notify_le_connection (p_acl_cb->remote_addr);
30219c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera                break;
30229c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera            }
30235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
30245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
30257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
30265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
30275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
30295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_write_adv_enable_complete
30315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function process the write adv enable command complete.
30335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
30355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
30375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_write_adv_enable_complete(UINT8 * p)
30385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
30395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
30405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if write adv enable/disbale not succeed */
30425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (*p != HCI_SUCCESS)
30435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* toggle back the adv mode */
30455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->adv_mode = !p_cb->adv_mode;
30465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3047ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
3048ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
3049ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
3050ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
3051ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_ble_dir_adv_tout
3052ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
3053ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      when directed adv time out
3054ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
3055ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void
3056ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
3057ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
3058ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid btm_ble_dir_adv_tout(void)
3059ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
3060ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btm_cb.ble_ctr_cb.inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
3061ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
3062ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* make device fall back into undirected adv mode by default */
3063ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btm_cb.ble_ctr_cb.inq_var.directed_conn = FALSE;
3064ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
3065ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
3066ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
3067ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
30685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_init
30695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Initialize the control block variable values.
30715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
30735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
30755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_init (void)
30765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
30775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
30785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30795344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_ble_init ");
30805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(p_cb, 0, sizeof(tBTM_BLE_CB));
308216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    memset(&(btm_cb.cmn_ble_vsc_cb), 0 , sizeof(tBTM_BLE_VSC_CB));
30833f24f460ec3efedde25723e6a4297efc10873cd2Satya Calloji    btm_cb.cmn_ble_vsc_cb.values_read = FALSE;
30847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_cb->cur_states       = 0;
30855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
30875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE;
30885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->inq_var.adv_chnl_map = BTM_BLE_DEFAULT_ADV_CHNL_MAP;
30895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->inq_var.afp = BTM_BLE_DEFAULT_AFP;
30905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->inq_var.sfp = BTM_BLE_DEFAULT_SFP;
30915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->inq_var.connectable_mode = BTM_BLE_NON_CONNECTABLE;
30925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->inq_var.discoverable_mode = BTM_BLE_NON_DISCOVERABLE;
30935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* for background connection, reset connection params to be undefined */
30955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->scan_int = p_cb->scan_win = BTM_BLE_CONN_PARAM_UNDEF;
30965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30976975b4d711142b885af479721cada448952c6b41Andre Eisenbach    p_cb->inq_var.evt_type = BTM_BLE_NON_CONNECT_EVT;
3098c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji
309916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_VND_INCLUDED == FALSE
310016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    btm_ble_vendor_init(BTM_CS_IRK_LIST_MAX);
31011a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    btm_ble_adv_filter_init();
31021a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji#endif
31035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
31045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
31067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
31077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_ble_topology_check
31087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
31097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      check to see requested state is supported. One state check at
31107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  a time is supported
31117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
31127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          TRUE is request is allowed, FALSE otherwise.
31137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
31147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
31157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN btm_ble_topology_check(tBTM_BLE_STATE_MASK request_state_mask)
31167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
31177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    BOOLEAN rt = FALSE;
31187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT32  llt_mask = 0;
31197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT8   *p;
31207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
31217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT8   state_offset = 0;
31227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT16  cur_states = btm_cb.ble_ctr_cb.cur_states;
31237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT8   mask, offset;
31247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT8   request_state = 0;
31257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
31267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    /* check only one bit is set and within valid range */
31277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (request_state_mask == BTM_BLE_STATE_INVALID ||
31287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        request_state_mask > BTM_BLE_STATE_SCAN_ADV_BIT ||
31297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (request_state_mask & (request_state_mask -1 )) != 0)
31307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
31315344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR("illegal state requested: %d", request_state_mask);
31327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return rt;
31337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
31347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
31357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    while (request_state_mask)
31367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
31377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        request_state_mask >>= 1;
31387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        request_state ++;
31397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
31407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
31417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    /* check if the requested state is supported or not */
31427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    mask = btm_le_state_combo_tbl[0][request_state - 1][0];
31437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    offset = btm_le_state_combo_tbl[0][request_state-1][1];
31447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
31457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (!BTM_LE_STATES_SUPPORTED(btm_cb.devcb.le_supported_states, mask, offset))
31467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
31475344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR("state requested not supported: %d", request_state);
31487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return rt;
31497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
31507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
31517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    rt = TRUE;
31527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    /* make sure currently active states are all supported in conjunction with the requested
31537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta       state. If the bit in table is not set, the combination is not supported */
31547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    while (cur_states != 0)
31557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
31567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (cur_states & 0x01)
31577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
31587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            mask = btm_le_state_combo_tbl[request_state][state_offset][0];
31597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            offset = btm_le_state_combo_tbl[request_state][state_offset][1];
31607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
31617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (mask != 0 && offset != 0)
31627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            {
31637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                if (!BTM_LE_STATES_SUPPORTED(btm_cb.devcb.le_supported_states, mask, offset))
31647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                {
31657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    rt = FALSE;
31667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    break;
31677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                }
31687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            }
31697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
31707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        cur_states >>= 1;
31717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        state_offset ++;
31727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
31737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return rt;
31747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
31757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
31767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
31775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif  /* BLE_INCLUDED */
3178