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