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