bta_dm_act.c revision ca22ac493ab777199084d87b3c7627e7f27555af
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2003-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  This file contains the action functions for device manager state
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  machine.
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h"
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h"
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bd.h"
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_sys.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_api.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_dm_int.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_dm_co.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h"
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sdp_api.h"
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h"
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "wbt_api.h"
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "utl.h"
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_inq_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir);
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_inq_cmpl_cb (void * p_result);
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_service_search_remname_cback (BD_ADDR bd_addr, DEV_CLASS dc, BD_NAME bd_name);
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_remname_cback (tBTM_REMOTE_DEV_NAME *p_remote_name);
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_find_services ( BD_ADDR bd_addr);
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_discover_next_device(void);
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_sdp_callback (UINT16 sdp_status);
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic 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);
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 bta_dm_pin_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name);
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 bta_dm_link_key_request_cback (BD_ADDR bd_addr, LINK_KEY key);
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic 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);
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,BD_NAME bd_name, int result);
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_local_name_cback(BD_ADDR bd_addr);
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_dm_check_av(UINT16 event);
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data);
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_acl_change_cback (BD_ADDR p_bda, DEV_CLASS p_dc, BD_NAME p_bdn, BD_FEATURES features, BOOLEAN is_new);
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr);
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Extended Inquiry Response */
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 bta_dm_sp_cback (tBTM_SP_EVT event, tBTM_SP_EVT_DATA *p_data);
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_EIR_SERVER_INCLUDED == TRUE)
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_set_eir (char *local_name);
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_EIR_SERVER_INCLUDED */
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_EIR_CLIENT_INCLUDED == TRUE)
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_eir_search_services( tBTM_INQ_RESULTS  *p_result,
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        tBTA_SERVICE_MASK *p_services_to_search,
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        tBTA_SERVICE_MASK *p_services_found);
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_EIR_CLIENT_INCLUDED */
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_rssi_cback (tBTM_RSSI_RESULTS *p_result);
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_signal_strength_timer_cback (TIMER_LIST_ENT *p_tle);
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_link_quality_cback (tBTM_LINK_QUALITY_RESULTS *p_result);
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_search_timer_cback (TIMER_LIST_ENT *p_tle);
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_disable_timer_cback (TIMER_LIST_ENT *p_tle);
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_disable_conn_down_timer_cback (TIMER_LIST_ENT *p_tle);
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr);
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_adjust_roles(BOOLEAN delay_role_switch);
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *bta_dm_get_remname(void);
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result);
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr);
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_discover_device(BD_ADDR remote_bd_addr);
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status );
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_dm_dev_blacklisted_for_switch (BD_ADDR remote_bd_addr);
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_delay_role_switch_cback (TIMER_LIST_ENT *p_tle);
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
95ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr);
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
97ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
98ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void bta_dm_disable_search_and_disc(void);
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #if ((defined SMP_INCLUDED) && (SMP_INCLUDED == TRUE))
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_DATA *p_data);
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #endif
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_ble_id_key_cback (UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key);
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #if ((defined BTA_GATT_INCLUDED) &&  (BTA_GATT_INCLUDED == TRUE))
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_dm_start_gatt_discovery ( BD_ADDR bd_addr);
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr);
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data);
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #endif
109ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void bta_dm_observe_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir);
110ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void bta_dm_observe_cmpl_cb (void * p_result);
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
112ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#ifndef BTA_DM_BLE_ADV_CHNL_MAP
113ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#define BTA_DM_BLE_ADV_CHNL_MAP (BTM_BLE_ADV_CHNL_37|BTM_BLE_ADV_CHNL_38|BTM_BLE_ADV_CHNL_39)
114ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
115ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void sdpu_uuid16_to_uuid128(UINT16 uuid16, UINT8* p_uuid128);
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT16 bta_service_id_to_uuid_lkup_tbl [BTA_MAX_SERVICE_ID] =
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_PNP_INFORMATION,         /* Reserved */
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_SERIAL_PORT,             /* BTA_SPP_SERVICE_ID */
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_DIALUP_NETWORKING,       /* BTA_DUN_SERVICE_ID */
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_AUDIO_SOURCE,            /* BTA_A2DP_SOURCE_SERVICE_ID */
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_LAN_ACCESS_USING_PPP,    /* BTA_LAP_SERVICE_ID */
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_HEADSET,                 /* BTA_HSP_HS_SERVICE_ID */
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_HF_HANDSFREE,            /* BTA_HFP_HS_SERVICE_ID */
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_OBEX_OBJECT_PUSH,        /* BTA_OPP_SERVICE_ID */
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_OBEX_FILE_TRANSFER,      /* BTA_FTP_SERVICE_ID */
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_CORDLESS_TELEPHONY,      /* BTA_CTP_SERVICE_ID */
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_INTERCOM,                /* BTA_ICP_SERVICE_ID */
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_IRMC_SYNC,               /* BTA_SYNC_SERVICE_ID */
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_DIRECT_PRINTING,         /* BTA_BPP_SERVICE_ID */
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_IMAGING_RESPONDER,       /* BTA_BIP_SERVICE_ID */
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_PANU,                    /* BTA_PANU_SERVICE_ID */
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_NAP,                     /* BTA_NAP_SERVICE_ID */
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_GN,                      /* BTA_GN_SERVICE_ID */
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_SAP,                     /* BTA_SAP_SERVICE_ID */
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_AUDIO_SINK,              /* BTA_A2DP_SERVICE_ID */
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_AV_REMOTE_CONTROL,       /* BTA_AVRCP_SERVICE_ID */
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_HUMAN_INTERFACE,         /* BTA_HID_SERVICE_ID */
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_VIDEO_SINK,              /* BTA_VDP_SERVICE_ID */
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_PBAP_PSE,                /* BTA_PBAP_SERVICE_ID */
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_HEADSET_AUDIO_GATEWAY,   /* BTA_HSP_SERVICE_ID */
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_AG_HANDSFREE,            /* BTA_HFP_SERVICE_ID */
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_MESSAGE_ACCESS,          /* BTA_MAP_SERVICE_ID */
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_MESSAGE_NOTIFICATION,    /* BTA_MN_SERVICE_ID */
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_HDP_PROFILE,             /* BTA_HDP_SERVICE_ID */
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_PBAP_PCE                 /* BTA_PCE_SERVICE_ID */
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED && BTA_GATT_INCLUDED
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ,UUID_PROTOCOL_ATT                       /* BTA_GATT_SERVICE_ID */
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * NOTE : The number of element in bta_service_id_to_btm_srv_id_lkup_tbl should be matching with
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *        the value BTA_MAX_SERVICE_ID in bta_api.h
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *        i.e., If you add new Service ID for BTA, the correct security ID of the new service
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *              from Security service definitions (btm_api.h) should be added to this lookup table.
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT32 bta_service_id_to_btm_srv_id_lkup_tbl [BTA_MAX_SERVICE_ID] =
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                                      /* Reserved */
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_SERIAL_PORT,            /* BTA_SPP_SERVICE_ID */
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_DUN,                    /* BTA_DUN_SERVICE_ID */
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_AVDTP,                  /* BTA_AUDIO_SOURCE_SERVICE_ID */
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_LAN_ACCESS,             /* BTA_LAP_SERVICE_ID */
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_HEADSET_AG,             /* BTA_HSP_SERVICE_ID */
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_AG_HANDSFREE,           /* BTA_HFP_SERVICE_ID */
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_OBEX,                   /* BTA_OPP_SERVICE_ID */
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_OBEX_FTP,               /* BTA_FTP_SERVICE_ID */
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_CORDLESS,               /* BTA_CTP_SERVICE_ID */
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_INTERCOM,               /* BTA_ICP_SERVICE_ID */
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_IRMC_SYNC,              /* BTA_SYNC_SERVICE_ID */
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_BPP_JOB,                /* BTA_BPP_SERVICE_ID */
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_BIP,                    /* BTA_BIP_SERVICE_ID */
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_BNEP_PANU,              /* BTA_PANU_SERVICE_ID */
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_BNEP_NAP,               /* BTA_NAP_SERVICE_ID */
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_BNEP_GN,                /* BTA_GN_SERVICE_ID */
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_SAP,                    /* BTA_SAP_SERVICE_ID */
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_AVDTP,                  /* BTA_A2DP_SERVICE_ID */
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_AVCTP,                  /* BTA_AVRCP_SERVICE_ID */
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_HID_SEC_CTRL,           /* BTA_HID_SERVICE_ID */
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_AVDTP,                  /* BTA_VDP_SERVICE_ID */
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_PBAP,                   /* BTA_PBAP_SERVICE_ID */
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_HEADSET,                /* BTA_HSP_HS_SERVICE_ID */
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_HF_HANDSFREE,           /* BTA_HFP_HS_SERVICE_ID */
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_MAP,                    /* BTA_MAP_SERVICE_ID */
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_MAP,                    /* BTA_MN_SERVICE_ID */
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_HDP_SNK,                /* BTA_HDP_SERVICE_ID */
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SEC_SERVICE_PBAP                    /* BTA_PCE_SERVICE_ID */
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED && BTA_GATT_INCLUDED
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ,BTM_SEC_SERVICE_ATT                    /* BTA_GATT_SERVICE_ID */
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* bta security callback */
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTM_APPL_INFO bta_security =
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    &bta_dm_authorize_cback,
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    &bta_dm_pin_cback,
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    &bta_dm_new_link_key_cback,
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    &bta_dm_link_key_request_cback,
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    &bta_dm_authentication_complete_cback,
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    NULL,
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    &bta_dm_bond_cancel_complete_cback,
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    &bta_dm_sp_cback
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    NULL
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ,&bta_dm_ble_smp_cback
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ,&bta_dm_ble_id_key_cback
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* TBD... To be moved to some conf file..? */
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_DM_MAX_ROLE_SWITCH_BLACKLIST_COUNT   5
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_DM_LMP_VER_INFO bta_role_switch_blacklist[BTA_DM_MAX_ROLE_SWITCH_BLACKLIST_COUNT] =
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {0x000F,0x2000,0x04},
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {0x00,0x00,0x00},
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {0x00,0x00,0x00},
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {0x00,0x00,0x00},
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {0x00,0x00,0x00}
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define MAX_DISC_RAW_DATA_BUF       (4096)
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 g_disc_raw_data_buf[MAX_DISC_RAW_DATA_BUF];
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_app_ready_timer_cback
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      allow sending EIR to controller
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&(BTA_EIR_CANNED_UUID_LIST != TRUE)
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_app_ready_timer_cback (TIMER_LIST_ENT *p_tle)
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_set_eir (NULL);
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define bta_dm_app_ready_timer_cback (x)
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_enable
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Initialises the BT device manager
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_enable(tBTA_DM_MSG *p_data)
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_SYS_HW_MSG *sys_enable_event;
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEC sec_event;
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if already in use, return an error */
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( bta_dm_cb.is_bta_dm_active == TRUE  )
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_WARNING0("bta_dm_enable - device already started by another application");
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&sec_event.enable, 0, sizeof ( tBTA_DM_ENABLE ));
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_event.enable.status = BTA_FAILURE;
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( p_data->enable.p_sec_cback != NULL  )
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data->enable.p_sec_cback (BTA_DM_ENABLE_EVT, &sec_event);
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* first, register our callback to SYS HW manager */
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_hw_register( BTA_SYS_HW_BLUETOOTH, bta_dm_sys_hw_cback );
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* make sure security callback is saved - if no callback, do not erase the previous one,
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    it could be an error recovery mechanism */
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( p_data->enable.p_sec_cback != NULL  )
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_cb.p_sec_cback = p_data->enable.p_sec_cback;
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* notify BTA DM is now active */
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_cb.is_bta_dm_active = TRUE;
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send a message to BTA SYS */
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((sys_enable_event = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL)
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sys_enable_event->hdr.event = BTA_SYS_API_ENABLE_EVT;
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH;
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_sendmsg(sys_enable_event);
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_sys_hw_cback
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description     callback register to SYS to get HW status updates
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status )
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    DEV_CLASS   dev_class;
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEC_CBACK           *temp_cback;
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                   key_mask = 0;
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_OCTET16              er;
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_BLE_LOCAL_ID_KEYS  id_key;
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBT_UUID                app_uuid = {LEN_UUID_128,{0}};
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG1(" bta_dm_sys_hw_cback with event: %i" , status );
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* On H/W error evt, report to the registered DM application callback */
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == BTA_SYS_HW_ERROR_EVT) {
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project          if( bta_dm_cb.p_sec_cback != NULL )
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_cb.p_sec_cback(BTA_DM_HW_ERROR_EVT, NULL);
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project          return;
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( status == BTA_SYS_HW_OFF_EVT )
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( bta_dm_cb.p_sec_cback != NULL )
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.p_sec_cback(BTA_DM_DISABLE_EVT, NULL);
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* reinitialize the control block */
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* unregister from SYS */
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_hw_unregister( BTA_SYS_HW_BLUETOOTH );
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* notify BTA DM is now unactive */
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.is_bta_dm_active = FALSE;
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( status == BTA_SYS_HW_ON_EVT )
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* FIXME: We should not unregister as the SYS shall invoke this callback on a H/W error.
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        * We need to revisit when this platform has more than one BLuetooth H/W chip */
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        //bta_sys_hw_unregister( BTA_SYS_HW_BLUETOOTH);
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* save security callback */
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        temp_cback = bta_dm_cb.p_sec_cback;
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* make sure the control block is properly initialized */
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* and retrieve the callback */
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.p_sec_cback=temp_cback;
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.is_bta_dm_active = TRUE;
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* hw is ready, go on with BTA DM initialization */
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&bta_dm_search_cb, 0x00, sizeof(bta_dm_search_cb));
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&bta_dm_conn_srvcs, 0x00, sizeof(bta_dm_conn_srvcs));
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&bta_dm_di_cb, 0, sizeof(tBTA_DM_DI_CB));
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(dev_class, bta_dm_cfg.dev_class, sizeof(dev_class));
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SetDeviceClass (dev_class);
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* load BLE local information: ID keys, ER if available */
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_co_ble_load_local_keys(&key_mask, er, &id_key);
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ER)
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ER, (tBTM_BLE_LOCAL_KEYS *)&er);
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ID)
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ID, (tBTM_BLE_LOCAL_KEYS *)&id_key);
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if ((defined BTA_GATT_INCLUDED) &&  (BTA_GATT_INCLUDED == TRUE))
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset (&app_uuid.uu.uuid128, 0x87, LEN_UUID_128);
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTA_GATTC_AppRegister(&app_uuid, bta_dm_gattc_callback);
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SecRegister((tBTM_APPL_INFO*)&bta_security);
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SetDefaultLinkSuperTout(bta_dm_cfg.link_timeout);
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_WritePageTimeout(bta_dm_cfg.page_timeout);
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.cur_policy = bta_dm_cfg.policy_settings;
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_RegBusyLevelNotif (bta_dm_bl_change_cback, NULL, BTM_BL_UPDATE_MASK|BTM_BL_ROLE_CHG_MASK);
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_AclRegisterForChanges(bta_dm_acl_change_cback);
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Earlier, we used to invoke BTM_ReadLocalAddr which was just copying the bd_addr
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           from the control block and invoking the callback which was sending the DM_ENABLE_EVT.
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           But then we have a few HCI commands being invoked above which were still in progress
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           when the ENABLE_EVT was sent. So modified this to fetch the local name which forces
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           the DM_ENABLE_EVT to be sent only after all the init steps are complete */
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_ReadLocalDeviceNameFromController((tBTM_CMPL_CB *)bta_dm_local_name_cback);
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_rm_register((tBTA_SYS_CONN_CBACK*)bta_dm_rm_cback);
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* initialize bluetooth low power manager */
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_init_pm();
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_policy_register((tBTA_SYS_CONN_CBACK*)bta_dm_policy_cback);
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        // BLUEDROID REMOVE ??
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if 0
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if 1
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Create broadcom primary DI record */
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(WBT_ExtCreateRecord())
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&( BTA_EIR_CANNED_UUID_LIST != TRUE )
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* while app_ready_timer is running, BTA DM doesn't send EIR to controller */
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.app_ready_timer.p_cback = (TIMER_CBACK*)&bta_dm_app_ready_timer_cback;
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_start_timer(&bta_dm_cb.app_ready_timer, 0, 100);
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_add_uuid(UUID_SERVCLASS_PNP_INFORMATION);
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_di_cb.di_handle[bta_dm_di_cb.di_num] = 0;    /* primary DI record */
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_di_cb.di_num ++;
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else   /* Eventually implement pin code */
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (WBT_ExtCreateRecord())
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            WBT_ExtAddPinCode();
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_DEBUG0(" --- ignored event");
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_disable
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Disables the BT device manager
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_disable (tBTA_DM_MSG *p_data)
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Set l2cap idle timeout to 0 (so BTE immediately disconnects ACL link after last channel is closed) */
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    L2CA_SetIdleTimeoutByBdAddr((UINT8 *)BT_BD_ANY, 0);
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* disable all active subsystems */
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_disable(BTA_SYS_HW_BLUETOOTH);
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SetDiscoverability(BTM_NON_DISCOVERABLE, 0, 0);
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SetConnectability(BTM_NON_CONNECTABLE, 0, 0);
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_disable_pm();
465ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    bta_dm_disable_search_and_disc();
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_cb.disabling = TRUE;
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(BTM_GetNumAclLinks()==0)
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined(BTA_DISABLE_DELAY) && BTA_DISABLE_DELAY > 0)
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If BTA_DISABLE_DELAY is defined and greater than zero, then delay the shutdown by
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * BTA_DISABLE_DELAY milliseconds
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         */
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_WARNING2("%s BTA_DISABLE_DELAY set to %d ms",
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            __FUNCTION__, BTA_DISABLE_DELAY);
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_stop_timer(&bta_dm_cb.disable_timer);
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_conn_down_timer_cback;
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, BTA_DISABLE_DELAY);
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_disable_conn_down_timer_cback(NULL);
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_timer_cback;
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 5000);
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_disable_timer_cback
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Called if the disable timer expires
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Used to close ACL connections which are still active
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_disable_timer_cback (TIMER_LIST_ENT *p_tle)
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i;
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_EVENT0(" bta_dm_disable_timer_cback  ");
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(BTM_GetNumAclLinks())
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for(i=0; i<bta_dm_cb.device_list.count; i++)
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_remove_acl(bta_dm_cb.device_list.peer_device[i].peer_bdaddr);
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.disabling = FALSE;
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_remove_uuid(UUID_SERVCLASS_PNP_INFORMATION);
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.p_sec_cback(BTA_DM_DISABLE_EVT, NULL);
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_set_dev_name
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Sets local device name
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_set_dev_name (tBTA_DM_MSG *p_data)
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SetLocalDeviceName((char*)p_data->set_name.name);
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_EIR_SERVER_INCLUDED == TRUE)
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_set_eir ((char*)p_data->set_name.name);
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_set_visibility
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Sets discoverability, connectability and pairability
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_set_visibility (tBTA_DM_MSG *p_data)
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set modes for Discoverability and connectability if not ignore */
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data->set_visibility.disc_mode != BTA_DM_IGNORE)
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SetDiscoverability((UINT8)p_data->set_visibility.disc_mode,
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                bta_dm_cb.inquiry_scan_window,
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                bta_dm_cb.inquiry_scan_interval);
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data->set_visibility.conn_mode != BTA_DM_IGNORE)
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SetConnectability((UINT8)p_data->set_visibility.conn_mode,
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                bta_dm_cb.page_scan_window,
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                bta_dm_cb.page_scan_interval);
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Send False or True if not ignore */
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE )
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_data->set_visibility.pair_mode == BTA_DM_NON_PAIRABLE)
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.disable_pair_mode = TRUE;
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.disable_pair_mode = FALSE;
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Send False or True if not ignore */
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE)
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_data->set_visibility.conn_paired_only == BTA_DM_CONN_ALL)
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.conn_paired_only = FALSE;
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.conn_paired_only = TRUE;
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Change mode if either mode is not ignore */
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE || p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE)
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SetPairableMode((BOOLEAN)(!(bta_dm_cb.disable_pair_mode)),bta_dm_cb.conn_paired_only);
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_set_afhchannels
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function sets the AFH first and
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  last disable channel, so channels within
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  that range are disabled.
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_set_afhchannels (tBTA_DM_MSG *p_data)
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SetAfhChannels(p_data->set_afhchannels.first,p_data->set_afhchannels.last);
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_vendor_spec_command
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send a vendor specific command to the controller
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_vendor_spec_command (tBTA_DM_MSG *p_data)
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS status;
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    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);
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_tx_inqpower
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      write inquiry tx power.
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_tx_inqpower(tBTA_DM_MSG *p_data)
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_WriteInquiryTxPower (p_data->tx_inq_pwr.tx_power) == BTM_ILLEGAL_VALUE)
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR1("Invalid Inquiry Tx Power: %d", p_data->tx_inq_pwr.tx_power);
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_remove_device
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Removes device, Disconnects ACL link if required.
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project****
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_remove_device (tBTA_DM_MSG *p_data)
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_API_REMOVE_DEVICE *p_dev = &p_data->remove_dev;
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEC sec_event;
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_IsAclConnectionUp(p_dev->bd_addr))
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Take the link down first, and mark the device for removal when disconnected */
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_remove_acl( p_dev->bd_addr) ;
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for(i=0; i<bta_dm_cb.device_list.count; i++)
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(!bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_dev->bd_addr))
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(i < bta_dm_cb.device_list.count)
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_UNPAIRING;
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else    /* Ok to remove the device in application layer */
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SecDeleteDevice(p_dev->bd_addr);
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( bta_dm_cb.p_sec_cback )
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdcpy(sec_event.link_down.bd_addr, p_dev->bd_addr);
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* No connection, set status to success (acl disc code not valid) */
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sec_event.link_down.status = HCI_SUCCESS;
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &sec_event);
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_add_device
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function adds a Link Key to an security database entry.
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  It is normally called during host startup to restore all required information
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  stored in the NVRAM.
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project****
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_add_device (tBTA_DM_MSG *p_data)
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_API_ADD_DEVICE *p_dev = &p_data->add_dev;
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_dc = NULL;
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_lc = NULL;
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32  trusted_services_mask[BTM_SEC_SERVICE_ARRAY_SIZE];
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   index = 0;
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   btm_mask_index = 0;
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (trusted_services_mask, 0, sizeof(trusted_services_mask));
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If not all zeros, the device class has been specified */
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev->dc_known)
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dc = (UINT8 *)p_dev->dc;
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev->link_key_known)
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_lc = (UINT8 *)p_dev->link_key;
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev->is_trusted)
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* covert BTA service mask to BTM mask */
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        while (p_dev->tm && (index < BTA_MAX_SERVICE_ID))
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev->tm & (UINT32)(1<<index))
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_mask_index =  bta_service_id_to_btm_srv_id_lkup_tbl[index] / BTM_SEC_ARRAY_BITS;
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                trusted_services_mask[btm_mask_index] |= (UINT32)(1 << (bta_service_id_to_btm_srv_id_lkup_tbl[index] - (UINT32)(btm_mask_index * 32)));
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev->tm &= (UINT32)(~(1<<index));
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            index++;
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!BTM_SecAddDevice (p_dev->bd_addr, p_dc, p_dev->bd_name, p_dev->features,
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           trusted_services_mask, p_lc, p_dev->key_type, p_dev->io_cap))
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR2 ("BTA_DM: Error adding device %08x%04x",
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (p_dev->bd_addr[0]<<24)+(p_dev->bd_addr[1]<<16)+(p_dev->bd_addr[2]<<8)+p_dev->bd_addr[3],
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (p_dev->bd_addr[4]<<8)+p_dev->bd_addr[5]);
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
760ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         bta_dm_close_acl
761ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
762ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function forces to close the connection to a remote device
763ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  and optionaly remove the device from security database if
764ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  required.
765ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta****
766ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
767ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid bta_dm_close_acl(tBTA_DM_MSG *p_data)
768ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
769ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTA_DM_API_REMOVE_ACL *p_remove_acl = &p_data->remove_acl;
770ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8   index;
771ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
772ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    APPL_TRACE_DEBUG0("bta_dm_close_acl");
773ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
774ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (BTM_IsAclConnectionUp(p_remove_acl->bd_addr))
775ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
776ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        for (index = 0; index < bta_dm_cb.device_list.count; index ++)
777ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
778ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (!bdcmp( bta_dm_cb.device_list.peer_device[index].peer_bdaddr, p_remove_acl->bd_addr))
779ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                break;
780ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
781ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (index != bta_dm_cb.device_list.count)
782ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
783ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (p_remove_acl->remove_dev)
784ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                bta_dm_cb.device_list.peer_device[index].remove_dev_pending = TRUE;
785ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
786ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        else
787ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
788ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            APPL_TRACE_ERROR0("unknown device, remove ACL failed");
789ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
790ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* Disconnect the ACL link */
791ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        btm_remove_acl(p_remove_acl->bd_addr);
792ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
793ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* if to remove the device from security database ? do it now */
794ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    else if (p_remove_acl->remove_dev)
795ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
796ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (!BTM_SecDeleteDevice(p_remove_acl->bd_addr))
797ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
798ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            APPL_TRACE_ERROR0("delete device from security database failed.");
799ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
800ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
801ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* need to remove all pending background connection if any */
802ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        BTA_GATTC_CancelOpen(0, p_remove_acl->bd_addr, FALSE);
803ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* remove all cached GATT information */
804ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        BTA_GATTC_Refresh(p_remove_acl->bd_addr);
805ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
806ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
807ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* otherwise, no action needed */
808ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
809ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
810ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
811ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_bond
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Bonds with peer device
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_bond (tBTA_DM_MSG *p_data)
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS status;
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEC sec_event;
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char        *p_name;
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = BTM_SecBond ( p_data->bond.bd_addr, 0, NULL, 0 );
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED))
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_name = BTM_SecReadDevName(p_data->bond.bd_addr);
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_name)
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_name = "";
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(sec_event.auth_cmpl.bd_addr, p_data->bond.bd_addr);
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(sec_event.auth_cmpl.bd_name, p_name, (BD_NAME_LEN-1));
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_event.auth_cmpl.bd_name[BD_NAME_LEN-1] = 0;
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*      taken care of by memset [above]
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_event.auth_cmpl.key_present = FALSE;
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_event.auth_cmpl.success = FALSE;
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_event.auth_cmpl.fail_reason = HCI_ERR_ILLEGAL_COMMAND;
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == BTM_SUCCESS)
846ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sec_event.auth_cmpl.success = TRUE;
848ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
849ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        else
850ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
851ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* delete this device entry from Sec Dev DB */
852ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            bta_dm_remove_sec_dev_entry(p_data->bond.bd_addr);
853ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_bond_cancel
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Cancels bonding with a peer device
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_bond_cancel (tBTA_DM_MSG *p_data)
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS status;
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEC sec_event;
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_EVENT0(" bta_dm_bond_cancel ");
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = BTM_SecBondCancel ( p_data->bond_cancel.bd_addr );
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED && status != BTM_SUCCESS))
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_event.bond_cancel_cmpl.result = BTA_FAILURE;
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.p_sec_cback(BTA_DM_BOND_CANCEL_CMPL_EVT, &sec_event);
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_pin_reply
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send the pin_reply to a request from BTM
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_pin_reply (tBTA_DM_MSG *p_data)
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32  trusted_mask[BTM_SEC_SERVICE_ARRAY_SIZE];
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32  * current_trusted_mask;
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    current_trusted_mask = BTM_ReadTrustedMask(p_data->pin_reply.bd_addr);
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(current_trusted_mask)
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(trusted_mask, current_trusted_mask, sizeof(trusted_mask));
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(trusted_mask, 0, sizeof(trusted_mask));
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_data->pin_reply.accept)
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_PINCodeReply(p_data->pin_reply.bd_addr, BTM_SUCCESS, p_data->pin_reply.pin_len, p_data->pin_reply.p_pin, trusted_mask );
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_PINCodeReply(p_data->pin_reply.bd_addr, BTM_NOT_AUTHORIZED, 0, NULL, trusted_mask );
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_link_policy
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      remove/set link policy mask.
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  wake the link, is sniff/park is removed
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_link_policy (tBTA_DM_MSG *p_data)
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_PEER_DEVICE *p_dev;
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev = bta_dm_find_peer_device(p_data->link_policy.bd_addr);
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(!p_dev)
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG2(" bta_dm_link_policy set:%d, policy:0x%x",
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_data->link_policy.set, p_data->link_policy.policy_mask);
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_data->link_policy.set)
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* restore the default link policy */
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev->link_policy |= p_data->link_policy.policy_mask;
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* clear the policy from the default link policy */
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev->link_policy &= (~p_data->link_policy.policy_mask);
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(p_data->link_policy.policy_mask & (HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_PARK_MODE))
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if clearing sniff/park, wake the link */
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_pm_active(p_dev->peer_bdaddr);
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_policy_cback
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      process the link policy changes
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_PEER_DEVICE *p_dev = NULL;
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  policy = app_id;
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32  mask = (UINT32)(1 << id);
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(peer_addr)
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev = bta_dm_find_peer_device(peer_addr);
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG2(" bta_dm_policy_cback cmd:%d, policy:0x%x",
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status, policy);
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(status)
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_SYS_PLCY_SET:
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(!p_dev)
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* restore the default link policy */
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev->link_policy |= policy;
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_SYS_PLCY_CLR:
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(!p_dev)
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* clear the policy from the default link policy */
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev->link_policy &= (~policy);
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(policy & (HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_PARK_MODE))
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if clearing sniff/park, wake the link */
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_pm_active(p_dev->peer_bdaddr);
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_SYS_PLCY_DEF_SET:
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* want to restore/set the role switch policy */
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.role_policy_mask &= ~mask;
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(0 == bta_dm_cb.role_policy_mask)
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if nobody wants to insist on the role */
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.cur_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH;
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_SYS_PLCY_DEF_CLR:
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* want to remove the role switch policy */
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.role_policy_mask |= mask;
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.cur_policy &= ~HCI_ENABLE_MASTER_SLAVE_SWITCH;
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_auth_reply
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send the authorization reply to a request from BTM
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_auth_reply (tBTA_DM_MSG *p_data)
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32  trusted_mask[BTM_SEC_SERVICE_ARRAY_SIZE];
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   btm_mask_index = 0;
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32  * current_trusted_mask;
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    current_trusted_mask = BTM_ReadTrustedMask(p_data->auth_reply.bd_addr);
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(current_trusted_mask)
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(trusted_mask, current_trusted_mask, sizeof(trusted_mask));
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(trusted_mask, 0, sizeof(trusted_mask));
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_data->auth_reply.response != BTA_DM_NOT_AUTH)
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(p_data->auth_reply.response == BTA_DM_AUTH_PERM)
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(p_data->auth_reply.service < BTA_MAX_SERVICE_ID)
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* convert BTA service id to BTM mask */
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_mask_index =  bta_service_id_to_btm_srv_id_lkup_tbl[p_data->auth_reply.service] / 32;
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                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)));
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_DeviceAuthorized (p_data->auth_reply.bd_addr, BTM_SUCCESS,trusted_mask);
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_DeviceAuthorized (p_data->auth_reply.bd_addr, BTM_NOT_AUTHORIZED,trusted_mask);
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_confirm
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send the user confirm request reply in response to a
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  request from BTM
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_confirm(tBTA_DM_MSG *p_data)
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS res = BTM_NOT_AUTHORIZED;
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_data->confirm.accept == TRUE)
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        res = BTM_SUCCESS;
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_ConfirmReqReply(res, p_data->confirm.bd_addr);
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_passkey_cancel
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send the passkey cancel from SP initiator by sending a negative
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  passkey request replyreply.
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_passkey_cancel(tBTA_DM_MSG *p_data)
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_PasskeyReqReply(BTM_NOT_AUTHORIZED, p_data->passkey_cancel.bd_addr, 0);
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_loc_oob
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Retrieve the OOB data from the local LM
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_OOB_INCLUDED == TRUE)
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_loc_oob(tBTA_DM_MSG *p_data)
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_ReadLocalOobData();
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_ci_io_req_act
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      respond to the IO capabilities request from BTM
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_ci_io_req_act(tBTA_DM_MSG *p_data)
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_AUTH_REQ   auth_req = BTM_AUTH_AP_NO;
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_data->ci_io_req.auth_req)
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        auth_req = BTM_AUTH_AP_YES;
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_IoCapRsp(p_data->ci_io_req.bd_addr, p_data->ci_io_req.io_cap,
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_data->ci_io_req.oob_data, auth_req);
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_ci_rmt_oob_act
11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      respond to the OOB data request for the remote device from BTM
11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_ci_rmt_oob_act(tBTA_DM_MSG *p_data)
11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS res = BTM_NOT_AUTHORIZED;
11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_data->ci_rmt_oob.accept == TRUE)
11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        res = BTM_SUCCESS;
11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_RemoteOobDataReply(res, p_data->ci_rmt_oob.bd_addr,
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_data->ci_rmt_oob.c, p_data->ci_rmt_oob.r );
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_OOB_INCLUDED */
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_search_start
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Starts an inquiry
11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_search_start (tBTA_DM_MSG *p_data)
11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_CMPL result;
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 len = (UINT16)(sizeof(tBT_UUID) * p_data->search.num_uuid);
11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG1("bta_dm_search_start avoid_scatter=%d", bta_dm_cfg.avoid_scatter);
11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_dm_cfg.avoid_scatter &&
11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (p_data->search.rs_res == BTA_DM_RS_NONE) && bta_dm_check_av(BTA_DM_API_SEARCH_EVT))
11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(&bta_dm_cb.search_msg, &p_data->search, sizeof(tBTA_DM_API_SEARCH));
11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_ClearInqDb(NULL);
11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* save search params */
11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.p_search_cback = p_data->search.p_cback;
11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.services = p_data->search.services;
11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((bta_dm_search_cb.num_uuid = p_data->search.num_uuid) != 0 &&
12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         p_data->search.p_uuid != NULL)
12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len)) == NULL)
12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_ERROR0("bta_dm_search_start no resources");
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            result.status = BTA_FAILURE;
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            result.num_resp = 0;
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_inq_cmpl_cb ((void *)&result);
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//        bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len);
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(bta_dm_search_cb.p_srvc_uuid, p_data->search.p_uuid, len);
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    result.status = BTM_StartInquiry(   (tBTM_INQ_PARMS*)&p_data->search.inq_params,
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        bta_dm_inq_results_cb,
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        (tBTM_CMPL_CB*) bta_dm_inq_cmpl_cb);
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_EVENT1("bta_dm_search_start status=%d", result.status);
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (result.status != BTM_CMD_STARTED)
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        result.num_resp = 0;
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_inq_cmpl_cb ((void *)&result);
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_search_cancel
12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Cancels an ongoing search for devices
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_search_cancel (tBTA_DM_MSG *p_data)
12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_MSG * p_msg;
12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(BTM_IsInquiryActive())
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_CancelInquiry();
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cancel_notify(NULL);
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_sendmsg(p_msg);
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If no Service Search going on then issue cancel remote name in case it is active */
12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (!bta_dm_search_cb.name_discover_done)
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_CancelRemoteDeviceName();
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1263ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_dm_search_cb.gatt_disc_active)
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_discover
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Discovers services on a remote device
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_discover (tBTA_DM_MSG *p_data)
12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 len = (UINT16)(sizeof(tBT_UUID) * p_data->discover.num_uuid);
12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_EVENT2("bta_dm_discover services_to_search=0x%04X, sdp_search=%d",
12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_data->discover.services, p_data->discover.sdp_search);
12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* save the search condition */
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.services = p_data->discover.services;
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((bta_dm_search_cb.num_uuid = p_data->discover.num_uuid) != 0 &&
12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_data->discover.p_uuid != NULL)
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len)) == NULL)
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data->discover.p_cback(BTA_DM_DISC_CMPL_EVT, NULL);
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(bta_dm_search_cb.p_srvc_uuid, p_data->discover.p_uuid, len);
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.uuid_to_search = bta_dm_search_cb.num_uuid;
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.p_search_cback = p_data->discover.p_cback;
13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.sdp_search = p_data->discover.sdp_search;
13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.services_to_search = bta_dm_search_cb.services;
13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.service_index = 0;
13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.services_found = 0;
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.peer_name[0] = 0;
13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.sdp_search = p_data->discover.sdp_search;
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.p_btm_inq_info = BTM_InqDbRead (p_data->discover.bd_addr);
13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.name_discover_done = FALSE;
13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(&bta_dm_search_cb.uuid, &p_data->discover.uuid, sizeof(tSDP_UUID));
13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_discover_device(p_data->discover.bd_addr);
13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_di_disc_cmpl
13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Sends event to application when DI discovery complete
13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_di_disc_cmpl(tBTA_DM_MSG *p_data)
13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_DI_DISC_CMPL    di_disc;
13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&di_disc, 0, sizeof(tBTA_DM_DI_DISC_CMPL));
13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(di_disc.bd_addr, bta_dm_search_cb.peer_bdaddr);
13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if((p_data->hdr.offset == SDP_SUCCESS)
13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        || (p_data->hdr.offset == SDP_DB_FULL))
13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        di_disc.num_record  = SDP_GetNumDiRecords(bta_dm_di_cb.p_di_db);
13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        di_disc.result      = BTA_FAILURE;
13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_di_cb.p_di_db = NULL;
13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.p_search_cback(BTA_DM_DI_DISC_CMPL_EVT, (tBTA_DM_SEARCH *) &di_disc);
13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_di_disc_callback
13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function queries a remote device for DI information.
13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_di_disc_callback(UINT16 result)
13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_MSG * p_msg;
13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->hdr.event            = BTA_DM_SEARCH_CMPL_EVT;
13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->hdr.layer_specific   = BTA_DM_API_DI_DISCOVER_EVT;
13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->hdr.offset           = result;
13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_sendmsg(p_msg);
13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1374ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         bta_dm_disable_search_and_disc
1375ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1376ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      Cancels an ongoing search or discovery for devices in case of
1377ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  a Bluetooth disable
1378ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1379ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1380ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void
1381ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1382ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
1383ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void bta_dm_disable_search_and_disc (void)
1384ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
1385ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTA_DM_DI_DISC_CMPL    di_disc;
1386ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTA_DM_MSG * p_msg;
1387ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1388ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if(BTM_IsInquiryActive()||(bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE))
1389ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
1390ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        BTM_CancelInquiry();
1391ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        bta_dm_search_cancel_notify(NULL);
1392ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1393ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1394ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
1395ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1396ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1397ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            bta_sys_sendmsg(p_msg);
1398ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1399ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
1400ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
1401ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* If no Service Search going on then issue cancel remote name in case it is active */
1402ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    else if (!bta_dm_search_cb.name_discover_done)
1403ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
1404ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        BTM_CancelRemoteDeviceName();
1405ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1406ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1407ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
1408ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1409ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1410ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            bta_sys_sendmsg(p_msg);
1411ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
1412ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
1413ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    else if(bta_dm_di_cb.p_di_db != NULL)
1414ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
1415ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        memset(&di_disc, 0, sizeof(tBTA_DM_DI_DISC_CMPL));
1416ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        bdcpy(di_disc.bd_addr, bta_dm_search_cb.peer_bdaddr);
1417ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        di_disc.result      = BTA_FAILURE;
1418ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1419ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        bta_dm_di_cb.p_di_db = NULL;
1420ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        bta_dm_search_cb.p_search_cback(BTA_DM_DI_DISC_CMPL_EVT, NULL);
1421ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
1422ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1423ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE) && (BTA_GATT_INCLUDED == TRUE)
1424ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (bta_dm_search_cb.gatt_disc_active)
1425ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
1426ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
1427ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
1428ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
1429ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
1430ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1431ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
1432ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_di_disc
14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function queries a remote device for DI information.
14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_di_disc (tBTA_DM_MSG *p_data)
14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  result = BTA_FAILURE;
14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_MSG *p_msg;
14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.p_search_cback = p_data->di_disc.p_cback;
14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(bta_dm_search_cb.peer_bdaddr, p_data->di_disc.bd_addr);
14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_di_cb.p_di_db = p_data->di_disc.p_sdp_db;
14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if((bta_dm_search_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)GKI_getbuf(BTA_DM_SDP_DB_SIZE)) != NULL)
14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( SDP_DiDiscover(bta_dm_search_cb.peer_bdaddr, p_data->di_disc.p_sdp_db,
14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_data->di_disc.len, bta_dm_di_disc_callback) == SDP_SUCCESS)
14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            result = BTA_SUCCESS;
14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR0("No buffer to start DI discovery");
14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( result == BTA_FAILURE &&
14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->hdr.event            = BTA_DM_SEARCH_CMPL_EVT;
14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->hdr.layer_specific   = BTA_DM_API_DI_DISCOVER_EVT;
14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_data->hdr.offset          = result;
14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_sendmsg(p_msg);
14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_read_remote_device_name
14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Initiate to get remote device name
14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if started to get remote name
14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr)
14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS  btm_status;
14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG0("bta_dm_read_remote_device_name");
14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(bta_dm_search_cb.peer_bdaddr, bd_addr);
14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.peer_name[0] = 0;
14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_status = BTM_ReadRemoteDeviceName (bta_dm_search_cb.peer_bdaddr,
14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           (tBTM_CMPL_CB *) bta_dm_remname_cback);
14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( btm_status == BTM_CMD_STARTED )
14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_DEBUG0("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is started");
14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (TRUE);
14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if ( btm_status == BTM_BUSY )
15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_DEBUG0("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is busy");
15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Remote name discovery is on going now so BTM cannot notify through "bta_dm_remname_cback" */
15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* adding callback to get notified that current reading remore name done */
15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SecAddRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (TRUE);
15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_WARNING1("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName returns 0x%02X", btm_status);
15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_inq_cmpl
15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Process the inquiry complete event from BTM
15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_inq_cmpl (tBTA_DM_MSG *p_data)
15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_MSG * p_msg;
15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEARCH  data;
15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG0("bta_dm_inq_cmpl");
15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    data.inq_cmpl.num_resps = p_data->inq_cmpl.num;
15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.p_search_cback(BTA_DM_INQ_CMPL_EVT, &data);
15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if((bta_dm_search_cb.p_btm_inq_info = BTM_InqDbFirst()) != NULL)
15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* start name and service discovery from the first device on inquiry result */
15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.name_discover_done = FALSE;
15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.peer_name[0]       = 0;
15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_discover_device(bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr);
15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* no devices, search complete */
15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.services = 0;
15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->hdr.event          = BTA_DM_SEARCH_CMPL_EVT;
15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_sendmsg(p_msg);
15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_rmt_name
15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Process the remote name result from BTM
15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_rmt_name (tBTA_DM_MSG *p_data)
15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG0("bta_dm_rmt_name");
15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( p_data->rem_name.result.disc_res.bd_name[0] && bta_dm_search_cb.p_btm_inq_info)
15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name = TRUE;
15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_discover_device(bta_dm_search_cb.peer_bdaddr);
15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_disc_rmt_name
15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Process the remote name result from BTM when application
15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  wants to find the name for a bdaddr
15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_disc_rmt_name (tBTA_DM_MSG *p_data)
15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQ_INFO *p_btm_inq_info;
15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG0("bta_dm_disc_rmt_name");
15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_btm_inq_info = BTM_InqDbRead (p_data->rem_name.result.disc_res.bd_addr);
15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( p_btm_inq_info )
15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( p_data->rem_name.result.disc_res.bd_name[0] )
15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_btm_inq_info->appl_knows_rem_name = TRUE;
16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_discover_device(p_data->rem_name.result.disc_res.bd_addr);
16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_sdp_result
16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Process the discovery result from sdp
16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_sdp_result (tBTA_DM_MSG *p_data)
16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_DISC_REC   *p_sdp_rec = NULL;
16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_MSG     *p_msg;
16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN          service_found = FALSE;
16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN          scn_found = FALSE;
16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16           service = 0xFFFF;
16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_PROTOCOL_ELEM  pe;
16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBT_UUID           *p_uuid = bta_dm_search_cb.p_srvc_uuid;
16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEARCH      result;
16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBT_UUID            service_uuid;
16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32 num_uuids = 0;
16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8  uuid_list[32][MAX_UUID_SIZE]; // assuming a max of 32 services
16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if((p_data->sdp_event.sdp_result == SDP_SUCCESS)
16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        || (p_data->sdp_event.sdp_result == SDP_NO_RECS_MATCH)
16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        || (p_data->sdp_event.sdp_result == SDP_DB_FULL))
16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_DEBUG1("sdp_result::0x%x", p_data->sdp_event.sdp_result);
16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        do
16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            service_found = FALSE;
16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_sdp_rec = NULL;
16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if( bta_dm_search_cb.service_index == (BTA_USER_SERVICE_ID+1) )
16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_sdp_rec = SDP_FindServiceUUIDInDb(bta_dm_search_cb.p_sdp_db, &bta_dm_search_cb.uuid, p_sdp_rec);
16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_sdp_rec && SDP_FindProtocolListElemInRec(p_sdp_rec, UUID_PROTOCOL_RFCOMM, &pe))
16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_search_cb.peer_scn = (UINT8) pe.params[0];
16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    scn_found = TRUE;
16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                service = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index-1];
16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_sdp_rec = SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db, service, p_sdp_rec);
16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* finished with BR/EDR services, now we check the result for GATT based service UUID */
16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (bta_dm_search_cb.service_index == BTA_MAX_SERVICE_ID)
16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (bta_dm_search_cb.uuid_to_search != 0 && p_uuid != NULL)
16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_uuid +=  (bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search);
16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* only support 16 bits UUID for now */
16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    service = p_uuid->uu.uuid16;
16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* all GATT based services */
16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                do
16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* find a service record, report it */
16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_sdp_rec = SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db,
16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                0, p_sdp_rec);
16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (p_sdp_rec)
16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        if (SDP_FindServiceUUIDInRec(p_sdp_rec, &service_uuid))
16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        {
16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            /* send result back to app now, one by one */
16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            bdcpy (result.disc_ble_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
1683ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                            BCM_STRNCPY_S((char*)result.disc_ble_res.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN));
1684ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                            result.disc_ble_res.bd_name[BD_NAME_LEN] = 0;
16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            result.disc_ble_res.service.len = service_uuid.len;
16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            result.disc_ble_res.service.uu.uuid16 = service_uuid.uu.uuid16;
16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            bta_dm_search_cb.p_search_cback(BTA_DM_DISC_BLE_RES_EVT, &result);
16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        }
16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (bta_dm_search_cb.uuid_to_search > 0)
16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        break;
16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                } while (p_sdp_rec);
16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* SDP_DB_FULL means some records with the
17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               required attributes were received */
17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(((p_data->sdp_event.sdp_result == SDP_DB_FULL) &&
17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_search_cb.services != BTA_ALL_SERVICE_MASK) ||
17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (p_sdp_rec  != NULL))
17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* If Plug and Play service record, check to see if Broadcom stack */
17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (service == UUID_SERVCLASS_PNP_INFORMATION)
17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (p_sdp_rec)
17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        if (SDP_FindAttributeInRec (p_sdp_rec, ATTR_ID_EXT_BRCM_VERSION))
17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        {
17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            service_found = TRUE;
17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        }
17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    service_found = TRUE;
17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (service_found)
17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    UINT16 tmp_svc = 0xFFFF;
17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_search_cb.services_found |=
17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index-1));
17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    tmp_svc = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index-1];
17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* Add to the list of UUIDs */
17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    sdpu_uuid16_to_uuid128(tmp_svc, uuid_list[num_uuids]);
17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    num_uuids++;
17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK &&
17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_search_cb.services_to_search == 0)
17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ( bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID &&
17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_search_cb.uuid_to_search > 0)
17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_search_cb.uuid_to_search --;
17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (bta_dm_search_cb.uuid_to_search == 0 ||
17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_search_cb.service_index != BTA_BLE_SERVICE_ID)
17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_search_cb.service_index++;
17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else /* regular one service per search or PNP search */
17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        while(bta_dm_search_cb.service_index <= BTA_MAX_SERVICE_ID);
17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//        GKI_freebuf(bta_dm_search_cb.p_sdp_db);
17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//        bta_dm_search_cb.p_sdp_db = NULL;
17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_DEBUG1("bta_dm_sdp_result services_found = %04x", bta_dm_search_cb.services_found);
17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Collect the 128-bit services here and put them into the list */
17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK)
17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_sdp_rec = NULL;
17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            do
17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                tBT_UUID temp_uuid;
17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* find a service record, report it */
17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_sdp_rec = SDP_FindServiceInDb_128bit(bta_dm_search_cb.p_sdp_db, p_sdp_rec);
17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_sdp_rec)
17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (SDP_FindServiceUUIDInRec_128bit(p_sdp_rec, &temp_uuid))
17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        memcpy(uuid_list[num_uuids], temp_uuid.uu.uuid128, MAX_UUID_SIZE);
17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        num_uuids++;
17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            } while (p_sdp_rec);
17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if there are more services to search for */
17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(bta_dm_search_cb.services_to_search)
17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Free up the p_sdp_db before checking the next one */
17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_free_sdp_db(NULL);
17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_find_services(bta_dm_search_cb.peer_bdaddr);
17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* callbacks */
17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* start next bd_addr if necessary */
17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_msg->disc_result.result.disc_res.result = BTA_SUCCESS;
17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_msg->disc_result.result.disc_res.p_raw_data = NULL;
17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_msg->disc_result.result.disc_res.raw_data_size = 0;
17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_msg->disc_result.result.disc_res.num_uuids = num_uuids;
17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_msg->disc_result.result.disc_res.p_uuid_list = NULL;
18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (num_uuids > 0) {
18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_msg->disc_result.result.disc_res.p_uuid_list = (UINT8*)GKI_getbuf(num_uuids*MAX_UUID_SIZE);
18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (p_msg->disc_result.result.disc_res.p_uuid_list) {
18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        memcpy(p_msg->disc_result.result.disc_res.p_uuid_list, uuid_list,
18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               num_uuids*MAX_UUID_SIZE);
18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    } else {
18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_msg->disc_result.result.disc_res.num_uuids = 0;
18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       APPL_TRACE_ERROR1("%s: Unable to allocate memory for uuid_list", __FUNCTION__);
18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                //copy the raw_data to the discovery result  structure
18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                //
18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                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);
18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (  bta_dm_search_cb.p_sdp_db != NULL && bta_dm_search_cb.p_sdp_db->raw_used != 0   &&
18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_search_cb.p_sdp_db->raw_data != NULL) {
18165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_msg->disc_result.result.disc_res.p_raw_data = GKI_getbuf(bta_dm_search_cb.p_sdp_db->raw_used);
18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if ( NULL != p_msg->disc_result.result.disc_res.p_raw_data  ) {
18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        memcpy(     p_msg->disc_result.result.disc_res.p_raw_data,
18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    bta_dm_search_cb.p_sdp_db->raw_data,
18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    bta_dm_search_cb.p_sdp_db->raw_used );
18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_msg->disc_result.result.disc_res.raw_data_size =
18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            bta_dm_search_cb.p_sdp_db->raw_used;
18255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    } else {
18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        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);
18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_search_cb.p_sdp_db->raw_data = NULL;     //no need to free this - it is a global assigned.
18315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_search_cb.p_sdp_db->raw_used = 0;
18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_search_cb.p_sdp_db->raw_size = 0;
18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else {
18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    APPL_TRACE_DEBUG0("bta_dm_sdp_result raw data size is 0 or raw_data is null!!\r\n");
18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Done with p_sdp_db. Free it */
18385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_free_sdp_db(NULL);
18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
18405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                //Piggy back the SCN over result field
18425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if( scn_found )
18435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
18445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                  p_msg->disc_result.result.disc_res.result = (3 + bta_dm_search_cb.peer_scn);
18455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                  p_msg->disc_result.result.disc_res.services |= BTA_USER_SERVICE_MASK;
18465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                  APPL_TRACE_EVENT1(" Piggy back the SCN over result field  SCN=%d", bta_dm_search_cb.peer_scn);
18485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
18505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
18515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
18525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        bta_dm_get_remname(), (BD_NAME_LEN-1));
18535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* make sure the string is null terminated */
18555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
18565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_sys_sendmsg(p_msg);
18585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
18595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
18645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* conn failed. No need for timer */
18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(p_data->sdp_event.sdp_result == SDP_CONN_FAILED || p_data->sdp_event.sdp_result == SDP_CONN_REJECTED
18675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           || p_data->sdp_event.sdp_result == SDP_SECURITY_ERR)
18685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_search_cb.wait_disc = FALSE;
18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* not able to connect go to next device */
18715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf(bta_dm_search_cb.p_sdp_db);
18725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.p_sdp_db = NULL;
18735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
18755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
18775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->disc_result.result.disc_res.result = BTA_FAILURE;
18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
18825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
18835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_get_remname(), (BD_NAME_LEN-1));
18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* make sure the string is null terminated */
18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_sendmsg(p_msg);
18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_search_cmpl
18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Sends event to application
18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_search_cmpl (tBTA_DM_MSG *p_data)
19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG0("bta_dm_search_cmpl");
19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
19085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
19095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data->hdr.layer_specific == BTA_DM_API_DI_DISCOVER_EVT)
19115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_di_disc_cmpl(p_data);
19125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
19135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.p_search_cback(BTA_DM_DISC_CMPL_EVT, NULL);
19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_disc_result
19195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Service discovery result when discovering services on a device
19215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
19235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_disc_result (tBTA_DM_MSG *p_data)
19265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_MSG *      p_msg;
19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG0("bta_dm_disc_result");
19305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if any BR/EDR service discovery has been done, report the event */
19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((bta_dm_search_cb.services & ((BTA_ALL_SERVICE_MASK | BTA_USER_SERVICE_MASK ) & ~BTA_BLE_SERVICE_MASK)))
19345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
19355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, &p_data->disc_result.result);
19365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send a message to change state */
19385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
19395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
19405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
19415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
19425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_sendmsg(p_msg);
19435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
19475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_search_result
19495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Service discovery result while searching for devices
19515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
19535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
19555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_search_result (tBTA_DM_MSG *p_data)
19565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG2("bta_dm_search_result searching:0x%04x, result:0x%04x",
19585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       bta_dm_search_cb.services,
19595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->disc_result.result.disc_res.services);
19605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* call back if application wants name discovery or found services that application is searching */
19625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (( !bta_dm_search_cb.services )
19635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      ||(( bta_dm_search_cb.services ) && ( p_data->disc_result.result.disc_res.services )))
19645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
19655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, &p_data->disc_result.result);
19665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if searching did not initiate to create link */
19695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(!bta_dm_search_cb.wait_disc )
19705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
19715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if ( BTM_EIR_CLIENT_INCLUDED == TRUE )
19725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if service searching is done with EIR, don't search next device */
19735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( bta_dm_search_cb.p_btm_inq_info )
19745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
19755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_discover_next_device();
19765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
19785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
19795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* wait until link is disconnected or timeout */
19805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.sdp_results = TRUE;
19815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.search_timer.p_cback = (TIMER_CBACK*)&bta_dm_search_timer_cback;
19825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_start_timer(&bta_dm_search_cb.search_timer, 0, 1000*(L2CAP_LINK_INACTIVITY_TOUT+1) );
19835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
19885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_search_timer_cback
19905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Called when ACL disconnect time is over
19925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
19955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
19975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_search_timer_cback (TIMER_LIST_ENT *p_tle)
19985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_EVENT0(" bta_dm_search_timer_cback  ");
20015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.wait_disc = FALSE;
20025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* proceed with next device */
20045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_discover_next_device();
20055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
20075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
20105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_free_sdp_db
20125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Frees SDP data base
20145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
20165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
20185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_free_sdp_db (tBTA_DM_MSG *p_data)
20195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
20205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(bta_dm_search_cb.p_sdp_db)
20215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
20225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf(bta_dm_search_cb.p_sdp_db);
20235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.p_sdp_db = NULL;
20245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
20255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
20275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
20295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_queue_search
20315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Queues search command while search is being cancelled
20335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
20355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
20375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_queue_search (tBTA_DM_MSG *p_data)
20385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
20395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.p_search_queue = (tBTA_DM_MSG *)GKI_getbuf(sizeof(tBTA_DM_API_SEARCH));
20415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(bta_dm_search_cb.p_search_queue, p_data, sizeof(tBTA_DM_API_SEARCH));
20425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
20445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
20465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_queue_disc
20485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Queues discovery command while search is being cancelled
20505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
20525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
20545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_queue_disc (tBTA_DM_MSG *p_data)
20555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
20565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.p_search_queue = (tBTA_DM_MSG *)GKI_getbuf(sizeof(tBTA_DM_API_DISCOVER));
20585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(bta_dm_search_cb.p_search_queue, p_data, sizeof(tBTA_DM_API_DISCOVER));
20595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
20615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
20635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_search_clear_queue
20655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Clears the queue if API search cancel is called
20675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
20695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
20715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_search_clear_queue (tBTA_DM_MSG *p_data)
20725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
20735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(bta_dm_search_cb.p_search_queue)
20755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
20765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf(bta_dm_search_cb.p_search_queue);
20775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.p_search_queue = NULL;
20785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
20795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
20825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
20845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_search_cancel_cmpl
20865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Search cancel is complete
20885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
20905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
20925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_search_cancel_cmpl (tBTA_DM_MSG *p_data)
20935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
20945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(bta_dm_search_cb.p_search_queue)
20965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
20975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_sendmsg(bta_dm_search_cb.p_search_queue);
20985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.p_search_queue = NULL;
20995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
21005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
21025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
21045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_search_cancel_transac_cmpl
21065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Current Service Discovery or remote name procedure is
21085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  completed after search cancellation
21095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
21115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
21135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_search_cancel_transac_cmpl(tBTA_DM_MSG *p_data)
21145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
21155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(bta_dm_search_cb.p_sdp_db)
21175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
21185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf(bta_dm_search_cb.p_sdp_db);
21195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.p_sdp_db = NULL;
21205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
21215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cancel_notify(NULL);
21235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
21245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
21275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_search_cancel_notify
21295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Notify application that search has been cancelled
21315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
21335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
21355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_search_cancel_notify (tBTA_DM_MSG *p_data)
21365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
21375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_dm_search_cb.p_search_cback)
21385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
21395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.p_search_cback(BTA_DM_SEARCH_CANCEL_CMPL_EVT, NULL);
21405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
21415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!bta_dm_search_cb.name_discover_done)
21425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
21435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_CancelRemoteDeviceName();
21445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2145ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE) && (BTA_GATT_INCLUDED == TRUE)
21465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_dm_search_cb.gatt_disc_active)
21475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
21485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
21495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
21505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
21515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
21535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
21555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_find_services
21575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Starts discovery on a device
21595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
21615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
21635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_find_services ( BD_ADDR bd_addr)
21645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
21655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_UUID    uuid;
21675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16       attr_list[] = {ATTR_ID_SERVICE_CLASS_ID_LIST, ATTR_ID_EXT_BRCM_VERSION};
21685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16       num_attrs = 1;
21695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_MSG *p_msg;
21705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (&uuid, 0, sizeof(tSDP_UUID));
21725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while(bta_dm_search_cb.service_index < BTA_MAX_SERVICE_ID)
21745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
21755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( bta_dm_search_cb.services_to_search
21765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            & (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index)))
21775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
21785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if((bta_dm_search_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)GKI_getbuf(BTA_DM_SDP_DB_SIZE)) != NULL)
21795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
21805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                APPL_TRACE_DEBUG1("bta_dm_search_cb.services = %04x***********", bta_dm_search_cb.services);
21815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* try to search all services by search based on L2CAP UUID */
21825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK )
21835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
21845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    APPL_TRACE_ERROR1("services_to_search = %08x",bta_dm_search_cb.services_to_search);
21855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (bta_dm_search_cb.services_to_search & BTA_RES_SERVICE_MASK)
21865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
21875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[0];
21885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        bta_dm_search_cb.services_to_search &= ~BTA_RES_SERVICE_MASK;
21895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
21905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    else
21915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
21925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        uuid.uu.uuid16 = UUID_PROTOCOL_L2CAP;
21935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        bta_dm_search_cb.services_to_search = 0;
21945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
21955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
21965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
21975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
21985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
21995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* for LE only profile */
22005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID)
22015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
22025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        if (bta_dm_search_cb.uuid_to_search > 0 && bta_dm_search_cb.p_srvc_uuid)
22035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        {
22045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            memcpy(&uuid,
22055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                   (const void *)(bta_dm_search_cb.p_srvc_uuid + \
22065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search),
22075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                   sizeof(tBT_UUID));
22085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            bta_dm_search_cb.uuid_to_search -- ;
22105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        }
22115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        else
22125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index];
22135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        /* last one? clear the BLE service bit if all discovery has been done */
22155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        if (bta_dm_search_cb.uuid_to_search == 0)
22165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            bta_dm_search_cb.services_to_search &=
22175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index)));
22185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
22205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    else
22215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
22225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
22235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        /* remove the service from services to be searched  */
22245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        bta_dm_search_cb.services_to_search &=
22255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index)));
22265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index];
22275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
22285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
22295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (uuid.len == 0)
22315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                uuid.len = LEN_UUID_16;
22325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if 0
22345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (uuid.uu.uuid16 == UUID_SERVCLASS_PNP_INFORMATION)
22355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
22365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    num_attrs = 2;
22375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
22385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
22395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (bta_dm_search_cb.service_index == BTA_USER_SERVICE_ID)
22415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
22425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    memcpy(&uuid, &bta_dm_search_cb.uuid, sizeof(tSDP_UUID));
22435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
22445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                APPL_TRACE_ERROR1("****************search UUID = %04x***********", uuid.uu.uuid16);
22475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                //SDP_InitDiscoveryDb (bta_dm_search_cb.p_sdp_db, BTA_DM_SDP_DB_SIZE, 1, &uuid, num_attrs, attr_list);
22485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                SDP_InitDiscoveryDb (bta_dm_search_cb.p_sdp_db, BTA_DM_SDP_DB_SIZE, 1, &uuid, 0, NULL);
22495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memset(g_disc_raw_data_buf, 0, sizeof(g_disc_raw_data_buf));
22525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_search_cb.p_sdp_db->raw_data = g_disc_raw_data_buf;
22535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_search_cb.p_sdp_db->raw_size = MAX_DISC_RAW_DATA_BUF;
22555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (!SDP_ServiceSearchAttributeRequest (bd_addr, bta_dm_search_cb.p_sdp_db, &bta_dm_sdp_callback))
22575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
22585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* if discovery not successful with this device
22595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    proceed to next one */
22605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    GKI_freebuf(bta_dm_search_cb.p_sdp_db);
22615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_search_cb.p_sdp_db = NULL;
22625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_search_cb.service_index = BTA_MAX_SERVICE_ID;
22635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
22655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
22665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
22675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
22685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if ((bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID &&
22695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                         bta_dm_search_cb.uuid_to_search == 0) ||
22705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                         bta_dm_search_cb.service_index != BTA_BLE_SERVICE_ID)
22715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
22725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_search_cb.service_index++;
22735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    return;
22745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
22755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
22765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
22775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
22785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                APPL_TRACE_ERROR0("#### Failed to allocate SDP DB buffer! ####");
22795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
22805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
22815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.service_index++;
22835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
22845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* no more services to be discovered */
22865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(bta_dm_search_cb.service_index >= BTA_MAX_SERVICE_ID)
22875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
22885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
22895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
22905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
22915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
22925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
22935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
22945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_get_remname(), (BD_NAME_LEN-1));
22955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* make sure the string is terminated */
22975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
22985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_sendmsg(p_msg);
23005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
23035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
23055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_discover_next_device
23075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Starts discovery on the next device in Inquiry data base
23095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
23115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
23135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_discover_next_device(void)
23145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
23155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_MSG * p_msg;
23175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG0("bta_dm_discover_next_device");
23195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* searching next device on inquiry result */
23215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if((bta_dm_search_cb.p_btm_inq_info = BTM_InqDbNext(bta_dm_search_cb.p_btm_inq_info)) != NULL)
23225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.name_discover_done = FALSE;
23245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.peer_name[0]       = 0;
23255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_discover_device(bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr);
23265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
23285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* no devices, search complete */
23305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.services = 0;
23315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
23335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
23345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->hdr.event          = BTA_DM_SEARCH_CMPL_EVT;
23355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
23365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_sendmsg(p_msg);
23375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
23405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
23425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_discover_device
23445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Starts name and service discovery on the device
23465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
23485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
23505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_discover_device(BD_ADDR remote_bd_addr)
23515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
23525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_MSG * p_msg;
23535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
23555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBT_DEVICE_TYPE dev_type;
23565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBLE_ADDR_TYPE  addr_type;
23575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
23585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG6("bta_dm_discover_device, BDA:0x%02X%02X%02X%02X%02X%02X",
23605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        remote_bd_addr[0],remote_bd_addr[1],
23615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        remote_bd_addr[2],remote_bd_addr[3],
23625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        remote_bd_addr[4],remote_bd_addr[5]);
23635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(bta_dm_search_cb.peer_bdaddr, remote_bd_addr);
23655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG2("bta_dm_discover_device name_discover_done = %d p_btm_inq_info 0x%x ",
23675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        bta_dm_search_cb.name_discover_done,
23685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        bta_dm_search_cb.p_btm_inq_info
23695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        );
23705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( bta_dm_search_cb.p_btm_inq_info ) {
23715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_DEBUG1("bta_dm_discover_device appl_knows_rem_name %d",
23735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name
23745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            );
23755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if name discovery is not done and application needs remote name */
23785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((!bta_dm_search_cb.name_discover_done)
23795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       && (( bta_dm_search_cb.p_btm_inq_info == NULL )
23805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ||(bta_dm_search_cb.p_btm_inq_info && (!bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name))))
23815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( bta_dm_read_remote_device_name(bta_dm_search_cb.peer_bdaddr) == TRUE )
23835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
23845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
23855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
23875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
23885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* starting name discovery failed */
23895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_search_cb.name_discover_done = TRUE;
23905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if application wants to discover service */
23945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( bta_dm_search_cb.services )
23955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* initialize variables */
23975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.service_index      = 0;
23985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.services_found     = 0;
23995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.services_to_search = bta_dm_search_cb.services;
24005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
24015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.uuid_to_search     = bta_dm_search_cb.num_uuid;
24025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
24035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if ( BTM_EIR_CLIENT_INCLUDED == TRUE )
24045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((bta_dm_search_cb.p_btm_inq_info != NULL) &&
24055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project			bta_dm_search_cb.services != BTA_USER_SERVICE_MASK
24065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            &&(bta_dm_search_cb.sdp_search == FALSE))
24075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
24085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* check if EIR provides the information of supported services */
24095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_eir_search_services( &bta_dm_search_cb.p_btm_inq_info->results,
24105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        &bta_dm_search_cb.services_to_search,
24115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        &bta_dm_search_cb.services_found );
24125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
24135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if seaching with EIR is not completed */
24155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(bta_dm_search_cb.services_to_search)
24165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
24175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
24185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* check whether connection already exists to the device
24195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               if connection exists, we don't have to wait for ACL
24205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               link to go down to start search on next device */
24215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(BTM_IsAclConnectionUp(bta_dm_search_cb.peer_bdaddr))
24225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_search_cb.wait_disc = FALSE;
24235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
24245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_search_cb.wait_disc = TRUE;
24255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && (defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE))
24275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( bta_dm_search_cb.p_btm_inq_info )
24285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
24295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                APPL_TRACE_DEBUG3("bta_dm_discover_device p_btm_inq_info 0x%x results.device_type 0x%x services_to_search 0x%x",
24305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    bta_dm_search_cb.p_btm_inq_info,
24315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    bta_dm_search_cb.p_btm_inq_info->results.device_type,
24325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    bta_dm_search_cb.services_to_search
24335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    );
24345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
24355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_ReadDevInfo(remote_bd_addr, &dev_type, &addr_type);
24365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (dev_type == BT_DEVICE_TYPE_BLE)
24385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /*
24395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( bta_dm_search_cb.p_btm_inq_info != NULL &&
24405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 bta_dm_search_cb.p_btm_inq_info->results.device_type == BT_DEVICE_TYPE_BLE &&
24415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (bta_dm_search_cb.services_to_search & BTA_BLE_SERVICE_MASK))*/
24425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
24435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (bta_dm_search_cb.services_to_search & BTA_BLE_SERVICE_MASK)
24445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
24455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    //set the raw data buffer here
24465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    memset(g_disc_raw_data_buf, 0, sizeof(g_disc_raw_data_buf));
24475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_search_cb.p_ble_rawdata = g_disc_raw_data_buf;
24485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_search_cb.ble_raw_size = MAX_DISC_RAW_DATA_BUF;
24505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_search_cb.ble_raw_used = 0;
24515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* start GATT for service discovery */
24535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_dm_start_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
24545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    return;
24555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
24565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
24575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
24585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
24595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
24605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_search_cb.sdp_results = FALSE;
24615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_find_services(bta_dm_search_cb.peer_bdaddr);
24625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
24645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
24655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
24665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* name discovery and service discovery are done for this device */
24695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
24705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
24715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
24725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* initialize the data structure - includes p_raw_data and raw_data_size */
24735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&(p_msg->disc_result.result), 0, sizeof(tBTA_DM_DISC_RES));
24745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->disc_result.result.disc_res.result = BTA_SUCCESS;
24755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
24765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
24775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name,  sizeof(BD_NAME),
24785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      (char*)bta_dm_search_cb.peer_name, (BD_NAME_LEN-1));
24795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* make sure the string is terminated */
24815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
24825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_sendmsg(p_msg);
24845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
24865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
24885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_sdp_callback
24905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Callback from sdp with discovery status
24925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
24945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
24965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_sdp_callback (UINT16 sdp_status)
24975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
24985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SDP_RESULT * p_msg;
25005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_msg = (tBTA_DM_SDP_RESULT *) GKI_getbuf(sizeof(tBTA_DM_SDP_RESULT))) != NULL)
25025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
25035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->hdr.event = BTA_DM_SDP_RESULT_EVT;
25045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->sdp_result = sdp_status;
25055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_sendmsg(p_msg);
25065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
25095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
25115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_inq_results_cb
25135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Inquiry results callback from BTM
25155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
25175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
25195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_inq_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir)
25205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
25215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEARCH     result;
25235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQ_INFO      *p_inq_info;
25245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16             service_class;
25255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(result.inq_res.bd_addr, p_inq->remote_bd_addr);
25275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(result.inq_res.dev_class, p_inq->dev_class, DEV_CLASS_LEN);
25285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_COD_SERVICE_CLASS(service_class, p_inq->dev_class);
25295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    result.inq_res.is_limited = (service_class & BTM_COD_SERVICE_LMTD_DISCOVER)?TRUE:FALSE;
25305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    result.inq_res.rssi = p_inq->rssi;
25315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE)
25335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    result.inq_res.ble_addr_type    = p_inq->ble_addr_type;
25345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    result.inq_res.inq_result_type  = p_inq->inq_result_type;
25355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    result.inq_res.device_type      = p_inq->device_type;
25365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
25385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* application will parse EIR to find out remote device name */
25405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    result.inq_res.p_eir = p_eir;
25415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if((p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr)) != NULL)
25435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
25445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* initialize remt_name_not_required to FALSE so that we get the name by default */
25455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        result.inq_res.remt_name_not_required = FALSE;
25465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(bta_dm_search_cb.p_search_cback)
25505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.p_search_cback(BTA_DM_INQ_RES_EVT, &result);
25515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_inq_info)
25535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
25545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* application indicates if it knows the remote name, inside the callback
25555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         copy that to the inquiry data base*/
25565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(result.inq_res.remt_name_not_required)
25575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_inq_info->appl_knows_rem_name = TRUE;
25585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
25635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
25665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_inq_cmpl_cb
25685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Inquiry complete callback from BTM
25705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
25725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
25745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_inq_cmpl_cb (void * p_result)
25755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
25765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_MSG * p_msg;
25785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG0("bta_dm_inq_cmpl_cb");
25805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
25815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
25825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->inq_cmpl.hdr.event = BTA_DM_INQUIRY_CMPL_EVT;
25835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->inq_cmpl.num = ((tBTM_INQUIRY_CMPL *)p_result)->num_resp;
25845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_sendmsg(p_msg);
25855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
25905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
25925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_service_search_remname_cback
25945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Remote name call back from BTM during service discovery
25965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
25985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
26005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_service_search_remname_cback (BD_ADDR bd_addr, DEV_CLASS dc, BD_NAME bd_name)
26015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
26025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_REMOTE_DEV_NAME    rem_name;
26035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS             btm_status;
26045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG1("bta_dm_service_search_remname_cback name=<%s>", bd_name);
26065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if this is what we are looking for */
26085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!bdcmp( bta_dm_search_cb.peer_bdaddr, bd_addr))
26095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rem_name.length = strlen((char*)bd_name);
26115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (rem_name.length > (BD_NAME_LEN-1))
26125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
26135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rem_name.length = (BD_NAME_LEN-1);
26145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rem_name.remote_bd_name[(BD_NAME_LEN-1)] = 0;
26155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
26165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BCM_STRNCPY_S((char*)rem_name.remote_bd_name,  sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1));
26175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rem_name.status = BTM_SUCCESS;
26185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_remname_cback(&rem_name);
26205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
26225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* get name of device */
26245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_status = BTM_ReadRemoteDeviceName (bta_dm_search_cb.peer_bdaddr,
26255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                (tBTM_CMPL_CB *) bta_dm_remname_cback);
26265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( btm_status == BTM_BUSY )
26275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
26285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* wait for next chance(notification of remote name discovery done) */
26295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_DEBUG0("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName is busy");
26305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
26315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if ( btm_status != BTM_CMD_STARTED )
26325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
26335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if failed to start getting remote name then continue */
26345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_WARNING1("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName returns 0x%02X", btm_status);
26355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rem_name.length = 0;
26375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rem_name.remote_bd_name[0] = 0;
26385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rem_name.status = btm_status;
26395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_remname_cback(&rem_name);
26405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
26415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
26435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
26465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_remname_cback
26485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Remote name complete call back from BTM
26505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
26525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
26545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_remname_cback (tBTM_REMOTE_DEV_NAME *p_remote_name)
26555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
26565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_REM_NAME * p_msg;
26575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2658ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    APPL_TRACE_DEBUG2("bta_dm_remname_cback len = %d name=<%s>", p_remote_name->length,
2659ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                      p_remote_name->remote_bd_name);
26605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* remote name discovery is done but it could be failed */
26625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.name_discover_done = TRUE;
2663ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BCM_STRNCPY_S((char*)bta_dm_search_cb.peer_name, sizeof(BD_NAME), (char*)p_remote_name->remote_bd_name, (BD_NAME_LEN));
2664ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    bta_dm_search_cb.peer_name[BD_NAME_LEN]=0;
26655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
2667ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
2668ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    GAP_BleReadPeerPrefConnParams (bta_dm_search_cb.peer_bdaddr);
2669ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
26705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_msg = (tBTA_DM_REM_NAME *) GKI_getbuf(sizeof(tBTA_DM_REM_NAME))) != NULL)
26715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy (p_msg->result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
2673ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        BCM_STRNCPY_S((char*)p_msg->result.disc_res.bd_name, sizeof(BD_NAME), (char*)p_remote_name->remote_bd_name, (BD_NAME_LEN));
26745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* make sure the string is null terminated */
2676ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_msg->result.disc_res.bd_name[BD_NAME_LEN] = 0;
26775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->hdr.event = BTA_DM_REMT_NAME_EVT;
26795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_sendmsg(p_msg);
26805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
26835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
26855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_authorize_cback
26875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      cback requesting authorization
26895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
26915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
26935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 bta_dm_authorize_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name,
26945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     UINT8 *service_name, UINT8 service_id, BOOLEAN is_originator)
26955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
26965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEC sec_event;
26975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       index = 1;
26985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(sec_event.authorize.bd_addr, bd_addr);
27005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(sec_event.authorize.dev_class, dev_class, DEV_CLASS_LEN);
27015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BCM_STRNCPY_S((char*)sec_event.authorize.bd_name, sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1));
27035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* make sure the string is null terminated */
27055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sec_event.authorize.bd_name[BD_NAME_LEN-1] = 0;
27065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if ( defined(BTA_JV_INCLUDED) && BTA_JV_INCLUDED == TRUE )
27085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sec_event.authorize.service = service_id;
27095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
27105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while(index < BTA_MAX_SERVICE_ID)
27125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* get the BTA service id corresponding to BTM id */
27145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(bta_service_id_to_btm_srv_id_lkup_tbl[index] == service_id)
27155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sec_event.authorize.service = index;
27175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
27185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        index++;
27205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if supported service callback otherwise not authorized */
27245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(bta_dm_cb.p_sec_cback && (index < BTA_MAX_SERVICE_ID
27255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if ( defined(BTA_JV_INCLUDED) && BTA_JV_INCLUDED == TRUE )
27265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* pass through JV service ID */
27275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        || (service_id >= BTA_FIRST_JV_SERVICE_ID && service_id <= BTA_LAST_JV_SERVICE_ID)
27285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
27295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ))
27305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.p_sec_cback(BTA_DM_AUTHORIZE_EVT, &sec_event);
27325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_CMD_STARTED;
27335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
27355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_NOT_AUTHORIZED;
27375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
27395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
27455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_pinname_cback
27475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Callback requesting pin_key
27495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
27515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
27535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pinname_cback (void *p_data)
27545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
27555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_REMOTE_DEV_NAME *p_result = (tBTM_REMOTE_DEV_NAME *)p_data;
27565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEC           sec_event;
27575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32                bytes_to_copy;
27585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEC_EVT       event = bta_dm_cb.pin_evt;
27595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTA_DM_SP_CFM_REQ_EVT == event)
27615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	    /* Retrieved saved device class and bd_addr */
27635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	    bdcpy(sec_event.cfm_req.bd_addr, bta_dm_cb.pin_bd_addr);
27645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	    BTA_COPY_DEVICE_CLASS(sec_event.cfm_req.dev_class, bta_dm_cb.pin_dev_class);
27655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	    if (p_result && p_result->status == BTM_SUCCESS)
27675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	    {
27685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	        bytes_to_copy = (p_result->length < (BD_NAME_LEN-1))
27695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ? p_result->length : (BD_NAME_LEN-1);
27705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	        memcpy(sec_event.cfm_req.bd_name, p_result->remote_bd_name, bytes_to_copy);
27715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	        sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0;
27725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	    }
27735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	    else    /* No name found */
27745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	        sec_event.cfm_req.bd_name[0] = 0;
27755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	    sec_event.key_notif.passkey    = bta_dm_cb.num_val; /* get PIN code numeric number */
27775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* 1 additional event data fields for this event */
27795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_event.cfm_req.just_works = bta_dm_cb.just_works;
27805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
27825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	    /* Retrieved saved device class and bd_addr */
27845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	    bdcpy(sec_event.pin_req.bd_addr, bta_dm_cb.pin_bd_addr);
27855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	    BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, bta_dm_cb.pin_dev_class);
27865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	    if (p_result && p_result->status == BTM_SUCCESS)
27885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	    {
27895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	        bytes_to_copy = (p_result->length < (BD_NAME_LEN-1))
27905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ? p_result->length : (BD_NAME_LEN-1);
27915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	        memcpy(sec_event.pin_req.bd_name, p_result->remote_bd_name, bytes_to_copy);
27925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	        sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0;
27935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	    }
27945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	    else    /* No name found */
27955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	        sec_event.pin_req.bd_name[0] = 0;
27965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	    event = bta_dm_cb.pin_evt;
27985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	    sec_event.key_notif.passkey    = bta_dm_cb.num_val; /* get PIN code numeric number */
27995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
28005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( bta_dm_cb.p_sec_cback )
28025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.p_sec_cback(event, &sec_event);
28035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
28045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
28085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_pin_cback
28105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Callback requesting pin_key
28125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
28145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
28165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 bta_dm_pin_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name)
28175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
28185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEC sec_event;
28195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!bta_dm_cb.p_sec_cback)
28215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_NOT_AUTHORIZED;
28225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If the device name is not known, save bdaddr and devclass and initiate a name request */
28245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bd_name[0] == 0)
28255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
28265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.pin_evt = BTA_DM_PIN_REQ_EVT;
28275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(bta_dm_cb.pin_bd_addr, bd_addr);
28285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, dev_class);
28295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((BTM_ReadRemoteDeviceName(bd_addr, bta_dm_pinname_cback)) == BTM_CMD_STARTED)
28305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return BTM_CMD_STARTED;
28315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_WARNING0(" bta_dm_pin_cback() -> Failed to start Remote Name Request  ");
28335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
28345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(sec_event.pin_req.bd_addr, bd_addr);
28365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, dev_class);
28375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BCM_STRNCPY_S((char*)sec_event.pin_req.bd_name, sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1));
28385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0;
28395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_cb.p_sec_cback(BTA_DM_PIN_REQ_EVT, &sec_event);
28415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return BTM_CMD_STARTED;
28425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
28435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
28475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_link_key_request_cback
28495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Callback requesting linkkey
28515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
28535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
28555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8  bta_dm_link_key_request_cback (BD_ADDR bd_addr, LINK_KEY key)
28565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
28575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Application passes all link key to
28585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM during initialization using add_device
28595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    API. If BTM doesn't have the link key in it's
28605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    data base, that's because application doesn't
28615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    it */
28625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return BTM_NOT_AUTHORIZED;
28645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
28655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
28715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_new_link_key_cback
28735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Callback from BTM to notify new link key
28755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
28775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
28795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8  bta_dm_new_link_key_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,
28805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        BD_NAME bd_name, LINK_KEY key, UINT8 key_type)
28815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
28825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEC sec_event;
28835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_AUTH_CMPL *p_auth_cmpl;
28845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8             event;
28855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (&sec_event, 0, sizeof(tBTA_DM_SEC));
28875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Not AMP Key type */
28895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (key_type != HCI_LKEY_TYPE_AMP_WIFI && key_type != HCI_LKEY_TYPE_AMP_UWB)
28905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
28915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        event = BTA_DM_AUTH_CMPL_EVT;
28925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_auth_cmpl = &sec_event.auth_cmpl;
28935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(p_auth_cmpl->bd_addr, bd_addr);
28955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(p_auth_cmpl->bd_name, bd_name, (BD_NAME_LEN-1));
28975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_auth_cmpl->bd_name[BD_NAME_LEN-1] = 0;
28985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_auth_cmpl->key_present = TRUE;
29005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_auth_cmpl->key_type = key_type;
29015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_auth_cmpl->success = TRUE;
29025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(p_auth_cmpl->key, key, LINK_KEY_LEN);
29045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_event.auth_cmpl.fail_reason = HCI_SUCCESS;
29055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(bta_dm_cb.p_sec_cback)
29075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
29085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.p_sec_cback(event, &sec_event);
29095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
29105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
29125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
29135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_WARNING0(" bta_dm_new_link_key_cback() Received AMP Key??  ");
29145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return BTM_CMD_STARTED;
29175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_authentication_complete_cback
29235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Authentication complete callback from BTM
29255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
29275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
29295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,BD_NAME bd_name, int result)
29305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
29315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEC sec_event;
29335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(result != BTM_SUCCESS)
29355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
29365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
29375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(sec_event.auth_cmpl.bd_addr, bd_addr);
29385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(sec_event.auth_cmpl.bd_name, bd_name, (BD_NAME_LEN-1));
29405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_event.auth_cmpl.bd_name[BD_NAME_LEN-1] = 0;
29415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*      taken care of by memset [above]
29435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_event.auth_cmpl.key_present = FALSE;
29445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_event.auth_cmpl.success = FALSE;
29455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
29465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_event.auth_cmpl.fail_reason = (UINT8)result;
29475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(bta_dm_cb.p_sec_cback)
29485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
29495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
29505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2951ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* delete this device entry from Sec Dev DB */
2952ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        bta_dm_remove_sec_dev_entry(bd_addr);
29535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return BTM_SUCCESS;
29565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_sp_cback
29615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      simple pairing callback from BTM
29635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
29655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
29675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 bta_dm_sp_cback (tBTM_SP_EVT event, tBTM_SP_EVT_DATA *p_data)
29685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
29695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS status = BTM_CMD_STARTED;
29705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEC sec_event;
29715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEC_EVT pin_evt = BTA_DM_SP_KEY_NOTIF_EVT;
29725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_EVENT1("bta_dm_sp_cback: %d", event);
29745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!bta_dm_cb.p_sec_cback)
29755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_NOT_AUTHORIZED;
29765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* TODO_SP */
29785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(event)
29795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
29805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTM_SP_IO_REQ_EVT:
29815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
29825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* translate auth_req */
29835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_co_io_req(p_data->io_req.bd_addr, &p_data->io_req.io_cap,
29845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            &p_data->io_req.oob_data, &p_data->io_req.auth_req, p_data->io_req.is_orig);
29855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
29865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == FALSE
29875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTM_SUCCESS;
29885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
29895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_EVENT2("io mitm: %d oob_data:%d", p_data->io_req.auth_req, p_data->io_req.oob_data);
29915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
29925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTM_SP_IO_RSP_EVT:
29935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
29945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_co_io_rsp(p_data->io_rsp.bd_addr, p_data->io_rsp.io_cap,
29955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                         p_data->io_rsp.oob_data, p_data->io_rsp.auth_req );
29965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
29975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
29985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTM_SP_CFM_REQ_EVT:
30005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pin_evt = BTA_DM_SP_CFM_REQ_EVT;
30015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.just_works = sec_event.cfm_req.just_works = p_data->cfm_req.just_works;
30025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_event.cfm_req.loc_auth_req = p_data->cfm_req.loc_auth_req;
30035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_event.cfm_req.rmt_auth_req = p_data->cfm_req.rmt_auth_req;
30045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_event.cfm_req.loc_io_caps = p_data->cfm_req.loc_io_caps;
30055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_event.cfm_req.rmt_io_caps = p_data->cfm_req.rmt_io_caps;
30065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* continue to next case */
30075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
30085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Passkey entry mode, mobile device with output capability is very
30095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        unlikely to receive key request, so skip this event */
30105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*case BTM_SP_KEY_REQ_EVT: */
30115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTM_SP_KEY_NOTIF_EVT:
30125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
30135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.num_val = sec_event.key_notif.passkey = p_data->key_notif.passkey;
30145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If the device name is not known, save bdaddr and devclass and initiate a name request */
30155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_data->key_notif.bd_name[0] == 0)
30165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
30175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.pin_evt = pin_evt;
30185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdcpy(bta_dm_cb.pin_bd_addr, p_data->key_notif.bd_addr);
30195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->key_notif.dev_class);
30205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((BTM_ReadRemoteDeviceName(p_data->key_notif.bd_addr, bta_dm_pinname_cback)) == BTM_CMD_STARTED)
30215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return BTM_CMD_STARTED;
30225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_WARNING0(" bta_dm_sp_cback() -> Failed to start Remote Name Request  ");
30245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
30255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(sec_event.key_notif.bd_addr, p_data->key_notif.bd_addr);
30265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->key_notif.dev_class);
30275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME), (char*)p_data->key_notif.bd_name, (BD_NAME_LEN-1));
30285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sec_event.key_notif.bd_name[BD_NAME_LEN-1] = 0;
30295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.p_sec_cback(pin_evt, &sec_event);
30315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
30335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE
30355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTM_SP_LOC_OOB_EVT:
30365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_co_loc_oob((BOOLEAN)(p_data->loc_oob.status == BTM_SUCCESS),
30375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data->loc_oob.c, p_data->loc_oob.r);
30385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
30395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTM_SP_RMT_OOB_EVT:
30415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If the device name is not known, save bdaddr and devclass and initiate a name request */
30425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_data->rmt_oob.bd_name[0] == 0)
30435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
30445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.pin_evt = BTA_DM_SP_RMT_OOB_EVT;
30455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdcpy(bta_dm_cb.pin_bd_addr, p_data->rmt_oob.bd_addr);
30465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->rmt_oob.dev_class);
30475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((BTM_ReadRemoteDeviceName(p_data->rmt_oob.bd_addr, bta_dm_pinname_cback)) == BTM_CMD_STARTED)
30485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return BTM_CMD_STARTED;
30495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_WARNING0(" bta_dm_sp_cback() -> Failed to start Remote Name Request  ");
30515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
30525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(sec_event.rmt_oob.bd_addr, p_data->rmt_oob.bd_addr);
30535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTA_COPY_DEVICE_CLASS(sec_event.rmt_oob.dev_class, p_data->rmt_oob.dev_class);
30545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BCM_STRNCPY_S((char*)sec_event.rmt_oob.bd_name, sizeof(BD_NAME), (char*)p_data->rmt_oob.bd_name, (BD_NAME_LEN-1));
30555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sec_event.rmt_oob.bd_name[BD_NAME_LEN-1] = 0;
30565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.p_sec_cback(BTA_DM_SP_RMT_OOB_EVT, &sec_event);
30585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_co_rmt_oob(p_data->rmt_oob.bd_addr);
30605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
30615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
30625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTM_SP_COMPLT_EVT:
30635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* do not report this event - handled by link_key_callback or auth_complete_callback */
30645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
30655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTM_SP_KEYPRESS_EVT:
30675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(&sec_event.key_press, &p_data->key_press, sizeof(tBTM_SP_KEYPRESS));
30685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.p_sec_cback(BTA_DM_SP_KEYPRESS_EVT, &sec_event);
30695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
30705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTM_SP_UPGRADE_EVT:
30725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_co_lk_upgrade(p_data->upgrade.bd_addr, &p_data->upgrade.upgrade );
30735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
30745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
30765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTM_NOT_AUTHORIZED;
30775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
30785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
30795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_EVENT1("dm status: %d", status);
30805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
30815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
30825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
30845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_local_name_cback
30865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Callback from btm after local name is read
30885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
30915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
30935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_local_name_cback(UINT8 *p_name)
30945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
30955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEC sec_event;
30965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_GetLocalDeviceAddr(sec_event.enable.bd_addr);
30985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sec_event.enable.status = BTA_SUCCESS;
30995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(bta_dm_cb.p_sec_cback)
31015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.p_sec_cback(BTA_DM_ENABLE_EVT, &sec_event);
31025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
31035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
31055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
31065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_signal_strength
31075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
31085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Callback from btm after local bdaddr is read
31095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
31105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
31115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
31125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
31135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
31145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_signal_strength(tBTA_DM_MSG *p_data)
31155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
31165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_data->sig_strength.start)
31185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.signal_strength_mask = p_data->sig_strength.mask;
31205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.signal_strength_period = p_data->sig_strength.period;
31215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_signal_strength_timer_cback(NULL);
31225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
31245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_stop_timer(&bta_dm_cb.signal_strength_timer);
31265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
31295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
31305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
31315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_signal_strength_timer_cback
31325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
31335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Periodic timer callback to read signal strength
31345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
31355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
31365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
31375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
31385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
31395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_signal_strength_timer_cback (TIMER_LIST_ENT *p_tle)
31405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
31415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i;
31435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(bta_dm_cb.signal_strength_mask & BTA_SIG_STRENGTH_RSSI_MASK)
31455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for(i=0; i<bta_dm_cb.device_list.count; i++)
31475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
31485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_ReadRSSI (bta_dm_cb.device_list.peer_device[i].peer_bdaddr, (tBTM_CMPL_CB *)bta_dm_rssi_cback);
31495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(bta_dm_cb.signal_strength_mask & BTA_SIG_STRENGTH_LINK_QUALITY_MASK)
31535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for(i=0; i<bta_dm_cb.device_list.count; i++)
31565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
31575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_ReadLinkQuality (bta_dm_cb.device_list.peer_device[i].peer_bdaddr, (tBTM_CMPL_CB *)bta_dm_link_quality_cback);
31585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(bta_dm_cb.signal_strength_period)
31635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.signal_strength_timer.p_cback = (TIMER_CBACK*)&bta_dm_signal_strength_timer_cback;
31655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_start_timer(&bta_dm_cb.signal_strength_timer, 0, (UINT32)1000*bta_dm_cb.signal_strength_period);
31665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
31685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
31715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
31725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
31735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_bl_change_cback
31745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
31755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Callback from btm when acl connection goes up or down
31765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
31775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
31785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
31795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
31805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
31815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data)
31825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
31835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_ACL_CHANGE * p_msg;
31855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_msg = (tBTA_DM_ACL_CHANGE *) GKI_getbuf(sizeof(tBTA_DM_ACL_CHANGE))) != NULL)
31875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->event = p_data->event;
31895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->is_new = FALSE;
31905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch(p_msg->event)
31925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
31935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_BL_CONN_EVT:
31945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->is_new = TRUE;
31955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdcpy(p_msg->bd_addr, p_data->conn.p_bda);
31965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
31975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_BL_DISCN_EVT:
31985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdcpy(p_msg->bd_addr, p_data->discn.p_bda);
31995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
32005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_BL_UPDATE_EVT:
32015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->busy_level = p_data->update.busy_level;
3202ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_msg->busy_level_flags = p_data->update.busy_level_flags;
32035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
32045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_BL_ROLE_CHG_EVT:
32055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->new_role = p_data->role_chg.new_role;
32065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->hci_status = p_data->role_chg.hci_status;
32075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdcpy(p_msg->bd_addr, p_data->role_chg.p_bda);
32085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
32095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_BL_COLLISION_EVT:
32105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bdcpy(p_msg->bd_addr, p_data->conn.p_bda);
32115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;;
32125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
32135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->hdr.event = BTA_DM_ACL_CHANGE_EVT;
32155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_sendmsg(p_msg);
32165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
32205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
32215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
32235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
32245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_acl_change_cback
32255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
32265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Callback from btm when acl connection goes up or down
32275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
32285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
32295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
32305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
32315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
32325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_acl_change_cback (BD_ADDR p_bda, DEV_CLASS p_dc, BD_NAME p_bdn,
32335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     BD_FEATURES features, BOOLEAN is_new)
32345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
32355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_ACL_CHANGE * p_msg;
32375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_msg = (tBTA_DM_ACL_CHANGE *) GKI_getbuf(sizeof(tBTA_DM_ACL_CHANGE))) != NULL)
32395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
32405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy (p_msg->bd_addr, p_bda);
32415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->is_new = is_new;
32425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* This is collision case */
32445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (features != NULL)
32455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
32465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((features[0] == 0xFF) && !is_new)
32475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_msg->event = BTM_BL_COLLISION_EVT;
32485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
32495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->hdr.event = BTA_DM_ACL_CHANGE_EVT;
32515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_sendmsg(p_msg);
32525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
32565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
32575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
32585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
32595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_rs_cback
32605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
32615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Receives the role switch complete event
32625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
32635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns
32645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
32655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
32665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_rs_cback (tBTM_ROLE_SWITCH_CMPL *p1)
32675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
32685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_WARNING1("bta_dm_rs_cback:%d", bta_dm_cb.rs_event);
32695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(bta_dm_cb.rs_event == BTA_DM_API_SEARCH_EVT)
32705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
32715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.search_msg.rs_res = BTA_DM_RS_OK; /* do not care about the result for now */
32725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.rs_event = 0;
32735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_start((tBTA_DM_MSG *)&bta_dm_cb.search_msg);
32745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
32765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
32785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
32795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_check_av
32805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
32815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function checks if AV is active
32825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  if yes, make sure the AV link is master
32835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
32845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BOOLEAN - TRUE, if switch is in progress
32855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
32865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
32875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_dm_check_av(UINT16 event)
32885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
32895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN switching = FALSE;
32905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i;
32915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_PEER_DEVICE *p_dev;
32925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_WARNING1("bta_dm_check_av:%d", bta_dm_cb.cur_av_count);
32945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(bta_dm_cb.cur_av_count)
32955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
32965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for(i=0; i<bta_dm_cb.device_list.count; i++)
32975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
32985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev = &bta_dm_cb.device_list.peer_device[i];
32995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_WARNING3("[%d]: state:%d, info:x%x", i, p_dev->conn_state, p_dev->info);
33005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if((p_dev->conn_state == BTA_DM_CONNECTED) && (p_dev->info & BTA_DM_DI_AV_ACTIVE))
33015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
33025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* make master and take away the role switch policy */
33035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(BTM_CMD_STARTED == BTM_SwitchRole (p_dev->peer_bdaddr, HCI_ROLE_MASTER, (tBTM_CMPL_CB *)bta_dm_rs_cback))
33045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
33055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* the role switch command is actually sent */
33065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_cb.rs_event = event;
33075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    switching = TRUE;
33085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
33095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* else either already master or can not switch for some reasons */
33105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_policy_cback(BTA_SYS_PLCY_CLR, 0, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_dev->peer_bdaddr);
33115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
33125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
33135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
33145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
33155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return switching;
33165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
33175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
33195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_acl_change
33215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Process BTA_DM_ACL_CHANGE_EVT
33235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
33265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
33285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_acl_change(tBTA_DM_MSG *p_data)
33295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
33305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i;
33325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p;
33335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEC conn;
33345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN is_new = p_data->acl_change.is_new;
33355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_ADDR_PTR     p_bda = p_data->acl_change.bd_addr;
33365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN         need_policy_change = FALSE;
33375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN         issue_unpair_cb = FALSE;
33385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
33405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_PEER_DEVICE *p_dev;
33415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(p_data->acl_change.event)
33435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
33445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTM_BL_UPDATE_EVT:     /* busy level update */
33455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( bta_dm_cb.p_sec_cback )
33465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
33475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            conn.busy_level.level = p_data->acl_change.busy_level;
3348ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            conn.busy_level.level_flags = p_data->acl_change.busy_level_flags;
33495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.p_sec_cback(BTA_DM_BUSY_LEVEL_EVT, &conn);
33505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
33515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
33525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTM_BL_ROLE_CHG_EVT:   /* role change event */
33545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev = bta_dm_find_peer_device(p_bda);
33555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(p_dev)
33565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
33575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_DEBUG3("bta_dm_acl_change role chg info:x%x new_role:%d dev count:%d",
33585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev->info, p_data->acl_change.new_role, bta_dm_cb.device_list.count);
33595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(p_dev->info & BTA_DM_DI_AV_ACTIVE)
33605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
33615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* there's AV activity on this link */
33625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(p_data->acl_change.new_role == HCI_ROLE_SLAVE && bta_dm_cb.device_list.count > 1
33635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    && p_data->acl_change.hci_status == HCI_SUCCESS)
33645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
33655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* more than one connections and the AV connection is role switched to slave
33665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     * switch it back to master and remove the switch policy */
33675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    BTM_SwitchRole(p_bda, BTM_ROLE_MASTER, NULL);
33685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    need_policy_change = TRUE;
33695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
33705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else if (bta_dm_cfg.avoid_scatter && (p_data->acl_change.new_role == HCI_ROLE_MASTER))
33715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
33725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* if the link updated to be master include AV activities, remove the switch policy */
33735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    need_policy_change = TRUE;
33745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
33755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(need_policy_change)
33775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
33785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_policy_cback(BTA_SYS_PLCY_CLR, 0, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_dev->peer_bdaddr);
33795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
33805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
33815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
33825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
33835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* there's AV no activity on this link and role switch happened
33845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 * check if AV is active
33855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 * if so, make sure the AV link is master */
33865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_check_av(0);
33875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
33885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_notify_role_chg(p_data->acl_change.bd_addr, p_data->acl_change.new_role, p_data->acl_change.hci_status);
33895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdcpy(conn.role_chg.bd_addr, p_bda);
33905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            conn.role_chg.new_role = (UINT8) p_data->acl_change.new_role;
33915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if( bta_dm_cb.p_sec_cback )
33925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_cb.p_sec_cback(BTA_DM_ROLE_CHG_EVT, &conn);
33935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
33945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
33955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
33965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
33975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Collision report from Stack: Notify profiles */
33995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data->acl_change.event == BTM_BL_COLLISION_EVT)
34005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
34015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_notify_collision (p_bda);
34025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
34035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
34045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(is_new)
34065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
34075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for(i=0; i<bta_dm_cb.device_list.count; i++)
34085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
34095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(!bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda))
34105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
34115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
34135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(i == bta_dm_cb.device_list.count)
34155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
34165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdcpy(bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].peer_bdaddr, p_bda);
34175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].link_policy = bta_dm_cb.cur_policy;
34185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.device_list.count++;
34195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
34205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_CONNECTED;
34225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.device_list.peer_device[i].pref_role = BTA_ANY_ROLE;
34235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(conn.link_up.bd_addr, p_bda);
34245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_NONE;
34255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( ((NULL != (p = BTM_ReadLocalFeatures ())) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) &&
34265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ((NULL != (p = BTM_ReadRemoteFeatures (p_bda))) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) )
34275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
34285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* both local and remote devices support SSR */
34295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_USE_SSR;
34305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
34315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_WARNING1("info:x%x", bta_dm_cb.device_list.peer_device[i].info);
34325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( bta_dm_cb.p_sec_cback )
34335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.p_sec_cback(BTA_DM_LINK_UP_EVT, &conn);
34345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
34365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
34375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
34385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for(i=0; i<bta_dm_cb.device_list.count; i++)
34395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
34405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda))
34415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                continue;
34425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if( bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_UNPAIRING )
34445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
34455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_SecDeleteDevice(bta_dm_cb.device_list.peer_device[i].peer_bdaddr);
34465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                issue_unpair_cb = TRUE;
34475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
34485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3449ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            conn.link_down.is_removed = bta_dm_cb.device_list.peer_device[i].remove_dev_pending;
3450ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
34515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for(; i<bta_dm_cb.device_list.count ; i++)
34525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
34535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                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]));
34545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
34555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
34565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
34575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(bta_dm_cb.device_list.count)
34585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.device_list.count--;
34595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(bta_dm_search_cb.wait_disc && !bdcmp(bta_dm_search_cb.peer_bdaddr, p_bda))
34615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
34625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_search_cb.wait_disc = FALSE;
34635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(bta_dm_search_cb.sdp_results)
34655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
34665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                APPL_TRACE_EVENT0(" timer stopped  ");
34675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_sys_stop_timer(&bta_dm_search_cb.search_timer);
34685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_discover_next_device();
34695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
34705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
34725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(bta_dm_cb.disabling)
34745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
34755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(!BTM_GetNumAclLinks())
34765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
34775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_sys_stop_timer(&bta_dm_cb.disable_timer);
34785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_conn_down_timer_cback;
34795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* start a timer to make sure that the profiles get the disconnect event */
34805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 1000);
34815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
34825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3483ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (conn.link_down.is_removed)
3484ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
3485ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            BTM_SecDeleteDevice(p_bda);
3486ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
3487ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* need to remove all pending background connection */
3488ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            BTA_GATTC_CancelOpen(0, p_bda, FALSE);
3489ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* remove all cached GATT information */
3490ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            BTA_GATTC_Refresh(p_bda);
3491ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
3492ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         }
34935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(conn.link_down.bd_addr, p_bda);
34955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn.link_down.status = (UINT8) btm_get_acl_disc_reason_code();
34965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( bta_dm_cb.p_sec_cback )
34975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
34985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.p_sec_cback(BTA_DM_LINK_DOWN_EVT, &conn);
34995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if( issue_unpair_cb )
35005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &conn);
35015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
35025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_adjust_roles(TRUE);
35055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
35065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
35085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_disable_conn_down_timer_cback
35105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Sends disable event to application
35125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
35155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
35175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_disable_conn_down_timer_cback (TIMER_LIST_ENT *p_tle)
35185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
35195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_SYS_HW_MSG *sys_enable_event;
35205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3521ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* disable the power managment module */
3522ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    bta_dm_disable_pm();
3523ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
35245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* register our callback to SYS HW manager */
35255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_hw_register( BTA_SYS_HW_BLUETOOTH, bta_dm_sys_hw_cback );
35265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send a message to BTA SYS */
35285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((sys_enable_event = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL)
35295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
35305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sys_enable_event->hdr.event = BTA_SYS_API_DISABLE_EVT;
35315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH;
35325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_sendmsg(sys_enable_event);
35335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_cb.disabling = FALSE;
35365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
35385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
35405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_rssi_cback
35425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Callback from btm with rssi values
35445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
35475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
35495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_rssi_cback (tBTM_RSSI_RESULTS *p_result)
35505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
35515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEC sec_event;
35525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_result->status == BTM_SUCCESS)
35545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
35555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(sec_event.sig_strength.bd_addr, p_result->rem_bda);
35575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_event.sig_strength.mask = BTA_SIG_STRENGTH_RSSI_MASK;
35585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_event.sig_strength.rssi_value = p_result->rssi;
35595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( bta_dm_cb.p_sec_cback!= NULL )
35605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.p_sec_cback(BTA_DM_SIG_STRENGTH_EVT, &sec_event);
35615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
35645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
35665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_link_quality_cback
35685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Callback from btm with link quality value
35705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
35735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
35755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_link_quality_cback (tBTM_LINK_QUALITY_RESULTS *p_result)
35765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
35775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEC sec_event;
35795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_result->status == BTM_SUCCESS)
35815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
35825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(sec_event.sig_strength.bd_addr, p_result->rem_bda);
35845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_event.sig_strength.mask = BTA_SIG_STRENGTH_LINK_QUALITY_MASK;
35855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_event.sig_strength.link_quality_value = p_result->link_quality;
35865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( bta_dm_cb.p_sec_cback!= NULL )
35875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.p_sec_cback(BTA_DM_SIG_STRENGTH_EVT, &sec_event);
35885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
35915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
35935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_rm_cback
35955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Role management callback from sys
35975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
36005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
36015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
36025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
36035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
36045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 j;
36065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PREF_ROLES role;
36075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_PEER_DEVICE *p_dev;
36085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev = bta_dm_find_peer_device(peer_addr);
36105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( status == BTA_SYS_CONN_OPEN)
36115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
36125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(p_dev)
36135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
36145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Do not set to connected if we are in the middle of unpairing. When AV stream is
36155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * started it fakes out a SYS_CONN_OPEN to potentially trigger a role switch command.
36165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * But this should not be done if we are in the middle of unpairing.
36175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             */
36185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev->conn_state != BTA_DM_UNPAIRING)
36195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev->conn_state = BTA_DM_CONNECTED;
36205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for(j=1; j<= p_bta_dm_rm_cfg[0].app_id; j++)
36225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
36235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(((p_bta_dm_rm_cfg[j].app_id == app_id) || (p_bta_dm_rm_cfg[j].app_id == BTA_ALL_APP_ID))
36245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    && (p_bta_dm_rm_cfg[j].id == id))
36255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
36265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    role = p_bta_dm_rm_cfg[j].cfg;
36275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if(role > p_dev->pref_role )
36295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_dev->pref_role = role;
36305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
36315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
36325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
36335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
36355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
36375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if((BTA_ID_AV == id)||(BTA_ID_AVK ==id))
36395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
36405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( status == BTA_SYS_CONN_BUSY)
36415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
36425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(p_dev)
36435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev->info |= BTA_DM_DI_AV_ACTIVE;
36445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* AV calls bta_sys_conn_open with the A2DP stream count as app_id */
36455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(BTA_ID_AV == id)
36465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_cb.cur_av_count = app_id;
36475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
36485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if( status == BTA_SYS_CONN_IDLE)
36495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
36505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(p_dev)
36515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev->info &= ~BTA_DM_DI_AV_ACTIVE;
36525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* AV calls bta_sys_conn_open with the A2DP stream count as app_id */
36535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(BTA_ID_AV == id)
36545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_cb.cur_av_count = app_id;
36555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
36565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_WARNING2("bta_dm_rm_cback:%d, status:%d", bta_dm_cb.cur_av_count, status);
36575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
36585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_adjust_roles(FALSE);
36615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
36635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
36655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
36665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_dev_blacklisted_for_switch
36675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
36685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Checks if the device is blacklisted for immediate role switch after connection.
36695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
36705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if dev is blacklisted else FALSE
36715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
36725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
36735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_dm_dev_blacklisted_for_switch (BD_ADDR remote_bd_addr)
36745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
36755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 manufacturer = 0;
36765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  lmp_sub_version = 0;
36775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 lmp_version = 0;
36785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i = 0;
36795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_ReadRemoteVersion(remote_bd_addr, &lmp_version,
36815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        &manufacturer, &lmp_sub_version) == BTM_SUCCESS)
36825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
36835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Check if this device version info matches with is
36845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           blacklisted versions for role switch  */
36855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < BTA_DM_MAX_ROLE_SWITCH_BLACKLIST_COUNT; i++)
36865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
36875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             if ((bta_role_switch_blacklist[i].lmp_version == lmp_version) &&
36885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (bta_role_switch_blacklist[i].manufacturer == manufacturer)&&
36895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 ((bta_role_switch_blacklist[i].lmp_sub_version & lmp_sub_version) ==
36905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     bta_role_switch_blacklist[i].lmp_sub_version))
36915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
36925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    APPL_TRACE_EVENT0("Black list F/W version matches.. Delay Role Switch...");
36935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    return TRUE;
36945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
36955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
36975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
36985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return FALSE;
36995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
37005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
37025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_delay_role_switch_cback
37045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Callback from btm to delay a role switch
37065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
37085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
37105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_delay_role_switch_cback(TIMER_LIST_ENT *p_tle)
37115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
37125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_EVENT0("bta_dm_delay_role_switch_cback: initiating Delayed RS");
37135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_adjust_roles (FALSE);
37145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
37155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
37175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3718ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         bta_dm_remove_sec_dev_entry
3719ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
3720ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      Removes device entry from Security device DB if ACL connection with
3721ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  remtoe device does not exist, else schedule for dev entry removal upon
3722ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                     ACL close
3723ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
3724ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void
3725ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
3726ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
3727ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr)
3728ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
3729ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT16 index = 0;
3730ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (BTM_IsAclConnectionUp(remote_bd_addr))
3731ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
3732ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         APPL_TRACE_DEBUG1("%s ACL is not down. Schedule for  Dev Removal when ACL closes",
3733ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                            __FUNCTION__);
3734ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        for (index = 0; index < bta_dm_cb.device_list.count; index ++)
3735ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
3736ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (!bdcmp( bta_dm_cb.device_list.peer_device[index].peer_bdaddr, remote_bd_addr))
3737ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                break;
3738ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
3739ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (index != bta_dm_cb.device_list.count)
3740ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
3741ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            bta_dm_cb.device_list.peer_device[index].remove_dev_pending = TRUE;
3742ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
3743ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        else
3744ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
3745ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            APPL_TRACE_ERROR1(" %s Device does not exist in DB", __FUNCTION__);
3746ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
3747ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
3748ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    else
3749ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
3750ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        BTM_SecDeleteDevice (remote_bd_addr);
3751ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
3752ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
3753ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
3754ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
3755ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
37565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_adjust_roles
37575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Adjust roles
37595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
37625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
37645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_adjust_roles(BOOLEAN delay_role_switch)
37655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
37665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i;
37685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN set_master_role = FALSE;
37695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(bta_dm_cb.device_list.count)
37715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* the configuration is no scatternet
37745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * or AV connection exists and there are more than one ACL link */
37755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( (p_bta_dm_rm_cfg[0].cfg == BTA_DM_NO_SCATTERNET) ||
37765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (bta_dm_cb.cur_av_count && bta_dm_cb.device_list.count > 1) )
37775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
37785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            L2CA_SetDesireRole (HCI_ROLE_MASTER);
37805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            set_master_role = TRUE;
37815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
37835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for(i=0; i<bta_dm_cb.device_list.count; i++)
37855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
37865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED)
37875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
37885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(!set_master_role && (bta_dm_cb.device_list.peer_device[i].pref_role != BTA_ANY_ROLE)
37895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    && (p_bta_dm_rm_cfg[0].cfg == BTA_DM_PARTIAL_SCATTERNET))
37905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
37915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    L2CA_SetDesireRole (HCI_ROLE_MASTER);
37925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    set_master_role = TRUE;
37935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
37945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if((bta_dm_cb.device_list.peer_device[i].pref_role == BTA_MASTER_ROLE_ONLY)
37965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    || (bta_dm_cb.device_list.count > 1))
37975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
37985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Initiating immediate role switch with certain remote devices
38005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                  has caused issues due to role  switch colliding with link encryption setup and
38015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                  causing encryption (and in turn the link) to fail .  These device . Firmware
38025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                  versions are stored in a blacklist and role switch with these devices are
38035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                  delayed to avoid the collision with link encryption setup */
38045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if ((delay_role_switch == FALSE) ||
38065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       (bta_dm_dev_blacklisted_for_switch(
38075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       bta_dm_cb.device_list.peer_device[i].peer_bdaddr) == FALSE))
38085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
38095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        BTM_SwitchRole (bta_dm_cb.device_list.peer_device[i].peer_bdaddr,
38105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        HCI_ROLE_MASTER, NULL);
38115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
38125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    else
38135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
38145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        bta_dm_cb.switch_delay_timer.p_cback =
38155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            (TIMER_CBACK*)&bta_dm_delay_role_switch_cback;
38165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        bta_sys_start_timer(&bta_dm_cb.switch_delay_timer, 0, 500);
38175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
38185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
38195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
38215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
38225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(!set_master_role)
38255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
38265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            L2CA_SetDesireRole (L2CAP_DESIRED_LINK_ROLE);
38285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
38305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
38335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
38345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_SetDesireRole (L2CAP_DESIRED_LINK_ROLE);
38355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
38395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
38415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_get_remname
38435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Returns a pointer to the remote name stored in the DM control
38455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  block if it exists, or from the BTM memory.
38465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          char * - Pointer to the remote device name
38485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
38495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *bta_dm_get_remname(void)
38505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3851ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    char *p_name = (char *)bta_dm_search_cb.peer_name;
38525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char *p_temp;
38535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If the name isn't already stored, try retrieving from BTM */
38555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (*p_name == '\0')
38565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_temp = BTM_SecReadDevName(bta_dm_search_cb.peer_bdaddr)) != NULL)
38575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_name = p_temp;
38585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_name;
38605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
38615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
38635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_bond_cancel_complete_cback
38655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Authentication complete callback from BTM
38675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
38695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
38715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result)
38725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
38735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEC sec_event;
38755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (result == BTM_SUCCESS)
38775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_event.bond_cancel_cmpl.result = BTA_SUCCESS;
38785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
38795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_event.bond_cancel_cmpl.result = BTA_FAILURE;
38805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(bta_dm_cb.p_sec_cback)
38825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
38835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_cb.p_sec_cback(BTA_DM_BOND_CANCEL_CMPL_EVT, &sec_event);
38845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
38865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if ( BTM_EIR_SERVER_INCLUDED == TRUE )
38885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #if ( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
38895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
38905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_update_eir_uuid
38925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
38945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
38975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_update_eir_uuid (tBTA_DM_MSG *p_data)
38985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
38995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_API_UPDATE_EIR_UUID *p_msg = (tBTA_DM_API_UPDATE_EIR_UUID *)p_data;
39005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 xx;
39015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 empty_slot = BTA_EIR_SERVER_NUM_CUSTOM_UUID;
39025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 match_slot = BTA_EIR_SERVER_NUM_CUSTOM_UUID;
39035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; xx++)
39055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (bta_dm_cb.custom_uuid[xx].len == 0)
39075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
39085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (empty_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID)
39095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                empty_slot = xx;
39105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
39115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (match_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID)
39125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
39135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!memcmp (bta_dm_cb.custom_uuid[xx].uu.uuid128, p_msg->uuid.uu.uuid128, p_msg->uuid.len))
39145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
39155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                match_slot = xx;;
39165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
39175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
39185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
39195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_msg->is_add)
39215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (match_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID)
39235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
39245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (empty_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID)
39255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
39265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                APPL_TRACE_ERROR0("No space to add UUID for EIR");
39275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
39285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
39295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
39305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
39315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy (&(bta_dm_cb.custom_uuid[empty_slot]), &(p_msg->uuid), sizeof(tBT_UUID));
39325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
39335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
39345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
39355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
39365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_ERROR0("UUID is already added for EIR");
39375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
39385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
39395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
39405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
39415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (match_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID)
39435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
39445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_ERROR0("UUID is not found for EIR");
39455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
39465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
39475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
39485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
39495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset (&(bta_dm_cb.custom_uuid[match_slot]), 0, sizeof(tBT_UUID));
39505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
39515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
39525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_set_eir (NULL);
39545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
39555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #endif
39565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
39585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_set_eir_config
39605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
39625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
39655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_set_eir_config (tBTA_DM_MSG *p_data)
39665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
39675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data->set_eir_cfg.p_eir_cfg)
39685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* User defined config */
39705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_bta_dm_eir_cfg = p_data->set_eir_cfg.p_eir_cfg;
39715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
39725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
39735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Back to default config */
39755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_bta_dm_eir_cfg = (tBTA_DM_EIR_CONF*)&bta_dm_eir_cfg;
39765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
39775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_set_eir (NULL);
39795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
39805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
39825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_set_eir
39845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function creates EIR tagged data and writes it to controller.
39865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None
39885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
39905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_set_eir (char *local_name)
39915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
39925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR   *p_buf;
39935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    *p;
39945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    *p_length;
39955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_EIR_CANNED_UUID_LIST != TRUE)
39965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    *p_type;
39975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    max_num_uuid;
39985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
39995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    custom_uuid_idx;
40005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
40015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
40025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_EIR_DEFAULT_FEC_REQUIRED == FALSE)
40035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    free_eir_length = HCI_EXT_INQ_RESPONSE_LEN;
40045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
40055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    free_eir_length = HCI_DM5_PACKET_SIZE;
40065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
40075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    num_uuid;
40085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    data_type;
40095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    local_name_len;
40105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* wait until complete to disable */
40125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_dm_cb.disable_timer.in_use)
40135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
40145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if ( BTA_EIR_CANNED_UUID_LIST != TRUE )
40165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* wait until App is ready */
40175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_dm_cb.app_ready_timer.in_use)
40185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
40195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if local name is not provided, get it from controller */
40215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( local_name == NULL )
40225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( BTM_ReadLocalDeviceName( &local_name ) != BTM_SUCCESS )
40245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
40255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_ERROR0("Fail to read local device name for EIR");
40265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
40275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
40295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Allocate a buffer to hold HCI command */
40315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = (BT_HDR *)GKI_getpoolbuf(BTM_CMD_POOL_ID)) == NULL)
40325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR0("bta_dm_set_eir couldn't allocate buffer");
40345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
40355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p = (UINT8 *)p_buf + BTM_HCI_EIR_OFFSET;
40375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(p, 0x00, HCI_EXT_INQ_RESPONSE_LEN );
40395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG0("BTA is generating EIR");
40415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( local_name )
40435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        local_name_len = strlen( local_name );
40445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
40455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        local_name_len = 0;
40465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    data_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE;
40485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if local name is longer than minimum length of shortened name */
40495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* check whether it needs to be shortened or not */
40505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( local_name_len > p_bta_dm_eir_cfg->bta_dm_eir_min_name_len )
40515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* get number of UUID 16-bit list */
40535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_EIR_CANNED_UUID_LIST == TRUE)
40545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len/LEN_UUID_16;
40555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
40565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        max_num_uuid = (free_eir_length - 2)/LEN_UUID_16;
40575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        data_type = BTM_GetEirSupportedServices( bta_dm_cb.eir_uuid, &p,
40585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                 max_num_uuid, &num_uuid );
40595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = (UINT8 *)p_buf + BTM_HCI_EIR_OFFSET; /* reset p */
40605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
40615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if UUID doesn't fit remaing space, shorten local name */
40635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( local_name_len > (free_eir_length - 4 - num_uuid*LEN_UUID_16))
40645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
40655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_WARNING0("BTA EIR: local name is shortened");
40665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            local_name_len = p_bta_dm_eir_cfg->bta_dm_eir_min_name_len;
40675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            data_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE;
40685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
40695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
40705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            data_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE;
40715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM(p, local_name_len + 1);
40745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM(p, data_type);
40755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(p, local_name, local_name_len);
40765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p += local_name_len;
40775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    free_eir_length -= local_name_len + 2;
40785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_EIR_CANNED_UUID_LIST == TRUE)
40805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if UUID list is provided as static data in configuration */
40815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(( p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len > 0 )
40825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        &&(p_bta_dm_eir_cfg->bta_dm_eir_uuid16))
40835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( free_eir_length > LEN_UUID_16 + 2)
40855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
40865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            free_eir_length -= 2;
40875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len)
40895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
40905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len / LEN_UUID_16;
40915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                data_type = BTM_EIR_COMPLETE_16BITS_UUID_TYPE;
40925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
40935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else /* not enough room for all UUIDs */
40945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
40955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                APPL_TRACE_WARNING0("BTA EIR: UUID 16-bit list is truncated");
40965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                num_uuid = free_eir_length / LEN_UUID_16;
40975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                data_type = BTM_EIR_MORE_16BITS_UUID_TYPE;
40985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
40995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_STREAM(p, num_uuid * LEN_UUID_16 + 1);
41005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_STREAM(p, data_type);
41015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_uuid16, num_uuid * LEN_UUID_16 );
41025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p += num_uuid * LEN_UUID_16;
41035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            free_eir_length -= num_uuid * LEN_UUID_16;
41045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
41055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
41065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else /* (BTA_EIR_CANNED_UUID_LIST == TRUE) */
41075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if UUID list is dynamic */
41085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( free_eir_length >= 2)
41095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
41105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_length = p++;
41115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_type   = p++;
41125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        num_uuid = 0;
41135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        max_num_uuid = (free_eir_length - 2)/LEN_UUID_16;
41155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        data_type = BTM_GetEirSupportedServices( bta_dm_cb.eir_uuid, &p, max_num_uuid, &num_uuid );
41165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( data_type == BTM_EIR_MORE_16BITS_UUID_TYPE )
41185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
41195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_WARNING0("BTA EIR: UUID 16-bit list is truncated");
41205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
41215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
41225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
41235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
41245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++)
41255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
41265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_16)
41275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
41285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if ( num_uuid < max_num_uuid )
41295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
41305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        UINT16_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid16);
41315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        num_uuid++;
41325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
41335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    else
41345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
41355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        data_type = BTM_EIR_MORE_16BITS_UUID_TYPE;
41365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        APPL_TRACE_WARNING0("BTA EIR: UUID 16-bit list is truncated");
41375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        break;
41385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
41395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
41405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
41415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
41425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) */
41435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_16 + 1);
41455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM(p_type, data_type);
41465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        free_eir_length -= num_uuid * LEN_UUID_16 + 2;
41475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
41485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* (BTA_EIR_CANNED_UUID_LIST == TRUE) */
41495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if ( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
41515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Adding 32-bit UUID list */
41525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( free_eir_length >= 2)
41535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
41545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_length = p++;
41555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_type   = p++;
41565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        num_uuid = 0;
41575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        data_type = BTM_EIR_COMPLETE_32BITS_UUID_TYPE;
41585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        max_num_uuid = (free_eir_length - 2)/LEN_UUID_32;
41605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++)
41625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
41635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_32)
41645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
41655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ( num_uuid < max_num_uuid )
41665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
41675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    UINT32_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid32);
41685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    num_uuid++;
41695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
41705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
41715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
41725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    data_type = BTM_EIR_MORE_32BITS_UUID_TYPE;
41735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    APPL_TRACE_WARNING0("BTA EIR: UUID 32-bit list is truncated");
41745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
41755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
41765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
41775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
41785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_32 + 1);
41805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM(p_type, data_type);
41815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        free_eir_length -= num_uuid * LEN_UUID_32 + 2;
41825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
41835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Adding 128-bit UUID list */
41855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( free_eir_length >= 2)
41865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
41875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_length = p++;
41885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_type   = p++;
41895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        num_uuid = 0;
41905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        data_type = BTM_EIR_COMPLETE_128BITS_UUID_TYPE;
41915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        max_num_uuid = (free_eir_length - 2)/LEN_UUID_128;
41935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++)
41955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
41965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_128)
41975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
41985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ( num_uuid < max_num_uuid )
41995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
42005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    ARRAY16_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid128);
42015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    num_uuid++;
42025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
42035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
42045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
42055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    data_type = BTM_EIR_MORE_128BITS_UUID_TYPE;
42065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    APPL_TRACE_WARNING0("BTA EIR: UUID 128-bit list is truncated");
42075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
42085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
42095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
42105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
42115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_128 + 1);
42135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM(p_type, data_type);
42145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        free_eir_length -= num_uuid * LEN_UUID_128 + 2;
42155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
42165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* ( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) */
42175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if Flags are provided in configuration */
42195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(( p_bta_dm_eir_cfg->bta_dm_eir_flag_len > 0 )
42205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     &&( p_bta_dm_eir_cfg->bta_dm_eir_flags )
42215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     &&( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 2 ))
42225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
42235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 1);
42245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM(p, BTM_EIR_FLAGS_TYPE);
42255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_flags,
42265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               p_bta_dm_eir_cfg->bta_dm_eir_flag_len);
42275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += p_bta_dm_eir_cfg->bta_dm_eir_flag_len;
42285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 2;
42295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
42305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if Manufacturer Specific are provided in configuration */
42325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(( p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len > 0 )
42335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     &&( p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec )
42345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     &&( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2 ))
42355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
42365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_length = p;
42375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 1);
42395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM(p, BTM_EIR_MANUFACTURER_SPECIFIC_TYPE);
42405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec,
42415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len);
42425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len;
42435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2;
42445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
42465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
42475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
42485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_length = NULL;
42495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
42505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4251ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* if Inquiry Tx Resp Power compiled */
4252ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power) &&
4253ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        (free_eir_length >= 3))
4254ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
4255ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        UINT8_TO_STREAM(p, 2);      /* Length field */
4256ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        UINT8_TO_STREAM(p, BTM_EIR_TX_POWER_LEVEL_TYPE);
4257ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        UINT8_TO_STREAM(p, *(p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power));
4258ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        free_eir_length -= 3;
4259ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
4260ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
42615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( free_eir_length )
42625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM(p, 0); /* terminator of significant part */
42635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_WriteEIR( p_buf );
42655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
42675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
42685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if ( BTM_EIR_CLIENT_INCLUDED == TRUE )
42705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
42715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
42725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_eir_search_services
42735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
42745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function searches services in received EIR
42755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
42765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None
42775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
42785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
42795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_eir_search_services( tBTM_INQ_RESULTS  *p_result,
42805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        tBTA_SERVICE_MASK *p_services_to_search,
42815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        tBTA_SERVICE_MASK *p_services_found)
42825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
42835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_SERVICE_MASK       service_index = 0;
42845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_EIR_SEARCH_RESULT  result;
42855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG6("BTA searching services in EIR of BDA:0x%02X%02X%02X%02X%02X%02X",
42875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_result->remote_bd_addr[0],p_result->remote_bd_addr[1],
42885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_result->remote_bd_addr[2],p_result->remote_bd_addr[3],
42895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_result->remote_bd_addr[4],p_result->remote_bd_addr[5]);
42905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG1("    with services_to_search=0x%08X", *p_services_to_search);
42925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
42945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* always do GATT based service discovery by SDP instead of from EIR    */
42955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if GATT based service is also to be put in EIR, need to modify this  */
42965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (service_index < (BTA_MAX_SERVICE_ID - 1))
42975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
42985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while(service_index < BTA_MAX_SERVICE_ID)
42995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
43005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
43015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( *p_services_to_search
43025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           & (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)))
43035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
43045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            result = BTM_HasInquiryEirService( p_result,
43055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                               bta_service_id_to_uuid_lkup_tbl[service_index] );
43065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Searching for HSP v1.2 only device */
43085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((result != BTM_EIR_FOUND) &&
43095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (bta_service_id_to_uuid_lkup_tbl[service_index] == UUID_SERVCLASS_HEADSET))
43105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
43115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                result = BTM_HasInquiryEirService (p_result, UUID_SERVCLASS_HEADSET_HS);
43125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
43135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if( result == BTM_EIR_FOUND )
43155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
43165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* If Plug and Play service record, need to check to see if Broadcom stack */
43175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* However, EIR data doesn't have EXT_BRCM_VERSION so just skip it */
43185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if( bta_service_id_to_uuid_lkup_tbl[service_index]
43195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    != UUID_SERVCLASS_PNP_INFORMATION )
43205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
43215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    *p_services_found |=
43235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index));
43245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* remove the service from services to be searched  */
43255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    *p_services_to_search &=
43265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)));
43275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
43285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
43295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if( result == BTM_EIR_NOT_FOUND )
43305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
43315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* remove the service from services to be searched  */
43325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                *p_services_to_search &=
43335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)));
43345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
43355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
43365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        service_index++;
43385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
43395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_ERROR2("BTA EIR search result, services_to_search=0x%08X, services_found=0x%08X",
43415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        *p_services_to_search, *p_services_found);
43425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
43435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
43445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&(BTA_EIR_CANNED_UUID_LIST != TRUE)
43465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
43475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_eir_update_uuid
43495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function adds or removes service UUID in EIR database.
43515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None
43535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
43555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_eir_update_uuid(UINT16 uuid16, BOOLEAN adding)
43565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
43575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if this UUID is not advertised in EIR */
43585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( !BTM_HasEirService( p_bta_dm_eir_cfg->uuid_mask, uuid16 ))
43595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
43605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( adding )
43625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
43635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_EVENT1("Adding UUID=0x%04X into EIR", uuid16);
43645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_AddEirService( bta_dm_cb.eir_uuid, uuid16 );
43665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
43675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
43685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
43695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_EVENT1("Removing UUID=0x%04X from EIR", uuid16);
43705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_RemoveEirService( bta_dm_cb.eir_uuid, uuid16 );
43725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
43735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_set_eir (NULL);
43755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_EVENT2("bta_dm_eir_update_uuid UUID bit mask=0x%08X %08X",
43775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       bta_dm_cb.eir_uuid[1], bta_dm_cb.eir_uuid[0] );
43785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
43795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
43805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
43825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_enable_test_mode
43845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      enable test mode
43865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
43895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
43915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_enable_test_mode(tBTA_DM_MSG *p_data)
43925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
43935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_EnableTestMode();
43945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
43955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
43975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_disable_test_mode
43995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      disable test mode
44015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
44045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
44065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_disable_test_mode(tBTA_DM_MSG *p_data)
44075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
44085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_DeviceReset(NULL);
44095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
44105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
44125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_execute_callback
44145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Just execute a generic call back in the context of the BTU/BTA tack
44165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
44195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
44215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_execute_callback(tBTA_DM_MSG *p_data)
44225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
44235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
44245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_data->exec_cback.p_exec_cback == NULL)
44255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
44265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
44275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
44285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_data->exec_cback.p_exec_cback(p_data->exec_cback.p_param);
44305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
44315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
44325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_encrypt_cback
44345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      link encryption complete callback.
44365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         None
44385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
44405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_encrypt_cback(BD_ADDR bd_addr, void *p_ref_data, tBTM_STATUS result)
44415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
44425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_STATUS   bta_status = BTA_SUCCESS;
44435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_ENCRYPT_CBACK *p_callback = bta_dm_cb.p_encrypt_cback;
44445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_cb.p_encrypt_cback = NULL;
44465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (result)
44475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
44485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_SUCCESS:
44495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
44505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_WRONG_MODE:
44515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_status = BTA_WRONG_MODE;
44525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
44535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_NO_RESOURCES:
44545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_status = BTA_NO_RESOURCES;
44555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
44565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_BUSY:
44575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_status = BTA_BUSY;
44585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
44595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
44605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_status = BTA_FAILURE;
44615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
44625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
44635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG2("bta_dm_encrypt_cback status =%d p_callback=0x%x", bta_status, p_callback);
44655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_callback)
44675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
44685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_callback)(bd_addr, bta_status);
44695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
44705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
44715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
44725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_set_encryption
44745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function to encrypt the link
44765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None
44785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
44795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
44805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_set_encryption (tBTA_DM_MSG *p_data)
44815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
44825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG0("bta_dm_set_encryption"); //todo
44845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_data->set_encryption.p_callback)
44855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
44865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR0("bta_dm_set_encryption callback is not provided");
44875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
44885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
44895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_dm_cb.p_encrypt_cback)
44915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
44925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_data->set_encryption.p_callback)(p_data->set_encryption.bd_addr, BTA_BUSY);
44935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
44945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
44955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_cb.p_encrypt_cback = p_data->set_encryption.p_callback;
44985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_cb.sec_act         = p_data->set_encryption.sec_act;
44995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SetEncryption(p_data->set_encryption.bd_addr, bta_dm_encrypt_cback, &bta_dm_cb.sec_act);
45005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
45015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
45035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
45045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_set_afh_channels
45055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
45065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      set afh channels
45075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
45085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
45095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
45105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
45115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
45125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_set_afh_channels(tBTA_DM_MSG * p_data)
45135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
45145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SetAfhChannels(p_data->set_afhchannels.first,p_data->set_afhchannels.last);
45165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
45175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
45195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
45205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_set_afh_channel_assesment
45215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
45225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      set afh channel assesment
45235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
45245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
45255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
45265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
45275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
45285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_set_afh_channel_assesment (tBTA_DM_MSG * p_data)
45305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
45315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SetAfhChannelAssessment(p_data->set_afh_channel_assessment.enable_or_disable);
45325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
45335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE)
4535ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
4536ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
4537ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         bta_dm_observe_results_cb
4538ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
4539ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      Callback for BLE Observe result
4540ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
4541ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
4542ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void
4543ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
4544ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
4545ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void bta_dm_observe_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir)
4546ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
4547ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta;
4548ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTA_DM_SEARCH     result;
4549ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_INQ_INFO      *p_inq_info;
4550ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT16             service_class;
4551ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    APPL_TRACE_DEBUG0("bta_dm_observe_results_cb")
4552ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
4553ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    bdcpy(result.inq_res.bd_addr, p_inq->remote_bd_addr);
4554ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    result.inq_res.rssi = p_inq->rssi;
4555ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    result.inq_res.ble_addr_type    = p_inq->ble_addr_type;
4556ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    result.inq_res.inq_result_type  = p_inq->inq_result_type;
4557ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    result.inq_res.device_type      = p_inq->device_type;
4558ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
4559ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* application will parse EIR to find out remote device name */
4560ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    result.inq_res.p_eir = p_eir;
4561ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
4562ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if((p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr)) != NULL)
4563ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
4564ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* initialize remt_name_not_required to FALSE so that we get the name by default */
4565ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        result.inq_res.remt_name_not_required = FALSE;
4566ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
4567ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
4568ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if(bta_dm_search_cb.p_scan_cback)
4569ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_RES_EVT, &result);
4570ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
4571ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if(p_inq_info)
4572ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
4573ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* application indicates if it knows the remote name, inside the callback
4574ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         copy that to the inquiry data base*/
4575ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if(result.inq_res.remt_name_not_required)
4576ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_inq_info->appl_knows_rem_name = TRUE;
4577ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
4578ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
4579ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
4580ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
4581ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
4582ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         bta_dm_observe_cmpl_cb
4583ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
4584ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      Callback for BLE Observe complete
4585ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
4586ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
4587ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void
4588ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
4589ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
4590ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void bta_dm_observe_cmpl_cb (void * p_result)
4591ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
4592ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTA_DM_SEARCH  data;
4593ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
4594ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    APPL_TRACE_DEBUG0("bta_dm_observe_cmpl_cb");
4595ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
4596ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    data.inq_cmpl.num_resps = ((tBTM_INQUIRY_CMPL *)p_result)->num_resp;
4597ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (bta_dm_search_cb.p_scan_cback)
4598ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
4599ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_CMPL_EVT, &data);
4600ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
4601ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
4602ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
46035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_INCLUDED == TRUE)
46045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
46055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_ble_smp_cback
46075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Callback for BLE SMP
46095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
46125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
46145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_DATA *p_data)
46155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
46165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS status = BTM_SUCCESS;
46175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEC sec_event;
4618ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8 i;
4619ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
4620ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    APPL_TRACE_DEBUG0("bta_dm_ble_smp_cback");
46215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!bta_dm_cb.p_sec_cback)
46235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_NOT_AUTHORIZED;
46245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
46265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
46275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
46285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_LE_IO_REQ_EVT:
46295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
46305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_co_ble_io_req(bda,
46325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 &p_data->io_req.io_cap,
46335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 &p_data->io_req.oob_data,
46345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 &p_data->io_req.auth_req,
46355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 &p_data->io_req.max_key_size,
46365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 &p_data->io_req.init_keys,
46375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 &p_data->io_req.resp_keys);
46385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
46395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == FALSE
46405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTM_SUCCESS;
46415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
46425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_EVENT2("io mitm: %d oob_data:%d", p_data->io_req.auth_req, p_data->io_req.oob_data);
46435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
46455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_LE_SEC_REQUEST_EVT:
46475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdcpy(sec_event.ble_req.bd_addr, bda);
4648ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            BCM_STRNCPY_S((char*)sec_event.ble_req.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN));
4649ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            sec_event.ble_req.bd_name[BD_NAME_LEN] = 0;
46505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.p_sec_cback(BTA_DM_BLE_SEC_REQ_EVT, &sec_event);
46515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
46525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_LE_KEY_NOTIF_EVT:
46545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdcpy(sec_event.key_notif.bd_addr, bda);
4655ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN));
4656ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            sec_event.ble_req.bd_name[BD_NAME_LEN] = 0;
46575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sec_event.key_notif.passkey = p_data->key_notif;
46585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_NOTIF_EVT, &sec_event);
46595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
46605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_LE_KEY_REQ_EVT:
46625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdcpy(sec_event.ble_req.bd_addr, bda);
46635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_REQ_EVT, &sec_event);
46645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
46655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_LE_OOB_REQ_EVT:
46675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdcpy(sec_event.ble_req.bd_addr, bda);
46685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.p_sec_cback(BTA_DM_BLE_OOB_REQ_EVT, &sec_event);
46695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
46705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_LE_KEY_EVT:
46725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdcpy(sec_event.ble_key.bd_addr, bda);
46735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sec_event.ble_key.key_type = p_data->key.key_type;
4674ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
4675ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (p_data->key.key_type == BTM_LE_KEY_PID)
4676ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
4677ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                for (i=0; i<BT_OCTET16_LEN; i++ )
4678ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                {
4679ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    sec_event.ble_key.key_value.pid_key.irk[i] = p_data->key.p_key_value->pid_key.irk[i];
4680ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                }
4681ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                sec_event.ble_key.key_value.pid_key.addr_type = p_data->key.p_key_value->pid_key.addr_type;
4682ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                memcpy( &(sec_event.ble_key.key_value.pid_key.static_addr),
4683ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                        &(p_data->key.p_key_value->pid_key.static_addr),
4684ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                        sizeof (BD_ADDR));
4685ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
4686ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            else
4687ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
4688ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                memcpy(&sec_event.ble_key.key_value, p_data->key.p_key_value, sizeof(tBTM_LE_KEY_VALUE));
4689ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
4690ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            // memcpy(&sec_event.ble_key.key_value, p_data->key.p_key_value, sizeof(tBTM_LE_KEY_VALUE)); todo will crash
46915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_cb.p_sec_cback(BTA_DM_BLE_KEY_EVT, &sec_event);
46925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
46935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_LE_COMPLT_EVT:
46955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdcpy(sec_event.auth_cmpl.bd_addr, bda);
4696ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            BCM_STRNCPY_S((char*)sec_event.auth_cmpl.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN));
4697ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
46985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_data->complt.reason != 0)
4699ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
47005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sec_event.auth_cmpl.fail_reason = BTA_DM_AUTH_CONVERT_SMP_CODE(((UINT8)p_data->complt.reason));
4701ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                /* delete this device entry from Sec Dev DB */
4702ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                bta_dm_remove_sec_dev_entry (bda);
4703ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
47045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
4705ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
47065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sec_event.auth_cmpl.success = TRUE;
4707ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
4708ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            sec_event.auth_cmpl.privacy_enabled = p_data->complt.privacy_supported;
47095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (bta_dm_cb.p_sec_cback)
47105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
47115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                //bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
47125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_cb.p_sec_cback(BTA_DM_BLE_AUTH_CMPL_EVT, &sec_event);
47135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
47145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
47165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
47185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTM_NOT_AUTHORIZED;
47195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
47205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
47215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
47225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
47235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif  /* SMP_INCLUDED == TRUE */
47245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
47265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_ble_id_key_cback
47285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Callback for BLE local ID keys
47305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
47335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
47355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_ble_id_key_cback (UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key)
47365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
47375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   evt;
47385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEC dm_key;
47395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (key_type)
47415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
47425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_BLE_KEY_TYPE_ID:
47435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_BLE_KEY_TYPE_ER:
47445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (bta_dm_cb.p_sec_cback)
47455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
47465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy(&dm_key.ble_id_keys, p_key, sizeof(tBTM_BLE_LOCAL_KEYS));
47475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt = (key_type == BTM_BLE_KEY_TYPE_ID) ? BTA_DM_BLE_LOCAL_IR_EVT :\
47495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      BTA_DM_BLE_LOCAL_ER_EVT;
47505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_cb.p_sec_cback(evt, &dm_key);
47515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
47525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
47535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
47555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_DEBUG1("Unknown key type %d", key_type);
47565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
47575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
47585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
47595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
47615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
47635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_add_blekey
47655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function adds an BLE Key to an security database entry.
47675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  This function shall only be called AFTER BTA_DmAddBleDevice has been called.
47685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  It is normally called during host startup to restore all required information
47695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  stored in the NVRAM.
47705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:
47725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
47745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_add_blekey (tBTA_DM_MSG *p_data)
47755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
47765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!BTM_SecAddBleKey (p_data->add_ble_key.bd_addr,
47775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           (tBTM_LE_KEY_VALUE *)&p_data->add_ble_key.blekey,
47785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           p_data->add_ble_key.key_type))
47795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
47805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR2 ("BTA_DM: Error adding BLE Key for device %08x%04x",
47815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           (p_data->add_ble_key.bd_addr[0]<<24)+(p_data->add_ble_key.bd_addr[1]<<16)+\
47825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           (p_data->add_ble_key.bd_addr[2]<<8)+p_data->add_ble_key.bd_addr[3],
47835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           (p_data->add_ble_key.bd_addr[4]<<8)+p_data->add_ble_key.bd_addr[5]);
47845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
47855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
47865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
47885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_add_ble_device
47905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function adds an BLE device to an security database entry.
47925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  It is normally called during host startup to restore all required information
47935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  stored in the NVRAM.
47945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:
47965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
47985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_add_ble_device (tBTA_DM_MSG *p_data)
47995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
48005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!BTM_SecAddBleDevice (p_data->add_ble_device.bd_addr, NULL,
48015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              p_data->add_ble_device.dev_type  ,
48025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              p_data->add_ble_device.addr_type))
48035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
48045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR2 ("BTA_DM: Error adding BLE Device for device %08x%04x",
48055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           (p_data->add_ble_device.bd_addr[0]<<24)+(p_data->add_ble_device.bd_addr[1]<<16)+ \
48065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           (p_data->add_ble_device.bd_addr[2]<<8)+p_data->add_ble_device.bd_addr[3],
48075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           (p_data->add_ble_device.bd_addr[4]<<8)+p_data->add_ble_device.bd_addr[5]);
48085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
48095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
48105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
48125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_add_ble_device
48145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function adds an BLE device to an security database entry.
48165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  It is normally called during host startup to restore all required information
48175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  stored in the NVRAM.
48185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:
48205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
48225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_ble_passkey_reply (tBTA_DM_MSG *p_data)
48235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
48245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data->pin_reply.accept)
48255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
48265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_SUCCESS, p_data->ble_passkey_reply.passkey);
48285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
48295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
48305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
48315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_NOT_AUTHORIZED, p_data->ble_passkey_reply.passkey);
48325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
48335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
48355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
48375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_security_grant
48395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function grant SMP security request access.
48415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:
48435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
48455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_security_grant (tBTA_DM_MSG *p_data)
48465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
48475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SecurityGrant(p_data->ble_sec_grant.bd_addr, p_data->ble_sec_grant.res);
48485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
48495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
48515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_ble_set_bg_conn_type
48535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function set the BLE background connection type
48555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:
48575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
48595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_ble_set_bg_conn_type (tBTA_DM_MSG *p_data)
48605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
48615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_BleSetBgConnType(p_data->ble_set_bd_conn_type.bg_conn_type,
48625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                         p_data->ble_set_bd_conn_type.p_select_cback);
48635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
48645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
48665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_ble_set_conn_params
48685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function set the preferred connection parameters.
48705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:
48725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
48745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_ble_set_conn_params (tBTA_DM_MSG *p_data)
48755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
48765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_BleSetPrefConnParams(p_data->ble_set_conn_params.peer_bda,
48775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             p_data->ble_set_conn_params.conn_int_min,
48785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             p_data->ble_set_conn_params.conn_int_max,
48795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             p_data->ble_set_conn_params.slave_latency,
48805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             p_data->ble_set_conn_params.supervision_tout);
48815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
48825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
48845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_ble_set_scan_params
48865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function set the preferred connection scan parameters.
48885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:
48905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
48925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_ble_set_scan_params (tBTA_DM_MSG *p_data)
48935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
48945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_BleSetConnScanParams(p_data->ble_set_scan_params.scan_int,
48955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             p_data->ble_set_scan_params.scan_window);
48965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
48975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4898ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
4899ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
4900ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
4901ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         bta_dm_ble_observe
4902ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
4903ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function set the preferred connection scan parameters.
4904ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
4905ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters:
4906ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
4907ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
4908ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid bta_dm_ble_observe (tBTA_DM_MSG *p_data)
4909ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
4910ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
4911ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_STATUS status;
4912ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_data->ble_observe.start)
4913ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
4914ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /*Save the  callback to be called when a scan results are available */
4915ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        bta_dm_search_cb.p_scan_cback = p_data->ble_observe.p_cback;
4916ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if ((status = BTM_BleObserve(TRUE, p_data->ble_observe.duration,
4917ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                bta_dm_observe_results_cb, bta_dm_observe_cmpl_cb))!= BTM_SUCCESS)
4918ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
4919ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            tBTA_DM_SEARCH  data;
4920ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            APPL_TRACE_WARNING2(" %s BTM_BleObserve  failed. status %d",__FUNCTION__,status);
4921ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            data.inq_cmpl.num_resps = 0;
4922ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (bta_dm_search_cb.p_scan_cback)
4923ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
4924ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_CMPL_EVT, &data);
4925ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
4926ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
4927ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
4928ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    else
4929ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
4930ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        bta_dm_search_cb.p_scan_cback = NULL;
4931ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        BTM_BleObserve(FALSE, 0, NULL,NULL );
4932ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
4933ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
4934ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
49355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if ((defined BTA_GATT_INCLUDED) &&  (BTA_GATT_INCLUDED == TRUE))
49365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
49385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_dm_start_disc_gatt_services
49405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function starts a GATT service search request.
49425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:
49445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
49465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_dm_start_disc_gatt_services (UINT16 conn_id)
49475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
49485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBT_UUID    *p_uuid = bta_dm_search_cb.p_srvc_uuid +
49495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search;
49505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_uuid = bta_dm_search_cb.p_srvc_uuid +
49525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search;
49535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* always search for all services */
49555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_GATTC_ServiceSearchRequest(conn_id, p_uuid);
49565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
49575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
49595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_gatt_disc_result
49615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function process the GATT service search result.
49635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:
49655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
49675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_gatt_disc_result(tBTA_GATT_ID service_id)
49685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
49695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SEARCH   result;
49705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*
49725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        * This logic will not work for gatt case.  We are checking against the bluetooth profiles here
49735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        * just copy the GATTID in raw data field and send it across.
49745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        */
49755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( bta_dm_search_cb.ble_raw_used + sizeof(tBTA_GATT_ID) < bta_dm_search_cb.ble_raw_size )
49785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
49795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        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);
49805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4981ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach        if(bta_dm_search_cb.p_ble_rawdata)
4982ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach        {
4983ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach            memcpy((bta_dm_search_cb.p_ble_rawdata + bta_dm_search_cb.ble_raw_used), &service_id,
4984ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach                   sizeof(service_id) );
49855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4986ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach            bta_dm_search_cb.ble_raw_used += sizeof(service_id);
4987ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach        }
4988ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach        else
4989ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach        {
4990ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach            APPL_TRACE_ERROR0("p_ble_rawdata is NULL");
4991ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach        }
49925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
49945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
49955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
49965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        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 );
49975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
49985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_ERROR1("bta_dm_gatt_disc_result serivce_id len=%d ", service_id.uuid.len);
50005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE)
50015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
50025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* send result back to app now, one by one */
50045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy (result.disc_ble_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
50055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BCM_STRNCPY_S((char*)result.disc_ble_res.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN-1));
5006ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        result.disc_ble_res.bd_name[BD_NAME_LEN] = 0;
50075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(&result.disc_ble_res.service, &service_id.uuid, sizeof(tBT_UUID));
50085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.p_search_cback(BTA_DM_DISC_BLE_RES_EVT, &result);
50105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
50115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
50125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
50145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_gatt_disc_complete
50165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function process the GATT service search complete.
50185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:
50205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
50225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_gatt_disc_complete(UINT16 conn_id, tBTA_GATT_STATUS status)
50235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
50245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_MSG *p_msg;
50255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG1("bta_dm_gatt_disc_complete conn_id = %d",conn_id);
50275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_dm_search_cb.uuid_to_search > 0) bta_dm_search_cb.uuid_to_search --;
50295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == BTA_GATT_OK && bta_dm_search_cb.uuid_to_search > 0)
50315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
50325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_dm_start_disc_gatt_services(conn_id);
50335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
50345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
50355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
50365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.uuid_to_search = 0;
50375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* no more services to be discovered */
50395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
50405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
50415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
50425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->disc_result.result.disc_res.result = (status == BTA_GATT_OK) ? BTA_SUCCESS :BTA_FAILURE;
50435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
5044ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_msg->disc_result.result.disc_res.num_uuids = 0;
5045ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_msg->disc_result.result.disc_res.p_uuid_list = NULL;
50465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
50475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
50485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_get_remname(), (BD_NAME_LEN-1));
50495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* make sure the string is terminated */
50515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
50525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_msg->disc_result.result.disc_res.device_type = BT_DEVICE_TYPE_BLE;
50545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( bta_dm_search_cb.ble_raw_used > 0 )
50555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
50565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_msg->disc_result.result.disc_res.p_raw_data = GKI_getbuf(bta_dm_search_cb.ble_raw_used);
50575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy( p_msg->disc_result.result.disc_res.p_raw_data,
50595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            bta_dm_search_cb.p_ble_rawdata,
50605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            bta_dm_search_cb.ble_raw_used );
50615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_msg->disc_result.result.disc_res.raw_data_size = bta_dm_search_cb.ble_raw_used;
50635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
50645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
50655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
50665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_msg->disc_result.result.disc_res.p_raw_data = NULL;
50675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_search_cb.p_ble_rawdata = 0;
50685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
50695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_sendmsg(p_msg);
50715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
50725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (conn_id != BTA_GATT_INVALID_CONN_ID)
50735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
50745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTA_GATTC_Close(conn_id);
50755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
50765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID;
50775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_search_cb.gatt_disc_active = FALSE;
50785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
50795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
50805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
50825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_dm_start_gatt_discovery
50845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This is GATT initiate the service search by open a GATT connection
50865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  first.
50875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:
50895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
50915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_dm_start_gatt_discovery (BD_ADDR bd_addr)
50925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
50935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.gatt_disc_active = TRUE;
50945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_GATTC_Open(bta_dm_search_cb.client_if, bd_addr, TRUE);
50955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
50965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
50985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_cancel_gatt_discovery
51005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This is GATT cancel the GATT service search.
51025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:
51045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
51065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr)
51075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
51085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_dm_search_cb.conn_id == BTA_GATT_INVALID_CONN_ID)
51095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
51105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTA_GATTC_CancelOpen(bta_dm_search_cb.client_if, bd_addr, TRUE);
51115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
51125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_gatt_disc_complete(bta_dm_search_cb.conn_id, (tBTA_GATT_STATUS) BTA_GATT_ERROR);
51145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
51155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
51175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_proc_open_evt
51195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      process BTA_GATTC_OPEN_EVT in DM.
51215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:
51235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
51255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_proc_open_evt(tBTA_GATTC_OPEN *p_data)
51265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
51275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *p1;
51285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *p2;
51295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p1 = bta_dm_search_cb.peer_bdaddr;
51315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p2 = p_data->remote_bda;
51325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG5("DM Search state= %d search_cb.peer_dbaddr: [%08x%04x] connected_bda= [%08x%04x] ",
51345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      bta_dm_search_cb.state,
51355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      ((p1[0])<<24)+((p1[1])<<16)+((p1[2])<<8)+(p1[3]),
51365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      ((p1[4])<<8)+ p1[5],
51375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      ((p2[0])<<24)+((p2[1])<<16)+((p2[2])<<8)+(p2[3]),
51385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      ((p2[4])<<8)+ p2[5]);
51395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG3("BTA_GATTC_OPEN_EVT conn_id = %d client_if=%d status = %d" ,
51415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_data->conn_id,
51425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_data->client_if,
51435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_data->status);
51445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_dm_search_cb.conn_id = p_data->conn_id;
51465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data->status == BTA_GATT_OK)
51485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
51495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_dm_start_disc_gatt_services(p_data->conn_id);
51505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
51515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
51525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
51535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_gatt_disc_complete(BTA_GATT_INVALID_CONN_ID, p_data->status);
51545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
51555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
51565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
51585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_gattc_callback
51605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This is GATT client callback function used in DM.
51625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:
51645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
51665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data)
51675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
51685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG1("bta_dm_gattc_callback event = %d", event);
51695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
51715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
51725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_GATTC_REG_EVT:
51735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_DEBUG1("BTA_GATTC_REG_EVT client_if = %d",  p_data->reg_oper.client_if);
51745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_data->reg_oper.status == BTA_GATT_OK)
51755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_search_cb.client_if = p_data->reg_oper.client_if;
51765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
51775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_search_cb.client_if = BTA_GATTS_INVALID_IF;
51785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
51795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_GATTC_OPEN_EVT:
51815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_proc_open_evt(&p_data->open);
51825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
51835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_GATTC_SEARCH_RES_EVT:
51855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_gatt_disc_result(p_data->srvc_res.service_uuid.id);
51865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
51875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_GATTC_SEARCH_CMPL_EVT:
51895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE)
51905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_gatt_disc_complete(p_data->search_cmpl.conn_id, p_data->search_cmpl.status);
51915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
51925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_GATTC_CLOSE_EVT:
51945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_DEBUG1("BTA_GATTC_CLOSE_EVT reason = %d", p_data->close.reason);
51955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* in case of disconnect before search is completed */
51965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) &&
51975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 !memcmp(p_data->close.remote_bda, bta_dm_search_cb.peer_bdaddr, BD_ADDR_LEN))
51985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
51995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_gatt_disc_complete((UINT16)BTA_GATT_INVALID_CONN_ID,  (tBTA_GATT_STATUS) BTA_GATT_ERROR);
52005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
52015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
52025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
52045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
52055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
52065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
52075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_GATT_INCLUDED */
52095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif  /* BLE_INCLUDED */
5210