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