16ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/****************************************************************************** 26ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 36ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Copyright (C) 2003-2012 Broadcom Corporation 46ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 56ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Licensed under the Apache License, Version 2.0 (the "License"); 66ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * you may not use this file except in compliance with the License. 76ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * You may obtain a copy of the License at: 86ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 96ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * http://www.apache.org/licenses/LICENSE-2.0 106ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 116ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Unless required by applicable law or agreed to in writing, software 126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * distributed under the License is distributed on an "AS IS" BASIS, 136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * See the License for the specific language governing permissions and 156ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * limitations under the License. 166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/ 186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/****************************************************************************** 206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 216ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * This file contains the action functions for device manager state 226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * machine. 236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 246ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/ 25e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 26e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bt_types.h" 27e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "gki.h" 28e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bd.h" 29e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bta_sys.h" 30e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bta_api.h" 31e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bta_dm_int.h" 32e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bta_dm_co.h" 33e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "btm_api.h" 34e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "btm_int.h" 35e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "btu.h" 36e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "sdp_api.h" 37e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "l2c_api.h" 38e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "wbt_api.h" 39e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "utl.h" 40e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <string.h> 41e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 42e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_inq_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir); 43e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_inq_cmpl_cb (void * p_result); 44e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_service_search_remname_cback (BD_ADDR bd_addr, DEV_CLASS dc, BD_NAME bd_name); 45e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_remname_cback (tBTM_REMOTE_DEV_NAME *p_remote_name); 46e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_find_services ( BD_ADDR bd_addr); 47e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_discover_next_device(void); 48e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_sdp_callback (UINT16 sdp_status); 49e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic UINT8 bta_dm_authorize_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, UINT8 *service_name, UINT8 service_id, BOOLEAN is_originator); 50e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic UINT8 bta_dm_pin_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name); 51e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic UINT8 bta_dm_link_key_request_cback (BD_ADDR bd_addr, LINK_KEY key); 52e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic UINT8 bta_dm_new_link_key_cback(BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, LINK_KEY key, UINT8 key_type); 53e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,BD_NAME bd_name, int result); 54e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_local_name_cback(BD_ADDR bd_addr); 55e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic BOOLEAN bta_dm_check_av(UINT16 event); 56e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE) 57e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data); 58e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else 59e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_acl_change_cback (BD_ADDR p_bda, DEV_CLASS p_dc, BD_NAME p_bdn, BD_FEATURES features, BOOLEAN is_new); 60e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 61e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr); 62e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 63e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* Extended Inquiry Response */ 64e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic UINT8 bta_dm_sp_cback (tBTM_SP_EVT event, tBTM_SP_EVT_DATA *p_data); 65e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 66e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_EIR_SERVER_INCLUDED == TRUE) 67e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_set_eir (char *local_name); 68e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif /* BTM_EIR_SERVER_INCLUDED */ 69e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 70e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_EIR_CLIENT_INCLUDED == TRUE) 71e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_eir_search_services( tBTM_INQ_RESULTS *p_result, 72e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_SERVICE_MASK *p_services_to_search, 73e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_SERVICE_MASK *p_services_found); 74e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif /* BTM_EIR_CLIENT_INCLUDED */ 75e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 76e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_rssi_cback (tBTM_RSSI_RESULTS *p_result); 77e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_signal_strength_timer_cback (TIMER_LIST_ENT *p_tle); 78e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_link_quality_cback (tBTM_LINK_QUALITY_RESULTS *p_result); 79e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_search_timer_cback (TIMER_LIST_ENT *p_tle); 80e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_disable_timer_cback (TIMER_LIST_ENT *p_tle); 81e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_disable_conn_down_timer_cback (TIMER_LIST_ENT *p_tle); 82e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr); 83e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Battastatic void bta_dm_adjust_roles(BOOLEAN delay_role_switch); 84e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic char *bta_dm_get_remname(void); 85e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result); 86e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 87e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr); 88e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_discover_device(BD_ADDR remote_bd_addr); 89e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 90e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status ); 91e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 92e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Battastatic BOOLEAN bta_dm_dev_blacklisted_for_switch (BD_ADDR remote_bd_addr); 93e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Battastatic void bta_dm_delay_role_switch_cback (TIMER_LIST_ENT *p_tle); 94e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta 95e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta 96e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE)) 97e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach #if ((defined SMP_INCLUDED) && (SMP_INCLUDED == TRUE)) 98e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_DATA *p_data); 99e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach #endif 100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_ble_id_key_cback (UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key); 101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach #if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)) 102e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void btm_dm_start_gatt_discovery ( BD_ADDR bd_addr); 103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr); 104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data); 105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach #endif 106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1084ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamyextern void sdpu_uuid16_to_uuid128(UINT16 uuid16, UINT8* p_uuid128); 1094ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy 110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachconst UINT16 bta_service_id_to_uuid_lkup_tbl [BTA_MAX_SERVICE_ID] = 111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_PNP_INFORMATION, /* Reserved */ 113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_SERIAL_PORT, /* BTA_SPP_SERVICE_ID */ 114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_DIALUP_NETWORKING, /* BTA_DUN_SERVICE_ID */ 1154ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy UUID_SERVCLASS_AUDIO_SOURCE, /* BTA_A2DP_SOURCE_SERVICE_ID */ 116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_LAN_ACCESS_USING_PPP, /* BTA_LAP_SERVICE_ID */ 11795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UUID_SERVCLASS_HEADSET, /* BTA_HSP_HS_SERVICE_ID */ 11895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UUID_SERVCLASS_HF_HANDSFREE, /* BTA_HFP_HS_SERVICE_ID */ 119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_OBEX_OBJECT_PUSH, /* BTA_OPP_SERVICE_ID */ 120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_OBEX_FILE_TRANSFER, /* BTA_FTP_SERVICE_ID */ 121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_CORDLESS_TELEPHONY, /* BTA_CTP_SERVICE_ID */ 122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_INTERCOM, /* BTA_ICP_SERVICE_ID */ 123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_IRMC_SYNC, /* BTA_SYNC_SERVICE_ID */ 124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_DIRECT_PRINTING, /* BTA_BPP_SERVICE_ID */ 125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_IMAGING_RESPONDER, /* BTA_BIP_SERVICE_ID */ 126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_PANU, /* BTA_PANU_SERVICE_ID */ 127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_NAP, /* BTA_NAP_SERVICE_ID */ 128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_GN, /* BTA_GN_SERVICE_ID */ 129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_SAP, /* BTA_SAP_SERVICE_ID */ 130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_AUDIO_SINK, /* BTA_A2DP_SERVICE_ID */ 131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_AV_REMOTE_CONTROL, /* BTA_AVRCP_SERVICE_ID */ 132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_HUMAN_INTERFACE, /* BTA_HID_SERVICE_ID */ 133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_VIDEO_SINK, /* BTA_VDP_SERVICE_ID */ 134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_PBAP_PSE, /* BTA_PBAP_SERVICE_ID */ 13595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UUID_SERVCLASS_HEADSET_AUDIO_GATEWAY, /* BTA_HSP_SERVICE_ID */ 13695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UUID_SERVCLASS_AG_HANDSFREE, /* BTA_HFP_SERVICE_ID */ 137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_MESSAGE_ACCESS, /* BTA_MAP_SERVICE_ID */ 138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_MESSAGE_NOTIFICATION, /* BTA_MN_SERVICE_ID */ 139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_HDP_PROFILE, /* BTA_HDP_SERVICE_ID */ 140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UUID_SERVCLASS_PBAP_PCE /* BTA_PCE_SERVICE_ID */ 141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BLE_INCLUDED && BTA_GATT_INCLUDED 142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ,UUID_PROTOCOL_ATT /* BTA_GATT_SERVICE_ID */ 143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}; 145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* 1476ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * NOTE : The number of element in bta_service_id_to_btm_srv_id_lkup_tbl should be matching with 148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach * the value BTA_MAX_SERVICE_ID in bta_api.h 149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach * 1506ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * i.e., If you add new Service ID for BTA, the correct security ID of the new service 151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach * from Security service definitions (btm_api.h) should be added to this lookup table. 152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach */ 153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachconst UINT32 bta_service_id_to_btm_srv_id_lkup_tbl [BTA_MAX_SERVICE_ID] = 154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 0, /* Reserved */ 156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_SERIAL_PORT, /* BTA_SPP_SERVICE_ID */ 157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_DUN, /* BTA_DUN_SERVICE_ID */ 1584ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy BTM_SEC_SERVICE_AVDTP, /* BTA_AUDIO_SOURCE_SERVICE_ID */ 159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_LAN_ACCESS, /* BTA_LAP_SERVICE_ID */ 160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_HEADSET_AG, /* BTA_HSP_SERVICE_ID */ 161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_AG_HANDSFREE, /* BTA_HFP_SERVICE_ID */ 162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_OBEX, /* BTA_OPP_SERVICE_ID */ 163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_OBEX_FTP, /* BTA_FTP_SERVICE_ID */ 164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_CORDLESS, /* BTA_CTP_SERVICE_ID */ 165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_INTERCOM, /* BTA_ICP_SERVICE_ID */ 166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_IRMC_SYNC, /* BTA_SYNC_SERVICE_ID */ 167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_BPP_JOB, /* BTA_BPP_SERVICE_ID */ 168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_BIP, /* BTA_BIP_SERVICE_ID */ 169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_BNEP_PANU, /* BTA_PANU_SERVICE_ID */ 170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_BNEP_NAP, /* BTA_NAP_SERVICE_ID */ 171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_BNEP_GN, /* BTA_GN_SERVICE_ID */ 172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_SAP, /* BTA_SAP_SERVICE_ID */ 173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_AVDTP, /* BTA_A2DP_SERVICE_ID */ 174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_AVCTP, /* BTA_AVRCP_SERVICE_ID */ 175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_HID_SEC_CTRL, /* BTA_HID_SERVICE_ID */ 176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_AVDTP, /* BTA_VDP_SERVICE_ID */ 177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_PBAP, /* BTA_PBAP_SERVICE_ID */ 178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_HEADSET, /* BTA_HSP_HS_SERVICE_ID */ 179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_HF_HANDSFREE, /* BTA_HFP_HS_SERVICE_ID */ 180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_MAP, /* BTA_MAP_SERVICE_ID */ 181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_MAP, /* BTA_MN_SERVICE_ID */ 182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_HDP_SNK, /* BTA_HDP_SERVICE_ID */ 183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SEC_SERVICE_PBAP /* BTA_PCE_SERVICE_ID */ 184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BLE_INCLUDED && BTA_GATT_INCLUDED 185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ,BTM_SEC_SERVICE_ATT /* BTA_GATT_SERVICE_ID */ 186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}; 188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* bta security callback */ 190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachconst tBTM_APPL_INFO bta_security = 191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &bta_dm_authorize_cback, 193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &bta_dm_pin_cback, 194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &bta_dm_new_link_key_cback, 195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &bta_dm_link_key_request_cback, 196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &bta_dm_authentication_complete_cback, 197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach NULL, 198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &bta_dm_bond_cancel_complete_cback, 199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &bta_dm_sp_cback 201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else 202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach NULL 203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 2046ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach#if BLE_INCLUDED == TRUE 205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if SMP_INCLUDED == TRUE 2066ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ,&bta_dm_ble_smp_cback 207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ,&bta_dm_ble_id_key_cback 209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}; 212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 213e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta/* TBD... To be moved to some conf file..? */ 214e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta#define BTA_DM_MAX_ROLE_SWITCH_BLACKLIST_COUNT 5 215e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Battaconst tBTA_DM_LMP_VER_INFO bta_role_switch_blacklist[BTA_DM_MAX_ROLE_SWITCH_BLACKLIST_COUNT] = 216e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta{ 217e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta {0x000F,0x2000,0x04}, 218e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta {0x00,0x00,0x00}, 219e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta {0x00,0x00,0x00}, 220e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta {0x00,0x00,0x00}, 221e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta {0x00,0x00,0x00} 222e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta}; 223e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta 224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define MAX_DISC_RAW_DATA_BUF (4096) 225e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT8 g_disc_raw_data_buf[MAX_DISC_RAW_DATA_BUF]; 226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_app_ready_timer_cback 230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description allow sending EIR to controller 232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2336ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 2346ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&(BTA_EIR_CANNED_UUID_LIST != TRUE) 238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_app_ready_timer_cback (TIMER_LIST_ENT *p_tle) 239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_set_eir (NULL); 241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else 243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define bta_dm_app_ready_timer_cback (x) 244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_enable 249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2506ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description Initialises the BT device manager 2516ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2536ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_enable(tBTA_DM_MSG *p_data) 257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_SYS_HW_MSG *sys_enable_event; 259f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan tBTA_DM_SEC sec_event; 260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2616ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if already in use, return an error */ 263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( bta_dm_cb.is_bta_dm_active == TRUE ) 264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2656ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach APPL_TRACE_WARNING0("bta_dm_enable - device already started by another application"); 266f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan memset(&sec_event.enable, 0, sizeof ( tBTA_DM_ENABLE )); 267f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan sec_event.enable.status = BTA_FAILURE; 268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( p_data->enable.p_sec_cback != NULL ) 269f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan p_data->enable.p_sec_cback (BTA_DM_ENABLE_EVT, &sec_event); 270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* first, register our callback to SYS HW manager */ 275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_hw_register( BTA_SYS_HW_BLUETOOTH, bta_dm_sys_hw_cback ); 2766ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 2776ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach /* make sure security callback is saved - if no callback, do not erase the previous one, 278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach it could be an error recovery mechanism */ 2796ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if( p_data->enable.p_sec_cback != NULL ) 2806ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_dm_cb.p_sec_cback = p_data->enable.p_sec_cback; 281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* notify BTA DM is now active */ 282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.is_bta_dm_active = TRUE; 283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* send a message to BTA SYS */ 285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((sys_enable_event = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL) 286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sys_enable_event->hdr.event = BTA_SYS_API_ENABLE_EVT; 2886ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH; 2896ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(sys_enable_event); 291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2956ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_sys_hw_cback 303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description callback register to SYS to get HW status updates 305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3066ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 3076ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status ) 311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach DEV_CLASS dev_class; 313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_SEC_CBACK *temp_cback; 314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BLE_INCLUDED == TRUE 315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 key_mask = 0; 316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BT_OCTET16 er; 317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_BLE_LOCAL_ID_KEYS id_key; 318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBT_UUID app_uuid = {LEN_UUID_128,{0}}; 319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1(" bta_dm_sys_hw_cback with event: %i" , status ); 3216ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 322f8217980ebcc6a6800052d32f023ebd8f4fbf7fcKausik Sinnaswamy /* On H/W error evt, report to the registered DM application callback */ 323f8217980ebcc6a6800052d32f023ebd8f4fbf7fcKausik Sinnaswamy if (status == BTA_SYS_HW_ERROR_EVT) { 324f8217980ebcc6a6800052d32f023ebd8f4fbf7fcKausik Sinnaswamy if( bta_dm_cb.p_sec_cback != NULL ) 325f8217980ebcc6a6800052d32f023ebd8f4fbf7fcKausik Sinnaswamy bta_dm_cb.p_sec_cback(BTA_DM_HW_ERROR_EVT, NULL); 326f8217980ebcc6a6800052d32f023ebd8f4fbf7fcKausik Sinnaswamy return; 327f8217980ebcc6a6800052d32f023ebd8f4fbf7fcKausik Sinnaswamy } 328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( status == BTA_SYS_HW_OFF_EVT ) 3296ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach { 330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( bta_dm_cb.p_sec_cback != NULL ) 331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_sec_cback(BTA_DM_DISABLE_EVT, NULL); 332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* reinitialize the control block */ 334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&bta_dm_cb, 0, sizeof(bta_dm_cb)); 335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* unregister from SYS */ 337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_hw_unregister( BTA_SYS_HW_BLUETOOTH ); 338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* notify BTA DM is now unactive */ 339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.is_bta_dm_active = FALSE; 340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( status == BTA_SYS_HW_ON_EVT ) 3436ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach { 344f8217980ebcc6a6800052d32f023ebd8f4fbf7fcKausik Sinnaswamy /* FIXME: We should not unregister as the SYS shall invoke this callback on a H/W error. 345f8217980ebcc6a6800052d32f023ebd8f4fbf7fcKausik Sinnaswamy * We need to revisit when this platform has more than one BLuetooth H/W chip */ 346f8217980ebcc6a6800052d32f023ebd8f4fbf7fcKausik Sinnaswamy //bta_sys_hw_unregister( BTA_SYS_HW_BLUETOOTH); 347e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* save security callback */ 349e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach temp_cback = bta_dm_cb.p_sec_cback; 350e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* make sure the control block is properly initialized */ 351e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&bta_dm_cb, 0, sizeof(bta_dm_cb)); 352e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* and retrieve the callback */ 353e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_sec_cback=temp_cback; 354e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.is_bta_dm_active = TRUE; 3556ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 3566ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach /* hw is ready, go on with BTA DM initialization */ 357e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&bta_dm_search_cb, 0x00, sizeof(bta_dm_search_cb)); 358e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&bta_dm_conn_srvcs, 0x00, sizeof(bta_dm_conn_srvcs)); 359e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&bta_dm_di_cb, 0, sizeof(tBTA_DM_DI_CB)); 3606ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 361e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(dev_class, bta_dm_cfg.dev_class, sizeof(dev_class)); 362e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SetDeviceClass (dev_class); 3636ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 364e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE) 365e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* load BLE local information: ID keys, ER if available */ 366e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_co_ble_load_local_keys(&key_mask, er, &id_key); 367e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 368e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ER) 369e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 370e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ER, (tBTM_BLE_LOCAL_KEYS *)&er); 371e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 372e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ID) 373e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 374e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ID, (tBTM_BLE_LOCAL_KEYS *)&id_key); 375e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 376e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)) 377e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset (&app_uuid.uu.uuid128, 0x87, LEN_UUID_128); 378e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTA_GATTC_AppRegister(&app_uuid, bta_dm_gattc_callback); 379e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 380e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 381e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 382e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SecRegister((tBTM_APPL_INFO*)&bta_security); 383e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SetDefaultLinkSuperTout(bta_dm_cfg.link_timeout); 384e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_WritePageTimeout(bta_dm_cfg.page_timeout); 385e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.cur_policy = bta_dm_cfg.policy_settings; 386e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy); 387e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE) 388e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_RegBusyLevelNotif (bta_dm_bl_change_cback, NULL, BTM_BL_UPDATE_MASK|BTM_BL_ROLE_CHG_MASK); 389e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else 390e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_AclRegisterForChanges(bta_dm_acl_change_cback); 391e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 392e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Earlier, we used to invoke BTM_ReadLocalAddr which was just copying the bd_addr 393e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach from the control block and invoking the callback which was sending the DM_ENABLE_EVT. 394e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach But then we have a few HCI commands being invoked above which were still in progress 395e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach when the ENABLE_EVT was sent. So modified this to fetch the local name which forces 396e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach the DM_ENABLE_EVT to be sent only after all the init steps are complete */ 397e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_ReadLocalDeviceNameFromController((tBTM_CMPL_CB *)bta_dm_local_name_cback); 398e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 399e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_rm_register((tBTA_SYS_CONN_CBACK*)bta_dm_rm_cback); 4006ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 401e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* initialize bluetooth low power manager */ 402e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_init_pm(); 403e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 404e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_policy_register((tBTA_SYS_CONN_CBACK*)bta_dm_policy_cback); 405e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 406e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 407e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach // BLUEDROID REMOVE ?? 408e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if 0 409e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if 1 410e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Create broadcom primary DI record */ 411e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(WBT_ExtCreateRecord()) 412e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 413e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&( BTA_EIR_CANNED_UUID_LIST != TRUE ) 414e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* while app_ready_timer is running, BTA DM doesn't send EIR to controller */ 415e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.app_ready_timer.p_cback = (TIMER_CBACK*)&bta_dm_app_ready_timer_cback; 416e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_start_timer(&bta_dm_cb.app_ready_timer, 0, 100); 417e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 418e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_add_uuid(UUID_SERVCLASS_PNP_INFORMATION); 419e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 420e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_di_cb.di_handle[bta_dm_di_cb.di_num] = 0; /* primary DI record */ 421e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_di_cb.di_num ++; 422e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 423e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else /* Eventually implement pin code */ 424e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (WBT_ExtCreateRecord()) 425e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach WBT_ExtAddPinCode(); 426e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 4276ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach#endif 428e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 429e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 430e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG0(" --- ignored event"); 431e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 432e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 433e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 434e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 435e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 436e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 437e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_disable 438e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4396ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description Disables the BT device manager 440e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4416ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 4426ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 443e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 444e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 445e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_disable (tBTA_DM_MSG *p_data) 446e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 447e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Set l2cap idle timeout to 0 (so BTE immediately disconnects ACL link after last channel is closed) */ 448e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach L2CA_SetIdleTimeoutByBdAddr((UINT8 *)BT_BD_ANY, 0); 4496ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 450e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* disable all active subsystems */ 451e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_disable(BTA_SYS_HW_BLUETOOTH); 452e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 453e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SetDiscoverability(BTM_NON_DISCOVERABLE, 0, 0); 454e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SetConnectability(BTM_NON_CONNECTABLE, 0, 0); 455e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 456e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_disable_pm(); 457e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 458e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.disabling = TRUE; 4596ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 460e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cancel(NULL); 461e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 462e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(BTM_GetNumAclLinks()==0) 4636ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach { 464cdd49a6cfd2fedf775dd06e511c050e95508f5b8Kausik Sinnaswamy#if (defined(BTA_DISABLE_DELAY) && BTA_DISABLE_DELAY > 0) 465cdd49a6cfd2fedf775dd06e511c050e95508f5b8Kausik Sinnaswamy /* If BTA_DISABLE_DELAY is defined and greater than zero, then delay the shutdown by 466cdd49a6cfd2fedf775dd06e511c050e95508f5b8Kausik Sinnaswamy * BTA_DISABLE_DELAY milliseconds 467cdd49a6cfd2fedf775dd06e511c050e95508f5b8Kausik Sinnaswamy */ 468cdd49a6cfd2fedf775dd06e511c050e95508f5b8Kausik Sinnaswamy APPL_TRACE_WARNING2("%s BTA_DISABLE_DELAY set to %d ms", 469cdd49a6cfd2fedf775dd06e511c050e95508f5b8Kausik Sinnaswamy __FUNCTION__, BTA_DISABLE_DELAY); 470cdd49a6cfd2fedf775dd06e511c050e95508f5b8Kausik Sinnaswamy bta_sys_stop_timer(&bta_dm_cb.disable_timer); 471cdd49a6cfd2fedf775dd06e511c050e95508f5b8Kausik Sinnaswamy bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_conn_down_timer_cback; 472cdd49a6cfd2fedf775dd06e511c050e95508f5b8Kausik Sinnaswamy bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, BTA_DISABLE_DELAY); 473cdd49a6cfd2fedf775dd06e511c050e95508f5b8Kausik Sinnaswamy#else 4742409c30542ccd73a612c215c8ab584b1736bcc52Kausik Sinnaswamy bta_dm_disable_conn_down_timer_cback(NULL); 475cdd49a6cfd2fedf775dd06e511c050e95508f5b8Kausik Sinnaswamy#endif 476e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 477e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 4786ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach { 479e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_timer_cback; 480e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 5000); 481e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 482e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 483e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 484e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 485e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 486e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 487e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_disable_timer_cback 488e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 489e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Called if the disable timer expires 490e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Used to close ACL connections which are still active 491e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4926ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 4936ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 4946ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 495e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 496e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 497e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_disable_timer_cback (TIMER_LIST_ENT *p_tle) 498e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 499e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 500e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 i; 501e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 502e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_EVENT0(" bta_dm_disable_timer_cback "); 503e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 504e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(BTM_GetNumAclLinks()) 505e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 506e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for(i=0; i<bta_dm_cb.device_list.count; i++) 507e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 508e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_remove_acl(bta_dm_cb.device_list.peer_device[i].peer_bdaddr); 509e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 510e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 511e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 512e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 513e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 514e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 515e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.disabling = FALSE; 5166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 517e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_remove_uuid(UUID_SERVCLASS_PNP_INFORMATION); 518e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_sec_cback(BTA_DM_DISABLE_EVT, NULL); 519e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 520e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 521e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 522e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 523e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 524e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 525e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 526e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 527e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_set_dev_name 528e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 529e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Sets local device name 530e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 5316ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 5326ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 533e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 534e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 535e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_set_dev_name (tBTA_DM_MSG *p_data) 536e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 537e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 538e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SetLocalDeviceName((char*)p_data->set_name.name); 539e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_EIR_SERVER_INCLUDED == TRUE) 540e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_set_eir ((char*)p_data->set_name.name); 541e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 542e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 543e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 544e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 545e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 546e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_set_visibility 547e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 548e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Sets discoverability, connectability and pairability 549e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 5506ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 5516ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 552e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 553e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 554e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_set_visibility (tBTA_DM_MSG *p_data) 555e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 556e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 557e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 558e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* set modes for Discoverability and connectability if not ignore */ 559e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->set_visibility.disc_mode != BTA_DM_IGNORE) 560e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SetDiscoverability((UINT8)p_data->set_visibility.disc_mode, 561e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.inquiry_scan_window, 562e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.inquiry_scan_interval); 563e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 564e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->set_visibility.conn_mode != BTA_DM_IGNORE) 565e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SetConnectability((UINT8)p_data->set_visibility.conn_mode, 5666ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_dm_cb.page_scan_window, 567e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.page_scan_interval); 568e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 569e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Send False or True if not ignore */ 570e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE ) 571e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 572e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 573e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->set_visibility.pair_mode == BTA_DM_NON_PAIRABLE) 574e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.disable_pair_mode = TRUE; 575e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 576e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.disable_pair_mode = FALSE; 577e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 578e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 579e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 580e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Send False or True if not ignore */ 581e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE) 582e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 583e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 584e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->set_visibility.conn_paired_only == BTA_DM_CONN_ALL) 585e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.conn_paired_only = FALSE; 586e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 587e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.conn_paired_only = TRUE; 588e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 589e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 590e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 591e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Change mode if either mode is not ignore */ 592e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE || p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE) 593e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SetPairableMode((BOOLEAN)(!(bta_dm_cb.disable_pair_mode)),bta_dm_cb.conn_paired_only); 594e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 595e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 596e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 597e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 598e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 599e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 600e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_set_afhchannels 601e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 602e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function sets the AFH first and 603e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** last disable channel, so channels within 604e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** that range are disabled. 605e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 6066ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 6076ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 608e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 609e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 610e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_set_afhchannels (tBTA_DM_MSG *p_data) 611e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 612e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SetAfhChannels(p_data->set_afhchannels.first,p_data->set_afhchannels.last); 613e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 614e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 615e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 616e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 617e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 618e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 619e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_vendor_spec_command 620e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 621e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Send a vendor specific command to the controller 622e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 6236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 6246ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 625e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 626e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 627e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_vendor_spec_command (tBTA_DM_MSG *p_data) 628e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 629e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_STATUS status; 630e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 631e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = BTM_VendorSpecificCommand(p_data->vendor_command.opcode,p_data->vendor_command.param_len,p_data->vendor_command.p_param_buf, p_data->vendor_command.p_cback); 632e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 633e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 634e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 635e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 636e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 637e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 638e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_tx_inqpower 639e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 640e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description write inquiry tx power. 641e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 6426ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 6436ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 644e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 645e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 646e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_tx_inqpower(tBTA_DM_MSG *p_data) 647e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 648e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (BTM_WriteInquiryTxPower (p_data->tx_inq_pwr.tx_power) == BTM_ILLEGAL_VALUE) 649e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 650e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR1("Invalid Inquiry Tx Power: %d", p_data->tx_inq_pwr.tx_power); 651e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 652e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 653e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 654e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 655e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 656e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 65717706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani** Function bta_dm_remove_device 65817706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani** 65917706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani** Description Removes device, Disconnects ACL link if required. 66017706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani**** 66117706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani*******************************************************************************/ 66217706aa42214addb95ee4aea5177a8784960dfc1Harish Paryanivoid bta_dm_remove_device (tBTA_DM_MSG *p_data) 66317706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani{ 66417706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani tBTA_DM_API_REMOVE_DEVICE *p_dev = &p_data->remove_dev; 66517706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani int i; 666f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan tBTA_DM_SEC sec_event; 66717706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani 66817706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani if (BTM_IsAclConnectionUp(p_dev->bd_addr)) 66917706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani { 67017706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani /* Take the link down first, and mark the device for removal when disconnected */ 67117706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani btm_remove_acl( p_dev->bd_addr) ; 67217706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani 67317706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani for(i=0; i<bta_dm_cb.device_list.count; i++) 67417706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani { 67517706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani if(!bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_dev->bd_addr)) 67617706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani break; 67717706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani } 67817706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani 67917706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani if(i < bta_dm_cb.device_list.count) 68017706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani { 68117706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_UNPAIRING; 68217706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani } 68317706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani } 68417706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani else /* Ok to remove the device in application layer */ 68517706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani { 68617706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani BTM_SecDeleteDevice(p_dev->bd_addr); 68717706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani if( bta_dm_cb.p_sec_cback ) 688f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan { 689f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan bdcpy(sec_event.link_down.bd_addr, p_dev->bd_addr); 690f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan /* No connection, set status to success (acl disc code not valid) */ 691f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan sec_event.link_down.status = HCI_SUCCESS; 692f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &sec_event); 693f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan } 69417706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani } 69517706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani} 69617706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani 69717706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani/******************************************************************************* 69817706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani** 699e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_add_device 700e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 7016ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description This function adds a Link Key to an security database entry. 702e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** It is normally called during host startup to restore all required information 703e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** stored in the NVRAM. 704e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**** 705e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 706e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_add_device (tBTA_DM_MSG *p_data) 707e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 708e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_API_ADD_DEVICE *p_dev = &p_data->add_dev; 709e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 *p_dc = NULL; 710e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 *p_lc = NULL; 711e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT32 trusted_services_mask[BTM_SEC_SERVICE_ARRAY_SIZE]; 712e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 index = 0; 713e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 btm_mask_index = 0; 714e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 715e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset (trusted_services_mask, 0, sizeof(trusted_services_mask)); 716e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 717e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* If not all zeros, the device class has been specified */ 718e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_dev->dc_known) 719e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dc = (UINT8 *)p_dev->dc; 720e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 721e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_dev->link_key_known) 722e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_lc = (UINT8 *)p_dev->link_key; 723e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 724e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_dev->is_trusted) 725e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 726e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* covert BTA service mask to BTM mask */ 727e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach while (p_dev->tm && (index < BTA_MAX_SERVICE_ID)) 728e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 729e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_dev->tm & (UINT32)(1<<index)) 730e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 731e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 732e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_mask_index = bta_service_id_to_btm_srv_id_lkup_tbl[index] / BTM_SEC_ARRAY_BITS; 733e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach trusted_services_mask[btm_mask_index] |= (UINT32)(1 << (bta_service_id_to_btm_srv_id_lkup_tbl[index] - (UINT32)(btm_mask_index * 32))); 734e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 735e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev->tm &= (UINT32)(~(1<<index)); 736e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 737e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 738e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach index++; 739e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 740e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 741e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 742e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!BTM_SecAddDevice (p_dev->bd_addr, p_dc, p_dev->bd_name, p_dev->features, 743e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach trusted_services_mask, p_lc, p_dev->key_type, p_dev->io_cap)) 744e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 745e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR2 ("BTA_DM: Error adding device %08x%04x", 746e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (p_dev->bd_addr[0]<<24)+(p_dev->bd_addr[1]<<16)+(p_dev->bd_addr[2]<<8)+p_dev->bd_addr[3], 747e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (p_dev->bd_addr[4]<<8)+p_dev->bd_addr[5]); 748e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 749e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 750e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 751e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 752e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 753e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_bond 754e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 755e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Bonds with peer device 756e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 7576ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 7586ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 759e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 760e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 761e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_bond (tBTA_DM_MSG *p_data) 762e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 763e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_STATUS status; 764e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_SEC sec_event; 765e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach char *p_name; 766e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 7676ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach status = BTM_SecBond ( p_data->bond.bd_addr, 0, NULL, 0 ); 768e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 769e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED)) 770e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 771e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 772e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_name = BTM_SecReadDevName(p_data->bond.bd_addr); 773e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!p_name) 774e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_name = ""; 775e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 776e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&sec_event, 0, sizeof(tBTA_DM_SEC)); 777e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(sec_event.auth_cmpl.bd_addr, p_data->bond.bd_addr); 778e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(sec_event.auth_cmpl.bd_name, p_name, (BD_NAME_LEN-1)); 779e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.auth_cmpl.bd_name[BD_NAME_LEN-1] = 0; 780e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 781e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* taken care of by memset [above] 782e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.auth_cmpl.key_present = FALSE; 783e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.auth_cmpl.success = FALSE; 784e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*/ 785e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.auth_cmpl.fail_reason = HCI_ERR_ILLEGAL_COMMAND; 786e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (status == BTM_SUCCESS) 787e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.auth_cmpl.success = TRUE; 788e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 789e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event); 790e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 791e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 792e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 793e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 794e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 795e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 796e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_bond_cancel 797e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 798e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Cancels bonding with a peer device 799e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 8006ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 8016ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 802e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 803e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 804e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_bond_cancel (tBTA_DM_MSG *p_data) 805e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 806e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_STATUS status; 807e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_SEC sec_event; 808e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 809e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_EVENT0(" bta_dm_bond_cancel "); 810e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = BTM_SecBondCancel ( p_data->bond_cancel.bd_addr ); 811e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 812e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED && status != BTM_SUCCESS)) 813e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 814e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.bond_cancel_cmpl.result = BTA_FAILURE; 815e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 816e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_sec_cback(BTA_DM_BOND_CANCEL_CMPL_EVT, &sec_event); 817e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 818e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 819e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 820e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 821e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 822e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 823e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_pin_reply 824e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 825e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Send the pin_reply to a request from BTM 826e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 8276ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 8286ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 829e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 830e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 831e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_pin_reply (tBTA_DM_MSG *p_data) 832e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 833e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT32 trusted_mask[BTM_SEC_SERVICE_ARRAY_SIZE]; 834e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT32 * current_trusted_mask; 835e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 836e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach current_trusted_mask = BTM_ReadTrustedMask(p_data->pin_reply.bd_addr); 837e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 838e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(current_trusted_mask) 839e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 840e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(trusted_mask, current_trusted_mask, sizeof(trusted_mask)); 841e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 842e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 843e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 844e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(trusted_mask, 0, sizeof(trusted_mask)); 845e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 846e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 847e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_data->pin_reply.accept) 848e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 849e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 850e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_PINCodeReply(p_data->pin_reply.bd_addr, BTM_SUCCESS, p_data->pin_reply.pin_len, p_data->pin_reply.p_pin, trusted_mask ); 851e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 852e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 853e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 854e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_PINCodeReply(p_data->pin_reply.bd_addr, BTM_NOT_AUTHORIZED, 0, NULL, trusted_mask ); 8556ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach } 856e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 857e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 858e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 859e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 860e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 861e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_link_policy 862e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 863e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description remove/set link policy mask. 864e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** wake the link, is sniff/park is removed 865e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 8666ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 867e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 868e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 869e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_link_policy (tBTA_DM_MSG *p_data) 870e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 871e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_PEER_DEVICE *p_dev; 872e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 873e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev = bta_dm_find_peer_device(p_data->link_policy.bd_addr); 874e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(!p_dev) 875e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 876e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 877e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG2(" bta_dm_link_policy set:%d, policy:0x%x", 878e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->link_policy.set, p_data->link_policy.policy_mask); 879e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_data->link_policy.set) 880e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 881e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* restore the default link policy */ 882e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev->link_policy |= p_data->link_policy.policy_mask; 883e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy)); 884e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 885e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 886e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 887e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* clear the policy from the default link policy */ 888e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev->link_policy &= (~p_data->link_policy.policy_mask); 889e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy)); 890e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 891e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_data->link_policy.policy_mask & (HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_PARK_MODE)) 892e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 893e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if clearing sniff/park, wake the link */ 894e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_pm_active(p_dev->peer_bdaddr); 895e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 896e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 897e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 898e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 899e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 900e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 901e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_policy_cback 902e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 903e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description process the link policy changes 904e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 9056ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 906e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 907e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 908e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr) 909e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 910e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_PEER_DEVICE *p_dev = NULL; 911e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 policy = app_id; 912e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT32 mask = (UINT32)(1 << id); 913e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 914e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(peer_addr) 915e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev = bta_dm_find_peer_device(peer_addr); 916e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 917e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG2(" bta_dm_policy_cback cmd:%d, policy:0x%x", 918e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status, policy); 919e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach switch(status) 920e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 921e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTA_SYS_PLCY_SET: 922e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(!p_dev) 923e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 924e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* restore the default link policy */ 925e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev->link_policy |= policy; 926e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy)); 927e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 928e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 929e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTA_SYS_PLCY_CLR: 930e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(!p_dev) 931e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 932e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* clear the policy from the default link policy */ 933e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev->link_policy &= (~policy); 934e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy)); 935e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 936e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(policy & (HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_PARK_MODE)) 937e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 938e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if clearing sniff/park, wake the link */ 939e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_pm_active(p_dev->peer_bdaddr); 940e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 941e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 942e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 943e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTA_SYS_PLCY_DEF_SET: 944e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* want to restore/set the role switch policy */ 945e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.role_policy_mask &= ~mask; 946e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(0 == bta_dm_cb.role_policy_mask) 947e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 948e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if nobody wants to insist on the role */ 949e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.cur_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; 950e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy); 951e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 952e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 953e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 954e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTA_SYS_PLCY_DEF_CLR: 955e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* want to remove the role switch policy */ 956e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.role_policy_mask |= mask; 957e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.cur_policy &= ~HCI_ENABLE_MASTER_SLAVE_SWITCH; 958e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy); 959e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 960e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 961e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 962e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 963e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 964e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 965e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 966e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_auth_reply 967e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 968e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Send the authorization reply to a request from BTM 969e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 9706ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 9716ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 972e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 973e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 974e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_auth_reply (tBTA_DM_MSG *p_data) 975e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 9766ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 977e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT32 trusted_mask[BTM_SEC_SERVICE_ARRAY_SIZE]; 978e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 btm_mask_index = 0; 979e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT32 * current_trusted_mask; 980e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 981e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach current_trusted_mask = BTM_ReadTrustedMask(p_data->auth_reply.bd_addr); 982e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 983e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(current_trusted_mask) 984e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 985e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(trusted_mask, current_trusted_mask, sizeof(trusted_mask)); 986e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 987e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 988e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 989e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(trusted_mask, 0, sizeof(trusted_mask)); 990e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 991e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 992e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_data->auth_reply.response != BTA_DM_NOT_AUTH) 993e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 994e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_data->auth_reply.response == BTA_DM_AUTH_PERM) 995e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 996e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_data->auth_reply.service < BTA_MAX_SERVICE_ID) 997e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 998e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* convert BTA service id to BTM mask */ 999e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_mask_index = bta_service_id_to_btm_srv_id_lkup_tbl[p_data->auth_reply.service] / 32; 1000e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach trusted_mask[btm_mask_index] |= (UINT32)(1 << (bta_service_id_to_btm_srv_id_lkup_tbl[p_data->auth_reply.service] - (UINT32)(btm_mask_index * 32))); 1001e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1002e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1003e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1004e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_DeviceAuthorized (p_data->auth_reply.bd_addr, BTM_SUCCESS,trusted_mask); 1005e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1006e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1007e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1008e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_DeviceAuthorized (p_data->auth_reply.bd_addr, BTM_NOT_AUTHORIZED,trusted_mask); 1009e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1010e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1011e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1012e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1013e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1014e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1015e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_confirm 1016e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 10176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description Send the user confirm request reply in response to a 10186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** request from BTM 1019e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 10206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 1021e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1022e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1023e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_confirm(tBTA_DM_MSG *p_data) 1024e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1025e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_STATUS res = BTM_NOT_AUTHORIZED; 1026e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1027e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_data->confirm.accept == TRUE) 1028e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach res = BTM_SUCCESS; 1029e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_ConfirmReqReply(res, p_data->confirm.bd_addr); 1030e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1031e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1032e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1033e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1034e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_passkey_cancel 1035e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1036e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Send the passkey cancel from SP initiator by sending a negative 1037e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** passkey request replyreply. 10386ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 1039e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1040e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1041e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 1042e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_passkey_cancel(tBTA_DM_MSG *p_data) 1043e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1044e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_PasskeyReqReply(BTM_NOT_AUTHORIZED, p_data->passkey_cancel.bd_addr, 0); 1045e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1046e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 1047e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1048e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1049e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1050e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_loc_oob 1051e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1052e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Retrieve the OOB data from the local LM 1053e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 10546ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 1055e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1056e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1057e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_OOB_INCLUDED == TRUE) 1058e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_loc_oob(tBTA_DM_MSG *p_data) 1059e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1060e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_ReadLocalOobData(); 1061e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1062e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1063e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1064e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1065e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_ci_io_req_act 1066e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1067e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description respond to the IO capabilities request from BTM 1068e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 10696ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 1070e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1071e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1072e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_ci_io_req_act(tBTA_DM_MSG *p_data) 1073e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1074e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_AUTH_REQ auth_req = BTM_AUTH_AP_NO; 1075e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_data->ci_io_req.auth_req) 1076e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach auth_req = BTM_AUTH_AP_YES; 1077e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_IoCapRsp(p_data->ci_io_req.bd_addr, p_data->ci_io_req.io_cap, 1078e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->ci_io_req.oob_data, auth_req); 1079e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1080e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1081e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1082e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1083e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_ci_rmt_oob_act 1084e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1085e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description respond to the OOB data request for the remote device from BTM 1086e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 10876ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 10886ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 1089e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1090e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1091e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_ci_rmt_oob_act(tBTA_DM_MSG *p_data) 1092e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1093e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_STATUS res = BTM_NOT_AUTHORIZED; 1094e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1095e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_data->ci_rmt_oob.accept == TRUE) 1096e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach res = BTM_SUCCESS; 1097e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_RemoteOobDataReply(res, p_data->ci_rmt_oob.bd_addr, 1098e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->ci_rmt_oob.c, p_data->ci_rmt_oob.r ); 1099e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif /* BTM_OOB_INCLUDED */ 1101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1102e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_search_start 1105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 11066ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description Starts an inquiry 1107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 11086ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 11096ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 1110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_search_start (tBTA_DM_MSG *p_data) 1113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_INQUIRY_CMPL result; 1115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE 1117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 len = (UINT16)(sizeof(tBT_UUID) * p_data->search.num_uuid); 1118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 1119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("bta_dm_search_start avoid_scatter=%d", bta_dm_cfg.avoid_scatter); 1121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_cfg.avoid_scatter && 1122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (p_data->search.rs_res == BTA_DM_RS_NONE) && bta_dm_check_av(BTA_DM_API_SEARCH_EVT)) 1123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(&bta_dm_cb.search_msg, &p_data->search, sizeof(tBTA_DM_API_SEARCH)); 1125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 1126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_ClearInqDb(NULL); 1129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* save search params */ 1130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_search_cback = p_data->search.p_cback; 1131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.services = p_data->search.services; 1132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE) 1134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid); 1135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((bta_dm_search_cb.num_uuid = p_data->search.num_uuid) != 0 && 1137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->search.p_uuid != NULL) 1138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len)) == NULL) 1140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("bta_dm_search_start no resources"); 1142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result.status = BTA_FAILURE; 1144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result.num_resp = 0; 1145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_inq_cmpl_cb ((void *)&result); 1146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 1147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 11486ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach// bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len); 1149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(bta_dm_search_cb.p_srvc_uuid, p_data->search.p_uuid, len); 1150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->search.inq_params.mode & BTM_LIMITED_INQUIRY) 1153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->search.inq_params.mode |= BTM_BLE_LIMITED_INQUIRY; 1154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->search.inq_params.mode |= BTM_BLE_GENERAL_INQUIRY; 1156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 11576ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach result.status = BTM_StartInquiry( (tBTM_INQ_PARMS*)&p_data->search.inq_params, 11586ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_dm_inq_results_cb, 1159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (tBTM_CMPL_CB*) bta_dm_inq_cmpl_cb); 1160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_EVENT1("bta_dm_search_start status=%d", result.status); 1162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (result.status != BTM_CMD_STARTED) 1163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result.num_resp = 0; 1165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_inq_cmpl_cb ((void *)&result); 1166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_search_cancel 1173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Cancels an ongoing search for devices 1175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 11766ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 11776ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 1178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_search_cancel (tBTA_DM_MSG *p_data) 1181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_MSG * p_msg; 1184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(BTM_IsInquiryActive()) 1186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_CancelInquiry(); 1188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cancel_notify(NULL); 1189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) 1191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; 1193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; 1194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_msg); 1195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* If no Service Search going on then issue cancel remote name in case it is active */ 1199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if (!bta_dm_search_cb.name_discover_done) 1200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_CancelRemoteDeviceName(); 1202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if ((BLE_INCLUDED == TRUE) && (defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)) 1204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_search_cb.gatt_disc_active) 1205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr); 1207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 1209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_discover 1214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Discovers services on a remote device 1216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 12176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 12186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 1219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_discover (tBTA_DM_MSG *p_data) 1222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE 1224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 len = (UINT16)(sizeof(tBT_UUID) * p_data->discover.num_uuid); 1225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 12266ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach APPL_TRACE_EVENT2("bta_dm_discover services_to_search=0x%04X, sdp_search=%d", 1227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->discover.services, p_data->discover.sdp_search); 1228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* save the search condition */ 1230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.services = p_data->discover.services; 1231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE 1233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid); 1234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((bta_dm_search_cb.num_uuid = p_data->discover.num_uuid) != 0 && 1235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->discover.p_uuid != NULL) 1236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len)) == NULL) 1238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->discover.p_cback(BTA_DM_DISC_CMPL_EVT, NULL); 1240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 1241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(bta_dm_search_cb.p_srvc_uuid, p_data->discover.p_uuid, len); 1243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.uuid_to_search = bta_dm_search_cb.num_uuid; 1245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 1246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_search_cback = p_data->discover.p_cback; 1248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.sdp_search = p_data->discover.sdp_search; 1249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.services_to_search = bta_dm_search_cb.services; 1250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.service_index = 0; 1251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.services_found = 0; 1252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.peer_name[0] = 0; 1253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.sdp_search = p_data->discover.sdp_search; 1254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_btm_inq_info = BTM_InqDbRead (p_data->discover.bd_addr); 1255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.name_discover_done = FALSE; 1257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(&bta_dm_search_cb.uuid, &p_data->discover.uuid, sizeof(tSDP_UUID)); 1258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_discover_device(p_data->discover.bd_addr); 1259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_di_disc_cmpl 1264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Sends event to application when DI discovery complete 1266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 1268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_di_disc_cmpl(tBTA_DM_MSG *p_data) 1271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_DI_DISC_CMPL di_disc; 1273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&di_disc, 0, sizeof(tBTA_DM_DI_DISC_CMPL)); 1275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(di_disc.bd_addr, bta_dm_search_cb.peer_bdaddr); 1276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if((p_data->hdr.offset == SDP_SUCCESS) 1278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach || (p_data->hdr.offset == SDP_DB_FULL)) 1279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach di_disc.num_record = SDP_GetNumDiRecords(bta_dm_di_cb.p_di_db); 1281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach di_disc.result = BTA_FAILURE; 1284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_di_cb.p_di_db = NULL; 1286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_search_cback(BTA_DM_DI_DISC_CMPL_EVT, (tBTA_DM_SEARCH *) &di_disc); 1287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_di_disc_callback 1292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function queries a remote device for DI information. 1294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 12956ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 12966ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 1297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_di_disc_callback(UINT16 result) 1300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_MSG * p_msg; 1302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) 1304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; 1306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.layer_specific = BTA_DM_API_DI_DISCOVER_EVT; 1307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.offset = result; 1308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_msg); 1309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_di_disc 1315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function queries a remote device for DI information. 1317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 13186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 13196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 1320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1322e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_di_disc (tBTA_DM_MSG *p_data) 1323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 result = BTA_FAILURE; 1325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_MSG *p_msg; 1326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_search_cback = p_data->di_disc.p_cback; 1328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(bta_dm_search_cb.peer_bdaddr, p_data->di_disc.bd_addr); 1329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_di_cb.p_di_db = p_data->di_disc.p_sdp_db; 1330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if((bta_dm_search_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)GKI_getbuf(BTA_DM_SDP_DB_SIZE)) != NULL) 1332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 13336ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if ( SDP_DiDiscover(bta_dm_search_cb.peer_bdaddr, p_data->di_disc.p_sdp_db, 1334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->di_disc.len, bta_dm_di_disc_callback) == SDP_SUCCESS) 1335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result = BTA_SUCCESS; 1337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("No buffer to start DI discovery"); 1342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 13436ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 13446ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if ( result == BTA_FAILURE && 1345e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) 1346e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1347e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; 1348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.layer_specific = BTA_DM_API_DI_DISCOVER_EVT; 1349e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->hdr.offset = result; 1350e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_msg); 1351e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1352e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1353e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1354e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1355e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1356e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_read_remote_device_name 1357e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1358e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Initiate to get remote device name 1359e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1360e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns TRUE if started to get remote name 1361e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1362e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1363e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr) 1364e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1365e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_STATUS btm_status; 1366e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1367e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG0("bta_dm_read_remote_device_name"); 1368e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1369e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(bta_dm_search_cb.peer_bdaddr, bd_addr); 1370e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.peer_name[0] = 0; 1371e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1372e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_status = BTM_ReadRemoteDeviceName (bta_dm_search_cb.peer_bdaddr, 1373e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (tBTM_CMPL_CB *) bta_dm_remname_cback); 1374e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1375e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( btm_status == BTM_CMD_STARTED ) 1376e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1377e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG0("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is started"); 1378e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1379e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (TRUE); 1380e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1381e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if ( btm_status == BTM_BUSY ) 1382e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1383e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG0("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is busy"); 1384e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1385e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Remote name discovery is on going now so BTM cannot notify through "bta_dm_remname_cback" */ 1386e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* adding callback to get notified that current reading remore name done */ 1387e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SecAddRmtNameNotifyCallback(&bta_dm_service_search_remname_cback); 1388e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1389e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (TRUE); 1390e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1391e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1392e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1393e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_WARNING1("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName returns 0x%02X", btm_status); 1394e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1395e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (FALSE); 1396e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1397e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1398e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1399e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1400e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1401e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_inq_cmpl 1402e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1403e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Process the inquiry complete event from BTM 1404e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1405e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 1406e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1407e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1408e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_inq_cmpl (tBTA_DM_MSG *p_data) 1409e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1410e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_MSG * p_msg; 1411e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_SEARCH data; 1412e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1413e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG0("bta_dm_inq_cmpl"); 1414e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1415e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach data.inq_cmpl.num_resps = p_data->inq_cmpl.num; 1416e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_search_cback(BTA_DM_INQ_CMPL_EVT, &data); 1417e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1418e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if((bta_dm_search_cb.p_btm_inq_info = BTM_InqDbFirst()) != NULL) 1419e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1420e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* start name and service discovery from the first device on inquiry result */ 1421e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.name_discover_done = FALSE; 1422e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.peer_name[0] = 0; 1423e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_discover_device(bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr); 1424e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1425e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1426e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1427e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* no devices, search complete */ 1428e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.services = 0; 1429e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1430e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) 1431e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1432e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; 1433e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; 1434e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_msg); 1435e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1436e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1437e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1438e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1439e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1440e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1441e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_rmt_name 1442e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1443e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Process the remote name result from BTM 1444e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1445e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 1446e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1447e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1448e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_rmt_name (tBTA_DM_MSG *p_data) 1449e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1450e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG0("bta_dm_rmt_name"); 1451e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1452e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( p_data->rem_name.result.disc_res.bd_name[0] && bta_dm_search_cb.p_btm_inq_info) 1453e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1454e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name = TRUE; 1455e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1456e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1457e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_discover_device(bta_dm_search_cb.peer_bdaddr); 1458e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1459e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1460e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1461e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1462e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_disc_rmt_name 1463e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1464e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Process the remote name result from BTM when application 1465e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** wants to find the name for a bdaddr 1466e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1467e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 1468e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1469e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1470e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_disc_rmt_name (tBTA_DM_MSG *p_data) 1471e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1472e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_INQ_INFO *p_btm_inq_info; 1473e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1474e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG0("bta_dm_disc_rmt_name"); 1475e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1476e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_btm_inq_info = BTM_InqDbRead (p_data->rem_name.result.disc_res.bd_addr); 1477e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( p_btm_inq_info ) 1478e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1479e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( p_data->rem_name.result.disc_res.bd_name[0] ) 1480e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1481e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_btm_inq_info->appl_knows_rem_name = TRUE; 1482e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1483e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1484e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1485e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_discover_device(p_data->rem_name.result.disc_res.bd_addr); 1486e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1487e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1488e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1489e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1490e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_sdp_result 1491e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1492e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Process the discovery result from sdp 1493e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1494e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 1495e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1496e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1497e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_sdp_result (tBTA_DM_MSG *p_data) 1498e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1499e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1500e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tSDP_DISC_REC *p_sdp_rec = NULL; 1501e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_MSG *p_msg; 1502e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN service_found = FALSE; 1503e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN scn_found = FALSE; 1504e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 service = 0xFFFF; 1505e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tSDP_PROTOCOL_ELEM pe; 1506e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1507e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE 1508e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBT_UUID *p_uuid = bta_dm_search_cb.p_srvc_uuid; 1509e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_SEARCH result; 1510e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBT_UUID service_uuid; 1511e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 1512e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 15134ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy UINT32 num_uuids = 0; 15144ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy UINT8 uuid_list[32][MAX_UUID_SIZE]; // assuming a max of 32 services 15154ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy 1516e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if((p_data->sdp_event.sdp_result == SDP_SUCCESS) 15176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach || (p_data->sdp_event.sdp_result == SDP_NO_RECS_MATCH) 1518e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach || (p_data->sdp_event.sdp_result == SDP_DB_FULL)) 1519e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1520e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("sdp_result::0x%x", p_data->sdp_event.sdp_result); 1521e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach do 1522e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1523e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1524e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach service_found = FALSE; 1525e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_sdp_rec = NULL; 1526e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( bta_dm_search_cb.service_index == (BTA_USER_SERVICE_ID+1) ) 15276ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach { 1528e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_sdp_rec = SDP_FindServiceUUIDInDb(bta_dm_search_cb.p_sdp_db, &bta_dm_search_cb.uuid, p_sdp_rec); 1529e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1530e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_sdp_rec && SDP_FindProtocolListElemInRec(p_sdp_rec, UUID_PROTOCOL_RFCOMM, &pe)) 15316ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach { 15326ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_dm_search_cb.peer_scn = (UINT8) pe.params[0]; 1533e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach scn_found = TRUE; 1534e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 15356ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach } 1536e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1537e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 15384ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy service = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index-1]; 1539e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_sdp_rec = SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db, service, p_sdp_rec); 1540e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1541e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE 1542e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* finished with BR/EDR services, now we check the result for GATT based service UUID */ 1543e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_search_cb.service_index == BTA_MAX_SERVICE_ID) 1544e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1545e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_search_cb.uuid_to_search != 0 && p_uuid != NULL) 1546e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1547e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_uuid += (bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search); 1548e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* only support 16 bits UUID for now */ 1549e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach service = p_uuid->uu.uuid16; 1550e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1551e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1552e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* all GATT based services */ 15536ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach do 1554e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1555e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* find a service record, report it */ 1556e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_sdp_rec = SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db, 1557e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 0, p_sdp_rec); 1558e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_sdp_rec) 1559e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1560e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (SDP_FindServiceUUIDInRec(p_sdp_rec, &service_uuid)) 1561e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1562e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* send result back to app now, one by one */ 1563e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy (result.disc_ble_res.bd_addr, bta_dm_search_cb.peer_bdaddr); 1564e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BCM_STRNCPY_S((char*)result.disc_ble_res.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN-1)); 1565e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result.disc_ble_res.service.len = service_uuid.len; 1566e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result.disc_ble_res.service.uu.uuid16 = service_uuid.uu.uuid16; 15676ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 1568e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_search_cback(BTA_DM_DISC_BLE_RES_EVT, &result); 1569e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1570e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1571e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1572e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_search_cb.uuid_to_search > 0) 1573e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 1574e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1575e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } while (p_sdp_rec); 1576e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1577e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1578e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 1579e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 15806ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach /* SDP_DB_FULL means some records with the 1581e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach required attributes were received */ 15827b7aa6c5a9498e9e3ac3c6f16ee9164268314f60Srikanth Uppala if(((p_data->sdp_event.sdp_result == SDP_DB_FULL) && 15837b7aa6c5a9498e9e3ac3c6f16ee9164268314f60Srikanth Uppala bta_dm_search_cb.services != BTA_ALL_SERVICE_MASK) || 1584e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (p_sdp_rec != NULL)) 1585e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1586e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* If Plug and Play service record, check to see if Broadcom stack */ 1587e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (service == UUID_SERVCLASS_PNP_INFORMATION) 1588e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1589e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_sdp_rec) 1590e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1591e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (SDP_FindAttributeInRec (p_sdp_rec, ATTR_ID_EXT_BRCM_VERSION)) 1592e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1593e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach service_found = TRUE; 1594e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1595e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1596e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1597e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1598e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1599e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach service_found = TRUE; 1600e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1601e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1602e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (service_found) 1603e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 16044ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy UINT16 tmp_svc = 0xFFFF; 1605e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.services_found |= 1606e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index-1)); 16074ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy tmp_svc = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index-1]; 16084ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy /* Add to the list of UUIDs */ 16094ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy sdpu_uuid16_to_uuid128(tmp_svc, uuid_list[num_uuids]); 16104ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy num_uuids++; 1611e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1612e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1613e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1614e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 16156ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK && 1616e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.services_to_search == 0) 1617e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1618e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE 1619e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID && 1620e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.uuid_to_search > 0) 1621e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.uuid_to_search --; 1622e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1623e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_search_cb.uuid_to_search == 0 || 1624e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.service_index != BTA_BLE_SERVICE_ID) 1625e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 1626e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.service_index++; 1627e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1628e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else /* regular one service per search or PNP search */ 1629e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 1630e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1631e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 16326ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach while(bta_dm_search_cb.service_index <= BTA_MAX_SERVICE_ID); 1633e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1634e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach// GKI_freebuf(bta_dm_search_cb.p_sdp_db); 1635e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach// bta_dm_search_cb.p_sdp_db = NULL; 1636e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("bta_dm_sdp_result services_found = %04x", bta_dm_search_cb.services_found); 1637e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 16384ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy /* Collect the 128-bit services here and put them into the list */ 16394ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK) 16404ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy { 16414ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy p_sdp_rec = NULL; 16424ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy do 16434ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy { 16444ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy tBT_UUID temp_uuid; 16454ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy /* find a service record, report it */ 16464ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy p_sdp_rec = SDP_FindServiceInDb_128bit(bta_dm_search_cb.p_sdp_db, p_sdp_rec); 16474ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy if (p_sdp_rec) 16484ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy { 16494ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy if (SDP_FindServiceUUIDInRec_128bit(p_sdp_rec, &temp_uuid)) 16504ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy { 16514ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy memcpy(uuid_list[num_uuids], temp_uuid.uu.uuid128, MAX_UUID_SIZE); 16524ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy num_uuids++; 16534ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy } 16544ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy } 16554ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy } while (p_sdp_rec); 16564ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy } 1657e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if there are more services to search for */ 1658e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_search_cb.services_to_search) 1659e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1660e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Free up the p_sdp_db before checking the next one */ 1661e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_free_sdp_db(NULL); 1662e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_find_services(bta_dm_search_cb.peer_bdaddr); 1663e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1664e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1665e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1666e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* callbacks */ 1667e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* start next bd_addr if necessary */ 1668e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1669e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback); 1670e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1671e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1672e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) 1673e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1674e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT; 1675e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.result = BTA_SUCCESS; 1676e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.p_raw_data = NULL; 1677e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.raw_data_size = 0; 16784ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy p_msg->disc_result.result.disc_res.num_uuids = num_uuids; 16794ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy p_msg->disc_result.result.disc_res.p_uuid_list = NULL; 16804ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy if (num_uuids > 0) { 16814ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy p_msg->disc_result.result.disc_res.p_uuid_list = (UINT8*)GKI_getbuf(num_uuids*MAX_UUID_SIZE); 16824ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy if (p_msg->disc_result.result.disc_res.p_uuid_list) { 16834ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy memcpy(p_msg->disc_result.result.disc_res.p_uuid_list, uuid_list, 16844ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy num_uuids*MAX_UUID_SIZE); 16854ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy } else { 16864ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy p_msg->disc_result.result.disc_res.num_uuids = 0; 16874ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy APPL_TRACE_ERROR1("%s: Unable to allocate memory for uuid_list", __FUNCTION__); 16884ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy } 16894ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy } 1690e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach //copy the raw_data to the discovery result structure 1691e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach // 1692e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG2("bta_dm_sdp_result (raw_data used = 0x%x raw_data_ptr = 0x%x)\r\n",bta_dm_search_cb.p_sdp_db->raw_used, bta_dm_search_cb.p_sdp_db->raw_data); 16936ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 1694e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( bta_dm_search_cb.p_sdp_db != NULL && bta_dm_search_cb.p_sdp_db->raw_used != 0 && 1695e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_sdp_db->raw_data != NULL) { 16966ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 1697e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.p_raw_data = GKI_getbuf(bta_dm_search_cb.p_sdp_db->raw_used); 1698e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( NULL != p_msg->disc_result.result.disc_res.p_raw_data ) { 16996ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach memcpy( p_msg->disc_result.result.disc_res.p_raw_data, 17006ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_dm_search_cb.p_sdp_db->raw_data, 1701e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_sdp_db->raw_used ); 17026ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 17036ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach p_msg->disc_result.result.disc_res.raw_data_size = 1704e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_sdp_db->raw_used; 17056ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 1706e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } else { 1707e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("bta_dm_sdp_result GKI Alloc failed to allocate %d bytes !!\r\n",bta_dm_search_cb.p_sdp_db->raw_used); 1708e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 17096ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 1710e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_sdp_db->raw_data = NULL; //no need to free this - it is a global assigned. 1711e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_sdp_db->raw_used = 0; 17126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_dm_search_cb.p_sdp_db->raw_size = 0; 1713e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1714e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else { 1715e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG0("bta_dm_sdp_result raw data size is 0 or raw_data is null!!\r\n"); 1716e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1717e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Done with p_sdp_db. Free it */ 1718e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_free_sdp_db(NULL); 1719e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found; 17206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 1721e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach //Piggy back the SCN over result field 17226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if( scn_found ) 1723e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1724e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.result = (3 + bta_dm_search_cb.peer_scn); 1725e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.services |= BTA_USER_SERVICE_MASK; 17264ccd6261b39fef1854761442b10deac3490be623Kausik Sinnaswamy 1727e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_EVENT1(" Piggy back the SCN over result field SCN=%d", bta_dm_search_cb.peer_scn); 1728e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1729e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1730e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr); 1731e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME), 1732e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_get_remname(), (BD_NAME_LEN-1)); 1733e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1734e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* make sure the string is null terminated */ 1735e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0; 1736e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1737e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_msg); 1738e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1739e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1740e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1741e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1742e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1743e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1744e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1745e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* conn failed. No need for timer */ 1746e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_data->sdp_event.sdp_result == SDP_CONN_FAILED || p_data->sdp_event.sdp_result == SDP_CONN_REJECTED 1747e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach || p_data->sdp_event.sdp_result == SDP_SECURITY_ERR) 1748e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.wait_disc = FALSE; 1749e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1750e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* not able to connect go to next device */ 1751e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_freebuf(bta_dm_search_cb.p_sdp_db); 1752e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_sdp_db = NULL; 1753e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1754e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback); 1755e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1756e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) 1757e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1758e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT; 1759e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.result = BTA_FAILURE; 1760e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found; 1761e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr); 1762e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME), 1763e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_get_remname(), (BD_NAME_LEN-1)); 1764e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1765e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* make sure the string is null terminated */ 1766e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0; 1767e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1768e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_msg); 1769e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1770e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1771e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1772e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1773e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1774e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1775e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_search_cmpl 1776e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1777e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Sends event to application 1778e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1779e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 1780e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1781e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1782e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_search_cmpl (tBTA_DM_MSG *p_data) 1783e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1784e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG0("bta_dm_search_cmpl"); 1785e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1786e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE) 1787e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid); 1788e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 1789e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1790e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->hdr.layer_specific == BTA_DM_API_DI_DISCOVER_EVT) 1791e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_di_disc_cmpl(p_data); 1792e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1793e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_search_cback(BTA_DM_DISC_CMPL_EVT, NULL); 1794e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1795e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1796e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1797e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1798e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_disc_result 1799e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1800e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Service discovery result when discovering services on a device 1801e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1802e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 1803e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1804e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1805e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_disc_result (tBTA_DM_MSG *p_data) 1806e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1807e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_MSG * p_msg; 1808e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1809e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG0("bta_dm_disc_result"); 1810e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1811e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE 1812e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if any BR/EDR service discovery has been done, report the event */ 1813e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((bta_dm_search_cb.services & ((BTA_ALL_SERVICE_MASK | BTA_USER_SERVICE_MASK ) & ~BTA_BLE_SERVICE_MASK))) 1814e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 1815e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, &p_data->disc_result.result); 1816e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1817e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* send a message to change state */ 1818e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) 1819e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1820e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; 1821e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; 1822e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_msg); 1823e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1824e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1825e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1826e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1827e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1828e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_search_result 1829e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1830e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Service discovery result while searching for devices 1831e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1832e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 1833e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1834e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1835e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_search_result (tBTA_DM_MSG *p_data) 1836e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 18376ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach APPL_TRACE_DEBUG2("bta_dm_search_result searching:0x%04x, result:0x%04x", 18386ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_dm_search_cb.services, 1839e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->disc_result.result.disc_res.services); 1840e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1841e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* call back if application wants name discovery or found services that application is searching */ 1842e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (( !bta_dm_search_cb.services ) 1843e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ||(( bta_dm_search_cb.services ) && ( p_data->disc_result.result.disc_res.services ))) 1844e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1845e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, &p_data->disc_result.result); 1846e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1847e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1848e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if searching did not initiate to create link */ 1849e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(!bta_dm_search_cb.wait_disc ) 1850e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1851e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if ( BTM_EIR_CLIENT_INCLUDED == TRUE ) 1852e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if service searching is done with EIR, don't search next device */ 1853e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( bta_dm_search_cb.p_btm_inq_info ) 1854e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 1855e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_discover_next_device(); 1856e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1857e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 1858e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1859e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* wait until link is disconnected or timeout */ 1860e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.sdp_results = TRUE; 1861e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.search_timer.p_cback = (TIMER_CBACK*)&bta_dm_search_timer_cback; 1862e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_start_timer(&bta_dm_search_cb.search_timer, 0, 1000*(L2CAP_LINK_INACTIVITY_TOUT+1) ); 1863e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1864e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1865e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1866e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1867e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1868e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1869e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_search_timer_cback 1870e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1871e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Called when ACL disconnect time is over 1872e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 18736ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 18746ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 1875e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1876e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1877e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_search_timer_cback (TIMER_LIST_ENT *p_tle) 1878e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1879e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1880e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_EVENT0(" bta_dm_search_timer_cback "); 1881e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.wait_disc = FALSE; 1882e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1883e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* proceed with next device */ 1884e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_discover_next_device(); 1885e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1886e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1887e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1888e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1889e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1890e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1891e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_free_sdp_db 1892e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 18936ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description Frees SDP data base 1894e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1895e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 1896e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1897e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1898e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_free_sdp_db (tBTA_DM_MSG *p_data) 1899e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1900e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_search_cb.p_sdp_db) 1901e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1902e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_freebuf(bta_dm_search_cb.p_sdp_db); 1903e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_sdp_db = NULL; 1904e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1905e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1906e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1907e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1908e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1909e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1910e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_queue_search 1911e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1912e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Queues search command while search is being cancelled 1913e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1914e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 1915e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1916e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1917e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_queue_search (tBTA_DM_MSG *p_data) 1918e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1919e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1920e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_search_queue = (tBTA_DM_MSG *)GKI_getbuf(sizeof(tBTA_DM_API_SEARCH)); 1921e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(bta_dm_search_cb.p_search_queue, p_data, sizeof(tBTA_DM_API_SEARCH)); 1922e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1923e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1924e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1925e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1926e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1927e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_queue_disc 1928e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1929e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Queues discovery command while search is being cancelled 1930e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1931e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 1932e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1933e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1934e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_queue_disc (tBTA_DM_MSG *p_data) 1935e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1936e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1937e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_search_queue = (tBTA_DM_MSG *)GKI_getbuf(sizeof(tBTA_DM_API_DISCOVER)); 1938e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(bta_dm_search_cb.p_search_queue, p_data, sizeof(tBTA_DM_API_DISCOVER)); 1939e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1940e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1941e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1942e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1943e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1944e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_search_clear_queue 1945e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1946e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Clears the queue if API search cancel is called 1947e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1948e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 1949e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1950e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1951e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_search_clear_queue (tBTA_DM_MSG *p_data) 1952e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1953e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1954e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_search_cb.p_search_queue) 1955e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1956e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_freebuf(bta_dm_search_cb.p_search_queue); 1957e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_search_queue = NULL; 1958e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1959e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1960e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1961e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1962e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1963e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1964e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1965e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_search_cancel_cmpl 1966e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1967e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Search cancel is complete 1968e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1969e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 1970e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1971e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1972e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_search_cancel_cmpl (tBTA_DM_MSG *p_data) 1973e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1974e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1975e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_search_cb.p_search_queue) 1976e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1977e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(bta_dm_search_cb.p_search_queue); 1978e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_search_queue = NULL; 1979e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 1980e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1981e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 1982e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1983e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 1984e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1985e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_search_cancel_transac_cmpl 1986e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 19876ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description Current Service Discovery or remote name procedure is 1988e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** completed after search cancellation 1989e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1990e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 1991e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1992e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 1993e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_search_cancel_transac_cmpl(tBTA_DM_MSG *p_data) 1994e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 1995e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1996e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_search_cb.p_sdp_db) 1997e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1998e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_freebuf(bta_dm_search_cb.p_sdp_db); 1999e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_sdp_db = NULL; 2000e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2001e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2002e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cancel_notify(NULL); 2003e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 2004e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2005e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2006e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 2007e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2008e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_search_cancel_notify 2009e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 20106ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description Notify application that search has been cancelled 2011e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2012e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 2013e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2014e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 2015e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_search_cancel_notify (tBTA_DM_MSG *p_data) 2016e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 2017e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_search_cb.p_search_cback) 2018e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2019e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_search_cback(BTA_DM_SEARCH_CANCEL_CMPL_EVT, NULL); 2020e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2021e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!bta_dm_search_cb.name_discover_done) 2022e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2023e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_CancelRemoteDeviceName(); 2024e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2025e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if ((BLE_INCLUDED == TRUE) && (defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)) 2026e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_search_cb.gatt_disc_active) 2027e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2028e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr); 2029e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2030e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 2031e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2032e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 2033e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2034e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 2035e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2036e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_find_services 2037e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2038e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Starts discovery on a device 2039e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2040e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 2041e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2042e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 2043e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_find_services ( BD_ADDR bd_addr) 2044e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 2045e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2046e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tSDP_UUID uuid; 2047e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 attr_list[] = {ATTR_ID_SERVICE_CLASS_ID_LIST, ATTR_ID_EXT_BRCM_VERSION}; 2048e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 num_attrs = 1; 2049e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_MSG *p_msg; 20506ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 2051e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset (&uuid, 0, sizeof(tSDP_UUID)); 2052e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2053e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach while(bta_dm_search_cb.service_index < BTA_MAX_SERVICE_ID) 2054e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 20556ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if( bta_dm_search_cb.services_to_search 2056e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach & (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index))) 2057e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2058e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if((bta_dm_search_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)GKI_getbuf(BTA_DM_SDP_DB_SIZE)) != NULL) 20596ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach { 2060e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("bta_dm_search_cb.services = %04x***********", bta_dm_search_cb.services); 2061e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* try to search all services by search based on L2CAP UUID */ 2062e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK ) 2063e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2064e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR1("services_to_search = %08x",bta_dm_search_cb.services_to_search); 2065e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_search_cb.services_to_search & BTA_RES_SERVICE_MASK) 2066e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2067e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[0]; 2068e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.services_to_search &= ~BTA_RES_SERVICE_MASK; 2069e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2070e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 2071e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2072e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach uuid.uu.uuid16 = UUID_PROTOCOL_L2CAP; 2073e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.services_to_search = 0; 2074e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2075e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2076e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 2077e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2078e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE 2079e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* for LE only profile */ 2080e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID) 2081e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 20826ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if (bta_dm_search_cb.uuid_to_search > 0 && bta_dm_search_cb.p_srvc_uuid) 2083e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 20846ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach memcpy(&uuid, 2085e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (const void *)(bta_dm_search_cb.p_srvc_uuid + \ 20866ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search), 2087e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sizeof(tBT_UUID)); 2088e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2089e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.uuid_to_search -- ; 2090e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2091e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 2092e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index]; 2093e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2094e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* last one? clear the BLE service bit if all discovery has been done */ 2095e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_search_cb.uuid_to_search == 0) 2096e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.services_to_search &= 2097e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index))); 20986ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 2099e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 2101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 2102e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* remove the service from services to be searched */ 2104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.services_to_search &= 2105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index))); 2106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index]; 2107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 21096ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 2110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (uuid.len == 0) 2111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach uuid.len = LEN_UUID_16; 2112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if 0 2114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (uuid.uu.uuid16 == UUID_SERVCLASS_PNP_INFORMATION) 2115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_attrs = 2; 2117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 2119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_search_cb.service_index == BTA_USER_SERVICE_ID) 2121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(&uuid, &bta_dm_search_cb.uuid, sizeof(tSDP_UUID)); 2123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR1("****************search UUID = %04x***********", uuid.uu.uuid16); 2127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach //SDP_InitDiscoveryDb (bta_dm_search_cb.p_sdp_db, BTA_DM_SDP_DB_SIZE, 1, &uuid, num_attrs, attr_list); 2128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SDP_InitDiscoveryDb (bta_dm_search_cb.p_sdp_db, BTA_DM_SDP_DB_SIZE, 1, &uuid, 0, NULL); 21296ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 2130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(g_disc_raw_data_buf, 0, sizeof(g_disc_raw_data_buf)); 2132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_sdp_db->raw_data = g_disc_raw_data_buf; 21336ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 2134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_sdp_db->raw_size = MAX_DISC_RAW_DATA_BUF; 21356ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 2136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!SDP_ServiceSearchAttributeRequest (bd_addr, bta_dm_search_cb.p_sdp_db, &bta_dm_sdp_callback)) 2137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if discovery not successful with this device 2139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach proceed to next one */ 2140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_freebuf(bta_dm_search_cb.p_sdp_db); 2141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_sdp_db = NULL; 2142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.service_index = BTA_MAX_SERVICE_ID; 2143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 2146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE 2148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID && 2149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.uuid_to_search == 0) || 2150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.service_index != BTA_BLE_SERVICE_ID) 2151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 2152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.service_index++; 2153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 2154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 2157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("#### Failed to allocate SDP DB buffer! ####"); 2159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.service_index++; 2163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* no more services to be discovered */ 2166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_search_cb.service_index >= BTA_MAX_SERVICE_ID) 2167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) 2169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT; 2171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found; 2172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr); 2173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME), 2174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_get_remname(), (BD_NAME_LEN-1)); 2175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* make sure the string is terminated */ 2177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0; 2178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_msg); 2180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 2183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 2185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_discover_next_device 2187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Starts discovery on the next device in Inquiry data base 2189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 2191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 2193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_discover_next_device(void) 2194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 2195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_MSG * p_msg; 2197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG0("bta_dm_discover_next_device"); 2199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* searching next device on inquiry result */ 2201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if((bta_dm_search_cb.p_btm_inq_info = BTM_InqDbNext(bta_dm_search_cb.p_btm_inq_info)) != NULL) 2202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.name_discover_done = FALSE; 2204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.peer_name[0] = 0; 2205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_discover_device(bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr); 2206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 2208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* no devices, search complete */ 2210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.services = 0; 2211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) 2213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; 2215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; 2216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_msg); 2217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 2220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 2222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_discover_device 2224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Starts name and service discovery on the device 2226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 2228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 2230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_discover_device(BD_ADDR remote_bd_addr) 2231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 2232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_MSG * p_msg; 2233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE 2235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBT_DEVICE_TYPE dev_type; 2236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBLE_ADDR_TYPE addr_type; 2237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 2238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG6("bta_dm_discover_device, BDA:0x%02X%02X%02X%02X%02X%02X", 2240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach remote_bd_addr[0],remote_bd_addr[1], 2241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach remote_bd_addr[2],remote_bd_addr[3], 2242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach remote_bd_addr[4],remote_bd_addr[5]); 2243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(bta_dm_search_cb.peer_bdaddr, remote_bd_addr); 2245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG2("bta_dm_discover_device name_discover_done = %d p_btm_inq_info 0x%x ", 2247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.name_discover_done, 2248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_btm_inq_info 2249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ); 2250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( bta_dm_search_cb.p_btm_inq_info ) { 22516ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 2252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("bta_dm_discover_device appl_knows_rem_name %d", 2253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name 2254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ); 2255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if name discovery is not done and application needs remote name */ 2258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((!bta_dm_search_cb.name_discover_done) 2259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach && (( bta_dm_search_cb.p_btm_inq_info == NULL ) 2260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ||(bta_dm_search_cb.p_btm_inq_info && (!bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name)))) 2261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( bta_dm_read_remote_device_name(bta_dm_search_cb.peer_bdaddr) == TRUE ) 2263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 2265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 2267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* starting name discovery failed */ 2269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.name_discover_done = TRUE; 2270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if application wants to discover service */ 2274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( bta_dm_search_cb.services ) 2275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* initialize variables */ 2277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.service_index = 0; 2278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.services_found = 0; 2279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.services_to_search = bta_dm_search_cb.services; 2280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE 2281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.uuid_to_search = bta_dm_search_cb.num_uuid; 2282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 2283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if ( BTM_EIR_CLIENT_INCLUDED == TRUE ) 2284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((bta_dm_search_cb.p_btm_inq_info != NULL) && 2285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.services != BTA_USER_SERVICE_MASK 2286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &&(bta_dm_search_cb.sdp_search == FALSE)) 2287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* check if EIR provides the information of supported services */ 2289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_eir_search_services( &bta_dm_search_cb.p_btm_inq_info->results, 2290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &bta_dm_search_cb.services_to_search, 2291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &bta_dm_search_cb.services_found ); 2292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if seaching with EIR is not completed */ 2295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_search_cb.services_to_search) 2296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 2297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* check whether connection already exists to the device 2299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if connection exists, we don't have to wait for ACL 2300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach link to go down to start search on next device */ 2301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(BTM_IsAclConnectionUp(bta_dm_search_cb.peer_bdaddr)) 2302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.wait_disc = FALSE; 2303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 2304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.wait_disc = TRUE; 2305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BLE_INCLUDED == TRUE && (defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)) 23076ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if ( bta_dm_search_cb.p_btm_inq_info ) 2308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG3("bta_dm_discover_device p_btm_inq_info 0x%x results.device_type 0x%x services_to_search 0x%x", 2310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_btm_inq_info, 2311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_btm_inq_info->results.device_type, 2312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.services_to_search 2313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ); 2314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_ReadDevInfo(remote_bd_addr, &dev_type, &addr_type); 2316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (dev_type == BT_DEVICE_TYPE_BLE) 2318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* 2319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( bta_dm_search_cb.p_btm_inq_info != NULL && 2320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_btm_inq_info->results.device_type == BT_DEVICE_TYPE_BLE && 2321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (bta_dm_search_cb.services_to_search & BTA_BLE_SERVICE_MASK))*/ 23226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach { 2323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_search_cb.services_to_search & BTA_BLE_SERVICE_MASK) 2324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach //set the raw data buffer here 2326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(g_disc_raw_data_buf, 0, sizeof(g_disc_raw_data_buf)); 2327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_ble_rawdata = g_disc_raw_data_buf; 23286ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 2329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.ble_raw_size = MAX_DISC_RAW_DATA_BUF; 2330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.ble_raw_used = 0; 23316ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 2332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* start GATT for service discovery */ 2333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_dm_start_gatt_discovery(bta_dm_search_cb.peer_bdaddr); 2334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 2335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 2338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 2339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.sdp_results = FALSE; 2341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_find_services(bta_dm_search_cb.peer_bdaddr); 2342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2343e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 2344e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2345e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2346e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2347e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* name discovery and service discovery are done for this device */ 2349e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) 2350e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2351e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT; 2352e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* initialize the data structure - includes p_raw_data and raw_data_size */ 2353e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&(p_msg->disc_result.result), 0, sizeof(tBTA_DM_DISC_RES)); 2354e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.result = BTA_SUCCESS; 2355e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found; 2356e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr); 2357e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME), 2358e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (char*)bta_dm_search_cb.peer_name, (BD_NAME_LEN-1)); 2359e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2360e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* make sure the string is terminated */ 2361e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0; 2362e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2363e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_msg); 2364e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2365e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 2366e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2367e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 2368e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2369e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_sdp_callback 2370e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2371e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Callback from sdp with discovery status 2372e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2373e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 2374e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2375e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 2376e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_sdp_callback (UINT16 sdp_status) 2377e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 2378e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2379e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_SDP_RESULT * p_msg; 2380e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2381e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_msg = (tBTA_DM_SDP_RESULT *) GKI_getbuf(sizeof(tBTA_DM_SDP_RESULT))) != NULL) 2382e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2383e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.event = BTA_DM_SDP_RESULT_EVT; 2384e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->sdp_result = sdp_status; 2385e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_msg); 2386e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2387e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2388e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 2389e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2390e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 2391e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2392e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_inq_results_cb 2393e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 23946ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description Inquiry results callback from BTM 2395e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2396e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 2397e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2398e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 2399e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_inq_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir) 2400e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 2401e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2402e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_SEARCH result; 2403e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_INQ_INFO *p_inq_info; 2404e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 service_class; 2405e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2406e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(result.inq_res.bd_addr, p_inq->remote_bd_addr); 2407e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(result.inq_res.dev_class, p_inq->dev_class, DEV_CLASS_LEN); 2408e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_COD_SERVICE_CLASS(service_class, p_inq->dev_class); 2409e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result.inq_res.is_limited = (service_class & BTM_COD_SERVICE_LMTD_DISCOVER)?TRUE:FALSE; 2410e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result.inq_res.rssi = p_inq->rssi; 2411e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2412e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BLE_INCLUDED == TRUE) 2413e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result.inq_res.ble_addr_type = p_inq->ble_addr_type; 2414e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result.inq_res.inq_result_type = p_inq->inq_result_type; 2415e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result.inq_res.device_type = p_inq->device_type; 2416e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2417e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 2418e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2419e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* application will parse EIR to find out remote device name */ 2420e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result.inq_res.p_eir = p_eir; 2421e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2422e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if((p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr)) != NULL) 2423e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2424e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* initialize remt_name_not_required to FALSE so that we get the name by default */ 2425e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result.inq_res.remt_name_not_required = FALSE; 2426e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2427e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 24286ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 2429e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_search_cb.p_search_cback) 2430e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_search_cback(BTA_DM_INQ_RES_EVT, &result); 2431e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2432e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_inq_info) 2433e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 24346ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach /* application indicates if it knows the remote name, inside the callback 2435e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach copy that to the inquiry data base*/ 2436e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(result.inq_res.remt_name_not_required) 2437e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_inq_info->appl_knows_rem_name = TRUE; 2438e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2439e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2440e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 24416ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 2442e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 2443e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2444e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2445e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 2446e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2447e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_inq_cmpl_cb 2448e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 24496ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description Inquiry complete callback from BTM 2450e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2451e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 2452e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2453e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 2454e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_inq_cmpl_cb (void * p_result) 2455e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 2456e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2457e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_MSG * p_msg; 2458e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2459e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG0("bta_dm_inq_cmpl_cb"); 2460e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) 2461e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2462e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->inq_cmpl.hdr.event = BTA_DM_INQUIRY_CMPL_EVT; 2463e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->inq_cmpl.num = ((tBTM_INQUIRY_CMPL *)p_result)->num_resp; 2464e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_msg); 2465e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2466e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2467e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2468e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2469e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 2470e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2471e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 2472e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2473e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_service_search_remname_cback 2474e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 24756ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description Remote name call back from BTM during service discovery 2476e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2477e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 2478e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2479e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 2480e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_service_search_remname_cback (BD_ADDR bd_addr, DEV_CLASS dc, BD_NAME bd_name) 2481e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 2482e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_REMOTE_DEV_NAME rem_name; 2483e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_STATUS btm_status; 2484e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2485e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("bta_dm_service_search_remname_cback name=<%s>", bd_name); 2486e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2487e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if this is what we are looking for */ 2488e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!bdcmp( bta_dm_search_cb.peer_bdaddr, bd_addr)) 2489e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2490e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rem_name.length = strlen((char*)bd_name); 2491e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (rem_name.length > (BD_NAME_LEN-1)) 2492e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2493e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rem_name.length = (BD_NAME_LEN-1); 2494e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rem_name.remote_bd_name[(BD_NAME_LEN-1)] = 0; 2495e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2496e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BCM_STRNCPY_S((char*)rem_name.remote_bd_name, sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1)); 2497e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rem_name.status = BTM_SUCCESS; 2498e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2499e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_remname_cback(&rem_name); 2500e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2501e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 2502e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2503e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* get name of device */ 2504e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_status = BTM_ReadRemoteDeviceName (bta_dm_search_cb.peer_bdaddr, 2505e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (tBTM_CMPL_CB *) bta_dm_remname_cback); 2506e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( btm_status == BTM_BUSY ) 2507e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2508e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* wait for next chance(notification of remote name discovery done) */ 2509e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG0("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName is busy"); 2510e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2511e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if ( btm_status != BTM_CMD_STARTED ) 2512e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2513e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if failed to start getting remote name then continue */ 2514e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_WARNING1("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName returns 0x%02X", btm_status); 2515e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2516e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rem_name.length = 0; 2517e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rem_name.remote_bd_name[0] = 0; 2518e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach rem_name.status = btm_status; 2519e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_remname_cback(&rem_name); 2520e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2521e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2522e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 2523e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2524e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2525e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 2526e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2527e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_remname_cback 2528e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2529e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Remote name complete call back from BTM 2530e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2531e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 2532e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2533e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 2534e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_remname_cback (tBTM_REMOTE_DEV_NAME *p_remote_name) 2535e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 2536e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_REM_NAME * p_msg; 2537e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2538e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("bta_dm_remname_cback name=<%s>", p_remote_name->remote_bd_name); 2539e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2540e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* remote name discovery is done but it could be failed */ 2541e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.name_discover_done = TRUE; 2542e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BCM_STRNCPY_S((char*)bta_dm_search_cb.peer_name, sizeof(BD_NAME), (char*)p_remote_name->remote_bd_name, (BD_NAME_LEN-1)); 2543e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.peer_name[BD_NAME_LEN-1]=0; 2544e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2545e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback); 2546e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2547e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_msg = (tBTA_DM_REM_NAME *) GKI_getbuf(sizeof(tBTA_DM_REM_NAME))) != NULL) 2548e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2549e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy (p_msg->result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr); 2550e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BCM_STRNCPY_S((char*)p_msg->result.disc_res.bd_name, sizeof(BD_NAME), (char*)p_remote_name->remote_bd_name, (BD_NAME_LEN-1)); 2551e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2552e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* make sure the string is null terminated */ 2553e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->result.disc_res.bd_name[BD_NAME_LEN-1] = 0; 2554e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2555e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.event = BTA_DM_REMT_NAME_EVT; 2556e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_msg); 2557e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2558e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2559e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 2560e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2561e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 2562e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2563e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_authorize_cback 2564e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 25656ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description cback requesting authorization 2566e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2567e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 2568e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2569e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 2570e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic UINT8 bta_dm_authorize_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, 2571e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 *service_name, UINT8 service_id, BOOLEAN is_originator) 2572e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 2573e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_SEC sec_event; 2574e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 index = 1; 2575e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2576e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(sec_event.authorize.bd_addr, bd_addr); 2577e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(sec_event.authorize.dev_class, dev_class, DEV_CLASS_LEN); 2578e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2579e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BCM_STRNCPY_S((char*)sec_event.authorize.bd_name, sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1)); 2580e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2581e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* make sure the string is null terminated */ 2582e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.authorize.bd_name[BD_NAME_LEN-1] = 0; 2583e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2584e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if ( defined(BTA_JV_INCLUDED) && BTA_JV_INCLUDED == TRUE ) 2585e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.authorize.service = service_id; 2586e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 2587e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2588e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach while(index < BTA_MAX_SERVICE_ID) 2589e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2590e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* get the BTA service id corresponding to BTM id */ 2591e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_service_id_to_btm_srv_id_lkup_tbl[index] == service_id) 2592e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2593e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.authorize.service = index; 2594e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 2595e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2596e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach index++; 2597e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2598e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2599e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2600e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if supported service callback otherwise not authorized */ 2601e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_cb.p_sec_cback && (index < BTA_MAX_SERVICE_ID 2602e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if ( defined(BTA_JV_INCLUDED) && BTA_JV_INCLUDED == TRUE ) 2603e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* pass through JV service ID */ 2604e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach || (service_id >= BTA_FIRST_JV_SERVICE_ID && service_id <= BTA_LAST_JV_SERVICE_ID) 2605e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 2606e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach )) 2607e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2608e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_sec_cback(BTA_DM_AUTHORIZE_EVT, &sec_event); 2609e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BTM_CMD_STARTED; 2610e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2611e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 2612e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2613e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BTM_NOT_AUTHORIZED; 2614e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2615e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 2616e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2617e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2618e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2619e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2620e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2621e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 2622e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2623e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_pinname_cback 2624e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 26256ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description Callback requesting pin_key 2626e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2627e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 2628e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2629e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 2630e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_pinname_cback (void *p_data) 2631e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 2632e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_REMOTE_DEV_NAME *p_result = (tBTM_REMOTE_DEV_NAME *)p_data; 2633e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_SEC sec_event; 2634e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT32 bytes_to_copy; 2635e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_SEC_EVT event = bta_dm_cb.pin_evt; 2636e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2637e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (BTA_DM_SP_CFM_REQ_EVT == event) 2638e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2639e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Retrieved saved device class and bd_addr */ 2640e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(sec_event.cfm_req.bd_addr, bta_dm_cb.pin_bd_addr); 2641e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTA_COPY_DEVICE_CLASS(sec_event.cfm_req.dev_class, bta_dm_cb.pin_dev_class); 2642e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2643e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_result && p_result->status == BTM_SUCCESS) 2644e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2645e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bytes_to_copy = (p_result->length < (BD_NAME_LEN-1)) 2646e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ? p_result->length : (BD_NAME_LEN-1); 2647e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(sec_event.cfm_req.bd_name, p_result->remote_bd_name, bytes_to_copy); 2648e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0; 2649e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2650e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else /* No name found */ 2651e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.cfm_req.bd_name[0] = 0; 2652e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2653e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.key_notif.passkey = bta_dm_cb.num_val; /* get PIN code numeric number */ 2654e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2655e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* 1 additional event data fields for this event */ 2656e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.cfm_req.just_works = bta_dm_cb.just_works; 2657e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2658e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 2659e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2660e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Retrieved saved device class and bd_addr */ 2661e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(sec_event.pin_req.bd_addr, bta_dm_cb.pin_bd_addr); 2662e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, bta_dm_cb.pin_dev_class); 2663e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2664e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_result && p_result->status == BTM_SUCCESS) 2665e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2666e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bytes_to_copy = (p_result->length < (BD_NAME_LEN-1)) 2667e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ? p_result->length : (BD_NAME_LEN-1); 2668e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(sec_event.pin_req.bd_name, p_result->remote_bd_name, bytes_to_copy); 2669e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0; 2670e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2671e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else /* No name found */ 2672e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.pin_req.bd_name[0] = 0; 2673e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2674e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach event = bta_dm_cb.pin_evt; 2675e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.key_notif.passkey = bta_dm_cb.num_val; /* get PIN code numeric number */ 2676e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2677e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2678e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( bta_dm_cb.p_sec_cback ) 2679e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_sec_cback(event, &sec_event); 2680e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 2681e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2682e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2683e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2684e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 2685e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2686e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_pin_cback 2687e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 26886ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description Callback requesting pin_key 2689e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2690e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 2691e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2692e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 2693e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic UINT8 bta_dm_pin_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name) 2694e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 2695e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_SEC sec_event; 2696e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2697e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!bta_dm_cb.p_sec_cback) 2698e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BTM_NOT_AUTHORIZED; 2699e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2700e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* If the device name is not known, save bdaddr and devclass and initiate a name request */ 2701e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bd_name[0] == 0) 2702e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2703e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.pin_evt = BTA_DM_PIN_REQ_EVT; 2704e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(bta_dm_cb.pin_bd_addr, bd_addr); 2705e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, dev_class); 2706e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((BTM_ReadRemoteDeviceName(bd_addr, bta_dm_pinname_cback)) == BTM_CMD_STARTED) 2707e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BTM_CMD_STARTED; 2708e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2709e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_WARNING0(" bta_dm_pin_cback() -> Failed to start Remote Name Request "); 2710e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2711e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2712e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(sec_event.pin_req.bd_addr, bd_addr); 2713e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, dev_class); 2714e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BCM_STRNCPY_S((char*)sec_event.pin_req.bd_name, sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1)); 2715e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0; 2716e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2717e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_sec_cback(BTA_DM_PIN_REQ_EVT, &sec_event); 2718e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BTM_CMD_STARTED; 2719e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 2720e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2721e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2722e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2723e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 2724e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2725e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_link_key_request_cback 2726e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2727e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Callback requesting linkkey 2728e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2729e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 2730e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2731e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 2732e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic UINT8 bta_dm_link_key_request_cback (BD_ADDR bd_addr, LINK_KEY key) 2733e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 2734e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Application passes all link key to 2735e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM during initialization using add_device 2736e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach API. If BTM doesn't have the link key in it's 27376ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach data base, that's because application doesn't 2738e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach it */ 2739e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2740e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BTM_NOT_AUTHORIZED; 2741e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 2742e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2743e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2744e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2745e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2746e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2747e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 2748e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2749e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_new_link_key_cback 2750e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2751e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Callback from BTM to notify new link key 2752e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2753e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 2754e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2755e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 2756e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic UINT8 bta_dm_new_link_key_cback(BD_ADDR bd_addr, DEV_CLASS dev_class, 2757e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BD_NAME bd_name, LINK_KEY key, UINT8 key_type) 2758e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 2759e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_SEC sec_event; 2760e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_AUTH_CMPL *p_auth_cmpl; 2761e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 event; 2762e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2763e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset (&sec_event, 0, sizeof(tBTA_DM_SEC)); 2764e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2765e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Not AMP Key type */ 2766e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (key_type != HCI_LKEY_TYPE_AMP_WIFI && key_type != HCI_LKEY_TYPE_AMP_UWB) 2767e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2768e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach event = BTA_DM_AUTH_CMPL_EVT; 2769e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_auth_cmpl = &sec_event.auth_cmpl; 2770e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2771e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(p_auth_cmpl->bd_addr, bd_addr); 2772e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2773e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(p_auth_cmpl->bd_name, bd_name, (BD_NAME_LEN-1)); 2774e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_auth_cmpl->bd_name[BD_NAME_LEN-1] = 0; 2775e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2776e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_auth_cmpl->key_present = TRUE; 2777e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_auth_cmpl->key_type = key_type; 2778e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_auth_cmpl->success = TRUE; 2779e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2780e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(p_auth_cmpl->key, key, LINK_KEY_LEN); 2781e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.auth_cmpl.fail_reason = HCI_SUCCESS; 27826ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 2783e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_cb.p_sec_cback) 2784e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2785e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_sec_cback(event, &sec_event); 2786e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2787e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2788e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 2789e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2790e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_WARNING0(" bta_dm_new_link_key_cback() Received AMP Key?? "); 2791e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2792e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2793e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BTM_CMD_STARTED; 2794e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 2795e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2796e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2797e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 2798e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2799e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_authentication_complete_cback 2800e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2801e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Authentication complete callback from BTM 2802e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2803e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 2804e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2805e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 2806e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,BD_NAME bd_name, int result) 2807e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 2808e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2809e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_SEC sec_event; 2810e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2811e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(result != BTM_SUCCESS) 2812e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2813e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&sec_event, 0, sizeof(tBTA_DM_SEC)); 2814e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(sec_event.auth_cmpl.bd_addr, bd_addr); 2815e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2816e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(sec_event.auth_cmpl.bd_name, bd_name, (BD_NAME_LEN-1)); 2817e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.auth_cmpl.bd_name[BD_NAME_LEN-1] = 0; 2818e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2819e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* taken care of by memset [above] 2820e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.auth_cmpl.key_present = FALSE; 2821e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.auth_cmpl.success = FALSE; 2822e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*/ 2823e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.auth_cmpl.fail_reason = (UINT8)result; 2824e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_cb.p_sec_cback) 2825e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2826e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event); 28276ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach } 2828e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 28296ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 2830e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BTM_SUCCESS; 2831e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 2832e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2833e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 2834e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2835e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_sp_cback 2836e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2837e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description simple pairing callback from BTM 2838e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2839e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 2840e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2841e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 2842e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic UINT8 bta_dm_sp_cback (tBTM_SP_EVT event, tBTM_SP_EVT_DATA *p_data) 2843e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 2844e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_STATUS status = BTM_CMD_STARTED; 2845e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_SEC sec_event; 2846e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_SEC_EVT pin_evt = BTA_DM_SP_KEY_NOTIF_EVT; 2847e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2848e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_EVENT1("bta_dm_sp_cback: %d", event); 2849e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!bta_dm_cb.p_sec_cback) 2850e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BTM_NOT_AUTHORIZED; 2851e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2852e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* TODO_SP */ 2853e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach switch(event) 2854e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2855e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_SP_IO_REQ_EVT: 2856e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 2857e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* translate auth_req */ 2858e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_co_io_req(p_data->io_req.bd_addr, &p_data->io_req.io_cap, 2859e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &p_data->io_req.oob_data, &p_data->io_req.auth_req, p_data->io_req.is_orig); 2860e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 2861e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BTM_OOB_INCLUDED == FALSE 2862e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = BTM_SUCCESS; 2863e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 2864e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2865e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_EVENT2("io mitm: %d oob_data:%d", p_data->io_req.auth_req, p_data->io_req.oob_data); 2866e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 2867e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_SP_IO_RSP_EVT: 2868e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 2869e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_co_io_rsp(p_data->io_rsp.bd_addr, p_data->io_rsp.io_cap, 2870e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->io_rsp.oob_data, p_data->io_rsp.auth_req ); 2871e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 2872e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 2873e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2874e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_SP_CFM_REQ_EVT: 2875e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach pin_evt = BTA_DM_SP_CFM_REQ_EVT; 2876e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.just_works = sec_event.cfm_req.just_works = p_data->cfm_req.just_works; 2877e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.cfm_req.loc_auth_req = p_data->cfm_req.loc_auth_req; 2878e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.cfm_req.rmt_auth_req = p_data->cfm_req.rmt_auth_req; 2879defb69c3b383ad0f9b5d6329be625fafc2e3c931Ravi Nagarajan sec_event.cfm_req.loc_io_caps = p_data->cfm_req.loc_io_caps; 2880defb69c3b383ad0f9b5d6329be625fafc2e3c931Ravi Nagarajan sec_event.cfm_req.rmt_io_caps = p_data->cfm_req.rmt_io_caps; 2881e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* continue to next case */ 2882e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 28836ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach /* Passkey entry mode, mobile device with output capability is very 2884e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach unlikely to receive key request, so skip this event */ 2885e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /*case BTM_SP_KEY_REQ_EVT: */ 2886e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_SP_KEY_NOTIF_EVT: 2887e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 2888e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.num_val = sec_event.key_notif.passkey = p_data->key_notif.passkey; 2889e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* If the device name is not known, save bdaddr and devclass and initiate a name request */ 2890e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->key_notif.bd_name[0] == 0) 2891e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2892e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.pin_evt = pin_evt; 2893e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(bta_dm_cb.pin_bd_addr, p_data->key_notif.bd_addr); 2894e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->key_notif.dev_class); 2895e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((BTM_ReadRemoteDeviceName(p_data->key_notif.bd_addr, bta_dm_pinname_cback)) == BTM_CMD_STARTED) 2896e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BTM_CMD_STARTED; 2897e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2898e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_WARNING0(" bta_dm_sp_cback() -> Failed to start Remote Name Request "); 2899e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2900e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(sec_event.key_notif.bd_addr, p_data->key_notif.bd_addr); 2901e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->key_notif.dev_class); 2902e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME), (char*)p_data->key_notif.bd_name, (BD_NAME_LEN-1)); 2903e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.key_notif.bd_name[BD_NAME_LEN-1] = 0; 2904e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2905e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_sec_cback(pin_evt, &sec_event); 2906e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2907e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 2908e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2909e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BTM_OOB_INCLUDED == TRUE 2910e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_SP_LOC_OOB_EVT: 2911e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_co_loc_oob((BOOLEAN)(p_data->loc_oob.status == BTM_SUCCESS), 2912e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->loc_oob.c, p_data->loc_oob.r); 2913e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 2914e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2915e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_SP_RMT_OOB_EVT: 2916e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* If the device name is not known, save bdaddr and devclass and initiate a name request */ 2917e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->rmt_oob.bd_name[0] == 0) 2918e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2919e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.pin_evt = BTA_DM_SP_RMT_OOB_EVT; 2920e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(bta_dm_cb.pin_bd_addr, p_data->rmt_oob.bd_addr); 2921e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->rmt_oob.dev_class); 2922e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((BTM_ReadRemoteDeviceName(p_data->rmt_oob.bd_addr, bta_dm_pinname_cback)) == BTM_CMD_STARTED) 2923e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BTM_CMD_STARTED; 2924e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2925e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_WARNING0(" bta_dm_sp_cback() -> Failed to start Remote Name Request "); 2926e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2927e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(sec_event.rmt_oob.bd_addr, p_data->rmt_oob.bd_addr); 2928e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTA_COPY_DEVICE_CLASS(sec_event.rmt_oob.dev_class, p_data->rmt_oob.dev_class); 2929e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BCM_STRNCPY_S((char*)sec_event.rmt_oob.bd_name, sizeof(BD_NAME), (char*)p_data->rmt_oob.bd_name, (BD_NAME_LEN-1)); 2930e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.rmt_oob.bd_name[BD_NAME_LEN-1] = 0; 2931e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2932e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_sec_cback(BTA_DM_SP_RMT_OOB_EVT, &sec_event); 2933e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2934e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_co_rmt_oob(p_data->rmt_oob.bd_addr); 2935e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 2936e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 2937e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_SP_COMPLT_EVT: 29386ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach /* do not report this event - handled by link_key_callback or auth_complete_callback */ 2939e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 2940e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2941e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_SP_KEYPRESS_EVT: 2942e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(&sec_event.key_press, &p_data->key_press, sizeof(tBTM_SP_KEYPRESS)); 2943e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_sec_cback(BTA_DM_SP_KEYPRESS_EVT, &sec_event); 2944e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 2945e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2946e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_SP_UPGRADE_EVT: 2947e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_co_lk_upgrade(p_data->upgrade.bd_addr, &p_data->upgrade.upgrade ); 2948e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 2949e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2950e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach default: 2951e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = BTM_NOT_AUTHORIZED; 2952e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 2953e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2954e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_EVENT1("dm status: %d", status); 2955e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return status; 2956e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 2957e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2958e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 2959e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2960e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_local_name_cback 2961e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2962e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Callback from btm after local name is read 2963e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 29646ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 29656ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 2966e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2967e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 2968e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_local_name_cback(UINT8 *p_name) 2969e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 2970f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan tBTA_DM_SEC sec_event; 2971e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2972f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan BTM_GetLocalDeviceAddr(sec_event.enable.bd_addr); 2973f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan sec_event.enable.status = BTA_SUCCESS; 2974e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2975e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_cb.p_sec_cback) 2976f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan bta_dm_cb.p_sec_cback(BTA_DM_ENABLE_EVT, &sec_event); 2977e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 2978e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2979e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 2980e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2981e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_signal_strength 2982e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2983e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Callback from btm after local bdaddr is read 2984e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 29856ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 29866ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 2987e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2988e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 2989e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_signal_strength(tBTA_DM_MSG *p_data) 2990e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 2991e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2992e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_data->sig_strength.start) 2993e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2994e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.signal_strength_mask = p_data->sig_strength.mask; 2995e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.signal_strength_period = p_data->sig_strength.period; 2996e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_signal_strength_timer_cback(NULL); 2997e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 2998e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 2999e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3000e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_stop_timer(&bta_dm_cb.signal_strength_timer); 3001e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3002e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3003e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 3004e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 3005e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3006e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_signal_strength_timer_cback 3007e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3008e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Periodic timer callback to read signal strength 3009e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 30106ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 30116ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 3012e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3013e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 3014e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_signal_strength_timer_cback (TIMER_LIST_ENT *p_tle) 3015e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 3016e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3017e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 i; 3018e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3019e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_cb.signal_strength_mask & BTA_SIG_STRENGTH_RSSI_MASK) 3020e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3021e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for(i=0; i<bta_dm_cb.device_list.count; i++) 3022e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3023e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_ReadRSSI (bta_dm_cb.device_list.peer_device[i].peer_bdaddr, (tBTM_CMPL_CB *)bta_dm_rssi_cback); 3024e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3025e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3026e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3027e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_cb.signal_strength_mask & BTA_SIG_STRENGTH_LINK_QUALITY_MASK) 3028e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3029e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3030e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for(i=0; i<bta_dm_cb.device_list.count; i++) 3031e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3032e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_ReadLinkQuality (bta_dm_cb.device_list.peer_device[i].peer_bdaddr, (tBTM_CMPL_CB *)bta_dm_link_quality_cback); 3033e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3034e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3035e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3036e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3037e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_cb.signal_strength_period) 3038e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3039e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.signal_strength_timer.p_cback = (TIMER_CBACK*)&bta_dm_signal_strength_timer_cback; 3040e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_start_timer(&bta_dm_cb.signal_strength_timer, 0, (UINT32)1000*bta_dm_cb.signal_strength_period); 3041e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3042e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 30436ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 3044e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3045e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE) 3046e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 3047e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3048e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_bl_change_cback 3049e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3050e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Callback from btm when acl connection goes up or down 3051e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 30526ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 30536ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 3054e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3055e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 3056e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data) 3057e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 3058e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3059e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_ACL_CHANGE * p_msg; 3060e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3061e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_msg = (tBTA_DM_ACL_CHANGE *) GKI_getbuf(sizeof(tBTA_DM_ACL_CHANGE))) != NULL) 3062e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3063e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->event = p_data->event; 3064e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->is_new = FALSE; 30656ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 3066e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach switch(p_msg->event) 3067e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3068e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_BL_CONN_EVT: 3069e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->is_new = TRUE; 3070e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(p_msg->bd_addr, p_data->conn.p_bda); 3071e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 3072e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_BL_DISCN_EVT: 3073e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(p_msg->bd_addr, p_data->discn.p_bda); 3074e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 3075e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_BL_UPDATE_EVT: 3076e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->busy_level = p_data->update.busy_level; 3077e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 3078e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_BL_ROLE_CHG_EVT: 3079e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->new_role = p_data->role_chg.new_role; 3080e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hci_status = p_data->role_chg.hci_status; 3081e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(p_msg->bd_addr, p_data->role_chg.p_bda); 3082e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 3083e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_BL_COLLISION_EVT: 3084e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(p_msg->bd_addr, p_data->conn.p_bda); 3085e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break;; 3086e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3087e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3088e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.event = BTA_DM_ACL_CHANGE_EVT; 3089e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_msg); 3090e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3091e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 30926ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 3093e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 3094e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else 3095e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3096e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 3097e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3098e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_acl_change_cback 3099e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Callback from btm when acl connection goes up or down 3101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 31026ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 31036ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 3104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 3106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_acl_change_cback (BD_ADDR p_bda, DEV_CLASS p_dc, BD_NAME p_bdn, 3107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BD_FEATURES features, BOOLEAN is_new) 3108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 3109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_ACL_CHANGE * p_msg; 3111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_msg = (tBTA_DM_ACL_CHANGE *) GKI_getbuf(sizeof(tBTA_DM_ACL_CHANGE))) != NULL) 3113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy (p_msg->bd_addr, p_bda); 3115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->is_new = is_new; 3116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* This is collision case */ 3118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (features != NULL) 3119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((features[0] == 0xFF) && !is_new) 3121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->event = BTM_BL_COLLISION_EVT; 3122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.event = BTA_DM_ACL_CHANGE_EVT; 3125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_msg); 3126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 31286ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 3129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 3130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 3131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 3132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_rs_cback 3134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Receives the role switch complete event 3136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 31376ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns 3138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 3140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_rs_cback (tBTM_ROLE_SWITCH_CMPL *p1) 3141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 3142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_WARNING1("bta_dm_rs_cback:%d", bta_dm_cb.rs_event); 3143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_cb.rs_event == BTA_DM_API_SEARCH_EVT) 3144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.search_msg.rs_res = BTA_DM_RS_OK; /* do not care about the result for now */ 3146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.rs_event = 0; 3147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_start((tBTA_DM_MSG *)&bta_dm_cb.search_msg); 3148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 3150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 3152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_check_av 3154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function checks if AV is active 3156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** if yes, make sure the AV link is master 3157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns BOOLEAN - TRUE, if switch is in progress 3159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 3161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic BOOLEAN bta_dm_check_av(UINT16 event) 3162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 3163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN switching = FALSE; 3164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 i; 3165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_PEER_DEVICE *p_dev; 3166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_WARNING1("bta_dm_check_av:%d", bta_dm_cb.cur_av_count); 3168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_cb.cur_av_count) 3169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for(i=0; i<bta_dm_cb.device_list.count; i++) 3171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev = &bta_dm_cb.device_list.peer_device[i]; 3173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_WARNING3("[%d]: state:%d, info:x%x", i, p_dev->conn_state, p_dev->info); 3174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if((p_dev->conn_state == BTA_DM_CONNECTED) && (p_dev->info & BTA_DM_DI_AV_ACTIVE)) 3175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* make master and take away the role switch policy */ 3177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(BTM_CMD_STARTED == BTM_SwitchRole (p_dev->peer_bdaddr, HCI_ROLE_MASTER, (tBTM_CMPL_CB *)bta_dm_rs_cback)) 3178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* the role switch command is actually sent */ 3180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.rs_event = event; 3181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach switching = TRUE; 3182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* else either already master or can not switch for some reasons */ 3184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_policy_cback(BTA_SYS_PLCY_CLR, 0, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_dev->peer_bdaddr); 3185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 3186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return switching; 3190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 3191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 3193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_acl_change 3195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Process BTA_DM_ACL_CHANGE_EVT 3197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 31986ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 31996ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 3200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 3202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_acl_change(tBTA_DM_MSG *p_data) 3203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 3204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 i; 3206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 *p; 3207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_SEC conn; 3208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN is_new = p_data->acl_change.is_new; 3209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BD_ADDR_PTR p_bda = p_data->acl_change.bd_addr; 3210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN need_policy_change = FALSE; 321117706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani BOOLEAN issue_unpair_cb = FALSE; 3212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE) 3214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_PEER_DEVICE *p_dev; 3215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach switch(p_data->acl_change.event) 3217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_BL_UPDATE_EVT: /* busy level update */ 3219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( bta_dm_cb.p_sec_cback ) 3220f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan { 3221f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan conn.busy_level.level = p_data->acl_change.busy_level; 3222f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan bta_dm_cb.p_sec_cback(BTA_DM_BUSY_LEVEL_EVT, &conn); 3223f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan } 3224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 3225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_BL_ROLE_CHG_EVT: /* role change event */ 3227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev = bta_dm_find_peer_device(p_bda); 3228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_dev) 3229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG3("bta_dm_acl_change role chg info:x%x new_role:%d dev count:%d", 3231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev->info, p_data->acl_change.new_role, bta_dm_cb.device_list.count); 3232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_dev->info & BTA_DM_DI_AV_ACTIVE) 3233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* there's AV activity on this link */ 3235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_data->acl_change.new_role == HCI_ROLE_SLAVE && bta_dm_cb.device_list.count > 1 3236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach && p_data->acl_change.hci_status == HCI_SUCCESS) 3237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* more than one connections and the AV connection is role switched to slave 3239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach * switch it back to master and remove the switch policy */ 3240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SwitchRole(p_bda, BTM_ROLE_MASTER, NULL); 3241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach need_policy_change = TRUE; 3242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if (bta_dm_cfg.avoid_scatter && (p_data->acl_change.new_role == HCI_ROLE_MASTER)) 3244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if the link updated to be master include AV activities, remove the switch policy */ 3246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach need_policy_change = TRUE; 3247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(need_policy_change) 3250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_policy_cback(BTA_SYS_PLCY_CLR, 0, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_dev->peer_bdaddr); 3252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 3255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* there's AV no activity on this link and role switch happened 3257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach * check if AV is active 3258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach * if so, make sure the AV link is master */ 3259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_check_av(0); 3260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_notify_role_chg(p_data->acl_change.bd_addr, p_data->acl_change.new_role, p_data->acl_change.hci_status); 3262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(conn.role_chg.bd_addr, p_bda); 3263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach conn.role_chg.new_role = (UINT8) p_data->acl_change.new_role; 32646ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if( bta_dm_cb.p_sec_cback ) 3265f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan bta_dm_cb.p_sec_cback(BTA_DM_ROLE_CHG_EVT, &conn); 3266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 3268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 3270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Collision report from Stack: Notify profiles */ 3272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->acl_change.event == BTM_BL_COLLISION_EVT) 3273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_notify_collision (p_bda); 3275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 3276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(is_new) 3279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for(i=0; i<bta_dm_cb.device_list.count; i++) 3281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(!bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda)) 32836ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach break; 3284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(i == bta_dm_cb.device_list.count) 3288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].peer_bdaddr, p_bda); 3290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].link_policy = bta_dm_cb.cur_policy; 3291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.device_list.count++; 3292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_CONNECTED; 3295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.device_list.peer_device[i].pref_role = BTA_ANY_ROLE; 3296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(conn.link_up.bd_addr, p_bda); 3297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_NONE; 3298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( ((NULL != (p = BTM_ReadLocalFeatures ())) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) && 3299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ((NULL != (p = BTM_ReadRemoteFeatures (p_bda))) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) ) 3300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* both local and remote devices support SSR */ 3302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_USE_SSR; 3303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_WARNING1("info:x%x", bta_dm_cb.device_list.peer_device[i].info); 33056ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if( bta_dm_cb.p_sec_cback ) 3306f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan bta_dm_cb.p_sec_cback(BTA_DM_LINK_UP_EVT, &conn); 3307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 3310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for(i=0; i<bta_dm_cb.device_list.count; i++) 3312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda)) 33146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach continue; 3315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 331617706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani if( bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_UNPAIRING ) 3317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 331817706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani BTM_SecDeleteDevice(bta_dm_cb.device_list.peer_device[i].peer_bdaddr); 331917706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani issue_unpair_cb = TRUE; 332017706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani } 3321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 332217706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani for(; i<bta_dm_cb.device_list.count ; i++) 332317706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani { 3324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(&bta_dm_cb.device_list.peer_device[i], &bta_dm_cb.device_list.peer_device[i+1], sizeof(bta_dm_cb.device_list.peer_device[i])); 332517706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani } 3326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 3327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_cb.device_list.count) 332917706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani bta_dm_cb.device_list.count--; 3330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_search_cb.wait_disc && !bdcmp(bta_dm_search_cb.peer_bdaddr, p_bda)) 3332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.wait_disc = FALSE; 3334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_search_cb.sdp_results) 3336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_EVENT0(" timer stopped "); 3338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_stop_timer(&bta_dm_search_cb.search_timer); 3339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_discover_next_device(); 3340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3343e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3344e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_cb.disabling) 3345e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3346e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(!BTM_GetNumAclLinks()) 3347e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_stop_timer(&bta_dm_cb.disable_timer); 3349e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_conn_down_timer_cback; 335017706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani /* start a timer to make sure that the profiles get the disconnect event */ 3351e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 1000); 3352e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3353e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3354e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3355e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(conn.link_down.bd_addr, p_bda); 3356e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach conn.link_down.status = (UINT8) btm_get_acl_disc_reason_code(); 33576ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if( bta_dm_cb.p_sec_cback ) 335817706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani { 3359f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan bta_dm_cb.p_sec_cback(BTA_DM_LINK_DOWN_EVT, &conn); 336017706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani if( issue_unpair_cb ) 3361f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &conn); 336217706aa42214addb95ee4aea5177a8784960dfc1Harish Paryani } 33636ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach } 3364e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3365e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta bta_dm_adjust_roles(TRUE); 3366e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 3367e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3368e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 3369e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3370e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_disable_conn_down_timer_cback 3371e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3372e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Sends disable event to application 3373e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 33746ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 33756ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 3376e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3377e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 3378e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_disable_conn_down_timer_cback (TIMER_LIST_ENT *p_tle) 3379e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 3380e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_SYS_HW_MSG *sys_enable_event; 3381e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3382e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* register our callback to SYS HW manager */ 3383e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_hw_register( BTA_SYS_HW_BLUETOOTH, bta_dm_sys_hw_cback ); 3384e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3385e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* send a message to BTA SYS */ 3386e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((sys_enable_event = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL) 3387e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3388e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sys_enable_event->hdr.event = BTA_SYS_API_DISABLE_EVT; 33896ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH; 3390e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(sys_enable_event); 3391e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3392e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3393e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.disabling = FALSE; 33946ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 3395e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 3396e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3397e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 3398e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3399e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_rssi_cback 3400e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3401e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Callback from btm with rssi values 3402e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 34036ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 34046ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 3405e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3406e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 3407e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_rssi_cback (tBTM_RSSI_RESULTS *p_result) 3408e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 3409f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan tBTA_DM_SEC sec_event; 3410e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3411e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_result->status == BTM_SUCCESS) 3412e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3413e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3414f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan bdcpy(sec_event.sig_strength.bd_addr, p_result->rem_bda); 3415f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan sec_event.sig_strength.mask = BTA_SIG_STRENGTH_RSSI_MASK; 3416f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan sec_event.sig_strength.rssi_value = p_result->rssi; 34176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if( bta_dm_cb.p_sec_cback!= NULL ) 3418f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan bta_dm_cb.p_sec_cback(BTA_DM_SIG_STRENGTH_EVT, &sec_event); 3419e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3420e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3421e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 3422e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3423e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 3424e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3425e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_link_quality_cback 3426e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3427e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Callback from btm with link quality value 3428e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 34296ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 34306ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 3431e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3432e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 3433e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_link_quality_cback (tBTM_LINK_QUALITY_RESULTS *p_result) 3434e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 3435e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3436f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan tBTA_DM_SEC sec_event; 3437e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3438e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_result->status == BTM_SUCCESS) 3439e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3440e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3441f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan bdcpy(sec_event.sig_strength.bd_addr, p_result->rem_bda); 3442f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan sec_event.sig_strength.mask = BTA_SIG_STRENGTH_LINK_QUALITY_MASK; 3443f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan sec_event.sig_strength.link_quality_value = p_result->link_quality; 34446ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if( bta_dm_cb.p_sec_cback!= NULL ) 3445f19a017a6f0beb4e79fc50a21d6d10172431bd9cRavi Nagarajan bta_dm_cb.p_sec_cback(BTA_DM_SIG_STRENGTH_EVT, &sec_event); 3446e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3447e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3448e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 3449e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3450e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 3451e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3452e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_rm_cback 3453e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3454e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Role management callback from sys 3455e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 34566ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 34576ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 3458e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3459e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 3460e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr) 3461e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 3462e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3463e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 j; 3464e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_PREF_ROLES role; 3465e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_PEER_DEVICE *p_dev; 3466e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3467e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev = bta_dm_find_peer_device(peer_addr); 3468e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( status == BTA_SYS_CONN_OPEN) 3469e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3470e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_dev) 3471e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3472f06e7cebf18e93cf320a285c2c67ef79b98b13e0Kausik Sinnaswamy /* Do not set to connected if we are in the middle of unpairing. When AV stream is 3473f06e7cebf18e93cf320a285c2c67ef79b98b13e0Kausik Sinnaswamy * started it fakes out a SYS_CONN_OPEN to potentially trigger a role switch command. 3474f06e7cebf18e93cf320a285c2c67ef79b98b13e0Kausik Sinnaswamy * But this should not be done if we are in the middle of unpairing. 3475f06e7cebf18e93cf320a285c2c67ef79b98b13e0Kausik Sinnaswamy */ 3476f06e7cebf18e93cf320a285c2c67ef79b98b13e0Kausik Sinnaswamy if (p_dev->conn_state != BTA_DM_UNPAIRING) 3477f06e7cebf18e93cf320a285c2c67ef79b98b13e0Kausik Sinnaswamy p_dev->conn_state = BTA_DM_CONNECTED; 3478e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3479e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for(j=1; j<= p_bta_dm_rm_cfg[0].app_id; j++) 3480e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3481e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(((p_bta_dm_rm_cfg[j].app_id == app_id) || (p_bta_dm_rm_cfg[j].app_id == BTA_ALL_APP_ID)) 3482e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach && (p_bta_dm_rm_cfg[j].id == id)) 3483e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3484e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach role = p_bta_dm_rm_cfg[j].cfg; 3485e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3486e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(role > p_dev->pref_role ) 3487e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev->pref_role = role; 3488e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 3489e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3490e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3491e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3492e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 34936ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 3494e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3495e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3496e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if((BTA_ID_AV == id)||(BTA_ID_AVK ==id)) 3497e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3498e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( status == BTA_SYS_CONN_BUSY) 3499e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3500e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_dev) 3501e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev->info |= BTA_DM_DI_AV_ACTIVE; 3502e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* AV calls bta_sys_conn_open with the A2DP stream count as app_id */ 3503e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(BTA_ID_AV == id) 3504e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.cur_av_count = app_id; 3505e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3506e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if( status == BTA_SYS_CONN_IDLE) 3507e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3508e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_dev) 3509e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev->info &= ~BTA_DM_DI_AV_ACTIVE; 3510e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* AV calls bta_sys_conn_open with the A2DP stream count as app_id */ 3511e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(BTA_ID_AV == id) 3512e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.cur_av_count = app_id; 3513e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3514e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_WARNING2("bta_dm_rm_cback:%d, status:%d", bta_dm_cb.cur_av_count, status); 3515e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3516e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3517e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3518e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta bta_dm_adjust_roles(FALSE); 3519e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3520e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 3521e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3522e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 3523e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3524e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta** Function bta_dm_dev_blacklisted_for_switch 3525e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta** 3526e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta** Description Checks if the device is blacklisted for immediate role switch after connection. 3527e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta** 3528e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta** Returns TRUE if dev is blacklisted else FALSE 3529e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta** 3530e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta*******************************************************************************/ 3531e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Battastatic BOOLEAN bta_dm_dev_blacklisted_for_switch (BD_ADDR remote_bd_addr) 3532e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta{ 3533e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta UINT16 manufacturer = 0; 3534e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta UINT16 lmp_sub_version = 0; 3535e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta UINT8 lmp_version = 0; 3536e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta UINT8 i = 0; 3537e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta 3538e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta if (BTM_ReadRemoteVersion(remote_bd_addr, &lmp_version, 3539e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta &manufacturer, &lmp_sub_version) == BTM_SUCCESS) 3540e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta { 3541e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta /* Check if this device version info matches with is 3542e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta blacklisted versions for role switch */ 3543e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta for (i = 0; i < BTA_DM_MAX_ROLE_SWITCH_BLACKLIST_COUNT; i++) 3544e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta { 3545e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta if ((bta_role_switch_blacklist[i].lmp_version == lmp_version) && 3546e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta (bta_role_switch_blacklist[i].manufacturer == manufacturer)&& 3547e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta ((bta_role_switch_blacklist[i].lmp_sub_version & lmp_sub_version) == 3548e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta bta_role_switch_blacklist[i].lmp_sub_version)) 3549e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta { 3550e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta APPL_TRACE_EVENT0("Black list F/W version matches.. Delay Role Switch..."); 3551e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta return TRUE; 3552e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta } 3553e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta 3554e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta } 3555e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta } 3556e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta return FALSE; 3557e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta} 3558e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta 3559e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta/******************************************************************************* 3560e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta** 3561e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta** Function bta_dm_delay_role_switch_cback 3562e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta** 3563e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta** Description Callback from btm to delay a role switch 3564e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta** 3565e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta** Returns void 3566e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta** 3567e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta*******************************************************************************/ 3568e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Battastatic void bta_dm_delay_role_switch_cback(TIMER_LIST_ENT *p_tle) 3569e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta{ 3570e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta APPL_TRACE_EVENT0("bta_dm_delay_role_switch_cback: initiating Delayed RS"); 3571e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta bta_dm_adjust_roles (FALSE); 3572e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta} 3573e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta 3574e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta/******************************************************************************* 3575e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta** 3576e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_adjust_roles 3577e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 35786ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description Adjust roles 35796ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 3580e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 35816ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 3582e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3583e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 3584e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Battastatic void bta_dm_adjust_roles(BOOLEAN delay_role_switch) 3585e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 3586e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3587e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 i; 3588e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN set_master_role = FALSE; 3589e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3590e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_cb.device_list.count) 3591e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3592e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3593e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* the configuration is no scatternet 3594e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach * or AV connection exists and there are more than one ACL link */ 3595e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( (p_bta_dm_rm_cfg[0].cfg == BTA_DM_NO_SCATTERNET) || 3596e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (bta_dm_cb.cur_av_count && bta_dm_cb.device_list.count > 1) ) 3597e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3598e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3599e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach L2CA_SetDesireRole (HCI_ROLE_MASTER); 3600e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach set_master_role = TRUE; 3601e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3602e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3603e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3604e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for(i=0; i<bta_dm_cb.device_list.count; i++) 3605e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3606e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED) 3607e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3608e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(!set_master_role && (bta_dm_cb.device_list.peer_device[i].pref_role != BTA_ANY_ROLE) 3609e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach && (p_bta_dm_rm_cfg[0].cfg == BTA_DM_PARTIAL_SCATTERNET)) 3610e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3611e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach L2CA_SetDesireRole (HCI_ROLE_MASTER); 3612e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach set_master_role = TRUE; 3613e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3614e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3615e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if((bta_dm_cb.device_list.peer_device[i].pref_role == BTA_MASTER_ROLE_ONLY) 3616e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach || (bta_dm_cb.device_list.count > 1)) 3617e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3618e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3619e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta /* Initiating immediate role switch with certain remote devices 3620e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta has caused issues due to role switch colliding with link encryption setup and 3621e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta causing encryption (and in turn the link) to fail . These device . Firmware 3622e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta versions are stored in a blacklist and role switch with these devices are 3623e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta delayed to avoid the collision with link encryption setup */ 3624e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3625e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta if ((delay_role_switch == FALSE) || 3626e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta (bta_dm_dev_blacklisted_for_switch( 3627e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta bta_dm_cb.device_list.peer_device[i].peer_bdaddr) == FALSE)) 3628e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta { 3629e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta BTM_SwitchRole (bta_dm_cb.device_list.peer_device[i].peer_bdaddr, 3630e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta HCI_ROLE_MASTER, NULL); 3631e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta } 3632e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta else 3633e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta { 3634e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta bta_dm_cb.switch_delay_timer.p_cback = 3635e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta (TIMER_CBACK*)&bta_dm_delay_role_switch_cback; 3636e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta bta_sys_start_timer(&bta_dm_cb.switch_delay_timer, 0, 500); 3637e9d957443d3e5d7427c5d09a306e2b5e99d26201Ganesh Ganapathi Batta } 3638e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3639e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3640e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3641e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3642e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3643e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3644e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(!set_master_role) 3645e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3646e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3647e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach L2CA_SetDesireRole (L2CAP_DESIRED_LINK_ROLE); 3648e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3649e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3650e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3651e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3652e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 3653e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3654e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach L2CA_SetDesireRole (L2CAP_DESIRED_LINK_ROLE); 3655e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3656e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3657e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3658e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 3659e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3660e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 3661e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3662e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_get_remname 3663e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 36646ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description Returns a pointer to the remote name stored in the DM control 3665e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** block if it exists, or from the BTM memory. 3666e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3667e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns char * - Pointer to the remote device name 3668e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 3669e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic char *bta_dm_get_remname(void) 3670e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 3671e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach char *p_name = bta_dm_search_cb.peer_name; 3672e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach char *p_temp; 3673e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3674e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* If the name isn't already stored, try retrieving from BTM */ 3675e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (*p_name == '\0') 3676e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_temp = BTM_SecReadDevName(bta_dm_search_cb.peer_bdaddr)) != NULL) 3677e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_name = p_temp; 3678e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3679e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return p_name; 3680e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 3681e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3682e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 3683e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3684e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_bond_cancel_complete_cback 3685e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3686e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Authentication complete callback from BTM 3687e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3688e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 3689e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3690e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 3691e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result) 3692e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 3693e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3694e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_SEC sec_event; 3695e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3696e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (result == BTM_SUCCESS) 3697e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.bond_cancel_cmpl.result = BTA_SUCCESS; 3698e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 3699e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.bond_cancel_cmpl.result = BTA_FAILURE; 3700e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3701e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(bta_dm_cb.p_sec_cback) 3702e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3703e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_sec_cback(BTA_DM_BOND_CANCEL_CMPL_EVT, &sec_event); 37046ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach } 3705e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 3706e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3707e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if ( BTM_EIR_SERVER_INCLUDED == TRUE ) 3708e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach #if ( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) 3709e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 3710e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3711e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_update_eir_uuid 3712e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 37136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description 3714e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3715e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3716e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 3717e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_update_eir_uuid (tBTA_DM_MSG *p_data) 3718e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 3719e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_API_UPDATE_EIR_UUID *p_msg = (tBTA_DM_API_UPDATE_EIR_UUID *)p_data; 3720e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 xx; 3721e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 empty_slot = BTA_EIR_SERVER_NUM_CUSTOM_UUID; 3722e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 match_slot = BTA_EIR_SERVER_NUM_CUSTOM_UUID; 3723e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3724e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (xx = 0; xx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; xx++) 3725e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3726e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_cb.custom_uuid[xx].len == 0) 3727e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3728e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (empty_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID) 3729e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach empty_slot = xx; 3730e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3731e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if (match_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID) 3732e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3733e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!memcmp (bta_dm_cb.custom_uuid[xx].uu.uuid128, p_msg->uuid.uu.uuid128, p_msg->uuid.len)) 3734e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3735e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach match_slot = xx;; 3736e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3737e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3738e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3739e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3740e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_msg->is_add) 3741e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3742e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (match_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID) 3743e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3744e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (empty_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID) 3745e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3746e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("No space to add UUID for EIR"); 3747e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 3748e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3749e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 3750e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3751e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy (&(bta_dm_cb.custom_uuid[empty_slot]), &(p_msg->uuid), sizeof(tBT_UUID)); 3752e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3753e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3754e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 3755e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3756e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("UUID is already added for EIR"); 3757e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 3758e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3759e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3760e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 3761e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3762e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (match_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID) 3763e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3764e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("UUID is not found for EIR"); 3765e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 3766e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3767e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 3768e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3769e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset (&(bta_dm_cb.custom_uuid[match_slot]), 0, sizeof(tBT_UUID)); 3770e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3771e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3772e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3773e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_set_eir (NULL); 3774e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 3775e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach #endif 3776e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3777e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 3778e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3779e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_set_eir_config 3780e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 37816ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description 3782e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3783e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3784e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 3785e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_set_eir_config (tBTA_DM_MSG *p_data) 3786e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 3787e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->set_eir_cfg.p_eir_cfg) 3788e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3789e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* User defined config */ 3790e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bta_dm_eir_cfg = p_data->set_eir_cfg.p_eir_cfg; 3791e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3792e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 3793e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3794e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Back to default config */ 3795e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bta_dm_eir_cfg = (tBTA_DM_EIR_CONF*)&bta_dm_eir_cfg; 3796e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3797e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3798e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_set_eir (NULL); 3799e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 3800e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3801e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 3802e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3803e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_set_eir 3804e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3805e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function creates EIR tagged data and writes it to controller. 3806e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3807e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None 3808e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3809e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 3810e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_set_eir (char *local_name) 3811e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 3812e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BT_HDR *p_buf; 3813e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 *p; 3814e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 *p_length; 3815e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTA_EIR_CANNED_UUID_LIST != TRUE) 3816e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 *p_type; 3817e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 max_num_uuid; 3818e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) 3819e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 custom_uuid_idx; 3820e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 3821e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 3822e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_EIR_DEFAULT_FEC_REQUIRED == FALSE) 3823e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 free_eir_length = HCI_EXT_INQ_RESPONSE_LEN; 3824e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else 3825e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 free_eir_length = HCI_DM5_PACKET_SIZE; 3826e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 3827e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 num_uuid; 3828e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 data_type; 3829e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 local_name_len; 38306ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 3831e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* wait until complete to disable */ 3832e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_cb.disable_timer.in_use) 3833e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 3834e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3835e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if ( BTA_EIR_CANNED_UUID_LIST != TRUE ) 3836e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* wait until App is ready */ 3837e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_cb.app_ready_timer.in_use) 3838e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 3839e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3840e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if local name is not provided, get it from controller */ 3841e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( local_name == NULL ) 3842e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3843e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( BTM_ReadLocalDeviceName( &local_name ) != BTM_SUCCESS ) 3844e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3845e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("Fail to read local device name for EIR"); 3846e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3847e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3848e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 3849e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3850e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Allocate a buffer to hold HCI command */ 3851e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_buf = (BT_HDR *)GKI_getpoolbuf(BTM_CMD_POOL_ID)) == NULL) 3852e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3853e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("bta_dm_set_eir couldn't allocate buffer"); 3854e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 3855e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3856e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p = (UINT8 *)p_buf + BTM_HCI_EIR_OFFSET; 3857e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3858e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(p, 0x00, HCI_EXT_INQ_RESPONSE_LEN ); 3859e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3860e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG0("BTA is generating EIR"); 38616ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 3862e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( local_name ) 3863e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach local_name_len = strlen( local_name ); 3864e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 3865e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach local_name_len = 0; 3866e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3867e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach data_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE; 3868e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if local name is longer than minimum length of shortened name */ 3869e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* check whether it needs to be shortened or not */ 3870e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( local_name_len > p_bta_dm_eir_cfg->bta_dm_eir_min_name_len ) 3871e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3872e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* get number of UUID 16-bit list */ 3873e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTA_EIR_CANNED_UUID_LIST == TRUE) 3874e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len/LEN_UUID_16; 3875e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else 3876e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach max_num_uuid = (free_eir_length - 2)/LEN_UUID_16; 38776ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach data_type = BTM_GetEirSupportedServices( bta_dm_cb.eir_uuid, &p, 3878e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach max_num_uuid, &num_uuid ); 3879e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p = (UINT8 *)p_buf + BTM_HCI_EIR_OFFSET; /* reset p */ 3880e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 38816ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 3882e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if UUID doesn't fit remaing space, shorten local name */ 3883e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( local_name_len > (free_eir_length - 4 - num_uuid*LEN_UUID_16)) 3884e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3885e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_WARNING0("BTA EIR: local name is shortened"); 3886e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach local_name_len = p_bta_dm_eir_cfg->bta_dm_eir_min_name_len; 3887e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach data_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE; 3888e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3889e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 3890e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach data_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE; 3891e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 38926ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 3893e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8_TO_STREAM(p, local_name_len + 1); 3894e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8_TO_STREAM(p, data_type); 3895e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(p, local_name, local_name_len); 3896e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p += local_name_len; 3897e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach free_eir_length -= local_name_len + 2; 3898e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3899e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTA_EIR_CANNED_UUID_LIST == TRUE) 3900e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if UUID list is provided as static data in configuration */ 3901e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(( p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len > 0 ) 3902e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &&(p_bta_dm_eir_cfg->bta_dm_eir_uuid16)) 3903e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3904e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( free_eir_length > LEN_UUID_16 + 2) 3905e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3906e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach free_eir_length -= 2; 3907e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3908e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len) 3909e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3910e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len / LEN_UUID_16; 3911e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach data_type = BTM_EIR_COMPLETE_16BITS_UUID_TYPE; 3912e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3913e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else /* not enough room for all UUIDs */ 3914e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3915e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_WARNING0("BTA EIR: UUID 16-bit list is truncated"); 3916e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_uuid = free_eir_length / LEN_UUID_16; 3917e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach data_type = BTM_EIR_MORE_16BITS_UUID_TYPE; 3918e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3919e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8_TO_STREAM(p, num_uuid * LEN_UUID_16 + 1); 3920e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8_TO_STREAM(p, data_type); 3921e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_uuid16, num_uuid * LEN_UUID_16 ); 3922e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p += num_uuid * LEN_UUID_16; 3923e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach free_eir_length -= num_uuid * LEN_UUID_16; 3924e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3925e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3926e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else /* (BTA_EIR_CANNED_UUID_LIST == TRUE) */ 3927e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if UUID list is dynamic */ 3928e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( free_eir_length >= 2) 3929e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3930e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_length = p++; 3931e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_type = p++; 3932e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_uuid = 0; 3933e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3934e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach max_num_uuid = (free_eir_length - 2)/LEN_UUID_16; 3935e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach data_type = BTM_GetEirSupportedServices( bta_dm_cb.eir_uuid, &p, max_num_uuid, &num_uuid ); 3936e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3937e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( data_type == BTM_EIR_MORE_16BITS_UUID_TYPE ) 3938e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3939e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_WARNING0("BTA EIR: UUID 16-bit list is truncated"); 3940e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3941e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) 3942e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 3943e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3944e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++) 3945e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3946e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_16) 3947e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3948e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( num_uuid < max_num_uuid ) 3949e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3950e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid16); 3951e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_uuid++; 3952e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3953e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 3954e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3955e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach data_type = BTM_EIR_MORE_16BITS_UUID_TYPE; 3956e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_WARNING0("BTA EIR: UUID 16-bit list is truncated"); 3957e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 3958e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3959e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3960e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3961e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3962e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif /* (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) */ 3963e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3964e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_16 + 1); 3965e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8_TO_STREAM(p_type, data_type); 3966e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach free_eir_length -= num_uuid * LEN_UUID_16 + 2; 3967e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3968e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif /* (BTA_EIR_CANNED_UUID_LIST == TRUE) */ 3969e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3970e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if ( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) 3971e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Adding 32-bit UUID list */ 3972e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( free_eir_length >= 2) 3973e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3974e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_length = p++; 3975e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_type = p++; 3976e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_uuid = 0; 3977e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach data_type = BTM_EIR_COMPLETE_32BITS_UUID_TYPE; 3978e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3979e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach max_num_uuid = (free_eir_length - 2)/LEN_UUID_32; 3980e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3981e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++) 3982e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3983e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_32) 3984e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3985e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( num_uuid < max_num_uuid ) 3986e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3987e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT32_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid32); 3988e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_uuid++; 3989e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3990e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 3991e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 3992e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach data_type = BTM_EIR_MORE_32BITS_UUID_TYPE; 3993e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_WARNING0("BTA EIR: UUID 32-bit list is truncated"); 3994e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 3995e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3996e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3997e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3998e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3999e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_32 + 1); 4000e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8_TO_STREAM(p_type, data_type); 4001e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach free_eir_length -= num_uuid * LEN_UUID_32 + 2; 4002e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4003e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4004e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Adding 128-bit UUID list */ 4005e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( free_eir_length >= 2) 4006e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4007e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_length = p++; 4008e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_type = p++; 4009e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_uuid = 0; 4010e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach data_type = BTM_EIR_COMPLETE_128BITS_UUID_TYPE; 4011e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4012e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach max_num_uuid = (free_eir_length - 2)/LEN_UUID_128; 4013e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4014e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++) 4015e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4016e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_128) 4017e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4018e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( num_uuid < max_num_uuid ) 4019e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4020e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ARRAY16_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid128); 4021e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_uuid++; 4022e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4023e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 4024e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4025e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach data_type = BTM_EIR_MORE_128BITS_UUID_TYPE; 4026e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_WARNING0("BTA EIR: UUID 128-bit list is truncated"); 4027e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 4028e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4029e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4030e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4031e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4032e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_128 + 1); 4033e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8_TO_STREAM(p_type, data_type); 4034e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach free_eir_length -= num_uuid * LEN_UUID_128 + 2; 4035e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4036e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif /* ( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) */ 4037e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4038e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if Flags are provided in configuration */ 4039e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(( p_bta_dm_eir_cfg->bta_dm_eir_flag_len > 0 ) 4040e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &&( p_bta_dm_eir_cfg->bta_dm_eir_flags ) 4041e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &&( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 2 )) 4042e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4043e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 1); 4044e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8_TO_STREAM(p, BTM_EIR_FLAGS_TYPE); 40456ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_flags, 4046e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bta_dm_eir_cfg->bta_dm_eir_flag_len); 4047e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p += p_bta_dm_eir_cfg->bta_dm_eir_flag_len; 4048e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 2; 4049e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4050e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4051e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if Inquiry Tx Resp Power compiled */ 4052e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if((p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power) && 4053e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (free_eir_length >= 3)) 4054e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4055e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8_TO_STREAM(p, 2); /* Length field */ 4056e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8_TO_STREAM(p, BTM_EIR_TX_POWER_LEVEL_TYPE); 4057e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8_TO_STREAM(p, *(p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power)); 4058e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach free_eir_length -= 3; 4059e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4060e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4061e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if Manufacturer Specific are provided in configuration */ 4062e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(( p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len > 0 ) 4063e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &&( p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec ) 4064e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &&( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2 )) 4065e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4066e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_length = p; 4067e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4068e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 1); 4069e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8_TO_STREAM(p, BTM_EIR_MANUFACTURER_SPECIFIC_TYPE); 40706ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec, 4071e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len); 4072e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p += p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len; 4073e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2; 4074e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4075e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4076e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 4077e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4078e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_length = NULL; 4079e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4080e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4081e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( free_eir_length ) 4082e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8_TO_STREAM(p, 0); /* terminator of significant part */ 4083e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4084e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_WriteEIR( p_buf ); 4085e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4086e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4087e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 4088e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4089e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if ( BTM_EIR_CLIENT_INCLUDED == TRUE ) 4090e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4091e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4092e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_eir_search_services 4093e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4094e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function searches services in received EIR 4095e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4096e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None 4097e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4098e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4099e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_eir_search_services( tBTM_INQ_RESULTS *p_result, 4100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_SERVICE_MASK *p_services_to_search, 4101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_SERVICE_MASK *p_services_found) 4102e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 4103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_SERVICE_MASK service_index = 0; 4104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_EIR_SEARCH_RESULT result; 4105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG6("BTA searching services in EIR of BDA:0x%02X%02X%02X%02X%02X%02X", 4107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_result->remote_bd_addr[0],p_result->remote_bd_addr[1], 4108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_result->remote_bd_addr[2],p_result->remote_bd_addr[3], 4109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_result->remote_bd_addr[4],p_result->remote_bd_addr[5]); 4110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1(" with services_to_search=0x%08X", *p_services_to_search); 4112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE 4114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* always do GATT based service discovery by SDP instead of from EIR */ 4115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if GATT based service is also to be put in EIR, need to modify this */ 4116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach while (service_index < (BTA_MAX_SERVICE_ID - 1)) 4117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else 4118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach while(service_index < BTA_MAX_SERVICE_ID) 4119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 4120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 41216ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if( *p_services_to_search 4122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach & (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index))) 4123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 41246ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach result = BTM_HasInquiryEirService( p_result, 4125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_service_id_to_uuid_lkup_tbl[service_index] ); 4126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Searching for HSP v1.2 only device */ 41286ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if ((result != BTM_EIR_FOUND) && 4129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (bta_service_id_to_uuid_lkup_tbl[service_index] == UUID_SERVCLASS_HEADSET)) 4130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result = BTM_HasInquiryEirService (p_result, UUID_SERVCLASS_HEADSET_HS); 4132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( result == BTM_EIR_FOUND ) 4135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* If Plug and Play service record, need to check to see if Broadcom stack */ 4137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* However, EIR data doesn't have EXT_BRCM_VERSION so just skip it */ 4138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( bta_service_id_to_uuid_lkup_tbl[service_index] 4139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach != UUID_SERVCLASS_PNP_INFORMATION ) 4140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach *p_services_found |= 4143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)); 4144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* remove the service from services to be searched */ 4145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach *p_services_to_search &= 4146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index))); 4147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if( result == BTM_EIR_NOT_FOUND ) 4150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* remove the service from services to be searched */ 4152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach *p_services_to_search &= 4153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index))); 4154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach service_index++; 4158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR2("BTA EIR search result, services_to_search=0x%08X, services_found=0x%08X", 4161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach *p_services_to_search, *p_services_found); 4162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 4164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&(BTA_EIR_CANNED_UUID_LIST != TRUE) 4166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_eir_update_uuid 4169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 41706ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description This function adds or removes service UUID in EIR database. 4171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None 4173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_eir_update_uuid(UINT16 uuid16, BOOLEAN adding) 4176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 4177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if this UUID is not advertised in EIR */ 4178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( !BTM_HasEirService( p_bta_dm_eir_cfg->uuid_mask, uuid16 )) 4179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 4180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( adding ) 4182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_EVENT1("Adding UUID=0x%04X into EIR", uuid16); 4184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_AddEirService( bta_dm_cb.eir_uuid, uuid16 ); 4186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 4188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_EVENT1("Removing UUID=0x%04X from EIR", uuid16); 4190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_RemoveEirService( bta_dm_cb.eir_uuid, uuid16 ); 4192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_set_eir (NULL); 4195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_EVENT2("bta_dm_eir_update_uuid UUID bit mask=0x%08X %08X", 41976ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_dm_cb.eir_uuid[1], bta_dm_cb.eir_uuid[0] ); 4198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 4200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_enable_test_mode 4204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 42056ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description enable test mode 42066ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 4207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 42086ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 4209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_enable_test_mode(tBTA_DM_MSG *p_data) 4212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 4213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_EnableTestMode(); 4214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_disable_test_mode 4219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 42206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description disable test mode 4221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 42226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 42236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 4224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_disable_test_mode(tBTA_DM_MSG *p_data) 4227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 4228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_DeviceReset(NULL); 4229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_execute_callback 4234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Just execute a generic call back in the context of the BTU/BTA tack 4236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 4239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_execute_callback(tBTA_DM_MSG *p_data) 4242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 4243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* sanity check */ 4244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_data->exec_cback.p_exec_cback == NULL) 4245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 4247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->exec_cback.p_exec_cback(p_data->exec_cback.p_param); 4250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_encrypt_cback 4254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description link encryption complete callback. 4256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 42576ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns None 4258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_encrypt_cback(BD_ADDR bd_addr, void *p_ref_data, tBTM_STATUS result) 4261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 4262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_STATUS bta_status = BTA_SUCCESS; 4263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_ENCRYPT_CBACK *p_callback = bta_dm_cb.p_encrypt_cback; 4264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_encrypt_cback = NULL; 4266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach switch (result) 4267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_SUCCESS: 4269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 4270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_WRONG_MODE: 4271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_status = BTA_WRONG_MODE; 4272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 4273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_NO_RESOURCES: 4274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_status = BTA_NO_RESOURCES; 4275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 4276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_BUSY: 4277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_status = BTA_BUSY; 4278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 4279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach default: 4280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_status = BTA_FAILURE; 4281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 4282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG2("bta_dm_encrypt_cback status =%d p_callback=0x%x", bta_status, p_callback); 4285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_callback) 4287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (*p_callback)(bd_addr, bta_status); 4289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_set_encryption 4294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function to encrypt the link 4296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None 4298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_set_encryption (tBTA_DM_MSG *p_data) 4301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 4302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG0("bta_dm_set_encryption"); //todo 4304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!p_data->set_encryption.p_callback) 4305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR0("bta_dm_set_encryption callback is not provided"); 4307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 4308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_cb.p_encrypt_cback) 4311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (*p_data->set_encryption.p_callback)(p_data->set_encryption.bd_addr, BTA_BUSY); 4313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 4314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_encrypt_cback = p_data->set_encryption.p_callback; 4318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.sec_act = p_data->set_encryption.sec_act; 4319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SetEncryption(p_data->set_encryption.bd_addr, bta_dm_encrypt_cback, &bta_dm_cb.sec_act); 4320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4322e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_set_afh_channels 4325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 43266ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description set afh channels 4327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 43286ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 43296ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 4330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_set_afh_channels(tBTA_DM_MSG * p_data) 4333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 4334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SetAfhChannels(p_data->set_afhchannels.first,p_data->set_afhchannels.last); 4336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 43406ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Function bta_dm_set_afh_channel_assesment 4341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description set afh channel assesment 4343e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 43446ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 43456ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 4346e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4347e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4349e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_set_afh_channel_assesment (tBTA_DM_MSG * p_data) 4350e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 4351e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SetAfhChannelAssessment(p_data->set_afh_channel_assessment.enable_or_disable); 4352e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4353e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4354e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BLE_INCLUDED == TRUE) 4355e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (SMP_INCLUDED == TRUE) 4356e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4357e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4358e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_ble_smp_cback 4359e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4360e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Callback for BLE SMP 4361e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 43626ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 43636ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 4364e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4365e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4366e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_DATA *p_data) 4367e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 4368e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_STATUS status = BTM_SUCCESS; 4369e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_SEC sec_event; 4370e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4371e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!bta_dm_cb.p_sec_cback) 4372e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return BTM_NOT_AUTHORIZED; 4373e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4374e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&sec_event, 0, sizeof(tBTA_DM_SEC)); 4375e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach switch (event) 4376e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4377e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_LE_IO_REQ_EVT: 4378e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 4379e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4380e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_co_ble_io_req(bda, 4381e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &p_data->io_req.io_cap, 4382e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &p_data->io_req.oob_data, 43836ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach &p_data->io_req.auth_req, 43846ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach &p_data->io_req.max_key_size, 43856ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach &p_data->io_req.init_keys, 4386e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &p_data->io_req.resp_keys); 4387e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 4388e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BTM_OOB_INCLUDED == FALSE 4389e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = BTM_SUCCESS; 4390e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 4391e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_EVENT2("io mitm: %d oob_data:%d", p_data->io_req.auth_req, p_data->io_req.oob_data); 4392e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4393e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 4394e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4395e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_LE_SEC_REQUEST_EVT: 4396e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(sec_event.ble_req.bd_addr, bda); 4397e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BCM_STRNCPY_S((char*)sec_event.ble_req.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN-1)); 4398e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_sec_cback(BTA_DM_BLE_SEC_REQ_EVT, &sec_event); 4399e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 4400e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4401e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_LE_KEY_NOTIF_EVT: 4402e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(sec_event.key_notif.bd_addr, bda); 4403e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN-1)); 4404e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.key_notif.passkey = p_data->key_notif; 4405e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_NOTIF_EVT, &sec_event); 4406e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 4407e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4408e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_LE_KEY_REQ_EVT: 4409e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(sec_event.ble_req.bd_addr, bda); 4410e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_REQ_EVT, &sec_event); 4411e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 4412e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4413e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_LE_OOB_REQ_EVT: 4414e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(sec_event.ble_req.bd_addr, bda); 4415e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_sec_cback(BTA_DM_BLE_OOB_REQ_EVT, &sec_event); 4416e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 4417e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4418e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_LE_KEY_EVT: 4419e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(sec_event.ble_key.bd_addr, bda); 4420e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.ble_key.key_type = p_data->key.key_type; 4421e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(&sec_event.ble_key.key_value, p_data->key.p_key_value, sizeof(tBTM_LE_KEY_VALUE)); 4422e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_sec_cback(BTA_DM_BLE_KEY_EVT, &sec_event); 4423e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 4424e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4425e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_LE_COMPLT_EVT: 4426e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(sec_event.auth_cmpl.bd_addr, bda); 4427e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->complt.reason != 0) 4428e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.auth_cmpl.fail_reason = BTA_DM_AUTH_CONVERT_SMP_CODE(((UINT8)p_data->complt.reason)); 4429e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 4430e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_event.auth_cmpl.success = TRUE; 4431e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4432e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_cb.p_sec_cback) 4433e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4434e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach //bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event); 4435e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_sec_cback(BTA_DM_BLE_AUTH_CMPL_EVT, &sec_event); 4436e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4437e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4438e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 4439e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4440e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach default: 4441e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = BTM_NOT_AUTHORIZED; 4442e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 4443e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4444e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return status; 4445e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4446e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif /* SMP_INCLUDED == TRUE */ 4447e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4448e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4449e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4450e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_ble_id_key_cback 4451e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4452e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Callback for BLE local ID keys 4453e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 44546ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 44556ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns void 4456e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4457e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4458e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_ble_id_key_cback (UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key) 4459e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 4460e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 evt; 4461e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_SEC dm_key; 4462e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4463e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach switch (key_type) 4464e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4465e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_BLE_KEY_TYPE_ID: 4466e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTM_BLE_KEY_TYPE_ER: 4467e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_cb.p_sec_cback) 4468e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4469e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(&dm_key.ble_id_keys, p_key, sizeof(tBTM_BLE_LOCAL_KEYS)); 4470e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4471e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach evt = (key_type == BTM_BLE_KEY_TYPE_ID) ? BTA_DM_BLE_LOCAL_IR_EVT :\ 4472e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTA_DM_BLE_LOCAL_ER_EVT; 4473e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_cb.p_sec_cback(evt, &dm_key); 4474e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4475e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 4476e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4477e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach default: 4478e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("Unknown key type %d", key_type); 4479e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 4480e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4481e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 4482e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4483e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4484e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4485e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4486e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4487e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_add_blekey 4488e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 44896ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description This function adds an BLE Key to an security database entry. 4490e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** This function shall only be called AFTER BTA_DmAddBleDevice has been called. 4491e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** It is normally called during host startup to restore all required information 4492e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** stored in the NVRAM. 4493e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 44946ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Parameters: 4495e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4496e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4497e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_add_blekey (tBTA_DM_MSG *p_data) 4498e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 44996ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if (!BTM_SecAddBleKey (p_data->add_ble_key.bd_addr, 45006ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach (tBTM_LE_KEY_VALUE *)&p_data->add_ble_key.blekey, 4501e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->add_ble_key.key_type)) 4502e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4503e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR2 ("BTA_DM: Error adding BLE Key for device %08x%04x", 4504e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (p_data->add_ble_key.bd_addr[0]<<24)+(p_data->add_ble_key.bd_addr[1]<<16)+\ 4505e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (p_data->add_ble_key.bd_addr[2]<<8)+p_data->add_ble_key.bd_addr[3], 4506e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (p_data->add_ble_key.bd_addr[4]<<8)+p_data->add_ble_key.bd_addr[5]); 4507e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4508e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4509e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4510e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4511e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4512e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_add_ble_device 4513e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 45146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description This function adds an BLE device to an security database entry. 4515e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** It is normally called during host startup to restore all required information 4516e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** stored in the NVRAM. 4517e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 45186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Parameters: 4519e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4520e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4521e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_add_ble_device (tBTA_DM_MSG *p_data) 4522e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 45236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if (!BTM_SecAddBleDevice (p_data->add_ble_device.bd_addr, NULL, 45246ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach p_data->add_ble_device.dev_type , 4525e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->add_ble_device.addr_type)) 4526e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4527e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR2 ("BTA_DM: Error adding BLE Device for device %08x%04x", 4528e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (p_data->add_ble_device.bd_addr[0]<<24)+(p_data->add_ble_device.bd_addr[1]<<16)+ \ 45296ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach (p_data->add_ble_device.bd_addr[2]<<8)+p_data->add_ble_device.bd_addr[3], 4530e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (p_data->add_ble_device.bd_addr[4]<<8)+p_data->add_ble_device.bd_addr[5]); 4531e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4532e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4533e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4534e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4535e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4536e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_add_ble_device 4537e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 45386ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description This function adds an BLE device to an security database entry. 4539e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** It is normally called during host startup to restore all required information 4540e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** stored in the NVRAM. 4541e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 45426ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Parameters: 4543e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4544e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4545e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_ble_passkey_reply (tBTA_DM_MSG *p_data) 4546e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 4547e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->pin_reply.accept) 4548e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4549e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4550e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_SUCCESS, p_data->ble_passkey_reply.passkey); 4551e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4552e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 4553e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4554e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_NOT_AUTHORIZED, p_data->ble_passkey_reply.passkey); 45556ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach } 4556e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4557e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4558e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4559e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4560e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4561e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_security_grant 4562e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4563e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function grant SMP security request access. 4564e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 45656ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Parameters: 4566e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4567e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4568e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_security_grant (tBTA_DM_MSG *p_data) 4569e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 4570e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SecurityGrant(p_data->ble_sec_grant.bd_addr, p_data->ble_sec_grant.res); 4571e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4572e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4573e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4574e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4575e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_ble_set_bg_conn_type 4576e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4577e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function set the BLE background connection type 4578e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 45796ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Parameters: 4580e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4581e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4582e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_ble_set_bg_conn_type (tBTA_DM_MSG *p_data) 4583e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 45846ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach BTM_BleSetBgConnType(p_data->ble_set_bd_conn_type.bg_conn_type, 4585e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->ble_set_bd_conn_type.p_select_cback); 4586e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4587e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4588e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4589e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4590e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_ble_set_conn_params 4591e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4592e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function set the preferred connection parameters. 4593e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 45946ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Parameters: 4595e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4596e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4597e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_ble_set_conn_params (tBTA_DM_MSG *p_data) 4598e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 4599e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_BleSetPrefConnParams(p_data->ble_set_conn_params.peer_bda, 4600e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->ble_set_conn_params.conn_int_min, 4601e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->ble_set_conn_params.conn_int_max, 4602e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->ble_set_conn_params.slave_latency, 4603e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->ble_set_conn_params.supervision_tout); 4604e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4605e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4606e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4607e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4608e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_ble_set_scan_params 4609e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4610e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function set the preferred connection scan parameters. 4611e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 46126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Parameters: 4613e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4614e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4615e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_ble_set_scan_params (tBTA_DM_MSG *p_data) 4616e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 4617e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_BleSetConnScanParams(p_data->ble_set_scan_params.scan_int, 4618e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->ble_set_scan_params.scan_window); 46196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach} 4620e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4621e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)) 4622e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4623e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4624e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4625e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_dm_start_disc_gatt_services 4626e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4627e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function starts a GATT service search request. 4628e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 46296ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Parameters: 4630e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4631e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4632e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void btm_dm_start_disc_gatt_services (UINT16 conn_id) 4633e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 46346ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach tBT_UUID *p_uuid = bta_dm_search_cb.p_srvc_uuid + 46356ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search; 4636e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 46376ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach p_uuid = bta_dm_search_cb.p_srvc_uuid + 4638e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search; 4639e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4640e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* always search for all services */ 4641e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTA_GATTC_ServiceSearchRequest(conn_id, p_uuid); 4642e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4643e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4644e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4645e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4646e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_gatt_disc_result 4647e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4648e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function process the GATT service search result. 4649e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 46506ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Parameters: 4651e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4652e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4653e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_gatt_disc_result(tBTA_GATT_ID service_id) 4654e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 4655e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_SEARCH result; 46566ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 4657e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* 4658e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach * This logic will not work for gatt case. We are checking against the bluetooth profiles here 4659e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach * just copy the GATTID in raw data field and send it across. 4660e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach */ 4661e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4662e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 46636ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if ( bta_dm_search_cb.ble_raw_used + sizeof(tBTA_GATT_ID) < bta_dm_search_cb.ble_raw_size ) 4664e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4665e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG3("ADDING BLE SERVICE uuid=0x%x, ble_ptr = 0x%x, ble_raw_used = 0x%x", service_id.uuid.uu.uuid16,bta_dm_search_cb.p_ble_rawdata,bta_dm_search_cb.ble_raw_used); 4666e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4667e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy((bta_dm_search_cb.p_ble_rawdata + bta_dm_search_cb.ble_raw_used), &service_id, 4668e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sizeof(service_id) ); 4669e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4670e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.ble_raw_used += sizeof(service_id); 4671e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 46726ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach } 4673e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 4674e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4675e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR3("%s out of room to accomodate more service ids ble_raw_size = %d ble_raw_used = %d", __FUNCTION__,bta_dm_search_cb.ble_raw_size, bta_dm_search_cb.ble_raw_used ); 4676e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 46776ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 4678e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_ERROR1("bta_dm_gatt_disc_result serivce_id len=%d ", service_id.uuid.len); 4679e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) 4680e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4681e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4682e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* send result back to app now, one by one */ 4683e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy (result.disc_ble_res.bd_addr, bta_dm_search_cb.peer_bdaddr); 4684e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BCM_STRNCPY_S((char*)result.disc_ble_res.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN-1)); 4685e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(&result.disc_ble_res.service, &service_id.uuid, sizeof(tBT_UUID)); 4686e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4687e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_search_cback(BTA_DM_DISC_BLE_RES_EVT, &result); 4688e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4689e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4690e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4691e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4692e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4693e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_gatt_disc_complete 4694e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4695e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function process the GATT service search complete. 4696e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 46976ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Parameters: 4698e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4699e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4700e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_gatt_disc_complete(UINT16 conn_id, tBTA_GATT_STATUS status) 4701e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 4702e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_DM_MSG *p_msg; 4703e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4704e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("bta_dm_gatt_disc_complete conn_id = %d",conn_id); 4705e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4706e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_search_cb.uuid_to_search > 0) bta_dm_search_cb.uuid_to_search --; 4707e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4708e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (status == BTA_GATT_OK && bta_dm_search_cb.uuid_to_search > 0) 4709e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4710e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_dm_start_disc_gatt_services(conn_id); 4711e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4712e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 4713e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4714e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.uuid_to_search = 0; 4715e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4716e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* no more services to be discovered */ 4717e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) 4718e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4719e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT; 4720e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.result = (status == BTA_GATT_OK) ? BTA_SUCCESS :BTA_FAILURE; 4721e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found; 4722e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr); 4723e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME), 4724e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_get_remname(), (BD_NAME_LEN-1)); 4725e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4726e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* make sure the string is terminated */ 4727e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0; 4728e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4729e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.device_type = BT_DEVICE_TYPE_BLE; 4730e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( bta_dm_search_cb.ble_raw_used > 0 ) 4731e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4732e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.p_raw_data = GKI_getbuf(bta_dm_search_cb.ble_raw_used); 47336ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 47346ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach memcpy( p_msg->disc_result.result.disc_res.p_raw_data, 4735e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_ble_rawdata, 4736e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.ble_raw_used ); 47376ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 4738e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.raw_data_size = bta_dm_search_cb.ble_raw_used; 4739e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4740e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 4741e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4742e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_msg->disc_result.result.disc_res.p_raw_data = NULL; 4743e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.p_ble_rawdata = 0; 4744e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4745e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4746e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_msg); 4747e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4748e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (conn_id != BTA_GATT_INVALID_CONN_ID) 4749e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4750e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTA_GATTC_Close(conn_id); 4751e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4752e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID; 4753e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.gatt_disc_active = FALSE; 4754e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4755e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4756e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4757e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4758e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4759e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_dm_start_gatt_discovery 4760e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4761e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This is GATT initiate the service search by open a GATT connection 4762e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** first. 4763e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 47646ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Parameters: 4765e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4766e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4767e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_dm_start_gatt_discovery (BD_ADDR bd_addr) 4768e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 4769e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.gatt_disc_active = TRUE; 4770e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTA_GATTC_Open(bta_dm_search_cb.client_if, bd_addr, TRUE); 4771e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4772e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4773e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4774e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4775e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_cancel_gatt_discovery 4776e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4777e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This is GATT cancel the GATT service search. 4778e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 47796ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Parameters: 4780e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4781e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4782e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr) 4783e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 4784e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (bta_dm_search_cb.conn_id == BTA_GATT_INVALID_CONN_ID) 4785e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4786e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTA_GATTC_CancelOpen(bta_dm_search_cb.client_if, bd_addr, TRUE); 4787e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4788e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4789e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_gatt_disc_complete(bta_dm_search_cb.conn_id, (tBTA_GATT_STATUS) BTA_GATT_ERROR); 4790e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4791e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4792e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4793e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4794e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_proc_open_evt 4795e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4796e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description process BTA_GATTC_OPEN_EVT in DM. 4797e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 47986ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Parameters: 4799e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4800e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4801e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_dm_proc_open_evt(tBTA_GATTC_OPEN *p_data) 4802e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 4803e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 *p1; 48046ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach UINT8 *p2; 4805e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4806e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p1 = bta_dm_search_cb.peer_bdaddr; 4807e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p2 = p_data->remote_bda; 4808e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 48096ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach APPL_TRACE_DEBUG5("DM Search state= %d search_cb.peer_dbaddr: [%08x%04x] connected_bda= [%08x%04x] ", 4810e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.state, 4811e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ((p1[0])<<24)+((p1[1])<<16)+((p1[2])<<8)+(p1[3]), 4812e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ((p1[4])<<8)+ p1[5], 4813e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ((p2[0])<<24)+((p2[1])<<16)+((p2[2])<<8)+(p2[3]), 4814e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ((p2[4])<<8)+ p2[5]); 4815e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 48166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach APPL_TRACE_DEBUG3("BTA_GATTC_OPEN_EVT conn_id = %d client_if=%d status = %d" , 4817e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->conn_id, 4818e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->client_if, 4819e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->status); 4820e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4821e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.conn_id = p_data->conn_id; 4822e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4823e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->status == BTA_GATT_OK) 4824e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4825e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_dm_start_disc_gatt_services(p_data->conn_id); 4826e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4827e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 4828e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4829e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_gatt_disc_complete(BTA_GATT_INVALID_CONN_ID, p_data->status); 4830e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4831e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4832e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4833e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 4834e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4835e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_dm_gattc_callback 4836e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4837e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This is GATT client callback function used in DM. 4838e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 48396ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Parameters: 4840e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4841e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 4842e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data) 4843e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 4844e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("bta_dm_gattc_callback event = %d", event); 4845e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4846e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach switch (event) 4847e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4848e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTA_GATTC_REG_EVT: 4849e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("BTA_GATTC_REG_EVT client_if = %d", p_data->reg_oper.client_if); 4850e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->reg_oper.status == BTA_GATT_OK) 4851e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.client_if = p_data->reg_oper.client_if; 4852e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 4853e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_search_cb.client_if = BTA_GATTS_INVALID_IF; 4854e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 4855e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4856e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTA_GATTC_OPEN_EVT: 4857e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_proc_open_evt(&p_data->open); 4858e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 4859e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4860e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTA_GATTC_SEARCH_RES_EVT: 4861e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_gatt_disc_result(p_data->srvc_res.service_uuid.id); 4862e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 4863e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4864e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTA_GATTC_SEARCH_CMPL_EVT: 4865e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) 4866e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_gatt_disc_complete(p_data->search_cmpl.conn_id, p_data->search_cmpl.status); 4867e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 4868e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4869e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach case BTA_GATTC_CLOSE_EVT: 4870e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_DEBUG1("BTA_GATTC_CLOSE_EVT reason = %d", p_data->close.reason); 4871e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* in case of disconnect before search is completed */ 4872e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) && 4873e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach !memcmp(p_data->close.remote_bda, bta_dm_search_cb.peer_bdaddr, BD_ADDR_LEN)) 4874e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 4875e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_dm_gatt_disc_complete((UINT16)BTA_GATT_INVALID_CONN_ID, (tBTA_GATT_STATUS) BTA_GATT_ERROR); 4876e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4877e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 4878e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4879e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach default: 4880e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 4881e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4882e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 4883e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4884e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif /* BTA_GATT_INCLUDED */ 4885e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4886e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif /* BLE_INCLUDED */ 4887