15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 31a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji * Copyright (C) 2003-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 the action functions for device manager state 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * machine. 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2649120dc867c7818511b5afec461dfc97d17eef58Marie Janssen#define LOG_TAG "bt_bta_dm" 2749120dc867c7818511b5afec461dfc97d17eef58Marie Janssen 28221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski#include <base/bind.h> 29221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski#include <base/callback.h> 30f2af1c42ccb2f642b241c2261b42d0be61d45438Jack He#include <base/logging.h> 31db554581079863974af8e1289646f5deea6fc044Marie Janssen#include <string.h> 32db554581079863974af8e1289646f5deea6fc044Marie Janssen 33cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "bt_common.h" 34597c5778ca69fec26c96bda48b83935c1a90660dMike J. Chen#include "bt_target.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_api.h" 37b2a292b5d8df2f359c38b0787bc01181225a9bc9Pavlin Radoslavov#include "bta_dm_api.h" 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_dm_co.h" 39db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "bta_dm_int.h" 40db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "bta_sys.h" 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h" 44cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "gap_api.h" /* For GAP_BleReadPeerPrefConnParams */ 45db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "l2c_api.h" 46f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton#include "osi/include/log.h" 47bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray#include "osi/include/osi.h" 48db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "sdp_api.h" 49db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "utl.h" 50f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton 51a02a48c2f2aece8b173a25e88a0f00d2e2f78c48Mike J. Chen#if (GAP_INCLUDED == TRUE) 52a02a48c2f2aece8b173a25e88a0f00d2e2f78c48Mike J. Chen#include "gap_api.h" 53a02a48c2f2aece8b173a25e88a0f00d2e2f78c48Mike J. Chen#endif 54a02a48c2f2aece8b173a25e88a0f00d2e2f78c48Mike J. Chen 550595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowskistatic void bta_dm_inq_results_cb(tBTM_INQ_RESULTS* p_inq, uint8_t* p_eir, 56f7100bb0e57ed289833c353ba06028345f9f39b6Jakub Pawlowski uint16_t eir_len); 57cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_inq_cmpl_cb(void* p_result); 58cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_service_search_remname_cback(BD_ADDR bd_addr, DEV_CLASS dc, 59cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BD_NAME bd_name); 60cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_remname_cback(tBTM_REMOTE_DEV_NAME* p_remote_name); 61cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_find_services(BD_ADDR bd_addr); 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_discover_next_device(void); 63cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_sdp_callback(uint16_t sdp_status); 64cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic uint8_t bta_dm_authorize_cback(BD_ADDR bd_addr, DEV_CLASS dev_class, 65cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BD_NAME bd_name, uint8_t* service_name, 66cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t service_id, bool is_originator); 67cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic uint8_t bta_dm_pin_cback(BD_ADDR bd_addr, DEV_CLASS dev_class, 68cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BD_NAME bd_name, bool min_16_digit); 69cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic uint8_t bta_dm_new_link_key_cback(BD_ADDR bd_addr, DEV_CLASS dev_class, 70cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BD_NAME bd_name, LINK_KEY key, 71cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t key_type); 72cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic uint8_t bta_dm_authentication_complete_cback(BD_ADDR bd_addr, 73cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson DEV_CLASS dev_class, 74cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BD_NAME bd_name, 75cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson int result); 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_local_name_cback(BD_ADDR bd_addr); 77e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic bool bta_dm_check_av(uint16_t event); 78cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_bl_change_cback(tBTM_BL_EVENT_DATA* p_data); 7976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan 80cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, uint8_t id, 81cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t app_id, BD_ADDR peer_addr); 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Extended Inquiry Response */ 84eb1ad1d47b84767d9af180243cb14ac409331a0dPulkit Bhuwalka#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 85cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic uint8_t bta_dm_sp_cback(tBTM_SP_EVT event, tBTM_SP_EVT_DATA* p_data); 86eb1ad1d47b84767d9af180243cb14ac409331a0dPulkit Bhuwalka#endif 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 88cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_set_eir(char* local_name); 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 90cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_eir_search_services(tBTM_INQ_RESULTS* p_result, 91cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_SERVICE_MASK* p_services_to_search, 92cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_SERVICE_MASK* p_services_found); 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 94cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_search_timer_cback(void* data); 95cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_disable_conn_down_timer_cback(void* data); 96cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, uint8_t id, 97cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t app_id, BD_ADDR peer_addr); 98e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic void bta_dm_adjust_roles(bool delay_role_switch); 99cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic char* bta_dm_get_remname(void); 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result); 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 102cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic bool bta_dm_read_remote_device_name(BD_ADDR bd_addr, 103cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBT_TRANSPORT transport); 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_discover_device(BD_ADDR remote_bd_addr); 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 106cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_sys_hw_cback(tBTA_SYS_HW_EVT status); 107ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void bta_dm_disable_search_and_disc(void); 10876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan 109cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic uint8_t bta_dm_ble_smp_cback(tBTM_LE_EVT event, BD_ADDR bda, 110cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_LE_EVT_DATA* p_data); 111cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_ble_id_key_cback(uint8_t key_type, 112cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_BLE_LOCAL_KEYS* p_key); 113e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbachstatic void bta_dm_gattc_register(void); 11476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavanstatic void btm_dm_start_gatt_discovery(BD_ADDR bd_addr); 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr); 116cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC* p_data); 11781b03192d4284acc7c9903f5b183927797dceca4Prerepa Viswanadhamextern tBTA_DM_CONTRL_STATE bta_dm_pm_obtain_controller_state(void); 118104e3f238f500cacdb8afaccdc672dfc34eae7eeBernhard Rosenkränzer 119e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BLE_VND_INCLUDED == TRUE) 1208d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Battastatic void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result); 121104e3f238f500cacdb8afaccdc672dfc34eae7eeBernhard Rosenkränzer#endif 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 123ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#ifndef BTA_DM_BLE_ADV_CHNL_MAP 124cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#define BTA_DM_BLE_ADV_CHNL_MAP \ 125cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (BTM_BLE_ADV_CHNL_37 | BTM_BLE_ADV_CHNL_38 | BTM_BLE_ADV_CHNL_39) 126ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 127f751b01146d81fd70645907f5fd3a4cc3a7acc02Matthew Xie 12878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov/* Disable timer interval (in milliseconds) */ 12978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov#ifndef BTA_DM_DISABLE_TIMER_MS 13078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov#define BTA_DM_DISABLE_TIMER_MS 5000 13178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov#endif 13278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 13378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov/* Disable timer retrial interval (in milliseconds) */ 13478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov#ifndef BTA_DM_DISABLE_TIMER_RETRIAL_MS 13578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov#define BTA_DM_DISABLE_TIMER_RETRIAL_MS 1500 13678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov#endif 13778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 13878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov/* Disable connection down timer (in milliseconds) */ 13978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov#ifndef BTA_DM_DISABLE_CONN_DOWN_TIMER_MS 14078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov#define BTA_DM_DISABLE_CONN_DOWN_TIMER_MS 1000 14178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov#endif 14278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 14378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov/* Switch delay timer (in milliseconds) */ 14478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov#ifndef BTA_DM_SWITCH_DELAY_TIMER_MS 14578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov#define BTA_DM_SWITCH_DELAY_TIMER_MS 500 14678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov#endif 14778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 1489412bbaea51f577d903e060b8c8214fbd28b0b4fBalraj Selvarajstatic void bta_dm_reset_sec_dev_pending(BD_ADDR remote_bd_addr); 14976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavanstatic void bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr); 1500595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowskistatic void bta_dm_observe_results_cb(tBTM_INQ_RESULTS* p_inq, uint8_t* p_eir, 151f7100bb0e57ed289833c353ba06028345f9f39b6Jakub Pawlowski uint16_t eir_len); 152cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_observe_cmpl_cb(void* p_result); 153cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_delay_role_switch_cback(void* data); 154cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_disable_timer_cback(void* data); 155cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 156cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonconst uint16_t bta_service_id_to_uuid_lkup_tbl[BTA_MAX_SERVICE_ID] = { 157cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_PNP_INFORMATION, /* Reserved */ 158cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_SERIAL_PORT, /* BTA_SPP_SERVICE_ID */ 159cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_DIALUP_NETWORKING, /* BTA_DUN_SERVICE_ID */ 160cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_AUDIO_SOURCE, /* BTA_A2DP_SOURCE_SERVICE_ID */ 161cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_LAN_ACCESS_USING_PPP, /* BTA_LAP_SERVICE_ID */ 162cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_HEADSET, /* BTA_HSP_HS_SERVICE_ID */ 163cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_HF_HANDSFREE, /* BTA_HFP_HS_SERVICE_ID */ 164cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_OBEX_OBJECT_PUSH, /* BTA_OPP_SERVICE_ID */ 165cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_OBEX_FILE_TRANSFER, /* BTA_FTP_SERVICE_ID */ 166cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_CORDLESS_TELEPHONY, /* BTA_CTP_SERVICE_ID */ 167cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_INTERCOM, /* BTA_ICP_SERVICE_ID */ 168cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_IRMC_SYNC, /* BTA_SYNC_SERVICE_ID */ 169cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_DIRECT_PRINTING, /* BTA_BPP_SERVICE_ID */ 170cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_IMAGING_RESPONDER, /* BTA_BIP_SERVICE_ID */ 171cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_PANU, /* BTA_PANU_SERVICE_ID */ 172cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_NAP, /* BTA_NAP_SERVICE_ID */ 173cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_GN, /* BTA_GN_SERVICE_ID */ 174cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_SAP, /* BTA_SAP_SERVICE_ID */ 175cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_AUDIO_SINK, /* BTA_A2DP_SERVICE_ID */ 176cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_AV_REMOTE_CONTROL, /* BTA_AVRCP_SERVICE_ID */ 177cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_HUMAN_INTERFACE, /* BTA_HID_SERVICE_ID */ 178cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_VIDEO_SINK, /* BTA_VDP_SERVICE_ID */ 179cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_PBAP_PSE, /* BTA_PBAP_SERVICE_ID */ 180cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_HEADSET_AUDIO_GATEWAY, /* BTA_HSP_SERVICE_ID */ 181cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_AG_HANDSFREE, /* BTA_HFP_SERVICE_ID */ 182cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_MESSAGE_ACCESS, /* BTA_MAP_SERVICE_ID */ 183cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_MESSAGE_NOTIFICATION, /* BTA_MN_SERVICE_ID */ 184cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_HDP_PROFILE, /* BTA_HDP_SERVICE_ID */ 1859979121f0865e07432215529f9b157792ae3ef21Myles Watson UUID_SERVCLASS_PBAP_PCE, /* BTA_PCE_SERVICE_ID */ 1869979121f0865e07432215529f9b157792ae3ef21Myles Watson UUID_PROTOCOL_ATT /* BTA_GATT_SERVICE_ID */ 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 190cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * NOTE : The number of element in bta_service_id_to_btm_srv_id_lkup_tbl should 191cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * be matching with 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * the value BTA_MAX_SERVICE_ID in bta_api.h 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 194cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * i.e., If you add new Service ID for BTA, the correct security ID of 195cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * the new service 196cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * from Security service definitions (btm_api.h) should be added to 197cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * this lookup table. 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 199cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonconst uint32_t bta_service_id_to_btm_srv_id_lkup_tbl[BTA_MAX_SERVICE_ID] = { 200cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 0, /* Reserved */ 201cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_SERIAL_PORT, /* BTA_SPP_SERVICE_ID */ 202cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_DUN, /* BTA_DUN_SERVICE_ID */ 203cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_AVDTP, /* BTA_AUDIO_SOURCE_SERVICE_ID */ 204cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_LAN_ACCESS, /* BTA_LAP_SERVICE_ID */ 205cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_HEADSET_AG, /* BTA_HSP_SERVICE_ID */ 206cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_AG_HANDSFREE, /* BTA_HFP_SERVICE_ID */ 207cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_OBEX, /* BTA_OPP_SERVICE_ID */ 208cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_OBEX_FTP, /* BTA_FTP_SERVICE_ID */ 209cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_CORDLESS, /* BTA_CTP_SERVICE_ID */ 210cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_INTERCOM, /* BTA_ICP_SERVICE_ID */ 211cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_IRMC_SYNC, /* BTA_SYNC_SERVICE_ID */ 212cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_BPP_JOB, /* BTA_BPP_SERVICE_ID */ 213cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_BIP, /* BTA_BIP_SERVICE_ID */ 214cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_BNEP_PANU, /* BTA_PANU_SERVICE_ID */ 215cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_BNEP_NAP, /* BTA_NAP_SERVICE_ID */ 216cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_BNEP_GN, /* BTA_GN_SERVICE_ID */ 217cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_SAP, /* BTA_SAP_SERVICE_ID */ 218cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_AVDTP, /* BTA_A2DP_SERVICE_ID */ 219cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_AVCTP, /* BTA_AVRCP_SERVICE_ID */ 220cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_HIDH_SEC_CTRL, /* BTA_HID_SERVICE_ID */ 221cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_AVDTP, /* BTA_VDP_SERVICE_ID */ 222cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_PBAP, /* BTA_PBAP_SERVICE_ID */ 223cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_HEADSET, /* BTA_HSP_HS_SERVICE_ID */ 224cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_HF_HANDSFREE, /* BTA_HFP_HS_SERVICE_ID */ 225cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_MAP, /* BTA_MAP_SERVICE_ID */ 226cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_MAP, /* BTA_MN_SERVICE_ID */ 227cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SEC_SERVICE_HDP_SNK, /* BTA_HDP_SERVICE_ID */ 2289979121f0865e07432215529f9b157792ae3ef21Myles Watson BTM_SEC_SERVICE_PBAP, /* BTA_PCE_SERVICE_ID */ 2299979121f0865e07432215529f9b157792ae3ef21Myles Watson BTM_SEC_SERVICE_ATT /* BTA_GATT_SERVICE_ID */ 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* bta security callback */ 2332e8e9f42132d0297a94c0852a1fbf45c9bc348e5Myles Watsonconst tBTM_APPL_INFO bta_security = {&bta_dm_authorize_cback, 2342e8e9f42132d0297a94c0852a1fbf45c9bc348e5Myles Watson &bta_dm_pin_cback, 2352e8e9f42132d0297a94c0852a1fbf45c9bc348e5Myles Watson &bta_dm_new_link_key_cback, 2362e8e9f42132d0297a94c0852a1fbf45c9bc348e5Myles Watson &bta_dm_authentication_complete_cback, 2372e8e9f42132d0297a94c0852a1fbf45c9bc348e5Myles Watson &bta_dm_bond_cancel_complete_cback, 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 2392e8e9f42132d0297a94c0852a1fbf45c9bc348e5Myles Watson &bta_dm_sp_cback, 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 2417651cfbe6a2bd258eecda2764bdaa10b711d9e4fAlex Deymo NULL, 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2432e8e9f42132d0297a94c0852a1fbf45c9bc348e5Myles Watson &bta_dm_ble_smp_cback, 2442e8e9f42132d0297a94c0852a1fbf45c9bc348e5Myles Watson &bta_dm_ble_id_key_cback}; 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 246cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#define MAX_DISC_RAW_DATA_BUF (4096) 247e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenuint8_t g_disc_raw_data_buf[MAX_DISC_RAW_DATA_BUF]; 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavanextern DEV_CLASS local_device_default_class; 250cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonextern fixed_queue_t* btu_bta_alarm_queue; 25176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_enable 2558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Initialises the BT device manager 2578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 2608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 262cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_enable(tBTA_DM_MSG* p_data) { 263cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_ENABLE enable_event; 264cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 265cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if already in use, return an error */ 266cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.is_bta_dm_active == true) { 267cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_WARNING("%s Device already started by another application", 268cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson __func__); 269cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(&enable_event, 0, sizeof(tBTA_DM_ENABLE)); 270cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson enable_event.status = BTA_FAILURE; 271cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->enable.p_sec_cback != NULL) 272cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->enable.p_sec_cback(BTA_DM_ENABLE_EVT, 273cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTA_DM_SEC*)&enable_event); 274cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 275cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 277cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* first, register our callback to SYS HW manager */ 278cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_hw_register(BTA_SYS_HW_BLUETOOTH, bta_dm_sys_hw_cback); 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 280cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* make sure security callback is saved - if no callback, do not erase the 281cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson previous one, 282cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson it could be an error recovery mechanism */ 283cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->enable.p_sec_cback != NULL) 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_cb.p_sec_cback = p_data->enable.p_sec_cback; 285cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* notify BTA DM is now active */ 286cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.is_bta_dm_active = true; 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 288cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* send a message to BTA SYS */ 289cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_SYS_HW_MSG* sys_enable_event = 290cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTA_SYS_HW_MSG*)osi_malloc(sizeof(tBTA_SYS_HW_MSG)); 291cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sys_enable_event->hdr.event = BTA_SYS_API_ENABLE_EVT; 292cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH; 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 294cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(sys_enable_event); 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_init_cb 3008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Initializes the bta_dm_cb control block 3028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 3058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 307cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_init_cb(void) { 308cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(&bta_dm_cb, 0, sizeof(bta_dm_cb)); 309cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.disable_timer = alarm_new("bta_dm.disable_timer"); 310cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.switch_delay_timer = alarm_new("bta_dm.switch_delay_timer"); 311cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (size_t i = 0; i < BTA_DM_NUM_PM_TIMER; i++) { 312cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (size_t j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++) { 313cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.pm_timer[i].timer[j] = alarm_new("bta_dm.pm_timer"); 314cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 315cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3165ba79228abfeee8de6b65f28da180839445a693cSrinu Jella} 3175ba79228abfeee8de6b65f28da180839445a693cSrinu Jella 3185ba79228abfeee8de6b65f28da180839445a693cSrinu Jella/******************************************************************************* 3198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_deinit_cb 3218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description De-initializes the bta_dm_cb control block 3238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 3268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 328cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_deinit_cb(void) { 329cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* 330cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * TODO: Should alarm_free() the bta_dm_cb timers during graceful 331cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * shutdown. 332cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson */ 333cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson alarm_free(bta_dm_cb.disable_timer); 334cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson alarm_free(bta_dm_cb.switch_delay_timer); 335cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (size_t i = 0; i < BTA_DM_NUM_PM_TIMER; i++) { 336cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (size_t j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++) { 337cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson alarm_free(bta_dm_cb.pm_timer[i].timer[j]); 338cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 339cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 340cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(&bta_dm_cb, 0, sizeof(bta_dm_cb)); 34178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov} 34278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 34378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov/******************************************************************************* 3448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_sys_hw_cback 3468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description callback register to SYS to get HW status updates 3488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 3518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 353cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_sys_hw_cback(tBTA_SYS_HW_EVT status) { 354cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson DEV_CLASS dev_class; 355cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEC_CBACK* temp_cback; 356cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t key_mask = 0; 357cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_OCTET16 er; 358cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_BLE_LOCAL_ID_KEYS id_key; 35976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan 360cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s with event: %i", __func__, status); 3615ba79228abfeee8de6b65f28da180839445a693cSrinu Jella 362cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* On H/W error evt, report to the registered DM application callback */ 363cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (status == BTA_SYS_HW_ERROR_EVT) { 364cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.p_sec_cback != NULL) 365cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_HW_ERROR_EVT, NULL); 366cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 367cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 368cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 369cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (status == BTA_SYS_HW_OFF_EVT) { 370cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.p_sec_cback != NULL) 371cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_DISABLE_EVT, NULL); 372cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 373cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* reinitialize the control block */ 374cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_deinit_cb(); 375cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 376cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* hw is ready, go on with BTA DM initialization */ 377cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson alarm_free(bta_dm_search_cb.search_timer); 378cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson alarm_free(bta_dm_search_cb.gatt_close_timer); 379cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(&bta_dm_search_cb, 0, sizeof(bta_dm_search_cb)); 380cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 381cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* unregister from SYS */ 382cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_hw_unregister(BTA_SYS_HW_BLUETOOTH); 383cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* notify BTA DM is now unactive */ 384cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.is_bta_dm_active = false; 385cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else if (status == BTA_SYS_HW_ON_EVT) { 386cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* FIXME: We should not unregister as the SYS shall invoke this callback on 3874f484079fd27effce2675ed38f3cdf88da42ab04Andre Eisenbach * a H/W error. 3884f484079fd27effce2675ed38f3cdf88da42ab04Andre Eisenbach * We need to revisit when this platform has more than one BLuetooth H/W 3894f484079fd27effce2675ed38f3cdf88da42ab04Andre Eisenbach * chip 3904f484079fd27effce2675ed38f3cdf88da42ab04Andre Eisenbach */ 391cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson // bta_sys_hw_unregister( BTA_SYS_HW_BLUETOOTH); 392cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 393cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* save security callback */ 394cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson temp_cback = bta_dm_cb.p_sec_cback; 395cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* make sure the control block is properly initialized */ 396cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_init_cb(); 397cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* and retrieve the callback */ 398cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback = temp_cback; 399cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.is_bta_dm_active = true; 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 401cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* hw is ready, go on with BTA DM initialization */ 402cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson alarm_free(bta_dm_search_cb.search_timer); 403cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson alarm_free(bta_dm_search_cb.gatt_close_timer); 404cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(&bta_dm_search_cb, 0, sizeof(bta_dm_search_cb)); 405cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* 406cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * TODO: Should alarm_free() the bta_dm_search_cb timers during 407cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * graceful shutdown. 408cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson */ 409cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.search_timer = alarm_new("bta_dm_search.search_timer"); 410cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.gatt_close_timer = 411cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson alarm_new("bta_dm_search.gatt_close_timer"); 41278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 413cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(&bta_dm_conn_srvcs, 0, sizeof(bta_dm_conn_srvcs)); 414cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(&bta_dm_di_cb, 0, sizeof(tBTA_DM_DI_CB)); 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 416cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(dev_class, p_bta_dm_cfg->dev_class, sizeof(dev_class)); 417cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SetDeviceClass(dev_class); 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 419cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* load BLE local information: ID keys, ER if available */ 420cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_co_ble_load_local_keys(&key_mask, er, &id_key); 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 422cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ER) { 423cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ER, 424cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTM_BLE_LOCAL_KEYS*)&er); 425cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 426cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ID) { 427cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ID, 428cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTM_BLE_LOCAL_KEYS*)&id_key); 429cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 430cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID; 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 432cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SecRegister((tBTM_APPL_INFO*)&bta_security); 433cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SetDefaultLinkSuperTout(p_bta_dm_cfg->link_timeout); 434cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_WritePageTimeout(p_bta_dm_cfg->page_timeout); 435cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.cur_policy = p_bta_dm_cfg->policy_settings; 436cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy); 437cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_RegBusyLevelNotif(bta_dm_bl_change_cback, NULL, 438cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_BL_UPDATE_MASK | BTM_BL_ROLE_CHG_MASK); 4393f24f460ec3efedde25723e6a4297efc10873cd2Satya Calloji 440e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BLE_VND_INCLUDED == TRUE) 441cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_BleReadControllerFeatures(bta_dm_ctrl_features_rd_cmpl_cback); 4422255250d9bb5c8c1354fc2b4685523d028dcf6f9Jakub Pawlowski#else 4432255250d9bb5c8c1354fc2b4685523d028dcf6f9Jakub Pawlowski /* If VSC multi adv commands are available, advertising will be initialized 4442255250d9bb5c8c1354fc2b4685523d028dcf6f9Jakub Pawlowski * when capabilities are read. If they are not avaliable, initialize 4452255250d9bb5c8c1354fc2b4685523d028dcf6f9Jakub Pawlowski * advertising here */ 4462255250d9bb5c8c1354fc2b4685523d028dcf6f9Jakub Pawlowski btm_ble_adv_init(); 4473f24f460ec3efedde25723e6a4297efc10873cd2Satya Calloji#endif 4483f24f460ec3efedde25723e6a4297efc10873cd2Satya Calloji 449cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Earlier, we used to invoke BTM_ReadLocalAddr which was just copying the 450cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bd_addr 451cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson from the control block and invoking the callback which was sending the 452cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson DM_ENABLE_EVT. 453cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson But then we have a few HCI commands being invoked above which were still 454cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson in progress 455cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson when the ENABLE_EVT was sent. So modified this to fetch the local name 456cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson which forces 457cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson the DM_ENABLE_EVT to be sent only after all the init steps are complete 458cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson */ 459cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_ReadLocalDeviceNameFromController( 460cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTM_CMPL_CB*)bta_dm_local_name_cback); 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 462cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_rm_register((tBTA_SYS_CONN_CBACK*)bta_dm_rm_cback); 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 464cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* initialize bluetooth low power manager */ 465cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_init_pm(); 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 467cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_policy_register((tBTA_SYS_CONN_CBACK*)bta_dm_policy_cback); 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 469cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_gattc_register(); 470e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach 471cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else 472cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG(" --- ignored event"); 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_disable 4788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Disables the BT device manager 4808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 4838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 485cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_disable(UNUSED_ATTR tBTA_DM_MSG* p_data) { 486cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Set l2cap idle timeout to 0 (so BTE immediately disconnects ACL link after 487cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * last channel is closed) */ 488cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson L2CA_SetIdleTimeoutByBdAddr((uint8_t*)BT_BD_ANY, 0, BT_TRANSPORT_BR_EDR); 489cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson L2CA_SetIdleTimeoutByBdAddr((uint8_t*)BT_BD_ANY, 0, BT_TRANSPORT_LE); 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 491cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* disable all active subsystems */ 492cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_disable(BTA_SYS_HW_BLUETOOTH); 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 494cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SetDiscoverability(BTM_NON_DISCOVERABLE, 0, 0); 495cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SetConnectability(BTM_NON_CONNECTABLE, 0, 0); 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 497cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_disable_pm(); 498cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_disable_search_and_disc(); 499cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.disabling = true; 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 501cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_BleClearBgConnDev(); 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 503cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTM_GetNumAclLinks() == 0) { 504e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_DISABLE_DELAY > 0) 505cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* If BTA_DISABLE_DELAY is defined and greater than zero, then delay the 506cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * shutdown by 507cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * BTA_DISABLE_DELAY milliseconds 508cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson */ 509cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_WARNING("%s BTA_DISABLE_DELAY set to %d ms", __func__, 510cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_DISABLE_DELAY); 511cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson alarm_set_on_queue(bta_dm_cb.disable_timer, BTA_DISABLE_DELAY, 512cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_disable_conn_down_timer_cback, NULL, 513cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson btu_bta_alarm_queue); 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 515cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_disable_conn_down_timer_cback(NULL); 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 517cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 518cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson alarm_set_on_queue(bta_dm_cb.disable_timer, BTA_DM_DISABLE_TIMER_MS, 519cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_disable_timer_cback, UINT_TO_PTR(0), 520cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson btu_bta_alarm_queue); 521cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_disable_timer_cback 5278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Called if the disable timer expires 5298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Used to close ACL connections which are still active 5308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 5348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 536cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_disable_timer_cback(void* data) { 537cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t i; 538cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; 539cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool trigger_disc = false; 540cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint32_t param = PTR_TO_UINT(data); 541cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 542cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_EVENT("%s trial %u", __func__, param); 543cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 544cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTM_GetNumAclLinks() && (param == 0)) { 545cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (i = 0; i < bta_dm_cb.device_list.count; i++) { 546cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson transport = bta_dm_cb.device_list.peer_device[i].transport; 547cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson btm_remove_acl(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, 548cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson transport); 549cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson trigger_disc = true; 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 552cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Retrigger disable timer in case ACL disconnect failed, DISABLE_EVT still 553cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson need 554cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson to be sent out to avoid jave layer disable timeout */ 555cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (trigger_disc) { 556cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson alarm_set_on_queue( 557cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.disable_timer, BTA_DM_DISABLE_TIMER_RETRIAL_MS, 558cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_disable_timer_cback, UINT_TO_PTR(1), btu_bta_alarm_queue); 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 560cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 561cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.disabling = false; 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 563cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_remove_uuid(UUID_SERVCLASS_PNP_INFORMATION); 564cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_DISABLE_EVT, NULL); 565cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 566cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson} 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_set_dev_name 5718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Sets local device name 5738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 5768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 578cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_set_dev_name(tBTA_DM_MSG* p_data) { 579cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SetLocalDeviceName((char*)p_data->set_name.name); 580cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_set_eir((char*)p_data->set_name.name); 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_set_visibility 5868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Sets discoverability, connectability and pairability 5888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 5918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 593cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_set_visibility(tBTA_DM_MSG* p_data) { 594cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t window, interval; 595cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t le_disc_mode = BTM_BleReadDiscoverability(); 596cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t le_conn_mode = BTM_BleReadConnectability(); 597cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t disc_mode = BTM_ReadDiscoverability(&window, &interval); 598cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t conn_mode = BTM_ReadConnectability(&window, &interval); 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 600cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* set modes for Discoverability and connectability if not ignore */ 601cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->set_visibility.disc_mode != (BTA_DM_IGNORE | BTA_DM_LE_IGNORE)) { 602cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((p_data->set_visibility.disc_mode & BTA_DM_LE_IGNORE) == 603cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_DM_LE_IGNORE) 604cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->set_visibility.disc_mode = 605cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((p_data->set_visibility.disc_mode & ~BTA_DM_LE_IGNORE) | 606cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson le_disc_mode); 607cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((p_data->set_visibility.disc_mode & BTA_DM_IGNORE) == BTA_DM_IGNORE) 608cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->set_visibility.disc_mode = 609cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((p_data->set_visibility.disc_mode & ~BTA_DM_IGNORE) | disc_mode); 61076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan 611cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SetDiscoverability(p_data->set_visibility.disc_mode, 612cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.inquiry_scan_window, 613cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.inquiry_scan_interval); 614cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 616cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->set_visibility.conn_mode != (BTA_DM_IGNORE | BTA_DM_LE_IGNORE)) { 617cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((p_data->set_visibility.conn_mode & BTA_DM_LE_IGNORE) == 618cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_DM_LE_IGNORE) 619cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->set_visibility.conn_mode = 620cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((p_data->set_visibility.conn_mode & ~BTA_DM_LE_IGNORE) | 621cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson le_conn_mode); 622cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((p_data->set_visibility.conn_mode & BTA_DM_IGNORE) == BTA_DM_IGNORE) 623cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->set_visibility.conn_mode = 624cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((p_data->set_visibility.conn_mode & ~BTA_DM_IGNORE) | conn_mode); 625cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 626cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SetConnectability(p_data->set_visibility.conn_mode, 627cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.page_scan_window, 628cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.page_scan_interval); 629cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 630cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 631cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Send False or True if not ignore */ 632cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE) { 633cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->set_visibility.pair_mode == BTA_DM_NON_PAIRABLE) 634cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.disable_pair_mode = true; 635cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else 636cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.disable_pair_mode = false; 637cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 639cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Send False or True if not ignore */ 640cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE) { 641cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->set_visibility.conn_paired_only == BTA_DM_CONN_ALL) 642cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.conn_paired_only = false; 643cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else 644cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.conn_paired_only = true; 645cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 646cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 647cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Change mode if either mode is not ignore */ 648cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE || 649cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE) 650cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SetPairableMode((bool)(!(bta_dm_cb.disable_pair_mode)), 651cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.conn_paired_only); 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_process_remove_device 6578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Removes device, Disconnects ACL link if required. 6598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *** 6608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 661cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_process_remove_device(BD_ADDR bd_addr) { 662cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* need to remove all pending background connection before unpair */ 663cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_GATTC_CancelOpen(0, bd_addr, false); 6646fc9526bba383fdb33c0536ed050489aa2215554Satya Calloji 665cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SecDeleteDevice(bd_addr); 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 667cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* remove all cached GATT information */ 668cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_GATTC_Refresh(bd_addr); 669bd68d683bce9e64bba6ac561e432da9d7bbab671Zhihai Xu 670cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.p_sec_cback) { 671cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEC sec_event; 672cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(sec_event.link_down.bd_addr, bd_addr); 673cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* No connection, set status to success (acl disc code not valid) */ 674cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.link_down.status = HCI_SUCCESS; 675cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &sec_event); 676cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 6776fc9526bba383fdb33c0536ed050489aa2215554Satya Calloji} 6786fc9526bba383fdb33c0536ed050489aa2215554Satya Calloji 6796fc9526bba383fdb33c0536ed050489aa2215554Satya Calloji/******************************************************************************* 6808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_remove_device 6828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Removes device, disconnects ACL link if required. 6848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *** 6858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 686cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_remove_device(tBTA_DM_MSG* p_data) { 687cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_API_REMOVE_DEVICE* p_dev = &p_data->remove_dev; 688cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool continue_delete_other_dev = false; 689cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_dev == NULL) return; 690cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 691cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BD_ADDR other_address; 692cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(other_address, p_dev->bd_addr); 693cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 694cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* If ACL exists for the device in the remove_bond message*/ 695cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool continue_delete_dev = false; 696cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t other_transport = BT_TRANSPORT_INVALID; 697cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 698cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTM_IsAclConnectionUp(p_dev->bd_addr, BT_TRANSPORT_LE) || 699cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_IsAclConnectionUp(p_dev->bd_addr, BT_TRANSPORT_BR_EDR)) { 700cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s: ACL Up count %d", __func__, 701cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.count); 702cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson continue_delete_dev = false; 703cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 704cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Take the link down first, and mark the device for removal when 705cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * disconnected */ 706cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (int i = 0; i < bta_dm_cb.device_list.count; i++) { 707cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!bdcmp(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, 708cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_dev->bd_addr)) { 709cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t transport = BT_TRANSPORT_BR_EDR; 710dd339ab075d913334c84fe4c817c8ab09f5eda47Scott James Remnant 711cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson transport = bta_dm_cb.device_list.peer_device[i].transport; 712cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_UNPAIRING; 713cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson btm_remove_acl(p_dev->bd_addr, transport); 714cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s:transport = %d", __func__, 715cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[i].transport); 716cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 717cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* save the other transport to check if device is connected on 718cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * other_transport */ 719cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.device_list.peer_device[i].transport == BT_TRANSPORT_LE) 720cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson other_transport = BT_TRANSPORT_BR_EDR; 721cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else 722cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson other_transport = BT_TRANSPORT_LE; 723dd339ab075d913334c84fe4c817c8ab09f5eda47Scott James Remnant 724cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 725cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 7266fc9526bba383fdb33c0536ed050489aa2215554Satya Calloji } 727cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 728cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson continue_delete_dev = true; 729cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 730cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson // If it is DUMO device and device is paired as different address, unpair that 731cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson // device 732cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson // if different address 733cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((other_transport && 734cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (BTM_ReadConnectedTransportAddress(other_address, other_transport))) || 735cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (!other_transport && 736cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (BTM_ReadConnectedTransportAddress(other_address, BT_TRANSPORT_BR_EDR) || 737cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_ReadConnectedTransportAddress(other_address, BT_TRANSPORT_LE)))) { 738cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson continue_delete_other_dev = false; 739cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Take the link down first, and mark the device for removal when 740cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * disconnected */ 741cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (int i = 0; i < bta_dm_cb.device_list.count; i++) { 742cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!bdcmp(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, 743cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson other_address)) { 744cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_UNPAIRING; 745cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson btm_remove_acl(other_address, 746cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[i].transport); 747cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 748cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 7496fc9526bba383fdb33c0536ed050489aa2215554Satya Calloji } 750cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 751cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s: continue to delete the other dev ", __func__); 752cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson continue_delete_other_dev = true; 753cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 754cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Delete the device mentioned in the msg */ 755cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (continue_delete_dev) bta_dm_process_remove_device(p_dev->bd_addr); 756cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 757cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Delete the other paired device too */ 758cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BD_ADDR dummy_bda = {0}; 759cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (continue_delete_other_dev && (bdcmp(other_address, dummy_bda) != 0)) 760cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_process_remove_device(other_address); 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 7658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_add_device 7668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 7678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This function adds a Link Key to an security database entry. 768cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * It is normally called during host startup to restore all 7691baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * required information stored in the NVRAM. 7708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *** 7718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 772cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_add_device(tBTA_DM_MSG* p_data) { 773cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_API_ADD_DEVICE* p_dev = &p_data->add_dev; 774cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t* p_dc = NULL; 775cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t* p_lc = NULL; 776cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint32_t trusted_services_mask[BTM_SEC_SERVICE_ARRAY_SIZE]; 777cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t index = 0; 778cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t btm_mask_index = 0; 779cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 780cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(trusted_services_mask, 0, sizeof(trusted_services_mask)); 781cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 782cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* If not all zeros, the device class has been specified */ 783cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_dev->dc_known) p_dc = (uint8_t*)p_dev->dc; 784cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 785cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_dev->link_key_known) p_lc = (uint8_t*)p_dev->link_key; 786cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 787cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_dev->is_trusted) { 788cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* covert BTA service mask to BTM mask */ 789cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson while (p_dev->tm && (index < BTA_MAX_SERVICE_ID)) { 790cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_dev->tm & (uint32_t)(1 << index)) { 791cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson btm_mask_index = 792cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_service_id_to_btm_srv_id_lkup_tbl[index] / BTM_SEC_ARRAY_BITS; 793cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson trusted_services_mask[btm_mask_index] |= 794cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (uint32_t)(1 << (bta_service_id_to_btm_srv_id_lkup_tbl[index] - 795cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (uint32_t)(btm_mask_index * 32))); 796cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 797cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_dev->tm &= (uint32_t)(~(1 << index)); 798cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 799cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson index++; 800cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 801cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 802cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 803cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!BTM_SecAddDevice(p_dev->bd_addr, p_dc, p_dev->bd_name, p_dev->features, 804cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson trusted_services_mask, p_lc, p_dev->key_type, 805cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_dev->io_cap, p_dev->pin_length)) { 806cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_ERROR("BTA_DM: Error adding device %08x%04x", 807cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_dev->bd_addr[0] << 24) + (p_dev->bd_addr[1] << 16) + 808cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_dev->bd_addr[2] << 8) + p_dev->bd_addr[3], 809cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_dev->bd_addr[4] << 8) + p_dev->bd_addr[5]); 810cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_close_acl 8168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 817cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description This function forces to close the connection to a remote 8181baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * device and optionaly remove the device from security 8191baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * database if required. 8208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *** 8218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 822cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_close_acl(tBTA_DM_MSG* p_data) { 823cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_API_REMOVE_ACL* p_remove_acl = &p_data->remove_acl; 824cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t index; 825ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 826cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("bta_dm_close_acl"); 827ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 828cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTM_IsAclConnectionUp(p_remove_acl->bd_addr, p_remove_acl->transport)) { 829cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (index = 0; index < bta_dm_cb.device_list.count; index++) { 830cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!bdcmp(bta_dm_cb.device_list.peer_device[index].peer_bdaddr, 831cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_remove_acl->bd_addr)) 832cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 833cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 834cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (index != bta_dm_cb.device_list.count) { 835cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_remove_acl->remove_dev) 836cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[index].remove_dev_pending = true; 837cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 838cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_ERROR("unknown device, remove ACL failed"); 839cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 840cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Disconnect the ACL link */ 841cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson btm_remove_acl(p_remove_acl->bd_addr, p_remove_acl->transport); 842cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 843cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if to remove the device from security database ? do it now */ 844cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else if (p_remove_acl->remove_dev) { 845cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!BTM_SecDeleteDevice(p_remove_acl->bd_addr)) { 846cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_ERROR("delete device from security database failed."); 847ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 848cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* need to remove all pending background connection if any */ 849cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_GATTC_CancelOpen(0, p_remove_acl->bd_addr, false); 850cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* remove all cached GATT information */ 851cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_GATTC_Refresh(p_remove_acl->bd_addr); 852cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 853cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* otherwise, no action needed */ 854ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 85576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan 85676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan/******************************************************************************* 8578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_remove_all_acl 8598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 860cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description This function forces to close all the ACL links specified by 8611baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * link type 8628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *** 8638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 864cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_remove_all_acl(tBTA_DM_MSG* p_data) { 865cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson const tBTA_DM_LINK_TYPE link_type = p_data->remove_all_acl.link_type; 866cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; 86776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan 868cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s link type = %d", __func__, link_type); 86976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan 870cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (uint8_t i = 0; i < bta_dm_cb.device_list.count; i++) { 871cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BD_ADDR addr = {0}; 872cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(addr, bta_dm_cb.device_list.peer_device[i].peer_bdaddr); 873cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson transport = bta_dm_cb.device_list.peer_device[i].transport; 874cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((link_type == BTA_DM_LINK_TYPE_ALL) || 875cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((link_type == BTA_DM_LINK_TYPE_LE) && 876cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (transport == BT_TRANSPORT_LE)) || 877cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((link_type == BTA_DM_LINK_TYPE_BR_EDR) && 878cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (transport == BT_TRANSPORT_BR_EDR))) { 879cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Disconnect the ACL link */ 880cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson btm_remove_acl(addr, transport); 881cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 882cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 88376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan} 88476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan 885ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 8868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_bond 8888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Bonds with peer device 8908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 8938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 8948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 895cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_bond(tBTA_DM_MSG* p_data) { 896cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_STATUS status; 897cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEC sec_event; 898cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson char* p_name; 899cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 900cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->bond.transport == BTA_TRANSPORT_UNKNOWN) 901cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status = BTM_SecBond(p_data->bond.bd_addr, 0, NULL, 0); 902cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else 903cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status = BTM_SecBondByTransport(p_data->bond.bd_addr, 904cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->bond.transport, 0, NULL, 0); 905cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 906cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED)) { 907cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(&sec_event, 0, sizeof(tBTA_DM_SEC)); 908cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(sec_event.auth_cmpl.bd_addr, p_data->bond.bd_addr); 909cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_name = BTM_SecReadDevName(p_data->bond.bd_addr); 910cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_name != NULL) { 911cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(sec_event.auth_cmpl.bd_name, p_name, (BD_NAME_LEN - 1)); 912cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.auth_cmpl.bd_name[BD_NAME_LEN - 1] = 0; 913cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 914cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 915cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* taken care of by memset [above] 916cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.auth_cmpl.key_present = false; 917cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.auth_cmpl.success = false; 918cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson */ 919cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.auth_cmpl.fail_reason = HCI_ERR_ILLEGAL_COMMAND; 920cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (status == BTM_SUCCESS) { 921cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.auth_cmpl.success = true; 922cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 923cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* delete this device entry from Sec Dev DB */ 924cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_remove_sec_dev_entry(p_data->bond.bd_addr); 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 926cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event); 927cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_bond_cancel 9338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Cancels bonding with a peer device 9358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 9388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 940cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_bond_cancel(tBTA_DM_MSG* p_data) { 941cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_STATUS status; 942cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEC sec_event; 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 944cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_EVENT(" bta_dm_bond_cancel "); 945cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status = BTM_SecBondCancel(p_data->bond_cancel.bd_addr); 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 947cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.p_sec_cback && 948cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (status != BTM_CMD_STARTED && status != BTM_SUCCESS)) { 949cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.bond_cancel_cmpl.result = BTA_FAILURE; 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 951cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_BOND_CANCEL_CMPL_EVT, &sec_event); 952cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_pin_reply 9588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Send the pin_reply to a request from BTM 9608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 9638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 965cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_pin_reply(tBTA_DM_MSG* p_data) { 966cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint32_t trusted_mask[BTM_SEC_SERVICE_ARRAY_SIZE]; 967cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint32_t* current_trusted_mask; 968cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 969cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson current_trusted_mask = BTM_ReadTrustedMask(p_data->pin_reply.bd_addr); 970cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 971cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (current_trusted_mask) { 972cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(trusted_mask, current_trusted_mask, sizeof(trusted_mask)); 973cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 974cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(trusted_mask, 0, sizeof(trusted_mask)); 975cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 976cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 977cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->pin_reply.accept) { 978cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_PINCodeReply(p_data->pin_reply.bd_addr, BTM_SUCCESS, 979cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->pin_reply.pin_len, p_data->pin_reply.p_pin, 980cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson trusted_mask); 981cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 982cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_PINCodeReply(p_data->pin_reply.bd_addr, BTM_NOT_AUTHORIZED, 0, NULL, 983cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson trusted_mask); 984cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_policy_cback 9908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description process the link policy changes 9928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 9948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 9958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 996cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, uint8_t id, 997cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t app_id, BD_ADDR peer_addr) { 998cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_PEER_DEVICE* p_dev = NULL; 999cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t policy = app_id; 1000cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint32_t mask = (uint32_t)(1 << id); 1001cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1002cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (peer_addr) p_dev = bta_dm_find_peer_device(peer_addr); 1003cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1004cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG(" bta_dm_policy_cback cmd:%d, policy:0x%x", status, policy); 1005cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson switch (status) { 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_SYS_PLCY_SET: 1007cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!p_dev) return; 1008cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* restore the default link policy */ 1009cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_dev->link_policy |= policy; 1010cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy)); 1011cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_SYS_PLCY_CLR: 1014cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!p_dev) return; 1015cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* clear the policy from the default link policy */ 1016cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_dev->link_policy &= (~policy); 1017cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy)); 1018cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1019cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (policy & (HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_PARK_MODE)) { 1020cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if clearing sniff/park, wake the link */ 1021cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_pm_active(p_dev->peer_bdaddr); 1022cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1023cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_SYS_PLCY_DEF_SET: 1026cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* want to restore/set the role switch policy */ 1027cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.role_policy_mask &= ~mask; 1028cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (0 == bta_dm_cb.role_policy_mask) { 1029cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if nobody wants to insist on the role */ 1030cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.cur_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; 1031cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy); 1032cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1033cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_SYS_PLCY_DEF_CLR: 1036cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* want to remove the role switch policy */ 1037cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.role_policy_mask |= mask; 1038cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.cur_policy &= ~HCI_ENABLE_MASTER_SLAVE_SWITCH; 1039cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy); 1040cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 1041cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_confirm 10478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Send the user confirm request reply in response to a 10498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * request from BTM 10508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 10528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1054cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_confirm(tBTA_DM_MSG* p_data) { 1055cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_STATUS res = BTM_NOT_AUTHORIZED; 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1057cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->confirm.accept == true) res = BTM_SUCCESS; 1058cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_ConfirmReqReply(res, p_data->confirm.bd_addr); 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_loc_oob 10648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Retrieve the OOB data from the local LM 10668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 10688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1070cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_loc_oob(UNUSED_ATTR tBTA_DM_MSG* p_data) { BTM_ReadLocalOobData(); } 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_ci_io_req_act 10758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description respond to the IO capabilities request from BTM 10778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 10798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1081cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_ci_io_req_act(tBTA_DM_MSG* p_data) { 1082cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_AUTH_REQ auth_req = BTM_AUTH_AP_NO; 1083cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->ci_io_req.auth_req) auth_req = BTM_AUTH_AP_YES; 1084cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_IoCapRsp(p_data->ci_io_req.bd_addr, p_data->ci_io_req.io_cap, 1085cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->ci_io_req.oob_data, auth_req); 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_ci_rmt_oob_act 10918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1092cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description respond to the OOB data request for the remote device from 10931baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * BTM 10948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 10978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 10988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1099cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_ci_rmt_oob_act(tBTA_DM_MSG* p_data) { 1100cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_STATUS res = BTM_NOT_AUTHORIZED; 1101cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1102cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->ci_rmt_oob.accept == true) res = BTM_SUCCESS; 1103cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_RemoteOobDataReply(res, p_data->ci_rmt_oob.bd_addr, p_data->ci_rmt_oob.c, 1104cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->ci_rmt_oob.r); 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 11098af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_search_start 11108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 11118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Starts an inquiry 11128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 11138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 11148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 11158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 11168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1117cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_search_start(tBTA_DM_MSG* p_data) { 1118cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_INQUIRY_CMPL result; 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1120cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson size_t len = sizeof(tBT_UUID) * p_data->search.num_uuid; 1121cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_gattc_register(); 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1123cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s avoid_scatter=%d", __func__, 1124cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_bta_dm_cfg->avoid_scatter); 112576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan 1126cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_bta_dm_cfg->avoid_scatter && 1127cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_data->search.rs_res == BTA_DM_RS_NONE) && 1128cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_check_av(BTA_DM_API_SEARCH_EVT)) { 1129cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(&bta_dm_cb.search_msg, &p_data->search, sizeof(tBTA_DM_API_SEARCH)); 1130cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 1131cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1133cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_ClearInqDb(NULL); 1134cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* save search params */ 1135cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_search_cback = p_data->search.p_cback; 1136cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services = p_data->search.services; 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1138cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free_and_reset((void**)&bta_dm_search_cb.p_srvc_uuid); 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1140cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((bta_dm_search_cb.num_uuid = p_data->search.num_uuid) != 0 && 1141cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->search.p_uuid != NULL) { 1142cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_srvc_uuid = (tBT_UUID*)osi_malloc(len); 1143cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(bta_dm_search_cb.p_srvc_uuid, p_data->search.p_uuid, len); 1144cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1145cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result.status = BTM_StartInquiry((tBTM_INQ_PARMS*)&p_data->search.inq_params, 1146cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_inq_results_cb, 1147cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTM_CMPL_CB*)bta_dm_inq_cmpl_cb); 1148cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1149cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_EVENT("%s status=%d", __func__, result.status); 1150cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (result.status != BTM_CMD_STARTED) { 1151cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result.num_resp = 0; 1152cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_inq_cmpl_cb((void*)&result); 1153cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 11588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_search_cancel 11598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 11608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Cancels an ongoing search for devices 11618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 11628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 11638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 11648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 11658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1166cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_search_cancel(UNUSED_ATTR tBTA_DM_MSG* p_data) { 1167cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_MSG* p_msg; 1168cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1169cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTM_IsInquiryActive()) { 1170cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTM_CancelInquiry() == BTM_SUCCESS) { 1171cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cancel_notify(NULL); 1172cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG)); 1173cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; 1174cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; 1175cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_msg); 1176717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov } else { 1177cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* flag a search cancel is pending */ 1178cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.cancel_pending = true; 1179c358eed353e80c388ce0424d8cc89d148390ffb1Matthew Xie } 1180cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1181cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* If no Service Search going on then issue cancel remote name in case it is 1182cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson active */ 1183cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else if (!bta_dm_search_cb.name_discover_done) { 1184cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_CancelRemoteDeviceName(); 1185cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1186cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG)); 1187cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; 1188cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; 1189cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_msg); 1190cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 1191cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG)); 1192cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.event = BTA_DM_INQUIRY_CMPL_EVT; 1193cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; 1194cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_msg); 1195cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1196c358eed353e80c388ce0424d8cc89d148390ffb1Matthew Xie 1197cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.gatt_disc_active) { 1198cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr); 1199cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 12048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_discover 12058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 12068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Discovers services on a remote device 12078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 12088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 12098af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 12108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 12118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1212cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_discover(tBTA_DM_MSG* p_data) { 1213cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson size_t len = sizeof(tBT_UUID) * p_data->discover.num_uuid; 1214cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_EVENT("%s services_to_search=0x%04X, sdp_search=%d", __func__, 1215cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->discover.services, p_data->discover.sdp_search); 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1217cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* save the search condition */ 1218cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services = p_data->discover.services; 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1220cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_gattc_register(); 1221cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free_and_reset((void**)&bta_dm_search_cb.p_srvc_uuid); 1222cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((bta_dm_search_cb.num_uuid = p_data->discover.num_uuid) != 0 && 1223cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->discover.p_uuid != NULL) { 1224cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_srvc_uuid = (tBT_UUID*)osi_malloc(len); 1225cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(bta_dm_search_cb.p_srvc_uuid, p_data->discover.p_uuid, len); 1226cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1227cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.uuid_to_search = bta_dm_search_cb.num_uuid; 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1229cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_search_cback = p_data->discover.p_cback; 1230cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.sdp_search = p_data->discover.sdp_search; 1231cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services_to_search = bta_dm_search_cb.services; 1232cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.service_index = 0; 1233cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services_found = 0; 1234cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.peer_name[0] = 0; 1235cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.sdp_search = p_data->discover.sdp_search; 1236cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_btm_inq_info = BTM_InqDbRead(p_data->discover.bd_addr); 1237cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.transport = p_data->discover.transport; 1238cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1239cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.name_discover_done = false; 1240cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(&bta_dm_search_cb.uuid, &p_data->discover.uuid, sizeof(tSDP_UUID)); 1241cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_discover_device(p_data->discover.bd_addr); 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 12468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_di_disc_cmpl 12478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 12488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Sends event to application when DI discovery complete 12498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 12508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 12518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 12528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1253cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_di_disc_cmpl(tBTA_DM_MSG* p_data) { 1254cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_DI_DISC_CMPL di_disc; 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1256cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(&di_disc, 0, sizeof(tBTA_DM_DI_DISC_CMPL)); 1257cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(di_disc.bd_addr, bta_dm_search_cb.peer_bdaddr); 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1259cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((p_data->hdr.offset == SDP_SUCCESS) || 1260cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_data->hdr.offset == SDP_DB_FULL)) { 1261cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson di_disc.num_record = SDP_GetNumDiRecords(bta_dm_di_cb.p_di_db); 1262cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else 1263cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson di_disc.result = BTA_FAILURE; 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1265cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_di_cb.p_di_db = NULL; 1266cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_search_cback(BTA_DM_DI_DISC_CMPL_EVT, 1267cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTA_DM_SEARCH*)&di_disc); 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 12728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_di_disc_callback 12738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 12748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This function queries a remote device for DI information. 12758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 12768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 12778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 12788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 12798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1280cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_di_disc_callback(uint16_t result) { 1281cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_MSG* p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG)); 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1283cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; 1284cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.layer_specific = BTA_DM_API_DI_DISCOVER_EVT; 1285cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.offset = result; 1286717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov 1287cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_msg); 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 12928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_disable_search_and_disc 12938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1294cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description Cancels an ongoing search or discovery for devices in case 12951baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * of a Bluetooth disable 12968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 12978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 12988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 12998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 13008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1301cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_disable_search_and_disc(void) { 1302cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_DI_DISC_CMPL di_disc; 1303ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1304cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) bta_dm_search_cancel(NULL); 1305ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1306cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_di_cb.p_di_db != NULL) { 1307cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(&di_disc, 0, sizeof(tBTA_DM_DI_DISC_CMPL)); 1308cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(di_disc.bd_addr, bta_dm_search_cb.peer_bdaddr); 1309cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson di_disc.result = BTA_FAILURE; 1310ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1311cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_di_cb.p_di_db = NULL; 1312cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_search_cback(BTA_DM_DI_DISC_CMPL_EVT, NULL); 1313cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1314ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 1315ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1316ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 13178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 13188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_di_disc 13198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 13208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This function queries a remote device for DI information. 13218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 13228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 13238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 13248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 13258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1326cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_di_disc(tBTA_DM_MSG* p_data) { 1327cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t result = BTA_FAILURE; 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1329cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_search_cback = p_data->di_disc.p_cback; 1330cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(bta_dm_search_cb.peer_bdaddr, p_data->di_disc.bd_addr); 1331cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_di_cb.p_di_db = p_data->di_disc.p_sdp_db; 1332717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov 1333cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_sdp_db = 1334cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tSDP_DISCOVERY_DB*)osi_malloc(BTA_DM_SDP_DB_SIZE); 1335cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (SDP_DiDiscover(bta_dm_search_cb.peer_bdaddr, p_data->di_disc.p_sdp_db, 1336cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->di_disc.len, 1337cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_di_disc_callback) == SDP_SUCCESS) { 1338cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result = BTA_SUCCESS; 1339cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1340cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1341cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (result == BTA_FAILURE) { 1342cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_MSG* p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG)); 1343cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1344cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; 1345cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.layer_specific = BTA_DM_API_DI_DISCOVER_EVT; 1346cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->hdr.offset = result; 1347cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_msg); 1348cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 13538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_read_remote_device_name 13548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 13558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Initiate to get remote device name 13568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 13578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns true if started to get remote name 13588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 13598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1360cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic bool bta_dm_read_remote_device_name(BD_ADDR bd_addr, 1361cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBT_TRANSPORT transport) { 1362cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_STATUS btm_status; 1363cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1364cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("bta_dm_read_remote_device_name"); 1365cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1366cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(bta_dm_search_cb.peer_bdaddr, bd_addr); 1367cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.peer_name[0] = 0; 1368cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1369cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson btm_status = 1370cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_ReadRemoteDeviceName(bta_dm_search_cb.peer_bdaddr, 1371cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTM_CMPL_CB*)bta_dm_remname_cback, transport); 1372cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1373cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (btm_status == BTM_CMD_STARTED) { 1374cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG( 1375cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is started"); 1376cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1377cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return (true); 1378cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else if (btm_status == BTM_BUSY) { 1379cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG( 1380cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is busy"); 1381cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1382cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Remote name discovery is on going now so BTM cannot notify through 1383cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * "bta_dm_remname_cback" */ 1384cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* adding callback to get notified that current reading remore name done */ 1385cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SecAddRmtNameNotifyCallback(&bta_dm_service_search_remname_cback); 1386cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1387cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return (true); 1388cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 1389cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_WARNING( 1390cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName returns " 1391cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "0x%02X", 1392cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson btm_status); 1393cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1394cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return (false); 1395cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 14008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_inq_cmpl 14018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 14028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Process the inquiry complete event from BTM 14038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 14048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 14058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 14068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1407cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_inq_cmpl(tBTA_DM_MSG* p_data) { 1408cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEARCH data; 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1410cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("bta_dm_inq_cmpl"); 14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1412cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson data.inq_cmpl.num_resps = p_data->inq_cmpl.num; 1413cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_search_cback(BTA_DM_INQ_CMPL_EVT, &data); 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1415f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen bta_dm_search_cb.p_btm_inq_info = BTM_InqDbFirst(); 1416f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (bta_dm_search_cb.p_btm_inq_info != NULL) { 1417cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* start name and service discovery from the first device on inquiry result 1418cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson */ 1419cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.name_discover_done = false; 1420cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.peer_name[0] = 0; 1421cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_discover_device( 1422cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr); 1423cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 1424cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_MSG* p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG)); 1425717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov 1426cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* no devices, search complete */ 1427cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services = 0; 14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1429cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; 1430cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; 1431cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_msg); 1432cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1433717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov} 14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 14378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_rmt_name 14388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 14398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Process the remote name result from BTM 14408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 14418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 14428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 14438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1444cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_rmt_name(tBTA_DM_MSG* p_data) { 1445cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("bta_dm_rmt_name"); 14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1447cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->rem_name.result.disc_res.bd_name[0] && 1448cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_btm_inq_info) { 1449cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name = true; 1450cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1452cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_discover_device(bta_dm_search_cb.peer_bdaddr); 14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 14578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_disc_rmt_name 14588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 14598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Process the remote name result from BTM when application 14608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * wants to find the name for a bdaddr 14618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 14628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 14638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 14648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1465cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_disc_rmt_name(tBTA_DM_MSG* p_data) { 1466cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_INQ_INFO* p_btm_inq_info; 14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1468cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("bta_dm_disc_rmt_name"); 14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1470cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_btm_inq_info = BTM_InqDbRead(p_data->rem_name.result.disc_res.bd_addr); 1471cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_btm_inq_info) { 1472cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->rem_name.result.disc_res.bd_name[0]) { 1473cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_btm_inq_info->appl_knows_rem_name = true; 14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1475cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1477cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_discover_device(p_data->rem_name.result.disc_res.bd_addr); 14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 14828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_sdp_result 14838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 14848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Process the discovery result from sdp 14858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 14868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 14878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 14888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1489cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_sdp_result(tBTA_DM_MSG* p_data) { 1490cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tSDP_DISC_REC* p_sdp_rec = NULL; 1491cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_MSG* p_msg; 1492cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool scn_found = false; 1493cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t service = 0xFFFF; 1494cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tSDP_PROTOCOL_ELEM pe; 14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1496cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBT_UUID* p_uuid = bta_dm_search_cb.p_srvc_uuid; 1497cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEARCH result; 1498cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBT_UUID service_uuid; 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1500cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint32_t num_uuids = 0; 1501cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t uuid_list[32][MAX_UUID_SIZE]; // assuming a max of 32 services 1502cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1503cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((p_data->sdp_event.sdp_result == SDP_SUCCESS) || 1504cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_data->sdp_event.sdp_result == SDP_NO_RECS_MATCH) || 1505cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_data->sdp_event.sdp_result == SDP_DB_FULL)) { 1506cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("sdp_result::0x%x", p_data->sdp_event.sdp_result); 1507cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson do { 1508cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_sdp_rec = NULL; 1509cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.service_index == (BTA_USER_SERVICE_ID + 1)) { 1510cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_sdp_rec = SDP_FindServiceUUIDInDb(bta_dm_search_cb.p_sdp_db, 1511cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson &bta_dm_search_cb.uuid, p_sdp_rec); 1512cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1513cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_sdp_rec && SDP_FindProtocolListElemInRec( 1514cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_sdp_rec, UUID_PROTOCOL_RFCOMM, &pe)) { 1515cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.peer_scn = (uint8_t)pe.params[0]; 1516cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson scn_found = true; 1517cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1518cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 1519cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson service = 1520cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index - 1]; 1521cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_sdp_rec = 1522cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db, service, p_sdp_rec); 1523cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1524cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* finished with BR/EDR services, now we check the result for GATT based 1525cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * service UUID */ 1526cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.service_index == BTA_MAX_SERVICE_ID) { 1527cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.uuid_to_search != 0 && p_uuid != NULL) { 1528cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_uuid += 1529cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search); 1530cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* only support 16 bits UUID for now */ 1531cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson service = p_uuid->uu.uuid16; 1532cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1533cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* all GATT based services */ 1534cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson do { 1535cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* find a service record, report it */ 1536cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_sdp_rec = 1537cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db, 0, p_sdp_rec); 1538cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_sdp_rec) { 1539cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (SDP_FindServiceUUIDInRec(p_sdp_rec, &service_uuid)) { 1540cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* send result back to app now, one by one */ 1541cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(result.disc_ble_res.bd_addr, bta_dm_search_cb.peer_bdaddr); 1542cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson strlcpy((char*)result.disc_ble_res.bd_name, bta_dm_get_remname(), 1543cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BD_NAME_LEN); 1544cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result.disc_ble_res.service.len = service_uuid.len; 1545cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result.disc_ble_res.service.uu.uuid16 = service_uuid.uu.uuid16; 1546cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1547cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_search_cback(BTA_DM_DISC_BLE_RES_EVT, &result); 15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1549cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1551cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.uuid_to_search > 0) break; 15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1553cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } while (p_sdp_rec); 15549979121f0865e07432215529f9b157792ae3ef21Myles Watson } else { 1555cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* SDP_DB_FULL means some records with the 1556cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson required attributes were received */ 1557cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (((p_data->sdp_event.sdp_result == SDP_DB_FULL) && 1558cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services != BTA_ALL_SERVICE_MASK) || 1559cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_sdp_rec != NULL)) { 1560cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (service != UUID_SERVCLASS_PNP_INFORMATION) { 1561cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t tmp_svc = 0xFFFF; 1562cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services_found |= 1563cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK( 1564cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.service_index - 1)); 1565cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tmp_svc = 1566cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index - 1567cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1]; 1568cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Add to the list of UUIDs */ 1569cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sdpu_uuid16_to_uuid128(tmp_svc, uuid_list[num_uuids]); 1570cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson num_uuids++; 1571cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1572cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1573cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1575cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK && 1576cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services_to_search == 0) { 1577cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID && 1578cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.uuid_to_search > 0) 1579cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.uuid_to_search--; 15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1581cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.uuid_to_search == 0 || 1582cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.service_index != BTA_BLE_SERVICE_ID) 1583cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.service_index++; 1584cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else /* regular one service per search or PNP search */ 1585cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1587cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } while (bta_dm_search_cb.service_index <= BTA_MAX_SERVICE_ID); 1588cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1589cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s services_found = %04x", __func__, 1590cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services_found); 1591cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1592cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Collect the 128-bit services here and put them into the list */ 1593cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK) { 1594cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_sdp_rec = NULL; 1595cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson do { 1596cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBT_UUID temp_uuid; 1597cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* find a service record, report it */ 1598cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_sdp_rec = 1599cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson SDP_FindServiceInDb_128bit(bta_dm_search_cb.p_sdp_db, p_sdp_rec); 1600cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_sdp_rec) { 1601cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (SDP_FindServiceUUIDInRec_128bit(p_sdp_rec, &temp_uuid)) { 1602cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(uuid_list[num_uuids], temp_uuid.uu.uuid128, MAX_UUID_SIZE); 1603cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson num_uuids++; 1604cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1606cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } while (p_sdp_rec); 1607cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1608cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if there are more services to search for */ 1609cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.services_to_search) { 1610cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Free up the p_sdp_db before checking the next one */ 1611cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_free_sdp_db(NULL); 1612cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_find_services(bta_dm_search_cb.peer_bdaddr); 1613cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 1614cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* callbacks */ 1615cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* start next bd_addr if necessary */ 1616cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1617cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback); 1618cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1619cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG)); 1620cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT; 1621cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.result = BTA_SUCCESS; 1622cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.p_raw_data = NULL; 1623cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.raw_data_size = 0; 1624cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.num_uuids = num_uuids; 1625cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.p_uuid_list = NULL; 1626cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (num_uuids > 0) { 1627cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.p_uuid_list = 1628cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (uint8_t*)osi_malloc(num_uuids * MAX_UUID_SIZE); 1629cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(p_msg->disc_result.result.disc_res.p_uuid_list, uuid_list, 1630cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson num_uuids * MAX_UUID_SIZE); 1631cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1632cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson // Copy the raw_data to the discovery result structure 1633cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.p_sdp_db != NULL && 1634cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_sdp_db->raw_used != 0 && 1635cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_sdp_db->raw_data != NULL) { 1636cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s raw_data used = 0x%x raw_data_ptr = 0x%x", 1637cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson __func__, bta_dm_search_cb.p_sdp_db->raw_used, 1638cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_sdp_db->raw_data); 1639cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1640cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.p_raw_data = 1641cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (uint8_t*)osi_malloc(bta_dm_search_cb.p_sdp_db->raw_used); 1642cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(p_msg->disc_result.result.disc_res.p_raw_data, 1643cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_sdp_db->raw_data, 1644cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_sdp_db->raw_used); 1645cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1646cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.raw_data_size = 1647cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_sdp_db->raw_used; 1648cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1649cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_sdp_db->raw_data = 1650cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson NULL; // no need to free this - it is a global assigned. 1651cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_sdp_db->raw_used = 0; 1652cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_sdp_db->raw_size = 0; 1653cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 1654cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s raw data size is 0 or raw_data is null!!", 1655cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson __func__); 1656cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1657cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Done with p_sdp_db. Free it */ 1658cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_free_sdp_db(NULL); 1659cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.services = 1660cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services_found; 1661cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1662cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson // Piggy back the SCN over result field 1663cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (scn_found) { 1664cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.result = 1665cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (3 + bta_dm_search_cb.peer_scn); 1666cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.services |= BTA_USER_SERVICE_MASK; 1667cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1668cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_EVENT(" Piggy back the SCN over result field SCN=%d", 1669cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.peer_scn); 1670cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1671cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(p_msg->disc_result.result.disc_res.bd_addr, 1672cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.peer_bdaddr); 1673cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson strlcpy((char*)p_msg->disc_result.result.disc_res.bd_name, 1674cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_get_remname(), BD_NAME_LEN); 16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1676cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_msg); 1677cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1678cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 1679cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* conn failed. No need for timer */ 1680cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->sdp_event.sdp_result == SDP_CONN_FAILED || 1681cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->sdp_event.sdp_result == SDP_CONN_REJECTED || 1682cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->sdp_event.sdp_result == SDP_SECURITY_ERR) 1683cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.wait_disc = false; 16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1685cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* not able to connect go to next device */ 1686cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.p_sdp_db) 1687cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free_and_reset((void**)&bta_dm_search_cb.p_sdp_db); 16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1689cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback); 1690717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov 1691cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG)); 1692cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT; 1693cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.result = BTA_FAILURE; 1694cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.services = 1695cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services_found; 1696cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(p_msg->disc_result.result.disc_res.bd_addr, 1697cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.peer_bdaddr); 1698cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson strlcpy((char*)p_msg->disc_result.result.disc_res.bd_name, 1699cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_get_remname(), BD_NAME_LEN); 1700cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1701cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_msg); 1702cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 17078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_search_cmpl 17088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 17098af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Sends event to application 17108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 17118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 17128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 17138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1714cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_search_cmpl(tBTA_DM_MSG* p_data) { 1715cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_EVENT("%s", __func__); 17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1717cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free_and_reset((void**)&bta_dm_search_cb.p_srvc_uuid); 17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1719cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->hdr.layer_specific == BTA_DM_API_DI_DISCOVER_EVT) 1720cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_di_disc_cmpl(p_data); 1721cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else 1722cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_search_cback(BTA_DM_DISC_CMPL_EVT, NULL); 17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 17278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_disc_result 17288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1729cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description Service discovery result when discovering services on a 17301baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * device 17318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 17328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 17338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 17348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1735cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_disc_result(tBTA_DM_MSG* p_data) { 1736cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_EVENT("%s", __func__); 17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1738cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if any BR/EDR service discovery has been done, report the event */ 1739cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((bta_dm_search_cb.services & 1740cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((BTA_ALL_SERVICE_MASK | BTA_USER_SERVICE_MASK) & 1741cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ~BTA_BLE_SERVICE_MASK))) 1742cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, 1743cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson &p_data->disc_result.result); 17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1745cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_MSG* p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG)); 174676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan 1747cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* send a message to change state */ 1748cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; 1749cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; 1750cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_msg); 17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 17558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_search_result 17568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 17578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Service discovery result while searching for devices 17588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 17598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 17608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 17618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1762cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_search_result(tBTA_DM_MSG* p_data) { 1763cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s searching:0x%04x, result:0x%04x", __func__, 1764cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services, 1765cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->disc_result.result.disc_res.services); 1766cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1767cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* call back if application wants name discovery or found services that 1768cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * application is searching */ 1769cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((!bta_dm_search_cb.services) || 1770cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((bta_dm_search_cb.services) && 1771cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_data->disc_result.result.disc_res.services))) { 1772cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, 1773cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson &p_data->disc_result.result); 1774cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1775cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1776cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if searching did not initiate to create link */ 1777cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!bta_dm_search_cb.wait_disc) { 1778cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if service searching is done with EIR, don't search next device */ 1779cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.p_btm_inq_info) bta_dm_discover_next_device(); 1780cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 1781cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* wait until link is disconnected or timeout */ 1782cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.sdp_results = true; 1783cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson alarm_set_on_queue(bta_dm_search_cb.search_timer, 1784cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1000 * (L2CAP_LINK_INACTIVITY_TOUT + 1), 1785cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_timer_cback, NULL, btu_bta_alarm_queue); 1786cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 17918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_search_timer_cback 17928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 17938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Called when ACL disconnect time is over 17948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 17958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 17968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 17978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 17988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1799cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_search_timer_cback(UNUSED_ATTR void* data) { 1800cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_EVENT("%s", __func__); 1801cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.wait_disc = false; 18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1803cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* proceed with next device */ 1804cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_discover_next_device(); 18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18098af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_free_sdp_db 18108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Frees SDP data base 18128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 18148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1816cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_free_sdp_db(UNUSED_ATTR tBTA_DM_MSG* p_data) { 1817cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free_and_reset((void**)&bta_dm_search_cb.p_sdp_db); 18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_queue_search 18238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Queues search command while search is being cancelled 18258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 18278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1829cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_queue_search(tBTA_DM_MSG* p_data) { 1830cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free(bta_dm_search_cb.p_search_queue); 1831cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_search_queue = 1832cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_API_SEARCH)); 1833cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(bta_dm_search_cb.p_search_queue, p_data, sizeof(tBTA_DM_API_SEARCH)); 18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_queue_disc 18398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Queues discovery command while search is being cancelled 18418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 18438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1845cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_queue_disc(tBTA_DM_MSG* p_data) { 1846cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free(bta_dm_search_cb.p_search_queue); 1847cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_search_queue = 1848cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_API_DISCOVER)); 1849cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(bta_dm_search_cb.p_search_queue, p_data, sizeof(tBTA_DM_API_DISCOVER)); 18505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_search_clear_queue 18558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Clears the queue if API search cancel is called 18578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 18598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1861cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_search_clear_queue(UNUSED_ATTR tBTA_DM_MSG* p_data) { 1862cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free_and_reset((void**)&bta_dm_search_cb.p_search_queue); 18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_search_cancel_cmpl 18688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Search cancel is complete 18708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 18728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1874cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_search_cancel_cmpl(UNUSED_ATTR tBTA_DM_MSG* p_data) { 1875cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.p_search_queue) { 1876cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(bta_dm_search_cb.p_search_queue); 1877cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_search_queue = NULL; 1878cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_search_cancel_transac_cmpl 18848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Current Service Discovery or remote name procedure is 18868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * completed after search cancellation 18878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 18898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1891cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_search_cancel_transac_cmpl(UNUSED_ATTR tBTA_DM_MSG* p_data) { 1892cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free_and_reset((void**)&bta_dm_search_cb.p_sdp_db); 1893cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cancel_notify(NULL); 18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 18988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_search_cancel_notify 18998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 19008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Notify application that search has been cancelled 19018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 19028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 19038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 19048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1905cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_search_cancel_notify(UNUSED_ATTR tBTA_DM_MSG* p_data) { 1906cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.p_search_cback) { 1907cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_search_cback(BTA_DM_SEARCH_CANCEL_CMPL_EVT, NULL); 1908cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1909cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!bta_dm_search_cb.name_discover_done) { 1910cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_CancelRemoteDeviceName(); 1911cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1912cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.gatt_disc_active) { 1913cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr); 1914cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 19155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 19188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 19198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_find_services 19208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 19218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Starts discovery on a device 19228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 19238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 19248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 19258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 1926cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_find_services(BD_ADDR bd_addr) { 1927cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tSDP_UUID uuid; 1928cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1929cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(&uuid, 0, sizeof(tSDP_UUID)); 1930cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1931cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson while (bta_dm_search_cb.service_index < BTA_MAX_SERVICE_ID) { 1932cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.services_to_search & 1933cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTA_SERVICE_MASK)( 1934cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index))) { 1935cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_sdp_db = 1936cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tSDP_DISCOVERY_DB*)osi_malloc(BTA_DM_SDP_DB_SIZE); 1937cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("bta_dm_search_cb.services = %04x***********", 1938cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services); 1939cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* try to search all services by search based on L2CAP UUID */ 1940cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK) { 1941cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson LOG_INFO(LOG_TAG, "%s services_to_search=%08x", __func__, 1942cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services_to_search); 1943cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.services_to_search & BTA_RES_SERVICE_MASK) { 1944cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[0]; 1945cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services_to_search &= ~BTA_RES_SERVICE_MASK; 1946cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 1947cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uuid.uu.uuid16 = UUID_PROTOCOL_L2CAP; 1948cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services_to_search = 0; 1949cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1950cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 1951cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* for LE only profile */ 1952cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID) { 1953cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.uuid_to_search > 0 && 1954cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_srvc_uuid) { 1955cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(&uuid, (const void*)(bta_dm_search_cb.p_srvc_uuid + 1956cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.num_uuid - 1957cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.uuid_to_search), 1958cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sizeof(tBT_UUID)); 1959cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 1960cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.uuid_to_search--; 1961cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 1962cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uuid.uu.uuid16 = 1963cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index]; 1964cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 19655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1966cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* last one? clear the BLE service bit if all discovery has been done 1967cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson */ 1968cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.uuid_to_search == 0) 1969cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services_to_search &= 1970cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK( 1971cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.service_index))); 19725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19739979121f0865e07432215529f9b157792ae3ef21Myles Watson } else { 1974cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* remove the service from services to be searched */ 1975cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services_to_search &= (tBTA_SERVICE_MASK)(~( 1976cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index))); 1977cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uuid.uu.uuid16 = 1978cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index]; 1979cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1980cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 19815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1982cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (uuid.len == 0) uuid.len = LEN_UUID_16; 19835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1984cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.service_index == BTA_USER_SERVICE_ID) { 1985cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(&uuid, &bta_dm_search_cb.uuid, sizeof(tSDP_UUID)); 1986cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 19875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1988cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson LOG_INFO(LOG_TAG, "%s search UUID = %04x", __func__, uuid.uu.uuid16); 1989cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson SDP_InitDiscoveryDb(bta_dm_search_cb.p_sdp_db, BTA_DM_SDP_DB_SIZE, 1, 1990cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson &uuid, 0, NULL); 19915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1992cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(g_disc_raw_data_buf, 0, sizeof(g_disc_raw_data_buf)); 1993cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_sdp_db->raw_data = g_disc_raw_data_buf; 19945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1995cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_sdp_db->raw_size = MAX_DISC_RAW_DATA_BUF; 19965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1997cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!SDP_ServiceSearchAttributeRequest(bd_addr, bta_dm_search_cb.p_sdp_db, 1998cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson &bta_dm_sdp_callback)) { 1999cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* 2000cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * If discovery is not successful with this device, then 2001cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * proceed with the next one. 2002cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson */ 2003cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free_and_reset((void**)&bta_dm_search_cb.p_sdp_db); 2004cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.service_index = BTA_MAX_SERVICE_ID; 20055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2006cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 2007cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID && 2008cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.uuid_to_search == 0) || 2009cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.service_index != BTA_BLE_SERVICE_ID) 2010cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.service_index++; 2011cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 2012cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 20135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2015cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.service_index++; 2016cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2017cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2018cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* no more services to be discovered */ 2019cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.service_index >= BTA_MAX_SERVICE_ID) { 2020cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_MSG* p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG)); 202165cca8f2ccdc9224162f81dded617de04be41313Manu Viswanadhan /* initialize the data structure - includes p_raw_data and raw_data_size */ 202265cca8f2ccdc9224162f81dded617de04be41313Manu Viswanadhan memset(&(p_msg->disc_result.result), 0, sizeof(tBTA_DM_DISC_RES)); 2023cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT; 2024cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.services = 2025cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services_found; 2026cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(p_msg->disc_result.result.disc_res.bd_addr, 2027cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.peer_bdaddr); 2028cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson strlcpy((char*)p_msg->disc_result.result.disc_res.bd_name, 2029cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_get_remname(), BD_NAME_LEN); 2030cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2031cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_msg); 2032cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 20335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 20345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 20368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 20378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_discover_next_device 20388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 20398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Starts discovery on the next device in Inquiry data base 20408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 20418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 20428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 20438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 2044cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_discover_next_device(void) { 2045cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("bta_dm_discover_next_device"); 2046717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov 2047cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* searching next device on inquiry result */ 2048f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen bta_dm_search_cb.p_btm_inq_info = 2049f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen BTM_InqDbNext(bta_dm_search_cb.p_btm_inq_info); 2050f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (bta_dm_search_cb.p_btm_inq_info != NULL) { 2051cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.name_discover_done = false; 2052cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.peer_name[0] = 0; 2053cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_discover_device( 2054cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr); 2055cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 2056cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_MSG* p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG)); 20575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2058cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* no devices, search complete */ 2059cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services = 0; 2060717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov 2061cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; 2062cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; 2063cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2064cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_msg); 2065cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 20665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 20675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 20698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 20708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_discover_device 20718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 20728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Starts name and service discovery on the device 20738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 20748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 20758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 20768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 2077cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_discover_device(BD_ADDR remote_bd_addr) { 2078cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; 2079cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.transport == BTA_TRANSPORT_UNKNOWN) { 2080cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBT_DEVICE_TYPE dev_type; 2081cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBLE_ADDR_TYPE addr_type; 2082cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2083cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_ReadDevInfo(remote_bd_addr, &dev_type, &addr_type); 2084cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (dev_type == BT_DEVICE_TYPE_BLE || addr_type == BLE_ADDR_RANDOM) 2085cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson transport = BT_TRANSPORT_LE; 2086cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 2087cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson transport = bta_dm_search_cb.transport; 2088cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 20897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 2090cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Reset transport state for next discovery */ 2091cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.transport = BTA_TRANSPORT_UNKNOWN; 20925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2093cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s BDA:0x%02X%02X%02X%02X%02X%02X", __func__, 2094cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson remote_bd_addr[0], remote_bd_addr[1], remote_bd_addr[2], 2095cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson remote_bd_addr[3], remote_bd_addr[4], remote_bd_addr[5]); 20965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2097cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(bta_dm_search_cb.peer_bdaddr, remote_bd_addr); 20985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2099cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG( 2100cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "%s name_discover_done = %d p_btm_inq_info 0x%x state = %d, transport=%d", 2101cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson __func__, bta_dm_search_cb.name_discover_done, 2102cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_btm_inq_info, bta_dm_search_cb.state, transport); 2103b4365c55ccb2e985d00619c30dc14d5c156771b7Nitin Arora 2104cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.p_btm_inq_info) { 2105cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s appl_knows_rem_name %d", __func__, 2106cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name); 2107cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2108cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((bta_dm_search_cb.p_btm_inq_info) && 2109cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (bta_dm_search_cb.p_btm_inq_info->results.device_type == 2110cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_DEVICE_TYPE_BLE) && 2111cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (bta_dm_search_cb.state == BTA_DM_SEARCH_ACTIVE)) { 2112cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Do not perform RNR for LE devices at inquiry complete*/ 2113cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.name_discover_done = true; 2114cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2115cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if name discovery is not done and application needs remote name */ 2116cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((!bta_dm_search_cb.name_discover_done) && 2117cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((bta_dm_search_cb.p_btm_inq_info == NULL) || 2118cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (bta_dm_search_cb.p_btm_inq_info && 2119cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (!bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name)))) { 2120cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_read_remote_device_name(bta_dm_search_cb.peer_bdaddr, 2121cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson transport) == true) 2122cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 2123cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2124cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* starting name discovery failed */ 2125cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.name_discover_done = true; 2126cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 21275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2128cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if application wants to discover service */ 2129cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.services) { 2130cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* initialize variables */ 2131cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.service_index = 0; 2132cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services_found = 0; 2133cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services_to_search = bta_dm_search_cb.services; 2134cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.uuid_to_search = bta_dm_search_cb.num_uuid; 2135cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((bta_dm_search_cb.p_btm_inq_info != NULL) && 2136cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services != BTA_USER_SERVICE_MASK && 2137cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (bta_dm_search_cb.sdp_search == false)) { 2138cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* check if EIR provides the information of supported services */ 2139cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_eir_search_services(&bta_dm_search_cb.p_btm_inq_info->results, 2140cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson &bta_dm_search_cb.services_to_search, 2141cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson &bta_dm_search_cb.services_found); 2142cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2143cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2144cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if seaching with EIR is not completed */ 2145cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.services_to_search) { 2146cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* check whether connection already exists to the device 2147cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if connection exists, we don't have to wait for ACL 2148cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson link to go down to start search on next device */ 2149cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTM_IsAclConnectionUp(bta_dm_search_cb.peer_bdaddr, 2150cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_TRANSPORT_BR_EDR)) 2151cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.wait_disc = false; 2152cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else 2153cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.wait_disc = true; 21545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2155cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.p_btm_inq_info) { 2156cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG( 2157cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "%s p_btm_inq_info 0x%x results.device_type 0x%x " 2158cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "services_to_search 0x%x", 2159cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson __func__, bta_dm_search_cb.p_btm_inq_info, 2160cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_btm_inq_info->results.device_type, 2161cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services_to_search); 2162cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2163e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 2164cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (transport == BT_TRANSPORT_LE) { 2165cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.services_to_search & BTA_BLE_SERVICE_MASK) { 2166cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson // set the raw data buffer here 2167cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(g_disc_raw_data_buf, 0, sizeof(g_disc_raw_data_buf)); 2168cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_ble_rawdata = g_disc_raw_data_buf; 21695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2170cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.ble_raw_size = MAX_DISC_RAW_DATA_BUF; 2171cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.ble_raw_used = 0; 2172717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov 2173cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* start GATT for service discovery */ 2174cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson btm_dm_start_gatt_discovery(bta_dm_search_cb.peer_bdaddr); 2175cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 2176cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 21779979121f0865e07432215529f9b157792ae3ef21Myles Watson } else { 2178cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.sdp_results = false; 2179cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_find_services(bta_dm_search_cb.peer_bdaddr); 2180cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 2181cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2182cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2183cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2184cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2185cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* name discovery and service discovery are done for this device */ 2186cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_MSG* p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG)); 2187cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT; 2188cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* initialize the data structure - includes p_raw_data and raw_data_size */ 2189cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(&(p_msg->disc_result.result), 0, sizeof(tBTA_DM_DISC_RES)); 2190cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.result = BTA_SUCCESS; 2191cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found; 2192cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(p_msg->disc_result.result.disc_res.bd_addr, 2193cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.peer_bdaddr); 2194cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson strlcpy((char*)p_msg->disc_result.result.disc_res.bd_name, 2195cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (char*)bta_dm_search_cb.peer_name, BD_NAME_LEN); 2196cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2197cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_msg); 21985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 21995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 22018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 22028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_sdp_callback 22038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 22048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Callback from sdp with discovery status 22058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 22068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 22078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 22088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 2209cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_sdp_callback(uint16_t sdp_status) { 2210cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SDP_RESULT* p_msg = 2211cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTA_DM_SDP_RESULT*)osi_malloc(sizeof(tBTA_DM_SDP_RESULT)); 22125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2213cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.event = BTA_DM_SDP_RESULT_EVT; 2214cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->sdp_result = sdp_status; 22155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2216cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_msg); 22175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 22185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 22208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 22218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_inq_results_cb 22228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 22238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Inquiry results callback from BTM 22248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 22258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 22268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 22278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 22280595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowskistatic void bta_dm_inq_results_cb(tBTM_INQ_RESULTS* p_inq, uint8_t* p_eir, 2229f7100bb0e57ed289833c353ba06028345f9f39b6Jakub Pawlowski uint16_t eir_len) { 2230cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEARCH result; 2231cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_INQ_INFO* p_inq_info; 2232cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t service_class; 2233cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2234cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(result.inq_res.bd_addr, p_inq->remote_bd_addr); 2235cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(result.inq_res.dev_class, p_inq->dev_class, DEV_CLASS_LEN); 2236cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_COD_SERVICE_CLASS(service_class, p_inq->dev_class); 2237cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result.inq_res.is_limited = 2238cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (service_class & BTM_COD_SERVICE_LMTD_DISCOVER) ? true : false; 2239cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result.inq_res.rssi = p_inq->rssi; 22405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2241cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result.inq_res.ble_addr_type = p_inq->ble_addr_type; 2242cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result.inq_res.inq_result_type = p_inq->inq_result_type; 2243cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result.inq_res.device_type = p_inq->device_type; 2244cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result.inq_res.flag = p_inq->flag; 22455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2246cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* application will parse EIR to find out remote device name */ 2247cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result.inq_res.p_eir = p_eir; 22480595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowski result.inq_res.eir_len = eir_len; 22495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2250f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr); 2251f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_inq_info != NULL) { 2252cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* initialize remt_name_not_required to false so that we get the name by 2253cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * default */ 2254cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result.inq_res.remt_name_not_required = false; 2255cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 22565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2257cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.p_search_cback) 2258cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_search_cback(BTA_DM_INQ_RES_EVT, &result); 22595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2260cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_inq_info) { 2261cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* application indicates if it knows the remote name, inside the callback 2262cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson copy that to the inquiry data base*/ 2263cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (result.inq_res.remt_name_not_required) 2264cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_inq_info->appl_knows_rem_name = true; 2265cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 22665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 22675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 22698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 22708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_inq_cmpl_cb 22718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 22728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Inquiry complete callback from BTM 22738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 22748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 22758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 22768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 2277cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_inq_cmpl_cb(void* p_result) { 2278cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_MSG* p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG)); 22795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2280cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s", __func__); 2281717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov 2282cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.cancel_pending == false) { 2283cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->inq_cmpl.hdr.event = BTA_DM_INQUIRY_CMPL_EVT; 2284cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->inq_cmpl.num = ((tBTM_INQUIRY_CMPL*)p_result)->num_resp; 2285cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 2286cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.cancel_pending = false; 2287cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cancel_notify(NULL); 2288cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; 2289cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; 2290cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2291717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov 2292cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_msg); 22935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 22945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 22968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 22978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_service_search_remname_cback 22988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 22998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Remote name call back from BTM during service discovery 23008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 23018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 23028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 23038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 2304cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_service_search_remname_cback(BD_ADDR bd_addr, 2305cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UNUSED_ATTR DEV_CLASS dc, 2306cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BD_NAME bd_name) { 2307cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_REMOTE_DEV_NAME rem_name; 2308cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_STATUS btm_status; 2309cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2310cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("bta_dm_service_search_remname_cback name=<%s>", bd_name); 2311cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2312cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if this is what we are looking for */ 2313cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!bdcmp(bta_dm_search_cb.peer_bdaddr, bd_addr)) { 2314cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson rem_name.length = strlen((char*)bd_name); 2315cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (rem_name.length > (BD_NAME_LEN - 1)) { 2316cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson rem_name.length = (BD_NAME_LEN - 1); 2317cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson rem_name.remote_bd_name[(BD_NAME_LEN - 1)] = 0; 2318cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2319cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson strlcpy((char*)rem_name.remote_bd_name, (char*)bd_name, BD_NAME_LEN); 2320cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson rem_name.status = BTM_SUCCESS; 2321cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2322cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_remname_cback(&rem_name); 2323cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 2324cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* get name of device */ 2325cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson btm_status = BTM_ReadRemoteDeviceName(bta_dm_search_cb.peer_bdaddr, 2326cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTM_CMPL_CB*)bta_dm_remname_cback, 2327cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_TRANSPORT_BR_EDR); 2328cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (btm_status == BTM_BUSY) { 2329cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* wait for next chance(notification of remote name discovery done) */ 2330cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG( 2331cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName is " 2332cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "busy"); 2333cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else if (btm_status != BTM_CMD_STARTED) { 2334cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if failed to start getting remote name then continue */ 2335cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_WARNING( 2336cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName " 2337cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "returns 0x%02X", 2338cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson btm_status); 2339cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2340cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson rem_name.length = 0; 2341cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson rem_name.remote_bd_name[0] = 0; 2342cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson rem_name.status = btm_status; 2343cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_remname_cback(&rem_name); 2344cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2345cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 23465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 23475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 23498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 23508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_remname_cback 23518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 23528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Remote name complete call back from BTM 23538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 23548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 23558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 23568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 2357cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_remname_cback(tBTM_REMOTE_DEV_NAME* p_remote_name) { 2358cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("bta_dm_remname_cback len = %d name=<%s>", 2359cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_remote_name->length, p_remote_name->remote_bd_name); 23605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2361cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* remote name discovery is done but it could be failed */ 2362cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.name_discover_done = true; 2363cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson strlcpy((char*)bta_dm_search_cb.peer_name, 2364cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (char*)p_remote_name->remote_bd_name, BD_NAME_LEN); 23655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2366cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback); 23677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 2368cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.transport == BT_TRANSPORT_LE) { 2369cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson GAP_BleReadPeerPrefConnParams(bta_dm_search_cb.peer_bdaddr); 2370cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 237176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan 2372cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_REM_NAME* p_msg = 2373cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTA_DM_REM_NAME*)osi_malloc(sizeof(tBTA_DM_REM_NAME)); 2374cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(p_msg->result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr); 2375cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson strlcpy((char*)p_msg->result.disc_res.bd_name, 2376cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (char*)p_remote_name->remote_bd_name, BD_NAME_LEN); 2377cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.event = BTA_DM_REMT_NAME_EVT; 23785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2379cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_msg); 23805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 23815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 23838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 23848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_authorize_cback 23858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 23868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description cback requesting authorization 23878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 23888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 23898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 23908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 2391cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic uint8_t bta_dm_authorize_cback(BD_ADDR bd_addr, DEV_CLASS dev_class, 2392cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BD_NAME bd_name, 2393cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UNUSED_ATTR uint8_t* service_name, 2394cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t service_id, 2395cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UNUSED_ATTR bool is_originator) { 2396cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEC sec_event; 2397cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t index = 1; 2398cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2399cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(sec_event.authorize.bd_addr, bd_addr); 2400cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(sec_event.authorize.dev_class, dev_class, DEV_CLASS_LEN); 2401cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson strlcpy((char*)sec_event.authorize.bd_name, (char*)bd_name, BD_NAME_LEN); 24025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2403e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_JV_INCLUDED == TRUE) 2404cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.authorize.service = service_id; 24055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 24065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2407cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson while (index < BTA_MAX_SERVICE_ID) { 2408cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* get the BTA service id corresponding to BTM id */ 2409cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_service_id_to_btm_srv_id_lkup_tbl[index] == service_id) { 2410cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.authorize.service = index; 2411cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 24125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2413cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson index++; 2414cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 24155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2416cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if supported service callback otherwise not authorized */ 2417cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.p_sec_cback && (index < BTA_MAX_SERVICE_ID 2418e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_JV_INCLUDED == TRUE) 2419cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* pass through JV service ID */ 2420cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson || (service_id >= BTA_FIRST_JV_SERVICE_ID && 2421cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson service_id <= BTA_LAST_JV_SERVICE_ID) 24225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2423cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson )) { 2424cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_AUTHORIZE_EVT, &sec_event); 2425cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return BTM_CMD_STARTED; 2426cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 2427cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return BTM_NOT_AUTHORIZED; 2428cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 24295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 24305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 24328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 24338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_pinname_cback 24348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 24358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Callback requesting pin_key 24368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 24378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 24388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 24398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 2440cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_pinname_cback(void* p_data) { 2441cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_REMOTE_DEV_NAME* p_result = (tBTM_REMOTE_DEV_NAME*)p_data; 2442cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEC sec_event; 2443cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint32_t bytes_to_copy; 2444cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEC_EVT event = bta_dm_cb.pin_evt; 2445cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2446cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTA_DM_SP_CFM_REQ_EVT == event) { 2447cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Retrieved saved device class and bd_addr */ 2448cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(sec_event.cfm_req.bd_addr, bta_dm_cb.pin_bd_addr); 2449cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_COPY_DEVICE_CLASS(sec_event.cfm_req.dev_class, bta_dm_cb.pin_dev_class); 2450cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2451cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_result && p_result->status == BTM_SUCCESS) { 2452cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bytes_to_copy = (p_result->length < (BD_NAME_LEN - 1)) 2453cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ? p_result->length 2454cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson : (BD_NAME_LEN - 1); 2455cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(sec_event.cfm_req.bd_name, p_result->remote_bd_name, 2456cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bytes_to_copy); 2457cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.pin_req.bd_name[BD_NAME_LEN - 1] = 0; 2458cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else /* No name found */ 2459cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.cfm_req.bd_name[0] = 0; 2460cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2461cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.key_notif.passkey = 2462cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.num_val; /* get PIN code numeric number */ 2463cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2464cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* 1 additional event data fields for this event */ 2465cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.cfm_req.just_works = bta_dm_cb.just_works; 2466cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 2467cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Retrieved saved device class and bd_addr */ 2468cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(sec_event.pin_req.bd_addr, bta_dm_cb.pin_bd_addr); 2469cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, bta_dm_cb.pin_dev_class); 2470cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2471cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_result && p_result->status == BTM_SUCCESS) { 2472cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bytes_to_copy = (p_result->length < (BD_NAME_LEN - 1)) 2473cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ? p_result->length 2474cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson : (BD_NAME_LEN - 1); 2475cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(sec_event.pin_req.bd_name, p_result->remote_bd_name, 2476cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bytes_to_copy); 2477cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.pin_req.bd_name[BD_NAME_LEN - 1] = 0; 2478cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else /* No name found */ 2479cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.pin_req.bd_name[0] = 0; 2480cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2481cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson event = bta_dm_cb.pin_evt; 2482cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.key_notif.passkey = 2483cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.num_val; /* get PIN code numeric number */ 2484cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2485cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2486cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.p_sec_cback) bta_dm_cb.p_sec_cback(event, &sec_event); 24875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 24885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 24908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 24918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_pin_cback 24928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 24938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Callback requesting pin_key 24948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 24958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 24968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 24978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 2498cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic uint8_t bta_dm_pin_cback(BD_ADDR bd_addr, DEV_CLASS dev_class, 2499cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BD_NAME bd_name, bool min_16_digit) { 2500cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEC sec_event; 2501cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2502cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!bta_dm_cb.p_sec_cback) return BTM_NOT_AUTHORIZED; 2503cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2504cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* If the device name is not known, save bdaddr and devclass and initiate a 2505cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * name request */ 2506cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bd_name[0] == 0) { 2507cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.pin_evt = BTA_DM_PIN_REQ_EVT; 2508cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(bta_dm_cb.pin_bd_addr, bd_addr); 2509cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, dev_class); 2510cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((BTM_ReadRemoteDeviceName(bd_addr, bta_dm_pinname_cback, 2511cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED) 2512cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return BTM_CMD_STARTED; 2513cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2514cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_WARNING( 2515cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson " bta_dm_pin_cback() -> Failed to start Remote Name Request "); 2516cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2517cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2518cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(sec_event.pin_req.bd_addr, bd_addr); 2519cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, dev_class); 2520cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson strlcpy((char*)sec_event.pin_req.bd_name, (char*)bd_name, BD_NAME_LEN); 2521cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.pin_req.min_16_digit = min_16_digit; 2522cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2523cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_PIN_REQ_EVT, &sec_event); 2524cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return BTM_CMD_STARTED; 25255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 25265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 25288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 25298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_new_link_key_cback 25308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 25318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Callback from BTM to notify new link key 25328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 25338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 25348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 25358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 2536cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic uint8_t bta_dm_new_link_key_cback(BD_ADDR bd_addr, 2537cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UNUSED_ATTR DEV_CLASS dev_class, 2538cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BD_NAME bd_name, LINK_KEY key, 2539cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t key_type) { 2540cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEC sec_event; 2541cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_AUTH_CMPL* p_auth_cmpl; 2542cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t event; 25435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2544cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(&sec_event, 0, sizeof(tBTA_DM_SEC)); 25455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2546cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Not AMP Key type */ 2547cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (key_type != HCI_LKEY_TYPE_AMP_WIFI && key_type != HCI_LKEY_TYPE_AMP_UWB) { 2548cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson event = BTA_DM_AUTH_CMPL_EVT; 2549cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_auth_cmpl = &sec_event.auth_cmpl; 25505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2551cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(p_auth_cmpl->bd_addr, bd_addr); 25525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2553cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(p_auth_cmpl->bd_name, bd_name, (BD_NAME_LEN - 1)); 2554cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_auth_cmpl->bd_name[BD_NAME_LEN - 1] = 0; 25555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2556cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_auth_cmpl->key_present = true; 2557cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_auth_cmpl->key_type = key_type; 2558cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_auth_cmpl->success = true; 25595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2560cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(p_auth_cmpl->key, key, LINK_KEY_LEN); 2561cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.auth_cmpl.fail_reason = HCI_SUCCESS; 25625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2563cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson // Report the BR link key based on the BR/EDR address and type 2564cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_ReadDevInfo(bd_addr, &sec_event.auth_cmpl.dev_type, 2565cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson &sec_event.auth_cmpl.addr_type); 2566cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.p_sec_cback) bta_dm_cb.p_sec_cback(event, &sec_event); 2567cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2568cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson // Setting remove_dev_pending flag to false, where it will avoid deleting 2569cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson // the 2570cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson // security device record when the ACL connection link goes down in case of 2571cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson // reconnection. 2572cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.device_list.count) 2573cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_reset_sec_dev_pending(p_auth_cmpl->bd_addr); 2574cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 2575cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_WARNING("%s() Received AMP Key", __func__); 2576cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2577cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2578cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return BTM_CMD_STARTED; 25795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 25805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 25828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 25838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_authentication_complete_cback 25848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 25858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Authentication complete callback from BTM 25868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 25878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 25888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 25898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 2590cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic uint8_t bta_dm_authentication_complete_cback( 2591cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BD_ADDR bd_addr, UNUSED_ATTR DEV_CLASS dev_class, BD_NAME bd_name, 2592cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson int result) { 2593cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEC sec_event; 25945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2595cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (result != BTM_SUCCESS) { 2596cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(&sec_event, 0, sizeof(tBTA_DM_SEC)); 2597cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(sec_event.auth_cmpl.bd_addr, bd_addr); 25985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2599cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(sec_event.auth_cmpl.bd_name, bd_name, (BD_NAME_LEN - 1)); 2600cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.auth_cmpl.bd_name[BD_NAME_LEN - 1] = 0; 26015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2602cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson // Report the BR link key based on the BR/EDR address and type 2603cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_ReadDevInfo(bd_addr, &sec_event.auth_cmpl.dev_type, 2604cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson &sec_event.auth_cmpl.addr_type); 2605cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.auth_cmpl.fail_reason = (uint8_t)result; 2606e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 2607cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.p_sec_cback) 2608cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event); 26096975b4d711142b885af479721cada448952c6b41Andre Eisenbach 26104f484079fd27effce2675ed38f3cdf88da42ab04Andre Eisenbach if (result != HCI_ERR_LMP_RESPONSE_TIMEOUT && 26114f484079fd27effce2675ed38f3cdf88da42ab04Andre Eisenbach result != HCI_ERR_PAGE_TIMEOUT && 26124f484079fd27effce2675ed38f3cdf88da42ab04Andre Eisenbach result != HCI_ERR_CONN_FAILED_ESTABLISHMENT) { 26134f484079fd27effce2675ed38f3cdf88da42ab04Andre Eisenbach bta_dm_remove_sec_dev_entry(bd_addr); 26144f484079fd27effce2675ed38f3cdf88da42ab04Andre Eisenbach } 2615cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 26165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2617cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return BTM_SUCCESS; 26185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 26195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2620eb1ad1d47b84767d9af180243cb14ac409331a0dPulkit Bhuwalka#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 26215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 26228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 26238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_sp_cback 26248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 26258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description simple pairing callback from BTM 26268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 26278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 26288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 26298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 2630cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic uint8_t bta_dm_sp_cback(tBTM_SP_EVT event, tBTM_SP_EVT_DATA* p_data) { 2631cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_STATUS status = BTM_CMD_STARTED; 2632cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEC sec_event; 2633cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEC_EVT pin_evt = BTA_DM_SP_KEY_NOTIF_EVT; 26345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2635cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_EVENT("bta_dm_sp_cback: %d", event); 2636cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!bta_dm_cb.p_sec_cback) return BTM_NOT_AUTHORIZED; 26375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2638cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* TODO_SP */ 2639cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson switch (event) { 26405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SP_IO_REQ_EVT: 2641cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* translate auth_req */ 2642cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_co_io_req(p_data->io_req.bd_addr, &p_data->io_req.io_cap, 2643cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson &p_data->io_req.oob_data, &p_data->io_req.auth_req, 2644cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->io_req.is_orig); 2645cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_EVENT("io mitm: %d oob_data:%d", p_data->io_req.auth_req, 2646cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->io_req.oob_data); 2647cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 26485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SP_IO_RSP_EVT: 2649cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_co_io_rsp(p_data->io_rsp.bd_addr, p_data->io_rsp.io_cap, 2650cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->io_rsp.oob_data, p_data->io_rsp.auth_req); 2651cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 26525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SP_CFM_REQ_EVT: 2654cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson pin_evt = BTA_DM_SP_CFM_REQ_EVT; 2655cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.just_works = sec_event.cfm_req.just_works = 2656cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->cfm_req.just_works; 2657cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.cfm_req.loc_auth_req = p_data->cfm_req.loc_auth_req; 2658cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.cfm_req.rmt_auth_req = p_data->cfm_req.rmt_auth_req; 2659cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.cfm_req.loc_io_caps = p_data->cfm_req.loc_io_caps; 2660cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.cfm_req.rmt_io_caps = p_data->cfm_req.rmt_io_caps; 2661cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 26624f484079fd27effce2675ed38f3cdf88da42ab04Andre Eisenbach /* continue to next case */ 26635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Passkey entry mode, mobile device with output capability is very 26645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project unlikely to receive key request, so skip this event */ 26655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /*case BTM_SP_KEY_REQ_EVT: */ 26665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SP_KEY_NOTIF_EVT: 2667cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.num_val = sec_event.key_notif.passkey = 2668cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->key_notif.passkey; 2669cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2670cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTM_SP_CFM_REQ_EVT == event) { 2671cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Due to the switch case falling through below to BTM_SP_KEY_NOTIF_EVT, 2672cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson call remote name request using values from cfm_req */ 2673cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->cfm_req.bd_name[0] == 0) { 2674cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.pin_evt = pin_evt; 2675cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(bta_dm_cb.pin_bd_addr, p_data->cfm_req.bd_addr); 2676cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, 2677cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->cfm_req.dev_class); 2678cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((BTM_ReadRemoteDeviceName( 2679cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->cfm_req.bd_addr, bta_dm_pinname_cback, 2680cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED) 2681cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return BTM_CMD_STARTED; 2682cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_WARNING( 2683cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson " bta_dm_sp_cback() -> Failed to start Remote Name Request "); 2684cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 2685cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Due to the switch case falling through below to 2686cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SP_KEY_NOTIF_EVT, 2687cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson copy these values into key_notif from cfm_req */ 2688cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(sec_event.key_notif.bd_addr, p_data->cfm_req.bd_addr); 2689cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, 2690cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->cfm_req.dev_class); 2691cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson strlcpy((char*)sec_event.key_notif.bd_name, 2692cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (char*)p_data->cfm_req.bd_name, BD_NAME_LEN); 26937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 2694cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 26957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 2696cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTM_SP_KEY_NOTIF_EVT == event) { 2697cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* If the device name is not known, save bdaddr and devclass 2698cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson and initiate a name request with values from key_notif */ 2699cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->key_notif.bd_name[0] == 0) { 2700cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.pin_evt = pin_evt; 2701cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(bta_dm_cb.pin_bd_addr, p_data->key_notif.bd_addr); 2702cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, 2703cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->key_notif.dev_class); 2704cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((BTM_ReadRemoteDeviceName( 2705cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->key_notif.bd_addr, bta_dm_pinname_cback, 2706cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED) 2707cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return BTM_CMD_STARTED; 2708cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_WARNING( 2709cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson " bta_dm_sp_cback() -> Failed to start Remote Name Request "); 2710cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 2711cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(sec_event.key_notif.bd_addr, p_data->key_notif.bd_addr); 2712cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, 2713cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->key_notif.dev_class); 2714cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson strlcpy((char*)sec_event.key_notif.bd_name, 2715cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (char*)p_data->key_notif.bd_name, BD_NAME_LEN); 2716cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.key_notif.bd_name[BD_NAME_LEN - 1] = 0; 27175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2718cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 27195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2720cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(pin_evt, &sec_event); 27215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2722cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 27235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SP_LOC_OOB_EVT: 2725cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_co_loc_oob((bool)(p_data->loc_oob.status == BTM_SUCCESS), 2726cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->loc_oob.c, p_data->loc_oob.r); 2727cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 27285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SP_RMT_OOB_EVT: 2730cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* If the device name is not known, save bdaddr and devclass and initiate 2731cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * a name request */ 2732cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->rmt_oob.bd_name[0] == 0) { 2733cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.pin_evt = BTA_DM_SP_RMT_OOB_EVT; 2734cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(bta_dm_cb.pin_bd_addr, p_data->rmt_oob.bd_addr); 2735cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, 2736cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->rmt_oob.dev_class); 2737cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((BTM_ReadRemoteDeviceName(p_data->rmt_oob.bd_addr, 2738cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_pinname_cback, 2739cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED) 2740cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return BTM_CMD_STARTED; 2741cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_WARNING( 2742cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson " bta_dm_sp_cback() -> Failed to start Remote Name Request "); 2743cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 27445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2745cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(sec_event.rmt_oob.bd_addr, p_data->rmt_oob.bd_addr); 2746cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_COPY_DEVICE_CLASS(sec_event.rmt_oob.dev_class, 2747cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->rmt_oob.dev_class); 2748cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson strlcpy((char*)sec_event.rmt_oob.bd_name, (char*)p_data->rmt_oob.bd_name, 2749cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BD_NAME_LEN); 27505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2751cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_SP_RMT_OOB_EVT, &sec_event); 27525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2753cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_co_rmt_oob(p_data->rmt_oob.bd_addr); 2754cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 2755175da70b6d60349dffdee3a9cd13182b293edf4cJakub Pawlowski 27565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SP_COMPLT_EVT: 2757cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* do not report this event - handled by link_key_callback or 2758cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * auth_complete_callback */ 2759cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 27605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SP_KEYPRESS_EVT: 2762cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(&sec_event.key_press, &p_data->key_press, 2763cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sizeof(tBTM_SP_KEYPRESS)); 2764cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_SP_KEYPRESS_EVT, &sec_event); 2765cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 27665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SP_UPGRADE_EVT: 2768cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_co_lk_upgrade(p_data->upgrade.bd_addr, &p_data->upgrade.upgrade); 2769cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 27705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 2772cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status = BTM_NOT_AUTHORIZED; 2773cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 2774cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2775cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_EVENT("dm status: %d", status); 2776cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return status; 27775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2778eb1ad1d47b84767d9af180243cb14ac409331a0dPulkit Bhuwalka#endif 27795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 27818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 27828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_local_name_cback 27838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 27848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Callback from btm after local name is read 27858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 27868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 27878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 27888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 27898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 2790cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_local_name_cback(UNUSED_ATTR uint8_t* p_name) { 2791cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEC sec_event; 27925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2793cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.enable.status = BTA_SUCCESS; 27948d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta 2795cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.p_sec_cback) 2796cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_ENABLE_EVT, &sec_event); 27975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 27985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 28008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 28018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_bl_change_cback 28028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 28038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Callback from btm when acl connection goes up or down 28048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 28058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 28068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 28078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 28088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 2809cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_bl_change_cback(tBTM_BL_EVENT_DATA* p_data) { 2810cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_ACL_CHANGE* p_msg = 2811cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTA_DM_ACL_CHANGE*)osi_malloc(sizeof(tBTA_DM_ACL_CHANGE)); 28125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2813cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->event = p_data->event; 2814cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->is_new = false; 28155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2816cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson switch (p_msg->event) { 2817717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov case BTM_BL_CONN_EVT: 2818cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->is_new = true; 2819cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(p_msg->bd_addr, p_data->conn.p_bda); 2820cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->transport = p_data->conn.transport; 2821cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->handle = p_data->conn.handle; 2822cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 2823717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov case BTM_BL_DISCN_EVT: 2824cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(p_msg->bd_addr, p_data->discn.p_bda); 2825cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->transport = p_data->discn.transport; 2826cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->handle = p_data->discn.handle; 2827cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 2828717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov case BTM_BL_UPDATE_EVT: 2829cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->busy_level = p_data->update.busy_level; 2830cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->busy_level_flags = p_data->update.busy_level_flags; 2831cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 2832717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov case BTM_BL_ROLE_CHG_EVT: 2833cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->new_role = p_data->role_chg.new_role; 2834cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hci_status = p_data->role_chg.hci_status; 2835cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(p_msg->bd_addr, p_data->role_chg.p_bda); 2836cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 2837717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov case BTM_BL_COLLISION_EVT: 2838cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(p_msg->bd_addr, p_data->conn.p_bda); 2839cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 2840cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 28415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2842cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.event = BTA_DM_ACL_CHANGE_EVT; 2843cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_msg); 28445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 284576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan 284676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan/******************************************************************************* 28478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 28488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_rs_cback 28498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 28508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Receives the role switch complete event 28518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 28528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns 28538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 28548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 2855cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_rs_cback(UNUSED_ATTR tBTM_ROLE_SWITCH_CMPL* p1) { 2856cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_WARNING("bta_dm_rs_cback:%d", bta_dm_cb.rs_event); 2857cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.rs_event == BTA_DM_API_SEARCH_EVT) { 2858cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.search_msg.rs_res = 2859cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_DM_RS_OK; /* do not care about the result for now */ 2860cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.rs_event = 0; 2861cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_start((tBTA_DM_MSG*)&bta_dm_cb.search_msg); 2862cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 28635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 28645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 28668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 28678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_check_av 28688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 28698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This function checks if AV is active 28708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * if yes, make sure the AV link is master 28718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 28728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns bool - true, if switch is in progress 28738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 28748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 2875cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic bool bta_dm_check_av(uint16_t event) { 2876cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool avoid_roleswitch = false; 2877cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool switching = false; 2878cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t i; 2879cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_PEER_DEVICE* p_dev; 28805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2881e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_DM_AVOID_A2DP_ROLESWITCH_ON_INQUIRY == TRUE) 28829647e91549368fd44440dd13a854f403feb13ad9Mattias Agren 2883cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* avoid role switch upon inquiry if a2dp is actively streaming as it 2884cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson introduces an audioglitch due to FW scheduling delays (unavoidable) */ 2885cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (event == BTA_DM_API_SEARCH_EVT) { 2886cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson avoid_roleswitch = true; 2887cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 28889647e91549368fd44440dd13a854f403feb13ad9Mattias Agren#endif 28899647e91549368fd44440dd13a854f403feb13ad9Mattias Agren 2890cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_WARNING("bta_dm_check_av:%d", bta_dm_cb.cur_av_count); 2891cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.cur_av_count) { 2892cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (i = 0; i < bta_dm_cb.device_list.count; i++) { 2893cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_dev = &bta_dm_cb.device_list.peer_device[i]; 2894cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_WARNING("[%d]: state:%d, info:x%x, avoid_rs %d", i, 2895cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_dev->conn_state, p_dev->info, avoid_roleswitch); 2896cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((p_dev->conn_state == BTA_DM_CONNECTED) && 2897cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_dev->info & BTA_DM_DI_AV_ACTIVE) && (avoid_roleswitch == false)) { 2898cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* make master and take away the role switch policy */ 2899cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTM_CMD_STARTED == BTM_SwitchRole(p_dev->peer_bdaddr, 2900cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson HCI_ROLE_MASTER, 2901cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTM_CMPL_CB*)bta_dm_rs_cback)) { 2902cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* the role switch command is actually sent */ 2903cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.rs_event = event; 2904cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson switching = true; 29055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2906cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* else either already master or can not switch for some reasons */ 2907cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_policy_cback(BTA_SYS_PLCY_CLR, 0, HCI_ENABLE_MASTER_SLAVE_SWITCH, 2908cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_dev->peer_bdaddr); 2909cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 2910cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 29115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2912cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2913cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return switching; 29145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 29188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_acl_change 29198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 29208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Process BTA_DM_ACL_CHANGE_EVT 29218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 29228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 29238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 29248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 29258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 2926cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_acl_change(tBTA_DM_MSG* p_data) { 2927cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t i; 2928cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t* p; 2929cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEC conn; 2930cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool is_new = p_data->acl_change.is_new; 2931cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BD_ADDR_PTR p_bda = p_data->acl_change.bd_addr; 2932cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool need_policy_change = false; 2933cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool issue_unpair_cb = false; 2934cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2935cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_PEER_DEVICE* p_dev; 2936cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(&conn, 0, sizeof(tBTA_DM_SEC)); 2937cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2938cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson switch (p_data->acl_change.event) { 2939cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTM_BL_UPDATE_EVT: /* busy level update */ 2940cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.p_sec_cback) { 2941cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson conn.busy_level.level = p_data->acl_change.busy_level; 2942cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson conn.busy_level.level_flags = p_data->acl_change.busy_level_flags; 2943cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_BUSY_LEVEL_EVT, &conn); 2944cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2945cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 2946cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 2947cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTM_BL_ROLE_CHG_EVT: /* role change event */ 2948cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_dev = bta_dm_find_peer_device(p_bda); 2949cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_dev) { 2950cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG( 2951cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "bta_dm_acl_change role chg info:x%x new_role:%d dev count:%d", 2952cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_dev->info, p_data->acl_change.new_role, 2953cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.count); 2954cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_dev->info & BTA_DM_DI_AV_ACTIVE) { 2955cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* there's AV activity on this link */ 2956cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->acl_change.new_role == HCI_ROLE_SLAVE && 2957cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.count > 1 && 2958cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->acl_change.hci_status == HCI_SUCCESS) { 2959cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* more than one connections and the AV connection is role switched 2960cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * to slave 2961cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * switch it back to master and remove the switch policy */ 2962cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SwitchRole(p_bda, BTM_ROLE_MASTER, NULL); 2963cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson need_policy_change = true; 2964cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else if (p_bta_dm_cfg->avoid_scatter && 2965cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_data->acl_change.new_role == HCI_ROLE_MASTER)) { 2966cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if the link updated to be master include AV activities, remove 2967cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * the switch policy */ 2968cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson need_policy_change = true; 2969cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 29705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2971cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (need_policy_change) { 2972cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_policy_cback(BTA_SYS_PLCY_CLR, 0, 2973cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson HCI_ENABLE_MASTER_SLAVE_SWITCH, 2974cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_dev->peer_bdaddr); 2975cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2976cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 2977cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* there's AV no activity on this link and role switch happened 2978cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * check if AV is active 2979cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * if so, make sure the AV link is master */ 2980cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_check_av(0); 29815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2982cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_notify_role_chg(p_data->acl_change.bd_addr, 2983cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->acl_change.new_role, 2984cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->acl_change.hci_status); 2985cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(conn.role_chg.bd_addr, p_bda); 2986cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson conn.role_chg.new_role = (uint8_t)p_data->acl_change.new_role; 2987cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.p_sec_cback) 2988cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_ROLE_CHG_EVT, (tBTA_DM_SEC*)&conn); 2989cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2990cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 2991cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 29925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2993cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Collision report from Stack: Notify profiles */ 2994cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->acl_change.event == BTM_BL_COLLISION_EVT) { 2995cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_notify_collision(p_bda); 2996cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 2997cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 29985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2999cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (is_new) { 3000cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (i = 0; i < bta_dm_cb.device_list.count; i++) { 300184baa7f16e830394408278dbb8c508dd9fa02887Myles Watson if (!bdcmp(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda) && 3002cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[i].conn_handle == 300384baa7f16e830394408278dbb8c508dd9fa02887Myles Watson p_data->acl_change.handle) 3004cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 3005cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 30065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3007cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (i == bta_dm_cb.device_list.count) { 3008cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.device_list.count < BTA_DM_NUM_PEER_DEVICE) { 3009cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count] 3010cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson .peer_bdaddr, 3011cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_bda); 3012cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count] 3013cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson .link_policy = bta_dm_cb.cur_policy; 3014cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.count++; 3015cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[i].conn_handle = 3016cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->acl_change.handle; 3017cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->acl_change.transport == BT_TRANSPORT_LE) 3018cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.le_count++; 3019cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 3020cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_ERROR("%s max active connection reached, no resources", 3021cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson __func__); 3022cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 3023cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3024cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 30255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3026cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_CONNECTED; 3027cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[i].pref_role = BTA_ANY_ROLE; 3028cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(conn.link_up.bd_addr, p_bda); 3029cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_NONE; 3030cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson conn.link_up.link_type = p_data->acl_change.transport; 3031cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[i].transport = 3032cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->acl_change.transport; 30337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 3034cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (((NULL != (p = BTM_ReadLocalFeatures())) && 3035cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson HCI_SNIFF_SUB_RATE_SUPPORTED(p)) && 3036cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((NULL != (p = BTM_ReadRemoteFeatures(p_bda))) && 3037cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson HCI_SNIFF_SUB_RATE_SUPPORTED(p))) { 3038cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* both local and remote devices support SSR */ 3039cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_USE_SSR; 3040cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3041cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_WARNING("%s info: 0x%x", __func__, 3042cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[i].info); 3043cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3044cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.p_sec_cback) 3045cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_LINK_UP_EVT, (tBTA_DM_SEC*)&conn); 3046cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 3047cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (i = 0; i < bta_dm_cb.device_list.count; i++) { 304884baa7f16e830394408278dbb8c508dd9fa02887Myles Watson if (bdcmp(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda) || 3049cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[i].transport != 305084baa7f16e830394408278dbb8c508dd9fa02887Myles Watson p_data->acl_change.transport) 3051cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson continue; 30525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3053cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_UNPAIRING) { 3054cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTM_SecDeleteDevice( 3055cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[i].peer_bdaddr)) 3056cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson issue_unpair_cb = true; 305776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan 3058cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s: Unpairing: issue unpair CB = %d ", __func__, 3059cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson issue_unpair_cb); 3060cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 30615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3062cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson conn.link_down.is_removed = 3063cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[i].remove_dev_pending; 3064ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 3065e92648629c81ff1a12a605475983d0df5fc24aa3Martin Brabham // Iterate to the one before the last when shrinking the list, 3066e92648629c81ff1a12a605475983d0df5fc24aa3Martin Brabham // otherwise we memcpy garbage data into the record. 3067e92648629c81ff1a12a605475983d0df5fc24aa3Martin Brabham // Then clear out the last item in the list since we are shrinking. 3068e92648629c81ff1a12a605475983d0df5fc24aa3Martin Brabham for (; i < bta_dm_cb.device_list.count - 1; i++) { 3069cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(&bta_dm_cb.device_list.peer_device[i], 3070cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson &bta_dm_cb.device_list.peer_device[i + 1], 3071cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sizeof(bta_dm_cb.device_list.peer_device[i])); 3072cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3073e92648629c81ff1a12a605475983d0df5fc24aa3Martin Brabham if (bta_dm_cb.device_list.count > 0) { 3074e92648629c81ff1a12a605475983d0df5fc24aa3Martin Brabham int clear_index = bta_dm_cb.device_list.count - 1; 3075e92648629c81ff1a12a605475983d0df5fc24aa3Martin Brabham memset(&bta_dm_cb.device_list.peer_device[clear_index], 0, 3076e92648629c81ff1a12a605475983d0df5fc24aa3Martin Brabham sizeof(bta_dm_cb.device_list.peer_device[clear_index])); 3077e92648629c81ff1a12a605475983d0df5fc24aa3Martin Brabham } 3078cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 3079cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3080cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.device_list.count) bta_dm_cb.device_list.count--; 3081cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((p_data->acl_change.transport == BT_TRANSPORT_LE) && 3082cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (bta_dm_cb.device_list.le_count)) 3083cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.le_count--; 3084cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson conn.link_down.link_type = p_data->acl_change.transport; 30855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3086cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.wait_disc && 3087cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson !bdcmp(bta_dm_search_cb.peer_bdaddr, p_bda)) { 3088cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.wait_disc = false; 30895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3090cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.sdp_results) { 3091cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_EVENT(" timer stopped "); 3092cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson alarm_cancel(bta_dm_search_cb.search_timer); 3093cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_discover_next_device(); 3094cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3095cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 30965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3097cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.disabling) { 3098cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!BTM_GetNumAclLinks()) { 3099cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* 3100cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Start a timer to make sure that the profiles 3101cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * get the disconnect event. 3102cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson */ 3103cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson alarm_set_on_queue( 3104cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.disable_timer, BTA_DM_DISABLE_CONN_DOWN_TIMER_MS, 3105cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_disable_conn_down_timer_cback, NULL, btu_bta_alarm_queue); 3106cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3107cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3108cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (conn.link_down.is_removed) { 3109cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SecDeleteDevice(p_bda); 3110cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* need to remove all pending background connection */ 3111cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_GATTC_CancelOpen(0, p_bda, false); 3112cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* remove all cached GATT information */ 3113cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_GATTC_Refresh(p_bda); 3114cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 31155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3116cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(conn.link_down.bd_addr, p_bda); 3117cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson conn.link_down.status = (uint8_t)btm_get_acl_disc_reason_code(); 3118cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.p_sec_cback) { 3119cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_LINK_DOWN_EVT, &conn); 3120cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (issue_unpair_cb) 3121cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &conn); 31225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3123cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 31245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3125cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_adjust_roles(true); 31265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 31275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 31298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 31308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_disable_conn_down_timer_cback 31318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 31328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Sends disable event to application 31338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 31348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 31358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 31368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 31378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 3138cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_disable_conn_down_timer_cback(UNUSED_ATTR void* data) { 3139cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_SYS_HW_MSG* sys_enable_event = 3140cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTA_SYS_HW_MSG*)osi_malloc(sizeof(tBTA_SYS_HW_MSG)); 31415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3142cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* disable the power managment module */ 3143cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_disable_pm(); 3144ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 3145cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* register our callback to SYS HW manager */ 3146cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_hw_register(BTA_SYS_HW_BLUETOOTH, bta_dm_sys_hw_cback); 31475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3148cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* send a message to BTA SYS */ 3149cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sys_enable_event->hdr.event = BTA_SYS_API_DISABLE_EVT; 3150cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH; 3151cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(sys_enable_event); 31525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3153cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.disabling = false; 31545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 31555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 31578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 31588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_rm_cback 31598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 31608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Role management callback from sys 31618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 31628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 31638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 31648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 31658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 3166cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, uint8_t id, 3167cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t app_id, BD_ADDR peer_addr) { 3168cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t j; 3169cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_PREF_ROLES role; 3170cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_PEER_DEVICE* p_dev; 3171cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3172cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_dev = bta_dm_find_peer_device(peer_addr); 3173cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (status == BTA_SYS_CONN_OPEN) { 3174cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_dev) { 3175cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Do not set to connected if we are in the middle of unpairing. When AV 3176cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * stream is 3177cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * started it fakes out a SYS_CONN_OPEN to potentially trigger a role 3178cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * switch command. 3179cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * But this should not be done if we are in the middle of unpairing. 3180cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson */ 3181cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_dev->conn_state != BTA_DM_UNPAIRING) 3182cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_dev->conn_state = BTA_DM_CONNECTED; 3183cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3184cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (j = 1; j <= p_bta_dm_rm_cfg[0].app_id; j++) { 3185cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (((p_bta_dm_rm_cfg[j].app_id == app_id) || 3186cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_bta_dm_rm_cfg[j].app_id == BTA_ALL_APP_ID)) && 3187cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_bta_dm_rm_cfg[j].id == id)) { 3188cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson role = p_bta_dm_rm_cfg[j].cfg; 3189cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3190cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (role > p_dev->pref_role) p_dev->pref_role = role; 3191cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 31925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3193cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 31945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3195cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 31965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3197cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((BTA_ID_AV == id) || (BTA_ID_AVK == id)) { 3198cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (status == BTA_SYS_CONN_BUSY) { 3199cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_dev) p_dev->info |= BTA_DM_DI_AV_ACTIVE; 3200cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* AV calls bta_sys_conn_open with the A2DP stream count as app_id */ 3201cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTA_ID_AV == id) bta_dm_cb.cur_av_count = bta_dm_get_av_count(); 3202cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else if (status == BTA_SYS_CONN_IDLE) { 3203cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_dev) p_dev->info &= ~BTA_DM_DI_AV_ACTIVE; 320476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan 3205cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* get cur_av_count from connected services */ 3206cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTA_ID_AV == id) bta_dm_cb.cur_av_count = bta_dm_get_av_count(); 32075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3208cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_WARNING("bta_dm_rm_cback:%d, status:%d", bta_dm_cb.cur_av_count, 3209cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status); 3210cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 32115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3212cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Don't adjust roles for each busy/idle state transition to avoid 3213cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson excessive switch requests when individual profile busy/idle status 3214cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson changes */ 3215cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((status != BTA_SYS_CONN_BUSY) && (status != BTA_SYS_CONN_IDLE)) 3216cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_adjust_roles(false); 32175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 32185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 32208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 32218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_delay_role_switch_cback 32228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 32238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Callback from btm to delay a role switch 32248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 32258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 32268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 32278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 3228cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_delay_role_switch_cback(UNUSED_ATTR void* data) { 3229cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_EVENT("%s: initiating Delayed RS", __func__); 3230cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_adjust_roles(false); 32315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 32325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 32348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 32358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_reset_sec_dev_pending 32368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 32378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Setting the remove device pending status to false from 32388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * security device DB, when the link key notification 32398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * event comes. 32408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 32418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 32428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 32438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 3244cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_reset_sec_dev_pending(BD_ADDR remote_bd_addr) { 3245cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (size_t i = 0; i < bta_dm_cb.device_list.count; i++) { 3246cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bdcmp(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, 3247cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson remote_bd_addr) == 0) { 3248cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[i].remove_dev_pending = false; 3249cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 3250cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3251cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 32529412bbaea51f577d903e060b8c8214fbd28b0b4fBalraj Selvaraj} 32539412bbaea51f577d903e060b8c8214fbd28b0b4fBalraj Selvaraj 32549412bbaea51f577d903e060b8c8214fbd28b0b4fBalraj Selvaraj/******************************************************************************* 32558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 32568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_remove_sec_dev_entry 32578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3258cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description Removes device entry from Security device DB if ACL 3259cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson connection with 3260cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * remtoe device does not exist, else schedule for dev entry 3261cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson removal upon 3262ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ACL close 32638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 32648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 32658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 32668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 3267cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr) { 3268cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTM_IsAclConnectionUp(remote_bd_addr, BT_TRANSPORT_LE) || 3269cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_IsAclConnectionUp(remote_bd_addr, BT_TRANSPORT_BR_EDR)) { 3270cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG( 3271cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "%s ACL is not down. Schedule for Dev Removal when ACL closes", 3272cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson __func__); 3273cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SecClearSecurityFlags(remote_bd_addr); 3274cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (int i = 0; i < bta_dm_cb.device_list.count; i++) { 3275cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!bdcmp(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, 3276cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson remote_bd_addr)) { 3277cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[i].remove_dev_pending = TRUE; 3278cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 3279cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3280ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 3281cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 3282cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SecDeleteDevice(remote_bd_addr); 3283cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* need to remove all pending background connection */ 3284cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_GATTC_CancelOpen(0, remote_bd_addr, false); 3285cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* remove all cached GATT information */ 3286cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_GATTC_Refresh(remote_bd_addr); 3287cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3288ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 3289ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 3290ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 32918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 32928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_adjust_roles 32938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 32948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Adjust roles 32958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 32968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 32978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 32988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 32998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 3300cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_adjust_roles(bool delay_role_switch) { 3301cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t i; 3302cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool set_master_role = false; 3303cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t br_count = 3304cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.count - bta_dm_cb.device_list.le_count; 3305cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (br_count) { 3306cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* the configuration is no scatternet 3307cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * or AV connection exists and there are more than one ACL link */ 3308cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((p_bta_dm_rm_cfg[0].cfg == BTA_DM_NO_SCATTERNET) || 3309cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (bta_dm_cb.cur_av_count && br_count > 1)) { 3310cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson L2CA_SetDesireRole(HCI_ROLE_MASTER); 3311cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson set_master_role = true; 3312cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 33135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3314cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (i = 0; i < bta_dm_cb.device_list.count; i++) { 331584baa7f16e830394408278dbb8c508dd9fa02887Myles Watson if (bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED && 331684baa7f16e830394408278dbb8c508dd9fa02887Myles Watson bta_dm_cb.device_list.peer_device[i].transport == 331784baa7f16e830394408278dbb8c508dd9fa02887Myles Watson BT_TRANSPORT_BR_EDR) { 3318cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!set_master_role && 3319cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (bta_dm_cb.device_list.peer_device[i].pref_role != BTA_ANY_ROLE) && 3320cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_bta_dm_rm_cfg[0].cfg == BTA_DM_PARTIAL_SCATTERNET)) { 3321cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson L2CA_SetDesireRole(HCI_ROLE_MASTER); 3322cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson set_master_role = true; 33235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 33245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3325cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((bta_dm_cb.device_list.peer_device[i].pref_role == 3326cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_MASTER_ROLE_ONLY) || 3327cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (br_count > 1)) { 3328cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Initiating immediate role switch with certain remote devices 3329cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson has caused issues due to role switch colliding with link encryption 3330cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson setup and 3331cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson causing encryption (and in turn the link) to fail . These device . 3332cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson Firmware 3333cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson versions are stored in a blacklist and role switch with these 3334cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson devices are 3335cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson delayed to avoid the collision with link encryption setup */ 3336cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3337cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.device_list.peer_device[i].pref_role != 3338cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_SLAVE_ROLE_ONLY && 3339cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson delay_role_switch == false) { 3340cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SwitchRole(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, 3341cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson HCI_ROLE_MASTER, NULL); 3342cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 3343cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson alarm_set_on_queue( 3344cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.switch_delay_timer, BTA_DM_SWITCH_DELAY_TIMER_MS, 3345cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_delay_role_switch_cback, NULL, btu_bta_alarm_queue); 3346cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 33475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3348cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 33495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 33505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3351cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!set_master_role) { 3352cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson L2CA_SetDesireRole(L2CAP_DESIRED_LINK_ROLE); 3353cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 33545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3355cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 3356cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson L2CA_SetDesireRole(L2CAP_DESIRED_LINK_ROLE); 3357cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 33585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 33595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 33618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 33628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_get_remname 33638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3364cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description Returns a pointer to the remote name stored in the DM 33651baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * control block if it exists, or from the BTM memory. 33668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 33678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns char * - Pointer to the remote device name 33688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 3369cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic char* bta_dm_get_remname(void) { 3370cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson char* p_name = (char*)bta_dm_search_cb.peer_name; 3371cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson char* p_temp; 33725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3373cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* If the name isn't already stored, try retrieving from BTM */ 3374f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (*p_name == '\0') { 3375f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_temp = BTM_SecReadDevName(bta_dm_search_cb.peer_bdaddr); 3376f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_temp != NULL) p_name = p_temp; 3377f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen } 33785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3379cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return p_name; 33805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 33815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 33838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 33848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_bond_cancel_complete_cback 33858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 33868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Authentication complete callback from BTM 33878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 33888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 33898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 33908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 3391cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result) { 3392cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEC sec_event; 33935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3394cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (result == BTM_SUCCESS) 3395cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.bond_cancel_cmpl.result = BTA_SUCCESS; 3396cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else 3397cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.bond_cancel_cmpl.result = BTA_FAILURE; 33985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3399cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.p_sec_cback) { 3400cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_BOND_CANCEL_CMPL_EVT, &sec_event); 3401cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 34025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 34035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 34058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 34068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function find_utf8_char_boundary 34078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 34088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This function checks a UTF8 string |utf8str| starting at 34098af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * |offset|, moving backwards and returns the offset of the 34108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * next valid UTF8 character boundary found. 34118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 34128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns Offset of UTF8 character boundary 34138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 34148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 3415cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic size_t find_utf8_char_boundary(const char* utf8str, size_t offset) { 3416f2af1c42ccb2f642b241c2261b42d0be61d45438Jack He CHECK(utf8str); 3417f2af1c42ccb2f642b241c2261b42d0be61d45438Jack He CHECK(offset > 0); 3418cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3419cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson while (--offset) { 3420cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t ch = (uint8_t)utf8str[offset]; 3421cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((ch & 0x80) == 0x00) // ASCII 3422cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return offset + 1; 3423cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((ch & 0xC0) == 0xC0) // Multi-byte sequence start 3424cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return offset; 3425cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3426cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3427cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return 0; 3428c5734d7fe3b4ab02ad1b0174f56abe94546181cbMatadeen Mishra} 3429c5734d7fe3b4ab02ad1b0174f56abe94546181cbMatadeen Mishra 3430c5734d7fe3b4ab02ad1b0174f56abe94546181cbMatadeen Mishra/******************************************************************************* 34318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 34328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_set_eir 34338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3434cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description This function creates EIR tagged data and writes it to 34351baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * controller. 34368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 34378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns None 34388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 34398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 3440cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_set_eir(char* local_name) { 3441cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t* p; 3442cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t* p_length; 34435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_EIR_CANNED_UUID_LIST != TRUE) 3444cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t* p_type; 3445cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t max_num_uuid; 34465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) 3447cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t custom_uuid_idx; 34481e61ce1ae3fe8ef72443b30907f1cf8acae39674Chris Manton#endif // BTA_EIR_SERVER_NUM_CUSTOM_UUID 34491e61ce1ae3fe8ef72443b30907f1cf8acae39674Chris Manton#endif // BTA_EIR_CANNED_UUID_LIST 34505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_EIR_DEFAULT_FEC_REQUIRED == FALSE) 3451cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t free_eir_length = HCI_EXT_INQ_RESPONSE_LEN; 34521e61ce1ae3fe8ef72443b30907f1cf8acae39674Chris Manton#else // BTM_EIR_DEFAULT_FEC_REQUIRED 3453cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t free_eir_length = HCI_DM5_PACKET_SIZE; 3454818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde#endif // BTM_EIR_DEFAULT_FEC_REQUIRED 3455cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t num_uuid; 3456cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t data_type; 3457cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t local_name_len; 34585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3459cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* wait until complete to disable */ 3460cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (alarm_is_scheduled(bta_dm_cb.disable_timer)) return; 34615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3462e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_EIR_CANNED_UUID_LIST != TRUE) 3463cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if local name is not provided, get it from controller */ 3464cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (local_name == NULL) { 3465cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTM_ReadLocalDeviceName(&local_name) != BTM_SUCCESS) { 3466cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_ERROR("Fail to read local device name for EIR"); 34675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3468cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 34691e61ce1ae3fe8ef72443b30907f1cf8acae39674Chris Manton#endif // BTA_EIR_CANNED_UUID_LIST 34705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3471cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Allocate a buffer to hold HCI command */ 3472cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_HDR* p_buf = (BT_HDR*)osi_malloc(BTM_CMD_BUF_SIZE); 3473cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p = (uint8_t*)p_buf + BTM_HCI_EIR_OFFSET; 34745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3475cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(p, 0x00, HCI_EXT_INQ_RESPONSE_LEN); 34765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3477cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("BTA is generating EIR"); 34785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3479cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (local_name) 3480cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson local_name_len = strlen(local_name); 3481cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else 3482cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson local_name_len = 0; 3483cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3484cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson data_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE; 3485cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if local name is longer than minimum length of shortened name */ 3486cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* check whether it needs to be shortened or not */ 3487cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (local_name_len > p_bta_dm_eir_cfg->bta_dm_eir_min_name_len) { 3488cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson/* get number of UUID 16-bit list */ 34895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_EIR_CANNED_UUID_LIST == TRUE) 3490cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len / LEN_UUID_16; 3491cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#else // BTA_EIR_CANNED_UUID_LIST 3492cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson max_num_uuid = (free_eir_length - 2) / LEN_UUID_16; 3493cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson data_type = BTM_GetEirSupportedServices(bta_dm_cb.eir_uuid, &p, 3494cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson max_num_uuid, &num_uuid); 3495cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p = (uint8_t*)p_buf + BTM_HCI_EIR_OFFSET; /* reset p */ 34961e61ce1ae3fe8ef72443b30907f1cf8acae39674Chris Manton#endif // BTA_EIR_CANNED_UUID_LIST 34975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3498cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if UUID doesn't fit remaing space, shorten local name */ 3499cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (local_name_len > (free_eir_length - 4 - num_uuid * LEN_UUID_16)) { 3500cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson local_name_len = find_utf8_char_boundary( 3501cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson local_name, p_bta_dm_eir_cfg->bta_dm_eir_min_name_len); 3502cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_WARNING("%s local name is shortened (%d)", __func__, 3503cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson local_name_len); 3504cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson data_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE; 3505cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 3506cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson data_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE; 35075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3508cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 35095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3510cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UINT8_TO_STREAM(p, local_name_len + 1); 3511cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UINT8_TO_STREAM(p, data_type); 35123aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 3513cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (local_name != NULL) { 3514cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(p, local_name, local_name_len); 3515cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p += local_name_len; 3516cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3517cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson free_eir_length -= local_name_len + 2; 35185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_EIR_CANNED_UUID_LIST == TRUE) 3520cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if UUID list is provided as static data in configuration */ 3521cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len > 0) && 3522cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_bta_dm_eir_cfg->bta_dm_eir_uuid16)) { 3523cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (free_eir_length > LEN_UUID_16 + 2) { 3524cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson free_eir_length -= 2; 3525cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3526cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len) { 3527cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len / LEN_UUID_16; 3528cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson data_type = BTM_EIR_COMPLETE_16BITS_UUID_TYPE; 3529cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else /* not enough room for all UUIDs */ 3530cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson { 3531cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated"); 3532cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson num_uuid = free_eir_length / LEN_UUID_16; 3533cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson data_type = BTM_EIR_MORE_16BITS_UUID_TYPE; 3534cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3535cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UINT8_TO_STREAM(p, num_uuid * LEN_UUID_16 + 1); 3536cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UINT8_TO_STREAM(p, data_type); 3537cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_uuid16, num_uuid * LEN_UUID_16); 3538cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p += num_uuid * LEN_UUID_16; 3539cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson free_eir_length -= num_uuid * LEN_UUID_16; 35405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3541cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3542d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#else /* (BTA_EIR_CANNED_UUID_LIST == TRUE) */ 3543cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if UUID list is dynamic */ 3544cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (free_eir_length >= 2) { 3545cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_length = p++; 3546cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_type = p++; 3547cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson num_uuid = 0; 35485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3549cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson max_num_uuid = (free_eir_length - 2) / LEN_UUID_16; 3550cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson data_type = BTM_GetEirSupportedServices(bta_dm_cb.eir_uuid, &p, 3551cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson max_num_uuid, &num_uuid); 35525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3553cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (data_type == BTM_EIR_MORE_16BITS_UUID_TYPE) { 3554cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated"); 3555cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 35565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) 3557cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else { 3558cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (custom_uuid_idx = 0; 3559cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; 3560cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson custom_uuid_idx++) { 3561cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_16) { 3562cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (num_uuid < max_num_uuid) { 3563cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UINT16_TO_STREAM(p, 3564cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid16); 3565cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson num_uuid++; 3566cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 3567cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson data_type = BTM_EIR_MORE_16BITS_UUID_TYPE; 3568cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated"); 3569cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 3570cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 35715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3572cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3573cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 35745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) */ 35755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3576cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_16 + 1); 3577cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UINT8_TO_STREAM(p_type, data_type); 3578cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson free_eir_length -= num_uuid * LEN_UUID_16 + 2; 3579cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3580d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#endif /* (BTA_EIR_CANNED_UUID_LIST == TRUE) */ 35815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3582e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_EIR_CANNED_UUID_LIST != TRUE && BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) 3583cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Adding 32-bit UUID list */ 3584cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (free_eir_length >= 2) { 3585cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_length = p++; 3586cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_type = p++; 3587cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson num_uuid = 0; 3588cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson data_type = BTM_EIR_COMPLETE_32BITS_UUID_TYPE; 3589cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3590cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson max_num_uuid = (free_eir_length - 2) / LEN_UUID_32; 3591cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3592cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; 3593cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson custom_uuid_idx++) { 3594cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_32) { 3595cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (num_uuid < max_num_uuid) { 3596cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UINT32_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid32); 3597cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson num_uuid++; 3598cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 3599cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson data_type = BTM_EIR_MORE_32BITS_UUID_TYPE; 3600cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_WARNING("BTA EIR: UUID 32-bit list is truncated"); 3601cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 36025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3603cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 36045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3606cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_32 + 1); 3607cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UINT8_TO_STREAM(p_type, data_type); 3608cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson free_eir_length -= num_uuid * LEN_UUID_32 + 2; 3609cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 36105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3611cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Adding 128-bit UUID list */ 3612cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (free_eir_length >= 2) { 3613cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_length = p++; 3614cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_type = p++; 3615cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson num_uuid = 0; 3616cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson data_type = BTM_EIR_COMPLETE_128BITS_UUID_TYPE; 36175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3618cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson max_num_uuid = (free_eir_length - 2) / LEN_UUID_128; 36195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3620cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; 3621cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson custom_uuid_idx++) { 3622cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_128) { 3623cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (num_uuid < max_num_uuid) { 3624cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ARRAY16_TO_STREAM(p, 3625cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid128); 3626cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson num_uuid++; 3627cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 3628cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson data_type = BTM_EIR_MORE_128BITS_UUID_TYPE; 3629cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_WARNING("BTA EIR: UUID 128-bit list is truncated"); 3630cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 3631cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3632cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3633ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 3634ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 3635cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_128 + 1); 3636cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UINT8_TO_STREAM(p_type, data_type); 3637cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson free_eir_length -= num_uuid * LEN_UUID_128 + 2; 3638cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3639cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#endif /* ( BTA_EIR_CANNED_UUID_LIST != TRUE \ 3640cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) */ 3641cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3642cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if Flags are provided in configuration */ 3643cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((p_bta_dm_eir_cfg->bta_dm_eir_flag_len > 0) && 3644cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_bta_dm_eir_cfg->bta_dm_eir_flags) && 3645cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 2)) { 3646cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 1); 3647cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UINT8_TO_STREAM(p, BTM_EIR_FLAGS_TYPE); 3648cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_flags, 3649cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_bta_dm_eir_cfg->bta_dm_eir_flag_len); 3650cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p += p_bta_dm_eir_cfg->bta_dm_eir_flag_len; 3651cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 2; 3652cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3653cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3654cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if Manufacturer Specific are provided in configuration */ 3655cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len > 0) && 3656cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec) && 3657cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2)) { 3658cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_length = p; 3659cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3660cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 1); 3661cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UINT8_TO_STREAM(p, BTM_EIR_MANUFACTURER_SPECIFIC_TYPE); 3662cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec, 3663cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len); 3664cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p += p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len; 3665cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2; 3666cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3667cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 3668cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_length = NULL; 3669cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3670cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3671cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if Inquiry Tx Resp Power compiled */ 3672cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power) && (free_eir_length >= 3)) { 3673cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UINT8_TO_STREAM(p, 2); /* Length field */ 3674cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UINT8_TO_STREAM(p, BTM_EIR_TX_POWER_LEVEL_TYPE); 3675cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UINT8_TO_STREAM(p, *(p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power)); 3676cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson free_eir_length -= 3; 3677cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3678cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3679cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (free_eir_length) 3680cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UINT8_TO_STREAM(p, 0); /* terminator of significant part */ 3681cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3682cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_WriteEIR(p_buf); 36835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 36845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 36868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 36878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_eir_search_services 36888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 36898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This function searches services in received EIR 36908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 36918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns None 36928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 36938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 3694cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_eir_search_services(tBTM_INQ_RESULTS* p_result, 3695cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_SERVICE_MASK* p_services_to_search, 3696cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_SERVICE_MASK* p_services_found) { 3697cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_SERVICE_MASK service_index = 0; 3698cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_EIR_SEARCH_RESULT result; 36995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3700cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG( 3701cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "BTA searching services in EIR of BDA:0x%02X%02X%02X%02X%02X%02X", 3702cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_result->remote_bd_addr[0], p_result->remote_bd_addr[1], 3703cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_result->remote_bd_addr[2], p_result->remote_bd_addr[3], 3704cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_result->remote_bd_addr[4], p_result->remote_bd_addr[5]); 37055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3706cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG(" with services_to_search=0x%08X", *p_services_to_search); 37075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3708cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* always do GATT based service discovery by SDP instead of from EIR */ 3709cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if GATT based service is also to be put in EIR, need to modify this */ 37109979121f0865e07432215529f9b157792ae3ef21Myles Watson while (service_index < (BTA_MAX_SERVICE_ID - 1)) { 3711cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (*p_services_to_search & 3712cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index))) { 3713cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result = BTM_HasInquiryEirService( 3714cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_result, bta_service_id_to_uuid_lkup_tbl[service_index]); 3715cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3716cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Searching for HSP v1.2 only device */ 3717cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((result != BTM_EIR_FOUND) && 3718cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (bta_service_id_to_uuid_lkup_tbl[service_index] == 3719cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_HEADSET)) { 3720cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result = BTM_HasInquiryEirService(p_result, UUID_SERVCLASS_HEADSET_HS); 3721cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 37225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3723cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (result == BTM_EIR_FOUND) { 3724cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* If Plug and Play service record, need to check to see if Broadcom 3725cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * stack */ 3726cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* However, EIR data doesn't have EXT_BRCM_VERSION so just skip it */ 3727cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_service_id_to_uuid_lkup_tbl[service_index] != 3728cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UUID_SERVCLASS_PNP_INFORMATION) { 3729cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *p_services_found |= (tBTA_SERVICE_MASK)( 3730cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)); 3731cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* remove the service from services to be searched */ 3732cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *p_services_to_search &= (tBTA_SERVICE_MASK)( 3733cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index))); 37345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3735cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else if (result == BTM_EIR_NOT_FOUND) { 3736cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* remove the service from services to be searched */ 3737cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *p_services_to_search &= (tBTA_SERVICE_MASK)( 3738cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index))); 3739cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 37405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3742cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson service_index++; 3743cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3744cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3745cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_ERROR( 3746cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "BTA EIR search result, services_to_search=0x%08X, services_found=0x%08X", 3747cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson *p_services_to_search, *p_services_found); 37485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 37495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37501e61ce1ae3fe8ef72443b30907f1cf8acae39674Chris Manton#if (BTA_EIR_CANNED_UUID_LIST != TRUE) 37515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 37528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 37538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_eir_update_uuid 37548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 37558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This function adds or removes service UUID in EIR database. 37568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 37578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns None 37588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 37598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 3760cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_eir_update_uuid(uint16_t uuid16, bool adding) { 3761cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if this UUID is not advertised in EIR */ 3762cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!BTM_HasEirService(p_bta_dm_eir_cfg->uuid_mask, uuid16)) return; 37635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3764cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (adding) { 3765cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_EVENT("Adding UUID=0x%04X into EIR", uuid16); 37665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3767cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_AddEirService(bta_dm_cb.eir_uuid, uuid16); 3768cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 3769cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_EVENT("Removing UUID=0x%04X from EIR", uuid16); 37705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3771cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_RemoveEirService(bta_dm_cb.eir_uuid, uuid16); 3772cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 37735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3774cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_set_eir(NULL); 37755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3776cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_EVENT("bta_dm_eir_update_uuid UUID bit mask=0x%08X %08X", 3777cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.eir_uuid[1], bta_dm_cb.eir_uuid[0]); 37785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 37795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 37805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 37828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 37838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_enable_test_mode 37848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 37858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description enable test mode 37868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 37878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 37888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 37898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 37908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 3791cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_enable_test_mode(UNUSED_ATTR tBTA_DM_MSG* p_data) { 3792cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_EnableTestMode(); 37935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 37945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 37968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 37978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_disable_test_mode 37988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 37998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description disable test mode 38008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 38018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 38028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 38038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 38048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 3805cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_disable_test_mode(UNUSED_ATTR tBTA_DM_MSG* p_data) { 3806cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_DeviceReset(NULL); 38075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 38085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 38108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 38118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_execute_callback 38128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3813cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description Just execute a generic call back in the context of the 38141baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * BTU/BTA tack 38158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 38168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 38178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 38188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 38198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 3820cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_execute_callback(tBTA_DM_MSG* p_data) { 3821cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* sanity check */ 3822cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->exec_cback.p_exec_cback == NULL) { 3823cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 3824cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 38255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3826cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->exec_cback.p_exec_cback(p_data->exec_cback.p_param); 38275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 382876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan 38295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 38308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 38318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_encrypt_cback 38328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 38338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description link encryption complete callback. 38348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 38358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns None 38368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 38378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 3838d35a648d39710bbc5ac59f8add85166455af5af7Myles Watsonvoid bta_dm_encrypt_cback(BD_ADDR bd_addr, tBT_TRANSPORT transport, 3839cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson UNUSED_ATTR void* p_ref_data, tBTM_STATUS result) { 3840cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_STATUS bta_status = BTA_SUCCESS; 3841cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_ENCRYPT_CBACK* p_callback = NULL; 3842cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t i; 3843cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3844cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (i = 0; i < bta_dm_cb.device_list.count; i++) { 3845cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bdcmp(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, bd_addr) == 0 && 3846cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED) 3847cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 3848cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3849cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3850cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (i < bta_dm_cb.device_list.count) { 3851cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_callback = bta_dm_cb.device_list.peer_device[i].p_encrypt_cback; 3852cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[i].p_encrypt_cback = NULL; 3853cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3854cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3855cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson switch (result) { 3856cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTM_SUCCESS: 3857cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 3858cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTM_WRONG_MODE: 3859cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_status = BTA_WRONG_MODE; 3860cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 3861cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTM_NO_RESOURCES: 3862cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_status = BTA_NO_RESOURCES; 3863cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 3864cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTM_BUSY: 3865cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_status = BTA_BUSY; 3866cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 3867cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson default: 3868cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_status = BTA_FAILURE; 3869cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 3870cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 38715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3872cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("bta_dm_encrypt_cback status =%d p_callback=0x%x", 3873cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_status, p_callback); 38745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3875cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_callback) { 3876cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (*p_callback)(bd_addr, transport, bta_status); 3877cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 38785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 387976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan 38805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 38818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 38828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_set_encryption 38838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 38848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This function to encrypt the link 38858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 38868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns None 38878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 38888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 3889cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_set_encryption(tBTA_DM_MSG* p_data) { 3890cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t i; 38915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3892cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("bta_dm_set_encryption"); // todo 3893cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!p_data->set_encryption.p_callback) { 3894cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_ERROR("bta_dm_set_encryption callback is not provided"); 3895cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 3896cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3897cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (i = 0; i < bta_dm_cb.device_list.count; i++) { 3898cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bdcmp(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, 3899cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->set_encryption.bd_addr) == 0 && 3900cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED) 3901cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 3902cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3903cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (i < bta_dm_cb.device_list.count) { 3904cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.device_list.peer_device[i].p_encrypt_cback) { 3905cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_ERROR("earlier enc was not done for same device"); 3906cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (*p_data->set_encryption.p_callback)(p_data->set_encryption.bd_addr, 3907cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->set_encryption.transport, 3908cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_BUSY); 3909cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 3910cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3911cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3912cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTM_SetEncryption(p_data->set_encryption.bd_addr, 3913cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->set_encryption.transport, 3914cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_encrypt_cback, NULL, 3915cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->set_encryption.sec_act) == BTM_CMD_STARTED) { 3916cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.device_list.peer_device[i].p_encrypt_cback = 3917cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->set_encryption.p_callback; 3918cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3919cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 39205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 39215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39228843cc830b522cfe6f1e361297fc28fd331a1378Hemant Guptabool bta_dm_check_if_only_hd_connected(BD_ADDR peer_addr) { 39238843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta APPL_TRACE_DEBUG("%s: count(%d)", __func__, bta_dm_conn_srvcs.count); 39248843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta 39258843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta for (uint8_t j = 0; j < bta_dm_conn_srvcs.count; j++) { 39268843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta // Check if profiles other than hid are connected 39278843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta if ((bta_dm_conn_srvcs.conn_srvc[j].id != BTA_ID_HD) && 39288843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta !bdcmp(bta_dm_conn_srvcs.conn_srvc[j].peer_bdaddr, peer_addr)) { 39298843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta APPL_TRACE_DEBUG("%s: Another profile (id=%d) is connected", __func__, 39308843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta bta_dm_conn_srvcs.conn_srvc[j].id); 3931a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He return false; 39328843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta } 39338843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta } 39348843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta 3935a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He return true; 39368843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta} 39378843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta 3938ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 39398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 39408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_observe_results_cb 39418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 39428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Callback for BLE Observe result 39438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 39448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 39458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 39468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 39478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 39480595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowskistatic void bta_dm_observe_results_cb(tBTM_INQ_RESULTS* p_inq, uint8_t* p_eir, 3949f7100bb0e57ed289833c353ba06028345f9f39b6Jakub Pawlowski uint16_t eir_len) { 3950cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEARCH result; 3951cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_INQ_INFO* p_inq_info; 39520595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowski APPL_TRACE_DEBUG("bta_dm_observe_results_cb"); 3953cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3954cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(result.inq_res.bd_addr, p_inq->remote_bd_addr); 3955cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result.inq_res.rssi = p_inq->rssi; 3956cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result.inq_res.ble_addr_type = p_inq->ble_addr_type; 3957cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result.inq_res.inq_result_type = p_inq->inq_result_type; 3958cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result.inq_res.device_type = p_inq->device_type; 3959cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result.inq_res.flag = p_inq->flag; 39607de0f9b78fb38fcb02cbcd3c1c7c005947b9e291Jakub Pawlowski result.inq_res.ble_evt_type = p_inq->ble_evt_type; 39617de0f9b78fb38fcb02cbcd3c1c7c005947b9e291Jakub Pawlowski result.inq_res.ble_primary_phy = p_inq->ble_primary_phy; 39627de0f9b78fb38fcb02cbcd3c1c7c005947b9e291Jakub Pawlowski result.inq_res.ble_secondary_phy = p_inq->ble_secondary_phy; 39637de0f9b78fb38fcb02cbcd3c1c7c005947b9e291Jakub Pawlowski result.inq_res.ble_advertising_sid = p_inq->ble_advertising_sid; 39647de0f9b78fb38fcb02cbcd3c1c7c005947b9e291Jakub Pawlowski result.inq_res.ble_tx_power = p_inq->ble_tx_power; 39657de0f9b78fb38fcb02cbcd3c1c7c005947b9e291Jakub Pawlowski result.inq_res.ble_periodic_adv_int = p_inq->ble_periodic_adv_int; 3966cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3967cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* application will parse EIR to find out remote device name */ 3968cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result.inq_res.p_eir = p_eir; 39690595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowski result.inq_res.eir_len = eir_len; 3970cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3971f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr); 3972f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_inq_info != NULL) { 3973cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* initialize remt_name_not_required to false so that we get the name by 3974cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * default */ 3975cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result.inq_res.remt_name_not_required = false; 3976cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3977cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3978cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.p_scan_cback) 3979cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_RES_EVT, &result); 3980cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 3981cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_inq_info) { 3982cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* application indicates if it knows the remote name, inside the callback 3983cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson copy that to the inquiry data base*/ 3984cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (result.inq_res.remt_name_not_required) 3985cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_inq_info->appl_knows_rem_name = true; 3986cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3987ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 3988ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 3989ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 39908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 39918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_observe_cmpl_cb 39928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 39938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Callback for BLE Observe complete 39948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 39958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 39968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 39978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 39988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 3999cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_observe_cmpl_cb(void* p_result) { 4000cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEARCH data; 4001ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 4002cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("bta_dm_observe_cmpl_cb"); 4003ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 4004cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson data.inq_cmpl.num_resps = ((tBTM_INQUIRY_CMPL*)p_result)->num_resp; 4005cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.p_scan_cback) { 4006cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_CMPL_EVT, &data); 4007cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 4008ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 4009ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 40105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 40118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 40128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_ble_smp_cback 40138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 40148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Callback for BLE SMP 40158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 40168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 40178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 40188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 40198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4020cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic uint8_t bta_dm_ble_smp_cback(tBTM_LE_EVT event, BD_ADDR bda, 4021cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_LE_EVT_DATA* p_data) { 4022cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_STATUS status = BTM_SUCCESS; 4023cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEC sec_event; 4024cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson char* p_name = NULL; 40255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4026cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!bta_dm_cb.p_sec_cback) return BTM_NOT_AUTHORIZED; 40275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4028cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(&sec_event, 0, sizeof(tBTA_DM_SEC)); 4029cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson switch (event) { 4030cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTM_LE_IO_REQ_EVT: 40315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 40325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4033cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_co_ble_io_req( 4034cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bda, &p_data->io_req.io_cap, &p_data->io_req.oob_data, 4035cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson &p_data->io_req.auth_req, &p_data->io_req.max_key_size, 4036cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson &p_data->io_req.init_keys, &p_data->io_req.resp_keys); 40375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4038cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_EVENT("io mitm: %d oob_data:%d", p_data->io_req.auth_req, 4039cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->io_req.oob_data); 4040cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4041cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 4042cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4043cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTM_LE_SEC_REQUEST_EVT: 4044cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(sec_event.ble_req.bd_addr, bda); 4045cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_name = BTM_SecReadDevName(bda); 4046cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_name != NULL) 4047cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson strlcpy((char*)sec_event.ble_req.bd_name, p_name, BD_NAME_LEN); 4048cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else 4049cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.ble_req.bd_name[0] = 0; 4050cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_BLE_SEC_REQ_EVT, &sec_event); 4051cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 4052cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4053cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTM_LE_KEY_NOTIF_EVT: 4054cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(sec_event.key_notif.bd_addr, bda); 4055cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_name = BTM_SecReadDevName(bda); 4056cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_name != NULL) 4057cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson strlcpy((char*)sec_event.key_notif.bd_name, p_name, BD_NAME_LEN); 4058cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else 4059cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.key_notif.bd_name[0] = 0; 4060cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.key_notif.passkey = p_data->key_notif; 4061cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_NOTIF_EVT, &sec_event); 4062cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 4063cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4064cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTM_LE_KEY_REQ_EVT: 4065cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(sec_event.ble_req.bd_addr, bda); 4066cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_REQ_EVT, &sec_event); 4067cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 4068cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4069cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTM_LE_OOB_REQ_EVT: 4070cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(sec_event.ble_req.bd_addr, bda); 4071cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_BLE_OOB_REQ_EVT, &sec_event); 4072cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 4073cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4074cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTM_LE_NC_REQ_EVT: 4075cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(sec_event.key_notif.bd_addr, bda); 4076cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson strlcpy((char*)sec_event.key_notif.bd_name, bta_dm_get_remname(), 4077cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (BD_NAME_LEN)); 4078cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.key_notif.passkey = p_data->key_notif; 4079cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_BLE_NC_REQ_EVT, &sec_event); 4080cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 4081cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4082cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTM_LE_SC_OOB_REQ_EVT: 4083cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(sec_event.ble_req.bd_addr, bda); 4084cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_BLE_SC_OOB_REQ_EVT, &sec_event); 4085cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 4086cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4087cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTM_LE_KEY_EVT: 4088cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(sec_event.ble_key.bd_addr, bda); 4089cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.ble_key.key_type = p_data->key.key_type; 4090cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.ble_key.p_key_value = p_data->key.p_key_value; 4091cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_BLE_KEY_EVT, &sec_event); 4092cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 4093cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4094cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTM_LE_COMPLT_EVT: 4095cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(sec_event.auth_cmpl.bd_addr, bda); 4096cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_ReadDevInfo(bda, &sec_event.auth_cmpl.dev_type, 4097cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson &sec_event.auth_cmpl.addr_type); 4098cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_name = BTM_SecReadDevName(bda); 4099cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_name != NULL) 4100cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson strlcpy((char*)sec_event.auth_cmpl.bd_name, p_name, (BD_NAME_LEN)); 4101cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else 4102cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.auth_cmpl.bd_name[0] = 0; 4103cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4104cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->complt.reason != 0) { 4105cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.auth_cmpl.fail_reason = 4106cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_DM_AUTH_CONVERT_SMP_CODE(((uint8_t)p_data->complt.reason)); 4107cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* delete this device entry from Sec Dev DB */ 4108cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_remove_sec_dev_entry(bda); 4109cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 4110cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec_event.auth_cmpl.success = true; 4111cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 4112444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4113cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.p_sec_cback) { 4114cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson // bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event); 4115cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_BLE_AUTH_CMPL_EVT, &sec_event); 4116cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 4117cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 41185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4119cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson default: 4120cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status = BTM_NOT_AUTHORIZED; 4121cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 4122cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 4123cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return status; 41245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 41255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 41278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 41288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_ble_id_key_cback 41298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 41308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Callback for BLE local ID keys 41318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 41328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 41338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 41348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 41358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4136cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_ble_id_key_cback(uint8_t key_type, 4137cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_BLE_LOCAL_KEYS* p_key) { 4138cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t evt; 4139cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEC dm_key; 4140cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4141cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson switch (key_type) { 4142cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTM_BLE_KEY_TYPE_ID: 4143cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTM_BLE_KEY_TYPE_ER: 4144cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.p_sec_cback) { 4145cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(&dm_key.ble_id_keys, p_key, sizeof(tBTM_BLE_LOCAL_KEYS)); 4146cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4147cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson evt = (key_type == BTM_BLE_KEY_TYPE_ID) ? BTA_DM_BLE_LOCAL_IR_EVT 4148cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson : BTA_DM_BLE_LOCAL_ER_EVT; 4149cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(evt, &dm_key); 4150cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 4151cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 41525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4153cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson default: 4154cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("Unknown key type %d", key_type); 4155cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 4156cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 4157cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 41585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 41595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 41618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 41628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_add_blekey 41638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 41648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This function adds an BLE Key to an security database entry. 4165cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * This function shall only be called AFTER BTA_DmAddBleDevice 41661baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * has been called. 4167cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * It is normally called during host startup to restore all 41681baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * required information stored in the NVRAM. 41698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 41708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters: 41718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 41728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4173cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_add_blekey(tBTA_DM_MSG* p_data) { 4174cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!BTM_SecAddBleKey(p_data->add_ble_key.bd_addr, 4175cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTM_LE_KEY_VALUE*)&p_data->add_ble_key.blekey, 4176cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->add_ble_key.key_type)) { 4177cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_ERROR( 4178cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "BTA_DM: Error adding BLE Key for device %08x%04x", 4179cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_data->add_ble_key.bd_addr[0] << 24) + 4180cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_data->add_ble_key.bd_addr[1] << 16) + 4181cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_data->add_ble_key.bd_addr[2] << 8) + 4182cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->add_ble_key.bd_addr[3], 4183cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_data->add_ble_key.bd_addr[4] << 8) + p_data->add_ble_key.bd_addr[5]); 4184cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 41855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 41865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 41888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 41898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_add_ble_device 41908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4191cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description This function adds an BLE device to an security database 41921baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * entry. 4193cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * It is normally called during host startup to restore all 41941baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * required information stored in the NVRAM. 41958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 41968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters: 41978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 41988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4199cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_add_ble_device(tBTA_DM_MSG* p_data) { 4200cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!BTM_SecAddBleDevice(p_data->add_ble_device.bd_addr, NULL, 4201cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->add_ble_device.dev_type, 4202cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->add_ble_device.addr_type)) { 4203cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_ERROR("BTA_DM: Error adding BLE Device for device %08x%04x", 4204cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_data->add_ble_device.bd_addr[0] << 24) + 4205cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_data->add_ble_device.bd_addr[1] << 16) + 4206cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_data->add_ble_device.bd_addr[2] << 8) + 4207cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->add_ble_device.bd_addr[3], 4208cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (p_data->add_ble_device.bd_addr[4] << 8) + 4209cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->add_ble_device.bd_addr[5]); 4210cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 42115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 42125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 42148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 42158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_add_ble_device 42168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4217cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description This function adds an BLE device to an security database 42181baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * entry. 4219cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * It is normally called during host startup to restore all 42201baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * required information stored in the NVRAM. 42218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 42228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters: 42238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 42248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4225cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_ble_passkey_reply(tBTA_DM_MSG* p_data) { 4226cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->pin_reply.accept) { 4227cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_SUCCESS, 4228cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->ble_passkey_reply.passkey); 4229cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 4230cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_NOT_AUTHORIZED, 4231cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->ble_passkey_reply.passkey); 4232cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 42335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 42345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 42368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 42378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_ble_confirm_reply 42388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 42398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This is response to SM numeric comparison request submitted 42408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * to application. 42418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 42428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters: 42438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 42448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4245cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_ble_confirm_reply(tBTA_DM_MSG* p_data) { 4246cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->confirm.accept) { 4247cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_BleConfirmReply(p_data->confirm.bd_addr, BTM_SUCCESS); 4248cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 4249cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_BleConfirmReply(p_data->ble_passkey_reply.bd_addr, BTM_NOT_AUTHORIZED); 4250cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 4251444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 4252444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4253444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 42548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 42558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_security_grant 42568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 42578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This function grant SMP security request access. 42588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 42598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters: 42608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 42618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4262cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_security_grant(tBTA_DM_MSG* p_data) { 4263cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SecurityGrant(p_data->ble_sec_grant.bd_addr, p_data->ble_sec_grant.res); 42645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 42655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 42678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 42688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_ble_set_bg_conn_type 42698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 42708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This function set the BLE background connection type 42718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 42728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters: 42738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 42748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4275cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_ble_set_bg_conn_type(tBTA_DM_MSG* p_data) { 427683211b0ccceb53586ac651a4d67ded7443b2f222Jakub Pawlowski BTM_BleStartAutoConn(); 42775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 42785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 42808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 42818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_ble_set_conn_params 42828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 42838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This function set the preferred connection parameters. 42848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 42858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters: 42868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 42878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4288cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_ble_set_conn_params(tBTA_DM_MSG* p_data) { 4289cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_BleSetPrefConnParams(p_data->ble_set_conn_params.peer_bda, 4290cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->ble_set_conn_params.conn_int_min, 4291cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->ble_set_conn_params.conn_int_max, 4292cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->ble_set_conn_params.slave_latency, 4293cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->ble_set_conn_params.supervision_tout); 42945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 42955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 42978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 42988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_ble_set_conn_scan_params 42998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This function set the preferred connection scan parameters. 43018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters: 43038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4305cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_ble_set_conn_scan_params(tBTA_DM_MSG* p_data) { 4306cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_BleSetConnScanParams(p_data->ble_set_conn_scan_params.scan_int, 4307cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->ble_set_conn_scan_params.scan_window); 43085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 43097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 43108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_ble_update_conn_params 43128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This function update LE connection parameters. 43148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters: 43168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4318cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_ble_update_conn_params(tBTA_DM_MSG* p_data) { 4319cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!L2CA_UpdateBleConnParams(p_data->ble_update_conn_params.bd_addr, 4320cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->ble_update_conn_params.min_int, 4321cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->ble_update_conn_params.max_int, 4322cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->ble_update_conn_params.latency, 4323cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->ble_update_conn_params.timeout)) { 4324cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_ERROR("Update connection parameters failed!"); 4325cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 43267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 43275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4328e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BLE_PRIVACY_SPT == TRUE) 43297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 43308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_ble_config_local_privacy 43328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This function set the local device LE privacy settings. 43348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters: 43368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4338cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_ble_config_local_privacy(tBTA_DM_MSG* p_data) { 4339cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_BleConfigPrivacy(p_data->ble_local_privacy.privacy_enable); 43407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 43417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 434276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan 4343ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 43448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_ble_observe 43468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This function set the preferred connection scan parameters. 43488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters: 43508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4352cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_ble_observe(tBTA_DM_MSG* p_data) { 4353cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_STATUS status; 4354cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->ble_observe.start) { 4355cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /*Save the callback to be called when a scan results are available */ 4356cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_scan_cback = p_data->ble_observe.p_cback; 4357f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen status = BTM_BleObserve(true, p_data->ble_observe.duration, 4358f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen bta_dm_observe_results_cb, bta_dm_observe_cmpl_cb); 4359f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (status != BTM_CMD_STARTED) { 4360cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEARCH data; 4361cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_WARNING(" %s BTM_BleObserve failed. status %d", __func__, 4362cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status); 4363cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson data.inq_cmpl.num_resps = 0; 4364cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.p_scan_cback) { 4365cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_CMPL_EVT, &data); 4366cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 4367ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 4368cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 4369cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_scan_cback = NULL; 4370cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_BleObserve(false, 0, NULL, NULL); 4371cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 4372ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 43735c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach/******************************************************************************* 43748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_ble_set_adv_params 43768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This function set the adv parameters. 43788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters: 43808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4382cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_ble_set_adv_params(uint16_t adv_int_min, uint16_t adv_int_max, 4383cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBLE_BD_ADDR* p_dir_bda) { 4384cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_BleSetAdvParams(adv_int_min, adv_int_max, p_dir_bda, 4385cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_DM_BLE_ADV_CHNL_MAP); 43865c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach} 4387eeeac99328c23304ab24698331b6600f3b545700Andre Eisenbach 43885c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach/******************************************************************************* 43898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_ble_set_data_length 43918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This function set the maximum transmission packet size 43938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters 43958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 43968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4397cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_ble_set_data_length(tBTA_DM_MSG* p_data) { 4398cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTM_SetBleDataLength(p_data->ble_set_data_length.remote_bda, 4399cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->ble_set_data_length.tx_data_length) != 4400cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SUCCESS) { 4401cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_ERROR("%s failed", __func__); 4402cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 4403636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera} 4404636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 4405636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera/******************************************************************************* 44068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 44078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_ble_enable_scan_cmpl 44088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 44098af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description ADV payload filtering enable / disable complete callback 44108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 44118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 44128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns None 44138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 44148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 441516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadhamstatic void bta_ble_energy_info_cmpl(tBTM_BLE_TX_TIME_MS tx_time, 4416cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_BLE_RX_TIME_MS rx_time, 4417cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_BLE_IDLE_TIME_MS idle_time, 4418cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_BLE_ENERGY_USED energy_used, 4419cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_STATUS status) { 4420cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS : BTA_FAILURE; 4421cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_CONTRL_STATE ctrl_state = 0; 4422cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4423cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTA_SUCCESS == st) ctrl_state = bta_dm_pm_obtain_controller_state(); 4424cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4425cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.p_energy_info_cback) 4426cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_energy_info_cback(tx_time, rx_time, idle_time, energy_used, 4427cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ctrl_state, st); 442816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham} 442916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham 443016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham/******************************************************************************* 44318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 44328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_ble_get_energy_info 44338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 44348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This function obtains the energy info 44358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 44368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters: 44378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 44388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4439cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_ble_get_energy_info(tBTA_DM_MSG* p_data) { 4440cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTM_STATUS btm_status = 0; 4441cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4442cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_energy_info_cback = p_data->ble_energy_info.p_energy_info_cback; 4443cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson btm_status = BTM_BleGetEnergyInfo(bta_ble_energy_info_cmpl); 4444cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (BTM_CMD_STARTED != btm_status) 4445cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_ble_energy_info_cmpl(0, 0, 0, 0, btm_status); 444616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham} 444716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham 44486975b4d711142b885af479721cada448952c6b41Andre Eisenbach#ifndef BTA_DM_GATT_CLOSE_DELAY_TOUT 4449cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#define BTA_DM_GATT_CLOSE_DELAY_TOUT 1000 44506975b4d711142b885af479721cada448952c6b41Andre Eisenbach#endif 44515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 44538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 44548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_gattc_register 44558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 44568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Register with GATTC in DM if BLE is needed. 44578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 44588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 44598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 44608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 44618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4462cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_gattc_register(void) { 4463cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.client_if == BTA_GATTS_INVALID_IF) { 4464221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski BTA_GATTC_AppRegister(bta_dm_gattc_callback, 4465221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski base::Bind([](uint8_t client_id, uint8_t status) { 4466221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski if (status == BTA_GATT_OK) 4467221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski bta_dm_search_cb.client_if = client_id; 4468221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski else 4469221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski bta_dm_search_cb.client_if = BTA_GATTS_INVALID_IF; 4470221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski 4471221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski })); 4472cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 4473e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach} 4474e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach 4475e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach/******************************************************************************* 44768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 44778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function btm_dm_start_disc_gatt_services 44788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 44798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This function starts a GATT service search request. 44808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 44818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters: 44828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 44838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4484cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void btm_dm_start_disc_gatt_services(uint16_t conn_id) { 4485cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBT_UUID* p_uuid = bta_dm_search_cb.p_srvc_uuid + bta_dm_search_cb.num_uuid - 4486cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.uuid_to_search; 44875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4488cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_uuid = bta_dm_search_cb.p_srvc_uuid + bta_dm_search_cb.num_uuid - 4489cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.uuid_to_search; 44905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4491cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* always search for all services */ 4492cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_GATTC_ServiceSearchRequest(conn_id, p_uuid); 44935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 44945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 44968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 44978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_gatt_disc_result 44988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 44998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This function process the GATT service search result. 45008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 45018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters: 45028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 45038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4504cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_gatt_disc_result(tBTA_GATT_ID service_id) { 4505cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_SEARCH result; 4506cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4507cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* 45084f484079fd27effce2675ed38f3cdf88da42ab04Andre Eisenbach * This logic will not work for gatt case. We are checking against the 4509cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * bluetooth profiles here 45104f484079fd27effce2675ed38f3cdf88da42ab04Andre Eisenbach * just copy the GATTID in raw data field and send it across. 45114f484079fd27effce2675ed38f3cdf88da42ab04Andre Eisenbach */ 4512cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4513cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.ble_raw_used + sizeof(tBTA_GATT_ID) < 4514cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.ble_raw_size) { 4515cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG( 4516cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "ADDING BLE SERVICE uuid=0x%x, ble_ptr = 0x%x, ble_raw_used = 0x%x", 4517cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson service_id.uuid.uu.uuid16, bta_dm_search_cb.p_ble_rawdata, 4518cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.ble_raw_used); 4519cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4520cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.p_ble_rawdata) { 4521cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy((bta_dm_search_cb.p_ble_rawdata + bta_dm_search_cb.ble_raw_used), 4522cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson &service_id, sizeof(service_id)); 4523cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4524cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.ble_raw_used += sizeof(service_id); 4525cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 4526cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_ERROR("p_ble_rawdata is NULL"); 4527cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 4528cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4529cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 4530cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_ERROR( 4531cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "%s out of room to accomodate more service ids ble_raw_size = %d " 4532cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "ble_raw_used = %d", 4533cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson __func__, bta_dm_search_cb.ble_raw_size, bta_dm_search_cb.ble_raw_used); 4534cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 4535cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4536cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson LOG_INFO(LOG_TAG, "%s service_id_uuid_len=%d ", __func__, 4537cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson service_id.uuid.len); 4538cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) { 4539cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* send result back to app now, one by one */ 4540cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(result.disc_ble_res.bd_addr, bta_dm_search_cb.peer_bdaddr); 4541cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson strlcpy((char*)result.disc_ble_res.bd_name, bta_dm_get_remname(), 4542cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BD_NAME_LEN); 4543cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(&result.disc_ble_res.service, &service_id.uuid, sizeof(tBT_UUID)); 4544cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4545cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_search_cback(BTA_DM_DISC_BLE_RES_EVT, &result); 4546cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 45475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 45485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 45508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 45518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_gatt_disc_complete 45528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 45538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This function process the GATT service search complete. 45548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 45558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters: 45568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 45578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4558cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_gatt_disc_complete(uint16_t conn_id, 4559cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_GATT_STATUS status) { 4560cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s conn_id = %d", __func__, conn_id); 4561cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4562cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.uuid_to_search > 0) bta_dm_search_cb.uuid_to_search--; 4563cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4564cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (status == BTA_GATT_OK && bta_dm_search_cb.uuid_to_search > 0) { 4565cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson btm_dm_start_disc_gatt_services(conn_id); 4566cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 4567cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_DM_MSG* p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG)); 45685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4569cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.uuid_to_search = 0; 45705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4571cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* no more services to be discovered */ 4572cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT; 4573cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.result = 4574cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (status == BTA_GATT_OK) ? BTA_SUCCESS : BTA_FAILURE; 4575cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s service found: 0x%08x", __func__, 4576cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services_found); 4577cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.services = 4578cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.services_found; 4579cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.num_uuids = 0; 4580cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.p_uuid_list = NULL; 4581cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(p_msg->disc_result.result.disc_res.bd_addr, 4582cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.peer_bdaddr); 4583cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson strlcpy((char*)p_msg->disc_result.result.disc_res.bd_name, 4584cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_get_remname(), BD_NAME_LEN); 4585cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4586cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.device_type |= BT_DEVICE_TYPE_BLE; 4587cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.ble_raw_used > 0) { 4588cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.p_raw_data = 4589cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (uint8_t*)osi_malloc(bta_dm_search_cb.ble_raw_used); 4590cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4591cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy(p_msg->disc_result.result.disc_res.p_raw_data, 4592cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_ble_rawdata, bta_dm_search_cb.ble_raw_used); 4593cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4594cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.raw_data_size = 4595cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.ble_raw_used; 4596717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov } else { 4597cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_msg->disc_result.result.disc_res.p_raw_data = NULL; 4598cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.p_ble_rawdata = 0; 4599cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 460076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan 4601cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_msg); 4602717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov 4603cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (conn_id != BTA_GATT_INVALID_CONN_ID) { 4604cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* start a GATT channel close delay timer */ 4605cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_start_timer(bta_dm_search_cb.gatt_close_timer, 4606cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_DM_GATT_CLOSE_DELAY_TOUT, 4607cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_DM_DISC_CLOSE_TOUT_EVT, 0); 4608cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(bta_dm_search_cb.pending_close_bda, bta_dm_search_cb.peer_bdaddr); 46095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4610cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.gatt_disc_active = false; 4611cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 46125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 46135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 46158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 46168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_close_gatt_conn 46178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4618221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski * Description This function close the GATT connection after delay 4619221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski *timeout. 46208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 46218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters: 46228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 46238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4624cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_close_gatt_conn(UNUSED_ATTR tBTA_DM_MSG* p_data) { 4625cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.conn_id != BTA_GATT_INVALID_CONN_ID) 4626cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_GATTC_Close(bta_dm_search_cb.conn_id); 46276975b4d711142b885af479721cada448952c6b41Andre Eisenbach 4628cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(bta_dm_search_cb.pending_close_bda, 0, BD_ADDR_LEN); 4629cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID; 46306975b4d711142b885af479721cada448952c6b41Andre Eisenbach} 46316975b4d711142b885af479721cada448952c6b41Andre Eisenbach/******************************************************************************* 46328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 46338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function btm_dm_start_gatt_discovery 46348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4635cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Description This is GATT initiate the service search by open a GATT 46361baaae3f34a667058e7f0c5f778357d98320cf38Myles Watson * connection first. 46378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 46388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters: 46398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 46408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4641cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid btm_dm_start_gatt_discovery(BD_ADDR bd_addr) { 4642cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.gatt_disc_active = true; 4643cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4644cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* connection is already open */ 4645cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bdcmp(bta_dm_search_cb.pending_close_bda, bd_addr) == 0 && 4646cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.conn_id != BTA_GATT_INVALID_CONN_ID) { 4647cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memset(bta_dm_search_cb.pending_close_bda, 0, BD_ADDR_LEN); 4648cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson alarm_cancel(bta_dm_search_cb.gatt_close_timer); 4649cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson btm_dm_start_disc_gatt_services(bta_dm_search_cb.conn_id); 4650ce54c403203597ba92720f52d47d57189ae37de6Jakub Pawlowski } else { 4651ce54c403203597ba92720f52d47d57189ae37de6Jakub Pawlowski if (BTM_IsAclConnectionUp(bd_addr, BT_TRANSPORT_LE)) { 4652ce54c403203597ba92720f52d47d57189ae37de6Jakub Pawlowski BTA_GATTC_Open(bta_dm_search_cb.client_if, bd_addr, true, 4653ce54c403203597ba92720f52d47d57189ae37de6Jakub Pawlowski BTA_GATT_TRANSPORT_LE, true); 4654ce54c403203597ba92720f52d47d57189ae37de6Jakub Pawlowski } else { 4655ce54c403203597ba92720f52d47d57189ae37de6Jakub Pawlowski BTA_GATTC_Open(bta_dm_search_cb.client_if, bd_addr, true, 4656ce54c403203597ba92720f52d47d57189ae37de6Jakub Pawlowski BTA_GATT_TRANSPORT_LE, false); 4657ce54c403203597ba92720f52d47d57189ae37de6Jakub Pawlowski } 4658ce54c403203597ba92720f52d47d57189ae37de6Jakub Pawlowski } 46595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 46605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 46628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 46638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_cancel_gatt_discovery 46648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 46658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This is GATT cancel the GATT service search. 46668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 46678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters: 46688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 46698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4670cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr) { 4671cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.conn_id == BTA_GATT_INVALID_CONN_ID) { 4672cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTA_GATTC_CancelOpen(bta_dm_search_cb.client_if, bd_addr, true); 4673cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 46745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4675cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_gatt_disc_complete(bta_dm_search_cb.conn_id, 4676cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTA_GATT_STATUS)BTA_GATT_ERROR); 46775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 46785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 46808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 46818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_proc_open_evt 46828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 46838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description process BTA_GATTC_OPEN_EVT in DM. 46848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 46858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters: 46868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 46878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4688cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_dm_proc_open_evt(tBTA_GATTC_OPEN* p_data) { 4689cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t* p1; 4690cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t* p2; 4691cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4692cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p1 = bta_dm_search_cb.peer_bdaddr; 4693cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p2 = p_data->remote_bda; 4694cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4695cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG( 4696cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "DM Search state= %d search_cb.peer_dbaddr: [%08x%04x] connected_bda= " 4697cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "[%08x%04x] ", 4698cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.state, 4699cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((p1[0]) << 24) + ((p1[1]) << 16) + ((p1[2]) << 8) + (p1[3]), 4700cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((p1[4]) << 8) + p1[5], 4701cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((p2[0]) << 24) + ((p2[1]) << 16) + ((p2[2]) << 8) + (p2[3]), 4702cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((p2[4]) << 8) + p2[5]); 4703cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4704cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("BTA_GATTC_OPEN_EVT conn_id = %d client_if=%d status = %d", 4705cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->conn_id, p_data->client_if, p_data->status); 4706cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4707cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_search_cb.conn_id = p_data->conn_id; 4708cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4709cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->status == BTA_GATT_OK) { 4710cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson btm_dm_start_disc_gatt_services(p_data->conn_id); 4711cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 4712cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_gatt_disc_complete(BTA_GATT_INVALID_CONN_ID, p_data->status); 4713cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 47145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 47155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 47178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 47188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_gattc_callback 47198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 47208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description This is GATT client callback function used in DM. 47218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 47228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters: 47238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 47248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4725cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC* p_data) { 4726cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("bta_dm_gattc_callback event = %d", event); 4727cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4728cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson switch (event) { 4729cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTA_GATTC_OPEN_EVT: 4730cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_proc_open_evt(&p_data->open); 4731cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 4732cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4733cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTA_GATTC_SEARCH_RES_EVT: 4734cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_gatt_disc_result(p_data->srvc_res.service_uuid); 4735cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 4736cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4737cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTA_GATTC_SEARCH_CMPL_EVT: 4738cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) 4739cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_gatt_disc_complete(p_data->search_cmpl.conn_id, 4740cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->search_cmpl.status); 4741cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 4742cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 4743cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson case BTA_GATTC_CLOSE_EVT: 4744cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("BTA_GATTC_CLOSE_EVT reason = %d", p_data->close.reason); 4745cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* in case of disconnect before search is completed */ 4746cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) && 4747cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (bta_dm_search_cb.state != BTA_DM_SEARCH_ACTIVE) && 4748cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson !memcmp(p_data->close.remote_bda, bta_dm_search_cb.peer_bdaddr, 4749cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BD_ADDR_LEN)) { 4750cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_gatt_disc_complete((uint16_t)BTA_GATT_INVALID_CONN_ID, 4751cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTA_GATT_STATUS)BTA_GATT_ERROR); 4752cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 4753cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 47545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4755cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson default: 4756cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 4757cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 47585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4759c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji 4760e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BLE_VND_INCLUDED == TRUE) 47618d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta/******************************************************************************* 47628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 47638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_dm_ctrl_features_rd_cmpl_cback 47648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 47658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description callback to handle controller feature read complete 47668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 47678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Parameters: 47688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 47698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 4770cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result) { 4771cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s status = %d ", __func__, result); 4772cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (result == BTM_SUCCESS) { 4773cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_dm_cb.p_sec_cback) 4774cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_dm_cb.p_sec_cback(BTA_DM_LE_FEATURES_READ, NULL); 4775cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 4776cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_ERROR("%s Ctrl BLE feature read failed: status :%d", __func__, 4777cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson result); 4778cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 47798d41691e6b16ba945711e8c3846df1ec70fdb724Ganesh Ganapathi Batta} 4780104e3f238f500cacdb8afaccdc672dfc34eae7eeBernhard Rosenkränzer#endif /* BLE_VND_INCLUDED */ 4781