blob: 5230d8f664927d8f7efb8d75ea98d58bdd6cd5dd [file] [log] [blame]
The Android Open Source Project5738f832012-12-12 16:00:35 -08001/******************************************************************************
2 *
Satya Calloji1a9247a2014-06-05 13:15:15 -07003 * Copyright (C) 2003-2014 Broadcom Corporation
The Android Open Source Project5738f832012-12-12 16:00:35 -08004 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18
19/******************************************************************************
20 *
21 * This file contains the action functions for device manager state
22 * machine.
23 *
24 ******************************************************************************/
25
Mike J. Chen597c5772014-02-11 16:23:31 -080026#include "bt_target.h"
The Android Open Source Project5738f832012-12-12 16:00:35 -080027#include "bt_types.h"
28#include "gki.h"
The Android Open Source Project5738f832012-12-12 16:00:35 -080029#include "bta_sys.h"
30#include "bta_api.h"
31#include "bta_dm_int.h"
32#include "bta_dm_co.h"
33#include "btm_api.h"
34#include "btm_int.h"
35#include "btu.h"
36#include "sdp_api.h"
37#include "l2c_api.h"
The Android Open Source Project5738f832012-12-12 16:00:35 -080038#include "utl.h"
Kévin PETIT22c6e502014-02-12 17:24:01 +000039#include "gap_api.h" /* For GAP_BleReadPeerPrefConnParams */
The Android Open Source Project5738f832012-12-12 16:00:35 -080040#include <string.h>
41
Chris Mantonf8027002015-03-12 09:22:48 -070042#define LOG_TAG "bt_bta_dm"
43#include "osi/include/log.h"
44
Mike J. Chena02a48c2014-01-31 17:49:43 -080045#if (GAP_INCLUDED == TRUE)
46#include "gap_api.h"
47#endif
48
The Android Open Source Project5738f832012-12-12 16:00:35 -080049static void bta_dm_inq_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir);
50static void bta_dm_inq_cmpl_cb (void * p_result);
51static void bta_dm_service_search_remname_cback (BD_ADDR bd_addr, DEV_CLASS dc, BD_NAME bd_name);
52static void bta_dm_remname_cback (tBTM_REMOTE_DEV_NAME *p_remote_name);
53static void bta_dm_find_services ( BD_ADDR bd_addr);
54static void bta_dm_discover_next_device(void);
55static void bta_dm_sdp_callback (UINT16 sdp_status);
56static 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);
Casper Bonde818d0f22015-05-21 11:08:45 +020057static UINT8 bta_dm_pin_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, BOOLEAN min_16_digit);
The Android Open Source Project5738f832012-12-12 16:00:35 -080058static 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);
59static UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,BD_NAME bd_name, int result);
60static void bta_dm_local_name_cback(BD_ADDR bd_addr);
61static BOOLEAN bta_dm_check_av(UINT16 event);
The Android Open Source Project5738f832012-12-12 16:00:35 -080062static void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data);
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -070063
64
65#if BLE_INCLUDED == TRUE
66static void bta_dm_acl_change_cback(BD_ADDR p_bda, DEV_CLASS p_dc,
67 BD_NAME p_bdn, UINT8 *features,
68 BOOLEAN is_new, UINT16 handle,
69 tBT_TRANSPORT transport);
70#else
71static void bta_dm_acl_change_cback(BD_ADDR p_bda, DEV_CLASS p_dc,
72 BD_NAME p_bdn, UINT8 *features,
73 BOOLEAN is_new);
74#endif
75
76
The Android Open Source Project5738f832012-12-12 16:00:35 -080077static void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr);
78
79/* Extended Inquiry Response */
80static UINT8 bta_dm_sp_cback (tBTM_SP_EVT event, tBTM_SP_EVT_DATA *p_data);
81
The Android Open Source Project5738f832012-12-12 16:00:35 -080082static void bta_dm_set_eir (char *local_name);
The Android Open Source Project5738f832012-12-12 16:00:35 -080083
The Android Open Source Project5738f832012-12-12 16:00:35 -080084static void bta_dm_eir_search_services( tBTM_INQ_RESULTS *p_result,
85 tBTA_SERVICE_MASK *p_services_to_search,
86 tBTA_SERVICE_MASK *p_services_found);
The Android Open Source Project5738f832012-12-12 16:00:35 -080087
The Android Open Source Project5738f832012-12-12 16:00:35 -080088static void bta_dm_search_timer_cback (TIMER_LIST_ENT *p_tle);
The Android Open Source Project5738f832012-12-12 16:00:35 -080089static void bta_dm_disable_conn_down_timer_cback (TIMER_LIST_ENT *p_tle);
90static void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr);
91static void bta_dm_adjust_roles(BOOLEAN delay_role_switch);
92static char *bta_dm_get_remname(void);
93static void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result);
94
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -070095static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr,tBT_TRANSPORT transport);
The Android Open Source Project5738f832012-12-12 16:00:35 -080096static void bta_dm_discover_device(BD_ADDR remote_bd_addr);
97
98static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status );
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -080099static void bta_dm_disable_search_and_disc(void);
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700100
The Android Open Source Project5738f832012-12-12 16:00:35 -0800101#if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
102 #if ((defined SMP_INCLUDED) && (SMP_INCLUDED == TRUE))
103static UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_DATA *p_data);
104 #endif
105static void bta_dm_ble_id_key_cback (UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key);
106 #if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE))
Andre Eisenbache1202ca2013-05-15 04:55:08 -0700107static void bta_dm_gattc_register(void);
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700108static void btm_dm_start_gatt_discovery(BD_ADDR bd_addr);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800109static void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr);
110static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data);
Prerepa Viswanadham81b03192014-07-23 17:49:48 -0700111extern tBTA_DM_CONTRL_STATE bta_dm_pm_obtain_controller_state(void);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800112 #endif
Bernhard Rosenkränzer104e3f22014-11-12 21:53:08 +0100113
114#if BLE_VND_INCLUDED == TRUE
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -0700115static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result);
Bernhard Rosenkränzer104e3f22014-11-12 21:53:08 +0100116#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -0800117
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800118#ifndef BTA_DM_BLE_ADV_CHNL_MAP
119#define BTA_DM_BLE_ADV_CHNL_MAP (BTM_BLE_ADV_CHNL_37|BTM_BLE_ADV_CHNL_38|BTM_BLE_ADV_CHNL_39)
120#endif
121#endif
Matthew Xief751b012013-08-13 20:05:34 -0700122
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700123static void bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr);
124static void bta_dm_observe_results_cb(tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir);
125static void bta_dm_observe_cmpl_cb(void * p_result);
126static void bta_dm_delay_role_switch_cback(TIMER_LIST_ENT *p_tle);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800127extern void sdpu_uuid16_to_uuid128(UINT16 uuid16, UINT8* p_uuid128);
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700128static void bta_dm_disable_timer_cback(TIMER_LIST_ENT *p_tle);
129
The Android Open Source Project5738f832012-12-12 16:00:35 -0800130
131const UINT16 bta_service_id_to_uuid_lkup_tbl [BTA_MAX_SERVICE_ID] =
132{
133 UUID_SERVCLASS_PNP_INFORMATION, /* Reserved */
134 UUID_SERVCLASS_SERIAL_PORT, /* BTA_SPP_SERVICE_ID */
135 UUID_SERVCLASS_DIALUP_NETWORKING, /* BTA_DUN_SERVICE_ID */
136 UUID_SERVCLASS_AUDIO_SOURCE, /* BTA_A2DP_SOURCE_SERVICE_ID */
137 UUID_SERVCLASS_LAN_ACCESS_USING_PPP, /* BTA_LAP_SERVICE_ID */
138 UUID_SERVCLASS_HEADSET, /* BTA_HSP_HS_SERVICE_ID */
139 UUID_SERVCLASS_HF_HANDSFREE, /* BTA_HFP_HS_SERVICE_ID */
140 UUID_SERVCLASS_OBEX_OBJECT_PUSH, /* BTA_OPP_SERVICE_ID */
141 UUID_SERVCLASS_OBEX_FILE_TRANSFER, /* BTA_FTP_SERVICE_ID */
142 UUID_SERVCLASS_CORDLESS_TELEPHONY, /* BTA_CTP_SERVICE_ID */
143 UUID_SERVCLASS_INTERCOM, /* BTA_ICP_SERVICE_ID */
144 UUID_SERVCLASS_IRMC_SYNC, /* BTA_SYNC_SERVICE_ID */
145 UUID_SERVCLASS_DIRECT_PRINTING, /* BTA_BPP_SERVICE_ID */
146 UUID_SERVCLASS_IMAGING_RESPONDER, /* BTA_BIP_SERVICE_ID */
147 UUID_SERVCLASS_PANU, /* BTA_PANU_SERVICE_ID */
148 UUID_SERVCLASS_NAP, /* BTA_NAP_SERVICE_ID */
149 UUID_SERVCLASS_GN, /* BTA_GN_SERVICE_ID */
150 UUID_SERVCLASS_SAP, /* BTA_SAP_SERVICE_ID */
151 UUID_SERVCLASS_AUDIO_SINK, /* BTA_A2DP_SERVICE_ID */
152 UUID_SERVCLASS_AV_REMOTE_CONTROL, /* BTA_AVRCP_SERVICE_ID */
153 UUID_SERVCLASS_HUMAN_INTERFACE, /* BTA_HID_SERVICE_ID */
154 UUID_SERVCLASS_VIDEO_SINK, /* BTA_VDP_SERVICE_ID */
155 UUID_SERVCLASS_PBAP_PSE, /* BTA_PBAP_SERVICE_ID */
156 UUID_SERVCLASS_HEADSET_AUDIO_GATEWAY, /* BTA_HSP_SERVICE_ID */
157 UUID_SERVCLASS_AG_HANDSFREE, /* BTA_HFP_SERVICE_ID */
158 UUID_SERVCLASS_MESSAGE_ACCESS, /* BTA_MAP_SERVICE_ID */
159 UUID_SERVCLASS_MESSAGE_NOTIFICATION, /* BTA_MN_SERVICE_ID */
160 UUID_SERVCLASS_HDP_PROFILE, /* BTA_HDP_SERVICE_ID */
161 UUID_SERVCLASS_PBAP_PCE /* BTA_PCE_SERVICE_ID */
162#if BLE_INCLUDED && BTA_GATT_INCLUDED
163 ,UUID_PROTOCOL_ATT /* BTA_GATT_SERVICE_ID */
164#endif
165};
166
167/*
168 * NOTE : The number of element in bta_service_id_to_btm_srv_id_lkup_tbl should be matching with
169 * the value BTA_MAX_SERVICE_ID in bta_api.h
170 *
171 * i.e., If you add new Service ID for BTA, the correct security ID of the new service
172 * from Security service definitions (btm_api.h) should be added to this lookup table.
173 */
174const UINT32 bta_service_id_to_btm_srv_id_lkup_tbl [BTA_MAX_SERVICE_ID] =
175{
176 0, /* Reserved */
177 BTM_SEC_SERVICE_SERIAL_PORT, /* BTA_SPP_SERVICE_ID */
178 BTM_SEC_SERVICE_DUN, /* BTA_DUN_SERVICE_ID */
179 BTM_SEC_SERVICE_AVDTP, /* BTA_AUDIO_SOURCE_SERVICE_ID */
180 BTM_SEC_SERVICE_LAN_ACCESS, /* BTA_LAP_SERVICE_ID */
181 BTM_SEC_SERVICE_HEADSET_AG, /* BTA_HSP_SERVICE_ID */
182 BTM_SEC_SERVICE_AG_HANDSFREE, /* BTA_HFP_SERVICE_ID */
183 BTM_SEC_SERVICE_OBEX, /* BTA_OPP_SERVICE_ID */
184 BTM_SEC_SERVICE_OBEX_FTP, /* BTA_FTP_SERVICE_ID */
185 BTM_SEC_SERVICE_CORDLESS, /* BTA_CTP_SERVICE_ID */
186 BTM_SEC_SERVICE_INTERCOM, /* BTA_ICP_SERVICE_ID */
187 BTM_SEC_SERVICE_IRMC_SYNC, /* BTA_SYNC_SERVICE_ID */
188 BTM_SEC_SERVICE_BPP_JOB, /* BTA_BPP_SERVICE_ID */
189 BTM_SEC_SERVICE_BIP, /* BTA_BIP_SERVICE_ID */
190 BTM_SEC_SERVICE_BNEP_PANU, /* BTA_PANU_SERVICE_ID */
191 BTM_SEC_SERVICE_BNEP_NAP, /* BTA_NAP_SERVICE_ID */
192 BTM_SEC_SERVICE_BNEP_GN, /* BTA_GN_SERVICE_ID */
193 BTM_SEC_SERVICE_SAP, /* BTA_SAP_SERVICE_ID */
194 BTM_SEC_SERVICE_AVDTP, /* BTA_A2DP_SERVICE_ID */
195 BTM_SEC_SERVICE_AVCTP, /* BTA_AVRCP_SERVICE_ID */
Andre Eisenbach2e7fa682013-08-08 15:42:48 -0700196 BTM_SEC_SERVICE_HIDH_SEC_CTRL, /* BTA_HID_SERVICE_ID */
The Android Open Source Project5738f832012-12-12 16:00:35 -0800197 BTM_SEC_SERVICE_AVDTP, /* BTA_VDP_SERVICE_ID */
198 BTM_SEC_SERVICE_PBAP, /* BTA_PBAP_SERVICE_ID */
199 BTM_SEC_SERVICE_HEADSET, /* BTA_HSP_HS_SERVICE_ID */
200 BTM_SEC_SERVICE_HF_HANDSFREE, /* BTA_HFP_HS_SERVICE_ID */
201 BTM_SEC_SERVICE_MAP, /* BTA_MAP_SERVICE_ID */
202 BTM_SEC_SERVICE_MAP, /* BTA_MN_SERVICE_ID */
203 BTM_SEC_SERVICE_HDP_SNK, /* BTA_HDP_SERVICE_ID */
204 BTM_SEC_SERVICE_PBAP /* BTA_PCE_SERVICE_ID */
205#if BLE_INCLUDED && BTA_GATT_INCLUDED
206 ,BTM_SEC_SERVICE_ATT /* BTA_GATT_SERVICE_ID */
207#endif
Andre Eisenbach6975b4d2013-08-05 16:55:38 -0700208
The Android Open Source Project5738f832012-12-12 16:00:35 -0800209};
210
211/* bta security callback */
212const tBTM_APPL_INFO bta_security =
213{
214 &bta_dm_authorize_cback,
215 &bta_dm_pin_cback,
216 &bta_dm_new_link_key_cback,
The Android Open Source Project5738f832012-12-12 16:00:35 -0800217 &bta_dm_authentication_complete_cback,
The Android Open Source Project5738f832012-12-12 16:00:35 -0800218 &bta_dm_bond_cancel_complete_cback,
219#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
220 &bta_dm_sp_cback
221#else
222 NULL
223#endif
224#if BLE_INCLUDED == TRUE
225#if SMP_INCLUDED == TRUE
226 ,&bta_dm_ble_smp_cback
227#endif
228 ,&bta_dm_ble_id_key_cback
229#endif
230
231};
232
The Android Open Source Project5738f832012-12-12 16:00:35 -0800233#define MAX_DISC_RAW_DATA_BUF (4096)
234UINT8 g_disc_raw_data_buf[MAX_DISC_RAW_DATA_BUF];
235
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700236extern DEV_CLASS local_device_default_class;
237
The Android Open Source Project5738f832012-12-12 16:00:35 -0800238/*******************************************************************************
239**
The Android Open Source Project5738f832012-12-12 16:00:35 -0800240** Function bta_dm_enable
241**
242** Description Initialises the BT device manager
243**
244**
245** Returns void
246**
247*******************************************************************************/
248void bta_dm_enable(tBTA_DM_MSG *p_data)
249{
250 tBTA_SYS_HW_MSG *sys_enable_event;
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700251 tBTA_DM_ENABLE enable_event;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800252
The Android Open Source Project5738f832012-12-12 16:00:35 -0800253 /* if already in use, return an error */
254 if( bta_dm_cb.is_bta_dm_active == TRUE )
255 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700256 APPL_TRACE_WARNING("%s Device already started by another application", __func__);
257 memset(&enable_event, 0, sizeof(tBTA_DM_ENABLE));
258 enable_event.status = BTA_FAILURE;
259 if (p_data->enable.p_sec_cback != NULL)
260 p_data->enable.p_sec_cback(BTA_DM_ENABLE_EVT, (tBTA_DM_SEC *)&enable_event);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800261 return;
262 }
263
The Android Open Source Project5738f832012-12-12 16:00:35 -0800264 /* first, register our callback to SYS HW manager */
265 bta_sys_hw_register( BTA_SYS_HW_BLUETOOTH, bta_dm_sys_hw_cback );
266
267 /* make sure security callback is saved - if no callback, do not erase the previous one,
268 it could be an error recovery mechanism */
269 if( p_data->enable.p_sec_cback != NULL )
270 bta_dm_cb.p_sec_cback = p_data->enable.p_sec_cback;
271 /* notify BTA DM is now active */
272 bta_dm_cb.is_bta_dm_active = TRUE;
273
274 /* send a message to BTA SYS */
275 if ((sys_enable_event = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL)
276 {
277 sys_enable_event->hdr.event = BTA_SYS_API_ENABLE_EVT;
278 sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH;
279
280 bta_sys_sendmsg(sys_enable_event);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800281 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800282}
283
The Android Open Source Project5738f832012-12-12 16:00:35 -0800284/*******************************************************************************
285**
286** Function bta_dm_sys_hw_cback
287**
288** Description callback register to SYS to get HW status updates
289**
290**
291** Returns void
292**
293*******************************************************************************/
294static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status )
295{
296 DEV_CLASS dev_class;
297 tBTA_DM_SEC_CBACK *temp_cback;
298#if BLE_INCLUDED == TRUE
299 UINT8 key_mask = 0;
300 BT_OCTET16 er;
301 tBTA_BLE_LOCAL_ID_KEYS id_key;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800302#endif
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700303
304 APPL_TRACE_DEBUG("%s with event: %i", __func__, status);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800305
306 /* On H/W error evt, report to the registered DM application callback */
307 if (status == BTA_SYS_HW_ERROR_EVT) {
308 if( bta_dm_cb.p_sec_cback != NULL )
309 bta_dm_cb.p_sec_cback(BTA_DM_HW_ERROR_EVT, NULL);
310 return;
311 }
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700312
The Android Open Source Project5738f832012-12-12 16:00:35 -0800313 if( status == BTA_SYS_HW_OFF_EVT )
314 {
315 if( bta_dm_cb.p_sec_cback != NULL )
316 bta_dm_cb.p_sec_cback(BTA_DM_DISABLE_EVT, NULL);
317
318 /* reinitialize the control block */
319 memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));
320
321 /* unregister from SYS */
322 bta_sys_hw_unregister( BTA_SYS_HW_BLUETOOTH );
323 /* notify BTA DM is now unactive */
324 bta_dm_cb.is_bta_dm_active = FALSE;
325 }
326 else
327 if( status == BTA_SYS_HW_ON_EVT )
328 {
329 /* FIXME: We should not unregister as the SYS shall invoke this callback on a H/W error.
330 * We need to revisit when this platform has more than one BLuetooth H/W chip */
331 //bta_sys_hw_unregister( BTA_SYS_HW_BLUETOOTH);
332
333 /* save security callback */
334 temp_cback = bta_dm_cb.p_sec_cback;
335 /* make sure the control block is properly initialized */
336 memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));
337 /* and retrieve the callback */
338 bta_dm_cb.p_sec_cback=temp_cback;
339 bta_dm_cb.is_bta_dm_active = TRUE;
340
341 /* hw is ready, go on with BTA DM initialization */
342 memset(&bta_dm_search_cb, 0x00, sizeof(bta_dm_search_cb));
343 memset(&bta_dm_conn_srvcs, 0x00, sizeof(bta_dm_conn_srvcs));
344 memset(&bta_dm_di_cb, 0, sizeof(tBTA_DM_DI_CB));
345
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700346 memcpy(dev_class, p_bta_dm_cfg->dev_class, sizeof(dev_class));
The Android Open Source Project5738f832012-12-12 16:00:35 -0800347 BTM_SetDeviceClass (dev_class);
348
349#if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
350 /* load BLE local information: ID keys, ER if available */
351 bta_dm_co_ble_load_local_keys(&key_mask, er, &id_key);
352
353 if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ER)
354 {
355 BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ER, (tBTM_BLE_LOCAL_KEYS *)&er);
356 }
357 if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ID)
358 {
359 BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ID, (tBTM_BLE_LOCAL_KEYS *)&id_key);
360 }
Mike J. Chen597c5772014-02-11 16:23:31 -0800361#if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE))
Andre Eisenbach6975b4d2013-08-05 16:55:38 -0700362 bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800363#endif
Mike J. Chen597c5772014-02-11 16:23:31 -0800364#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -0800365
366 BTM_SecRegister((tBTM_APPL_INFO*)&bta_security);
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700367 BTM_SetDefaultLinkSuperTout(p_bta_dm_cfg->link_timeout);
368 BTM_WritePageTimeout(p_bta_dm_cfg->page_timeout);
369 bta_dm_cb.cur_policy = p_bta_dm_cfg->policy_settings;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800370 BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800371 BTM_RegBusyLevelNotif (bta_dm_bl_change_cback, NULL, BTM_BL_UPDATE_MASK|BTM_BL_ROLE_CHG_MASK);
Satya Calloji3f24f462014-09-16 22:44:43 -0700372
373#if BLE_VND_INCLUDED == TRUE
374 BTM_BleReadControllerFeatures (bta_dm_ctrl_features_rd_cmpl_cback);
375#endif
376
The Android Open Source Project5738f832012-12-12 16:00:35 -0800377 /* Earlier, we used to invoke BTM_ReadLocalAddr which was just copying the bd_addr
378 from the control block and invoking the callback which was sending the DM_ENABLE_EVT.
379 But then we have a few HCI commands being invoked above which were still in progress
380 when the ENABLE_EVT was sent. So modified this to fetch the local name which forces
381 the DM_ENABLE_EVT to be sent only after all the init steps are complete */
382 BTM_ReadLocalDeviceNameFromController((tBTM_CMPL_CB *)bta_dm_local_name_cback);
383
384 bta_sys_rm_register((tBTA_SYS_CONN_CBACK*)bta_dm_rm_cback);
385
386 /* initialize bluetooth low power manager */
387 bta_dm_init_pm();
388
389 bta_sys_policy_register((tBTA_SYS_CONN_CBACK*)bta_dm_policy_cback);
390
Andre Eisenbache1202ca2013-05-15 04:55:08 -0700391#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
Andre Eisenbache1202ca2013-05-15 04:55:08 -0700392 bta_dm_gattc_register();
393#endif
394
The Android Open Source Project5738f832012-12-12 16:00:35 -0800395 }
396 else
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700397 APPL_TRACE_DEBUG(" --- ignored event");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800398
399}
400
401
402/*******************************************************************************
403**
404** Function bta_dm_disable
405**
406** Description Disables the BT device manager
407**
408**
409** Returns void
410**
411*******************************************************************************/
412void bta_dm_disable (tBTA_DM_MSG *p_data)
413{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -0800414 UNUSED(p_data);
415
The Android Open Source Project5738f832012-12-12 16:00:35 -0800416 /* Set l2cap idle timeout to 0 (so BTE immediately disconnects ACL link after last channel is closed) */
Satya Calloji444a8da2015-03-06 10:38:22 -0800417 L2CA_SetIdleTimeoutByBdAddr((UINT8 *)BT_BD_ANY, 0, BT_TRANSPORT_BR_EDR);
418 L2CA_SetIdleTimeoutByBdAddr((UINT8 *)BT_BD_ANY, 0, BT_TRANSPORT_LE);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800419
420 /* disable all active subsystems */
421 bta_sys_disable(BTA_SYS_HW_BLUETOOTH);
422
423 BTM_SetDiscoverability(BTM_NON_DISCOVERABLE, 0, 0);
424 BTM_SetConnectability(BTM_NON_CONNECTABLE, 0, 0);
425
426 bta_dm_disable_pm();
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800427 bta_dm_disable_search_and_disc();
The Android Open Source Project5738f832012-12-12 16:00:35 -0800428 bta_dm_cb.disabling = TRUE;
429
Nitin Arora021e17a2014-01-29 19:18:39 -0800430#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
431 BTM_BleClearBgConnDev();
432#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -0800433
434 if(BTM_GetNumAclLinks()==0)
435 {
436#if (defined(BTA_DISABLE_DELAY) && BTA_DISABLE_DELAY > 0)
437 /* If BTA_DISABLE_DELAY is defined and greater than zero, then delay the shutdown by
438 * BTA_DISABLE_DELAY milliseconds
439 */
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700440 APPL_TRACE_WARNING("%s BTA_DISABLE_DELAY set to %d ms",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800441 __FUNCTION__, BTA_DISABLE_DELAY);
442 bta_sys_stop_timer(&bta_dm_cb.disable_timer);
443 bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_conn_down_timer_cback;
444 bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, BTA_DISABLE_DELAY);
445#else
446 bta_dm_disable_conn_down_timer_cback(NULL);
447#endif
448 }
449 else
450 {
451 bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_timer_cback;
lungtsai_lind6fc0512014-08-25 13:19:56 +0800452 bta_dm_cb.disable_timer.param = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800453 bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 5000);
454 }
455
456}
457
458/*******************************************************************************
459**
460** Function bta_dm_disable_timer_cback
461**
462** Description Called if the disable timer expires
463** Used to close ACL connections which are still active
464**
465**
466**
467** Returns void
468**
469*******************************************************************************/
470static void bta_dm_disable_timer_cback (TIMER_LIST_ENT *p_tle)
471{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -0800472 UNUSED(p_tle);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800473 UINT8 i;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700474 tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
lungtsai_lind6fc0512014-08-25 13:19:56 +0800475 BOOLEAN trigger_disc = FALSE;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700476
The Android Open Source Project5738f832012-12-12 16:00:35 -0800477
lungtsai_lind6fc0512014-08-25 13:19:56 +0800478 APPL_TRACE_EVENT(" bta_dm_disable_timer_cback trial %d ", p_tle->param);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800479
lungtsai_lind6fc0512014-08-25 13:19:56 +0800480 if(BTM_GetNumAclLinks() && p_tle->param == 0)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800481 {
482 for(i=0; i<bta_dm_cb.device_list.count; i++)
483 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700484#if (BLE_INCLUDED == TRUE)
485 transport = bta_dm_cb.device_list.peer_device[i].transport;
486#endif
487 btm_remove_acl(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, transport);
lungtsai_lind6fc0512014-08-25 13:19:56 +0800488 trigger_disc = TRUE;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800489 }
490
lungtsai_lind6fc0512014-08-25 13:19:56 +0800491 /* Retrigger disable timer in case ACL disconnect failed, DISABLE_EVT still need
492 to be sent out to avoid jave layer disable timeout */
493 if (trigger_disc)
494 {
495 bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_timer_cback;
496 bta_dm_cb.disable_timer.param = 1;
497 bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 1500);
498 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800499 }
500 else
501 {
502 bta_dm_cb.disabling = FALSE;
503
504 bta_sys_remove_uuid(UUID_SERVCLASS_PNP_INFORMATION);
505 bta_dm_cb.p_sec_cback(BTA_DM_DISABLE_EVT, NULL);
506 }
507}
508
509
510
511
512/*******************************************************************************
513**
514** Function bta_dm_set_dev_name
515**
516** Description Sets local device name
517**
518**
519** Returns void
520**
521*******************************************************************************/
522void bta_dm_set_dev_name (tBTA_DM_MSG *p_data)
523{
524
525 BTM_SetLocalDeviceName((char*)p_data->set_name.name);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800526 bta_dm_set_eir ((char*)p_data->set_name.name);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800527}
528
529/*******************************************************************************
530**
531** Function bta_dm_set_visibility
532**
533** Description Sets discoverability, connectability and pairability
534**
535**
536** Returns void
537**
538*******************************************************************************/
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700539void bta_dm_set_visibility(tBTA_DM_MSG *p_data)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800540{
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700541 UINT16 window, interval;
542 UINT16 le_disc_mode = BTM_BleReadDiscoverability();
543 UINT16 disc_mode = BTM_ReadDiscoverability(&window, &interval);
544 UINT16 le_conn_mode = BTM_BleReadConnectability();
545 UINT16 conn_mode = BTM_ReadConnectability(&window, &interval);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800546
547 /* set modes for Discoverability and connectability if not ignore */
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700548 if (p_data->set_visibility.disc_mode != (BTA_DM_IGNORE | BTA_DM_LE_IGNORE))
549 {
550 if ((p_data->set_visibility.disc_mode & BTA_DM_LE_IGNORE) == BTA_DM_LE_IGNORE)
551 p_data->set_visibility.disc_mode =
552 ((p_data->set_visibility.disc_mode & ~BTA_DM_LE_IGNORE) | le_disc_mode);
553
554 if ((p_data->set_visibility.disc_mode & BTA_DM_IGNORE) == BTA_DM_IGNORE)
555 p_data->set_visibility.disc_mode =
556 ((p_data->set_visibility.disc_mode & ~BTA_DM_IGNORE) | disc_mode);
557
558 BTM_SetDiscoverability(p_data->set_visibility.disc_mode,
The Android Open Source Project5738f832012-12-12 16:00:35 -0800559 bta_dm_cb.inquiry_scan_window,
560 bta_dm_cb.inquiry_scan_interval);
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700561 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800562
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700563 if (p_data->set_visibility.conn_mode != (BTA_DM_IGNORE | BTA_DM_LE_IGNORE))
564 {
565 if ((p_data->set_visibility.conn_mode & BTA_DM_LE_IGNORE) == BTA_DM_LE_IGNORE)
566 p_data->set_visibility.conn_mode =
567 ((p_data->set_visibility.conn_mode & ~BTA_DM_LE_IGNORE) | le_conn_mode);
568
569 if ((p_data->set_visibility.conn_mode & BTA_DM_IGNORE) == BTA_DM_IGNORE)
570 p_data->set_visibility.conn_mode =
571 ((p_data->set_visibility.conn_mode & ~BTA_DM_IGNORE) | conn_mode);
572
573 BTM_SetConnectability(p_data->set_visibility.conn_mode,
The Android Open Source Project5738f832012-12-12 16:00:35 -0800574 bta_dm_cb.page_scan_window,
575 bta_dm_cb.page_scan_interval);
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700576 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800577
578 /* Send False or True if not ignore */
579 if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE )
580 {
581
582 if (p_data->set_visibility.pair_mode == BTA_DM_NON_PAIRABLE)
583 bta_dm_cb.disable_pair_mode = TRUE;
584 else
585 bta_dm_cb.disable_pair_mode = FALSE;
586
587 }
588
589 /* Send False or True if not ignore */
590 if (p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE)
591 {
592
593 if (p_data->set_visibility.conn_paired_only == BTA_DM_CONN_ALL)
594 bta_dm_cb.conn_paired_only = FALSE;
595 else
596 bta_dm_cb.conn_paired_only = TRUE;
597
598 }
599
600 /* Change mode if either mode is not ignore */
601 if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE || p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE)
602 BTM_SetPairableMode((BOOLEAN)(!(bta_dm_cb.disable_pair_mode)),bta_dm_cb.conn_paired_only);
603
604}
605
The Android Open Source Project5738f832012-12-12 16:00:35 -0800606/*******************************************************************************
607**
Satya Calloji6fc95262015-04-21 16:34:54 -0700608** Function bta_dm_process_remove_device
The Android Open Source Project5738f832012-12-12 16:00:35 -0800609**
610** Description Removes device, Disconnects ACL link if required.
611****
612*******************************************************************************/
Satya Calloji6fc95262015-04-21 16:34:54 -0700613void bta_dm_process_remove_device(BD_ADDR bd_addr)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800614{
Zhihai Xubd68d682013-11-15 17:55:46 -0800615#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
Satya Calloji6fc95262015-04-21 16:34:54 -0700616 /* need to remove all pending background connection before unpair */
617 BTA_GATTC_CancelOpen(0, bd_addr, FALSE);
Zhihai Xubd68d682013-11-15 17:55:46 -0800618#endif
619
Satya Calloji6fc95262015-04-21 16:34:54 -0700620 BTM_SecDeleteDevice(bd_addr);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800621
Satya Calloji6fc95262015-04-21 16:34:54 -0700622#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
623 /* remove all cached GATT information */
624 BTA_GATTC_Refresh(bd_addr);
625#endif
626
627 if (bta_dm_cb.p_sec_cback)
628 {
629 tBTA_DM_SEC sec_event;
630 bdcpy(sec_event.link_down.bd_addr, bd_addr);
631 /* No connection, set status to success (acl disc code not valid) */
632 sec_event.link_down.status = HCI_SUCCESS;
633 bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &sec_event);
634 }
635}
636
637/*******************************************************************************
638**
639** Function bta_dm_remove_device
640**
641** Description Removes device, disconnects ACL link if required.
642****
643*******************************************************************************/
644void bta_dm_remove_device(tBTA_DM_MSG *p_data)
645{
646 tBTA_DM_API_REMOVE_DEVICE *p_dev = &p_data->remove_dev;
647 if (p_dev == NULL)
648 return;
649
650 BD_ADDR other_address;
651 bdcpy(other_address, p_dev->bd_addr);
652
653 /* If ACL exists for the device in the remove_bond message*/
654 BOOLEAN continue_delete_dev = FALSE;
655 UINT8 other_transport = BT_TRANSPORT_INVALID;
656
657 if (BTM_IsAclConnectionUp(p_dev->bd_addr, BT_TRANSPORT_LE) ||
658 BTM_IsAclConnectionUp(p_dev->bd_addr, BT_TRANSPORT_BR_EDR))
659 {
660 APPL_TRACE_DEBUG("%s: ACL Up count %d", __func__, bta_dm_cb.device_list.count);
661 continue_delete_dev = FALSE;
662
663 /* Take the link down first, and mark the device for removal when disconnected */
664 for(int i=0; i < bta_dm_cb.device_list.count; i++)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800665 {
Satya Calloji6fc95262015-04-21 16:34:54 -0700666 if (!bdcmp(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_dev->bd_addr))
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700667 {
668 bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_UNPAIRING;
Satya Calloji6fc95262015-04-21 16:34:54 -0700669 btm_remove_acl( p_dev->bd_addr, bta_dm_cb.device_list.peer_device[i].transport);
670 APPL_TRACE_DEBUG("%s:transport = %d", __func__,
671 bta_dm_cb.device_list.peer_device[i].transport);
672
673 /* save the other transport to check if device is connected on other_transport */
674 if(bta_dm_cb.device_list.peer_device[i].transport == BT_TRANSPORT_LE)
675 other_transport = BT_TRANSPORT_BR_EDR;
676 else
677 other_transport = BT_TRANSPORT_LE;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700678 break;
679 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800680 }
681 }
Satya Calloji6fc95262015-04-21 16:34:54 -0700682 else
The Android Open Source Project5738f832012-12-12 16:00:35 -0800683 {
Satya Calloji6fc95262015-04-21 16:34:54 -0700684 continue_delete_dev = TRUE;
685 }
Zhihai Xubd68d682013-11-15 17:55:46 -0800686
Satya Calloji6fc95262015-04-21 16:34:54 -0700687 // If it is DUMO device and device is paired as different address, unpair that device
688 // if different address
689 BOOLEAN continue_delete_other_dev = FALSE;
690 if ((other_transport && (BTM_ReadConnectedTransportAddress(other_address, other_transport))) ||
691 (!other_transport && (BTM_ReadConnectedTransportAddress(other_address, BT_TRANSPORT_BR_EDR) ||
692 BTM_ReadConnectedTransportAddress(other_address, BT_TRANSPORT_LE))))
693 {
694 continue_delete_other_dev = FALSE;
695 /* Take the link down first, and mark the device for removal when disconnected */
696 for(int i=0; i < bta_dm_cb.device_list.count; i++)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800697 {
Satya Calloji6fc95262015-04-21 16:34:54 -0700698 if (!bdcmp(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, other_address))
699 {
700 bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_UNPAIRING;
701 btm_remove_acl(other_address,bta_dm_cb.device_list.peer_device[i].transport);
702 break;
703 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800704 }
705 }
Satya Calloji6fc95262015-04-21 16:34:54 -0700706 else
707 {
708 APPL_TRACE_DEBUG("%s: continue to delete the other dev ", __func__);
709 continue_delete_other_dev = TRUE;
710 }
711
712 /* Delete the device mentioned in the msg */
713 if (continue_delete_dev)
714 bta_dm_process_remove_device(p_dev->bd_addr);
715
716 /* Delete the other paired device too */
717 BD_ADDR dummy_bda = {0};
718 if (continue_delete_other_dev && (bdcmp(other_address, dummy_bda) != 0))
719 bta_dm_process_remove_device(other_address);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800720}
721
722/*******************************************************************************
723**
724** Function bta_dm_add_device
725**
726** Description This function adds a Link Key to an security database entry.
727** It is normally called during host startup to restore all required information
728** stored in the NVRAM.
729****
730*******************************************************************************/
731void bta_dm_add_device (tBTA_DM_MSG *p_data)
732{
733 tBTA_DM_API_ADD_DEVICE *p_dev = &p_data->add_dev;
734 UINT8 *p_dc = NULL;
735 UINT8 *p_lc = NULL;
736 UINT32 trusted_services_mask[BTM_SEC_SERVICE_ARRAY_SIZE];
737 UINT8 index = 0;
738 UINT8 btm_mask_index = 0;
739
740 memset (trusted_services_mask, 0, sizeof(trusted_services_mask));
741
742 /* If not all zeros, the device class has been specified */
743 if (p_dev->dc_known)
744 p_dc = (UINT8 *)p_dev->dc;
745
746 if (p_dev->link_key_known)
747 p_lc = (UINT8 *)p_dev->link_key;
748
749 if (p_dev->is_trusted)
750 {
751 /* covert BTA service mask to BTM mask */
752 while (p_dev->tm && (index < BTA_MAX_SERVICE_ID))
753 {
754 if (p_dev->tm & (UINT32)(1<<index))
755 {
756
757 btm_mask_index = bta_service_id_to_btm_srv_id_lkup_tbl[index] / BTM_SEC_ARRAY_BITS;
758 trusted_services_mask[btm_mask_index] |= (UINT32)(1 << (bta_service_id_to_btm_srv_id_lkup_tbl[index] - (UINT32)(btm_mask_index * 32)));
759
760 p_dev->tm &= (UINT32)(~(1<<index));
761
762 }
763 index++;
764 }
765 }
766
767 if (!BTM_SecAddDevice (p_dev->bd_addr, p_dc, p_dev->bd_name, p_dev->features,
Casper Bonde818d0f22015-05-21 11:08:45 +0200768 trusted_services_mask, p_lc, p_dev->key_type, p_dev->io_cap,
769 p_dev->pin_length))
The Android Open Source Project5738f832012-12-12 16:00:35 -0800770 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700771 APPL_TRACE_ERROR ("BTA_DM: Error adding device %08x%04x",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800772 (p_dev->bd_addr[0]<<24)+(p_dev->bd_addr[1]<<16)+(p_dev->bd_addr[2]<<8)+p_dev->bd_addr[3],
773 (p_dev->bd_addr[4]<<8)+p_dev->bd_addr[5]);
774 }
775}
776
777/*******************************************************************************
778**
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800779** Function bta_dm_close_acl
780**
781** Description This function forces to close the connection to a remote device
782** and optionaly remove the device from security database if
783** required.
784****
785*******************************************************************************/
786void bta_dm_close_acl(tBTA_DM_MSG *p_data)
787{
788 tBTA_DM_API_REMOVE_ACL *p_remove_acl = &p_data->remove_acl;
789 UINT8 index;
790
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700791 APPL_TRACE_DEBUG("bta_dm_close_acl");
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800792
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700793 if (BTM_IsAclConnectionUp(p_remove_acl->bd_addr, p_remove_acl->transport))
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800794 {
795 for (index = 0; index < bta_dm_cb.device_list.count; index ++)
796 {
797 if (!bdcmp( bta_dm_cb.device_list.peer_device[index].peer_bdaddr, p_remove_acl->bd_addr))
798 break;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700799 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800800 if (index != bta_dm_cb.device_list.count)
801 {
802 if (p_remove_acl->remove_dev)
803 bta_dm_cb.device_list.peer_device[index].remove_dev_pending = TRUE;
804 }
805 else
806 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700807 APPL_TRACE_ERROR("unknown device, remove ACL failed");
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800808 }
809 /* Disconnect the ACL link */
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700810 btm_remove_acl(p_remove_acl->bd_addr, p_remove_acl->transport);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800811 }
812 /* if to remove the device from security database ? do it now */
813 else if (p_remove_acl->remove_dev)
814 {
815 if (!BTM_SecDeleteDevice(p_remove_acl->bd_addr))
816 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700817 APPL_TRACE_ERROR("delete device from security database failed.");
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800818 }
819#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
820 /* need to remove all pending background connection if any */
821 BTA_GATTC_CancelOpen(0, p_remove_acl->bd_addr, FALSE);
822 /* remove all cached GATT information */
823 BTA_GATTC_Refresh(p_remove_acl->bd_addr);
824#endif
825 }
826 /* otherwise, no action needed */
827
828}
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700829
830/*******************************************************************************
831**
832** Function bta_dm_remove_all_acl
833**
834** Description This function forces to close all the ACL links specified by link type
835****
836*******************************************************************************/
837void bta_dm_remove_all_acl(tBTA_DM_MSG *p_data)
838{
839 const tBTA_DM_LINK_TYPE link_type = p_data->remove_all_acl.link_type;
840 tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
841
842 APPL_TRACE_DEBUG("%s link type = %d", __func__, link_type);
843
844 for (UINT8 i=0; i < bta_dm_cb.device_list.count; i++)
845 {
846 BD_ADDR addr = {0};
847 bdcpy(addr, bta_dm_cb.device_list.peer_device[i].peer_bdaddr);
848#if defined (BLE_INCLUDED) && (BLE_INCLUDED == TRUE)
849 transport = bta_dm_cb.device_list.peer_device[i].transport;
850#endif
851 if ((link_type == BTA_DM_LINK_TYPE_ALL) ||
852 ((link_type == BTA_DM_LINK_TYPE_LE) && (transport == BT_TRANSPORT_LE)) ||
853 ((link_type == BTA_DM_LINK_TYPE_BR_EDR) && (transport == BT_TRANSPORT_BR_EDR)))
854 {
855 /* Disconnect the ACL link */
856 btm_remove_acl(addr, transport);
857 }
858 }
859}
860
861
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800862/*******************************************************************************
863**
The Android Open Source Project5738f832012-12-12 16:00:35 -0800864** Function bta_dm_bond
865**
866** Description Bonds with peer device
867**
868**
869** Returns void
870**
871*******************************************************************************/
872void bta_dm_bond (tBTA_DM_MSG *p_data)
873{
874 tBTM_STATUS status;
875 tBTA_DM_SEC sec_event;
876 char *p_name;
877
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700878 if (p_data->bond.transport == BTA_TRANSPORT_UNKNOWN)
879 status = BTM_SecBond ( p_data->bond.bd_addr, 0, NULL, 0 );
880 else
881 status = BTM_SecBondByTransport ( p_data->bond.bd_addr, p_data->bond.transport, 0, NULL, 0 );
882
The Android Open Source Project5738f832012-12-12 16:00:35 -0800883
884 if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED))
885 {
886
The Android Open Source Project5738f832012-12-12 16:00:35 -0800887 memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
888 bdcpy(sec_event.auth_cmpl.bd_addr, p_data->bond.bd_addr);
Kim Schulz2a2701c2013-09-16 15:59:33 +0200889 p_name = BTM_SecReadDevName(p_data->bond.bd_addr);
890 if (p_name != NULL)
891 {
892 memcpy(sec_event.auth_cmpl.bd_name, p_name, (BD_NAME_LEN-1));
893 sec_event.auth_cmpl.bd_name[BD_NAME_LEN-1] = 0;
894 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800895
896/* taken care of by memset [above]
897 sec_event.auth_cmpl.key_present = FALSE;
898 sec_event.auth_cmpl.success = FALSE;
899*/
900 sec_event.auth_cmpl.fail_reason = HCI_ERR_ILLEGAL_COMMAND;
901 if (status == BTM_SUCCESS)
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800902 {
The Android Open Source Project5738f832012-12-12 16:00:35 -0800903 sec_event.auth_cmpl.success = TRUE;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800904 }
905 else
906 {
907 /* delete this device entry from Sec Dev DB */
908 bta_dm_remove_sec_dev_entry(p_data->bond.bd_addr);
909 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800910 bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
911 }
912
913}
914
915/*******************************************************************************
916**
917** Function bta_dm_bond_cancel
918**
919** Description Cancels bonding with a peer device
920**
921**
922** Returns void
923**
924*******************************************************************************/
925void bta_dm_bond_cancel (tBTA_DM_MSG *p_data)
926{
927 tBTM_STATUS status;
928 tBTA_DM_SEC sec_event;
929
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700930 APPL_TRACE_EVENT(" bta_dm_bond_cancel ");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800931 status = BTM_SecBondCancel ( p_data->bond_cancel.bd_addr );
932
933 if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED && status != BTM_SUCCESS))
934 {
935 sec_event.bond_cancel_cmpl.result = BTA_FAILURE;
936
937 bta_dm_cb.p_sec_cback(BTA_DM_BOND_CANCEL_CMPL_EVT, &sec_event);
938 }
939
940}
941
942/*******************************************************************************
943**
944** Function bta_dm_pin_reply
945**
946** Description Send the pin_reply to a request from BTM
947**
948**
949** Returns void
950**
951*******************************************************************************/
952void bta_dm_pin_reply (tBTA_DM_MSG *p_data)
953{
954 UINT32 trusted_mask[BTM_SEC_SERVICE_ARRAY_SIZE];
955 UINT32 * current_trusted_mask;
956
957 current_trusted_mask = BTM_ReadTrustedMask(p_data->pin_reply.bd_addr);
958
959 if(current_trusted_mask)
960 {
961 memcpy(trusted_mask, current_trusted_mask, sizeof(trusted_mask));
962 }
963 else
964 {
965 memset(trusted_mask, 0, sizeof(trusted_mask));
966 }
967
968 if(p_data->pin_reply.accept)
969 {
970
971 BTM_PINCodeReply(p_data->pin_reply.bd_addr, BTM_SUCCESS, p_data->pin_reply.pin_len, p_data->pin_reply.p_pin, trusted_mask );
972 }
973 else
974 {
975 BTM_PINCodeReply(p_data->pin_reply.bd_addr, BTM_NOT_AUTHORIZED, 0, NULL, trusted_mask );
976 }
977
978}
979
980/*******************************************************************************
981**
The Android Open Source Project5738f832012-12-12 16:00:35 -0800982** Function bta_dm_policy_cback
983**
984** Description process the link policy changes
985**
986** Returns void
987**
988*******************************************************************************/
989static void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
990{
991 tBTA_DM_PEER_DEVICE *p_dev = NULL;
992 UINT16 policy = app_id;
993 UINT32 mask = (UINT32)(1 << id);
994
995 if(peer_addr)
996 p_dev = bta_dm_find_peer_device(peer_addr);
997
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700998 APPL_TRACE_DEBUG(" bta_dm_policy_cback cmd:%d, policy:0x%x",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800999 status, policy);
1000 switch(status)
1001 {
1002 case BTA_SYS_PLCY_SET:
1003 if(!p_dev)
1004 return;
1005 /* restore the default link policy */
1006 p_dev->link_policy |= policy;
1007 BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
1008 break;
1009
1010 case BTA_SYS_PLCY_CLR:
1011 if(!p_dev)
1012 return;
1013 /* clear the policy from the default link policy */
1014 p_dev->link_policy &= (~policy);
1015 BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
1016
1017 if(policy & (HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_PARK_MODE))
1018 {
1019 /* if clearing sniff/park, wake the link */
1020 bta_dm_pm_active(p_dev->peer_bdaddr);
1021 }
1022 break;
1023
1024 case BTA_SYS_PLCY_DEF_SET:
1025 /* want to restore/set the role switch policy */
1026 bta_dm_cb.role_policy_mask &= ~mask;
1027 if(0 == bta_dm_cb.role_policy_mask)
1028 {
1029 /* if nobody wants to insist on the role */
1030 bta_dm_cb.cur_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH;
1031 BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
1032 }
1033 break;
1034
1035 case BTA_SYS_PLCY_DEF_CLR:
1036 /* want to remove the role switch policy */
1037 bta_dm_cb.role_policy_mask |= mask;
1038 bta_dm_cb.cur_policy &= ~HCI_ENABLE_MASTER_SLAVE_SWITCH;
1039 BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
1040 break;
1041 }
1042}
1043
The Android Open Source Project5738f832012-12-12 16:00:35 -08001044/*******************************************************************************
1045**
1046** Function bta_dm_confirm
1047**
1048** Description Send the user confirm request reply in response to a
1049** request from BTM
1050**
1051** Returns void
1052**
1053*******************************************************************************/
1054void bta_dm_confirm(tBTA_DM_MSG *p_data)
1055{
1056 tBTM_STATUS res = BTM_NOT_AUTHORIZED;
1057
1058 if(p_data->confirm.accept == TRUE)
1059 res = BTM_SUCCESS;
1060 BTM_ConfirmReqReply(res, p_data->confirm.bd_addr);
1061}
1062
1063/*******************************************************************************
1064**
The Android Open Source Project5738f832012-12-12 16:00:35 -08001065** Function bta_dm_loc_oob
1066**
1067** Description Retrieve the OOB data from the local LM
1068**
1069** Returns void
1070**
1071*******************************************************************************/
1072#if (BTM_OOB_INCLUDED == TRUE)
1073void bta_dm_loc_oob(tBTA_DM_MSG *p_data)
1074{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08001075 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001076 BTM_ReadLocalOobData();
1077}
1078
1079/*******************************************************************************
1080**
1081** Function bta_dm_ci_io_req_act
1082**
1083** Description respond to the IO capabilities request from BTM
1084**
1085** Returns void
1086**
1087*******************************************************************************/
1088void bta_dm_ci_io_req_act(tBTA_DM_MSG *p_data)
1089{
1090 tBTM_AUTH_REQ auth_req = BTM_AUTH_AP_NO;
1091 if(p_data->ci_io_req.auth_req)
1092 auth_req = BTM_AUTH_AP_YES;
1093 BTM_IoCapRsp(p_data->ci_io_req.bd_addr, p_data->ci_io_req.io_cap,
1094 p_data->ci_io_req.oob_data, auth_req);
1095}
1096
1097/*******************************************************************************
1098**
1099** Function bta_dm_ci_rmt_oob_act
1100**
1101** Description respond to the OOB data request for the remote device from BTM
1102**
1103**
1104** Returns void
1105**
1106*******************************************************************************/
1107void bta_dm_ci_rmt_oob_act(tBTA_DM_MSG *p_data)
1108{
1109 tBTM_STATUS res = BTM_NOT_AUTHORIZED;
1110
1111 if(p_data->ci_rmt_oob.accept == TRUE)
1112 res = BTM_SUCCESS;
1113 BTM_RemoteOobDataReply(res, p_data->ci_rmt_oob.bd_addr,
1114 p_data->ci_rmt_oob.c, p_data->ci_rmt_oob.r );
1115}
1116#endif /* BTM_OOB_INCLUDED */
1117
1118/*******************************************************************************
1119**
1120** Function bta_dm_search_start
1121**
1122** Description Starts an inquiry
1123**
1124**
1125** Returns void
1126**
1127*******************************************************************************/
1128void bta_dm_search_start (tBTA_DM_MSG *p_data)
1129{
1130 tBTM_INQUIRY_CMPL result;
1131
Andre Eisenbache1202ca2013-05-15 04:55:08 -07001132#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001133 UINT16 len = (UINT16)(sizeof(tBT_UUID) * p_data->search.num_uuid);
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001134 bta_dm_gattc_register();
The Android Open Source Project5738f832012-12-12 16:00:35 -08001135#endif
1136
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001137 APPL_TRACE_DEBUG("%s avoid_scatter=%d", __func__, p_bta_dm_cfg->avoid_scatter);
1138
1139 if (p_bta_dm_cfg->avoid_scatter &&
The Android Open Source Project5738f832012-12-12 16:00:35 -08001140 (p_data->search.rs_res == BTA_DM_RS_NONE) && bta_dm_check_av(BTA_DM_API_SEARCH_EVT))
1141 {
1142 memcpy(&bta_dm_cb.search_msg, &p_data->search, sizeof(tBTA_DM_API_SEARCH));
1143 return;
1144 }
1145
1146 BTM_ClearInqDb(NULL);
1147 /* save search params */
1148 bta_dm_search_cb.p_search_cback = p_data->search.p_cback;
1149 bta_dm_search_cb.services = p_data->search.services;
1150
1151#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
1152 utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
1153
1154 if ((bta_dm_search_cb.num_uuid = p_data->search.num_uuid) != 0 &&
1155 p_data->search.p_uuid != NULL)
1156 {
1157 if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len)) == NULL)
1158 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001159 APPL_TRACE_ERROR("%s no resources", __func__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001160
1161 result.status = BTA_FAILURE;
1162 result.num_resp = 0;
1163 bta_dm_inq_cmpl_cb ((void *)&result);
1164 return;
1165 }
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001166
The Android Open Source Project5738f832012-12-12 16:00:35 -08001167 memcpy(bta_dm_search_cb.p_srvc_uuid, p_data->search.p_uuid, len);
1168 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001169#endif
1170 result.status = BTM_StartInquiry( (tBTM_INQ_PARMS*)&p_data->search.inq_params,
1171 bta_dm_inq_results_cb,
1172 (tBTM_CMPL_CB*) bta_dm_inq_cmpl_cb);
1173
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001174 APPL_TRACE_EVENT("%s status=%d", __func__, result.status);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001175 if (result.status != BTM_CMD_STARTED)
1176 {
1177 result.num_resp = 0;
1178 bta_dm_inq_cmpl_cb ((void *)&result);
1179 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001180}
1181
1182/*******************************************************************************
1183**
1184** Function bta_dm_search_cancel
1185**
1186** Description Cancels an ongoing search for devices
1187**
1188**
1189** Returns void
1190**
1191*******************************************************************************/
1192void bta_dm_search_cancel (tBTA_DM_MSG *p_data)
1193{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08001194 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001195 tBTA_DM_MSG * p_msg;
1196
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001197 if (BTM_IsInquiryActive())
The Android Open Source Project5738f832012-12-12 16:00:35 -08001198 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001199 if (BTM_CancelInquiry() != BTM_CMD_STARTED)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001200 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001201 bta_dm_search_cancel_notify(NULL);
1202 p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG));
1203 if (p_msg != NULL)
1204 {
1205 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1206 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1207 bta_sys_sendmsg(p_msg);
1208 }
1209 } else {
1210 /* flag a search cancel is pending */
1211 bta_dm_search_cb.cancel_pending = TRUE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001212 }
1213 }
1214 /* If no Service Search going on then issue cancel remote name in case it is active */
1215 else if (!bta_dm_search_cb.name_discover_done)
1216 {
1217 BTM_CancelRemoteDeviceName();
Matthew Xiec358eed2015-01-28 17:30:13 -08001218
1219 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1220 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001221 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
Matthew Xiec358eed2015-01-28 17:30:13 -08001222 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1223 bta_sys_sendmsg(p_msg);
1224 }
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001225
The Android Open Source Project5738f832012-12-12 16:00:35 -08001226 }
Matthew Xiec358eed2015-01-28 17:30:13 -08001227 else {
1228 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1229 {
1230 p_msg->hdr.event = BTA_DM_INQUIRY_CMPL_EVT;
1231 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1232 bta_sys_sendmsg(p_msg);
1233 }
1234 }
1235
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001236#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
The Android Open Source Project5738f832012-12-12 16:00:35 -08001237 if (bta_dm_search_cb.gatt_disc_active)
1238 {
1239 bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
1240 }
1241#endif
1242}
1243
1244/*******************************************************************************
1245**
1246** Function bta_dm_discover
1247**
1248** Description Discovers services on a remote device
1249**
1250**
1251** Returns void
1252**
1253*******************************************************************************/
1254void bta_dm_discover (tBTA_DM_MSG *p_data)
1255{
1256#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
1257 UINT16 len = (UINT16)(sizeof(tBT_UUID) * p_data->discover.num_uuid);
1258#endif
Chris Mantonf8027002015-03-12 09:22:48 -07001259 APPL_TRACE_EVENT("%s services_to_search=0x%04X, sdp_search=%d", __func__,
The Android Open Source Project5738f832012-12-12 16:00:35 -08001260 p_data->discover.services, p_data->discover.sdp_search);
1261
1262 /* save the search condition */
1263 bta_dm_search_cb.services = p_data->discover.services;
1264
1265#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001266 bta_dm_gattc_register();
The Android Open Source Project5738f832012-12-12 16:00:35 -08001267 utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
1268 if ((bta_dm_search_cb.num_uuid = p_data->discover.num_uuid) != 0 &&
1269 p_data->discover.p_uuid != NULL)
1270 {
1271 if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len)) == NULL)
1272 {
1273 p_data->discover.p_cback(BTA_DM_DISC_CMPL_EVT, NULL);
1274 return;
1275 }
1276 memcpy(bta_dm_search_cb.p_srvc_uuid, p_data->discover.p_uuid, len);
1277 }
1278 bta_dm_search_cb.uuid_to_search = bta_dm_search_cb.num_uuid;
1279#endif
1280
1281 bta_dm_search_cb.p_search_cback = p_data->discover.p_cback;
1282 bta_dm_search_cb.sdp_search = p_data->discover.sdp_search;
1283 bta_dm_search_cb.services_to_search = bta_dm_search_cb.services;
1284 bta_dm_search_cb.service_index = 0;
1285 bta_dm_search_cb.services_found = 0;
1286 bta_dm_search_cb.peer_name[0] = 0;
1287 bta_dm_search_cb.sdp_search = p_data->discover.sdp_search;
1288 bta_dm_search_cb.p_btm_inq_info = BTM_InqDbRead (p_data->discover.bd_addr);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001289 bta_dm_search_cb.transport = p_data->discover.transport;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001290
1291 bta_dm_search_cb.name_discover_done = FALSE;
1292 memcpy(&bta_dm_search_cb.uuid, &p_data->discover.uuid, sizeof(tSDP_UUID));
1293 bta_dm_discover_device(p_data->discover.bd_addr);
1294}
1295
1296/*******************************************************************************
1297**
1298** Function bta_dm_di_disc_cmpl
1299**
1300** Description Sends event to application when DI discovery complete
1301**
1302** Returns void
1303**
1304*******************************************************************************/
1305void bta_dm_di_disc_cmpl(tBTA_DM_MSG *p_data)
1306{
1307 tBTA_DM_DI_DISC_CMPL di_disc;
1308
1309 memset(&di_disc, 0, sizeof(tBTA_DM_DI_DISC_CMPL));
1310 bdcpy(di_disc.bd_addr, bta_dm_search_cb.peer_bdaddr);
1311
1312 if((p_data->hdr.offset == SDP_SUCCESS)
1313 || (p_data->hdr.offset == SDP_DB_FULL))
1314 {
1315 di_disc.num_record = SDP_GetNumDiRecords(bta_dm_di_cb.p_di_db);
1316 }
1317 else
1318 di_disc.result = BTA_FAILURE;
1319
1320 bta_dm_di_cb.p_di_db = NULL;
1321 bta_dm_search_cb.p_search_cback(BTA_DM_DI_DISC_CMPL_EVT, (tBTA_DM_SEARCH *) &di_disc);
1322}
1323
1324/*******************************************************************************
1325**
1326** Function bta_dm_di_disc_callback
1327**
1328** Description This function queries a remote device for DI information.
1329**
1330**
1331** Returns void
1332**
1333*******************************************************************************/
1334static void bta_dm_di_disc_callback(UINT16 result)
1335{
1336 tBTA_DM_MSG * p_msg;
1337
1338 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1339 {
1340 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1341 p_msg->hdr.layer_specific = BTA_DM_API_DI_DISCOVER_EVT;
1342 p_msg->hdr.offset = result;
1343 bta_sys_sendmsg(p_msg);
1344 }
1345}
1346
1347/*******************************************************************************
1348**
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001349** Function bta_dm_disable_search_and_disc
1350**
1351** Description Cancels an ongoing search or discovery for devices in case of
1352** a Bluetooth disable
1353**
1354**
1355** Returns void
1356**
1357*******************************************************************************/
1358static void bta_dm_disable_search_and_disc (void)
1359{
1360 tBTA_DM_DI_DISC_CMPL di_disc;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001361
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001362 if (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE)
1363 bta_dm_search_cancel(NULL);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001364
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001365 if (bta_dm_di_cb.p_di_db != NULL)
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001366 {
1367 memset(&di_disc, 0, sizeof(tBTA_DM_DI_DISC_CMPL));
1368 bdcpy(di_disc.bd_addr, bta_dm_search_cb.peer_bdaddr);
1369 di_disc.result = BTA_FAILURE;
1370
1371 bta_dm_di_cb.p_di_db = NULL;
1372 bta_dm_search_cb.p_search_cback(BTA_DM_DI_DISC_CMPL_EVT, NULL);
1373 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001374}
1375
1376/*******************************************************************************
1377**
The Android Open Source Project5738f832012-12-12 16:00:35 -08001378** Function bta_dm_di_disc
1379**
1380** Description This function queries a remote device for DI information.
1381**
1382**
1383** Returns void
1384**
1385*******************************************************************************/
1386void bta_dm_di_disc (tBTA_DM_MSG *p_data)
1387{
1388 UINT16 result = BTA_FAILURE;
1389 tBTA_DM_MSG *p_msg;
1390
1391 bta_dm_search_cb.p_search_cback = p_data->di_disc.p_cback;
1392 bdcpy(bta_dm_search_cb.peer_bdaddr, p_data->di_disc.bd_addr);
1393 bta_dm_di_cb.p_di_db = p_data->di_disc.p_sdp_db;
1394
1395 if((bta_dm_search_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)GKI_getbuf(BTA_DM_SDP_DB_SIZE)) != NULL)
1396 {
1397 if ( SDP_DiDiscover(bta_dm_search_cb.peer_bdaddr, p_data->di_disc.p_sdp_db,
1398 p_data->di_disc.len, bta_dm_di_disc_callback) == SDP_SUCCESS)
1399 {
1400 result = BTA_SUCCESS;
1401 }
1402 }
1403 else
1404 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001405 APPL_TRACE_ERROR("No buffer to start DI discovery");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001406 }
1407
1408 if ( result == BTA_FAILURE &&
1409 (p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1410 {
1411 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1412 p_msg->hdr.layer_specific = BTA_DM_API_DI_DISCOVER_EVT;
1413 p_data->hdr.offset = result;
1414 bta_sys_sendmsg(p_msg);
1415 }
1416}
1417
1418/*******************************************************************************
1419**
1420** Function bta_dm_read_remote_device_name
1421**
1422** Description Initiate to get remote device name
1423**
1424** Returns TRUE if started to get remote name
1425**
1426*******************************************************************************/
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001427static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr,tBT_TRANSPORT transport)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001428{
1429 tBTM_STATUS btm_status;
1430
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001431 APPL_TRACE_DEBUG("bta_dm_read_remote_device_name");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001432
1433 bdcpy(bta_dm_search_cb.peer_bdaddr, bd_addr);
1434 bta_dm_search_cb.peer_name[0] = 0;
1435
1436 btm_status = BTM_ReadRemoteDeviceName (bta_dm_search_cb.peer_bdaddr,
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001437 (tBTM_CMPL_CB *) bta_dm_remname_cback,
1438 transport);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001439
1440 if ( btm_status == BTM_CMD_STARTED )
1441 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001442 APPL_TRACE_DEBUG("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is started");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001443
1444 return (TRUE);
1445 }
1446 else if ( btm_status == BTM_BUSY )
1447 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001448 APPL_TRACE_DEBUG("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is busy");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001449
1450 /* Remote name discovery is on going now so BTM cannot notify through "bta_dm_remname_cback" */
1451 /* adding callback to get notified that current reading remore name done */
1452 BTM_SecAddRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
1453
1454 return (TRUE);
1455 }
1456 else
1457 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001458 APPL_TRACE_WARNING("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName returns 0x%02X", btm_status);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001459
1460 return (FALSE);
1461 }
1462}
1463
1464/*******************************************************************************
1465**
1466** Function bta_dm_inq_cmpl
1467**
1468** Description Process the inquiry complete event from BTM
1469**
1470** Returns void
1471**
1472*******************************************************************************/
1473void bta_dm_inq_cmpl (tBTA_DM_MSG *p_data)
1474{
1475 tBTA_DM_MSG * p_msg;
1476 tBTA_DM_SEARCH data;
1477
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001478 APPL_TRACE_DEBUG("bta_dm_inq_cmpl");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001479
1480 data.inq_cmpl.num_resps = p_data->inq_cmpl.num;
1481 bta_dm_search_cb.p_search_cback(BTA_DM_INQ_CMPL_EVT, &data);
1482
1483 if((bta_dm_search_cb.p_btm_inq_info = BTM_InqDbFirst()) != NULL)
1484 {
1485 /* start name and service discovery from the first device on inquiry result */
1486 bta_dm_search_cb.name_discover_done = FALSE;
1487 bta_dm_search_cb.peer_name[0] = 0;
1488 bta_dm_discover_device(bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr);
1489 }
1490 else
1491 {
1492 /* no devices, search complete */
1493 bta_dm_search_cb.services = 0;
1494
1495 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1496 {
1497 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1498 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1499 bta_sys_sendmsg(p_msg);
1500 }
1501 }
1502 }
1503
1504/*******************************************************************************
1505**
1506** Function bta_dm_rmt_name
1507**
1508** Description Process the remote name result from BTM
1509**
1510** Returns void
1511**
1512*******************************************************************************/
1513void bta_dm_rmt_name (tBTA_DM_MSG *p_data)
1514{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001515 APPL_TRACE_DEBUG("bta_dm_rmt_name");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001516
1517 if( p_data->rem_name.result.disc_res.bd_name[0] && bta_dm_search_cb.p_btm_inq_info)
1518 {
1519 bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name = TRUE;
1520 }
1521
1522 bta_dm_discover_device(bta_dm_search_cb.peer_bdaddr);
1523}
1524
1525/*******************************************************************************
1526**
1527** Function bta_dm_disc_rmt_name
1528**
1529** Description Process the remote name result from BTM when application
1530** wants to find the name for a bdaddr
1531**
1532** Returns void
1533**
1534*******************************************************************************/
1535void bta_dm_disc_rmt_name (tBTA_DM_MSG *p_data)
1536{
1537 tBTM_INQ_INFO *p_btm_inq_info;
1538
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001539 APPL_TRACE_DEBUG("bta_dm_disc_rmt_name");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001540
1541 p_btm_inq_info = BTM_InqDbRead (p_data->rem_name.result.disc_res.bd_addr);
1542 if( p_btm_inq_info )
1543 {
1544 if( p_data->rem_name.result.disc_res.bd_name[0] )
1545 {
1546 p_btm_inq_info->appl_knows_rem_name = TRUE;
1547 }
1548 }
1549
1550 bta_dm_discover_device(p_data->rem_name.result.disc_res.bd_addr);
1551}
1552
1553/*******************************************************************************
1554**
1555** Function bta_dm_sdp_result
1556**
1557** Description Process the discovery result from sdp
1558**
1559** Returns void
1560**
1561*******************************************************************************/
1562void bta_dm_sdp_result (tBTA_DM_MSG *p_data)
1563{
1564
1565 tSDP_DISC_REC *p_sdp_rec = NULL;
1566 tBTA_DM_MSG *p_msg;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001567 BOOLEAN scn_found = FALSE;
1568 UINT16 service = 0xFFFF;
1569 tSDP_PROTOCOL_ELEM pe;
1570
1571#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
1572 tBT_UUID *p_uuid = bta_dm_search_cb.p_srvc_uuid;
1573 tBTA_DM_SEARCH result;
1574 tBT_UUID service_uuid;
1575#endif
1576
1577 UINT32 num_uuids = 0;
1578 UINT8 uuid_list[32][MAX_UUID_SIZE]; // assuming a max of 32 services
1579
1580 if((p_data->sdp_event.sdp_result == SDP_SUCCESS)
1581 || (p_data->sdp_event.sdp_result == SDP_NO_RECS_MATCH)
1582 || (p_data->sdp_event.sdp_result == SDP_DB_FULL))
1583 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001584 APPL_TRACE_DEBUG("sdp_result::0x%x", p_data->sdp_event.sdp_result);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001585 do
1586 {
1587
The Android Open Source Project5738f832012-12-12 16:00:35 -08001588 p_sdp_rec = NULL;
1589 if( bta_dm_search_cb.service_index == (BTA_USER_SERVICE_ID+1) )
1590 {
1591 p_sdp_rec = SDP_FindServiceUUIDInDb(bta_dm_search_cb.p_sdp_db, &bta_dm_search_cb.uuid, p_sdp_rec);
1592
1593 if (p_sdp_rec && SDP_FindProtocolListElemInRec(p_sdp_rec, UUID_PROTOCOL_RFCOMM, &pe))
1594 {
1595 bta_dm_search_cb.peer_scn = (UINT8) pe.params[0];
1596 scn_found = TRUE;
1597 }
1598 }
1599 else
1600 {
1601 service = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index-1];
1602 p_sdp_rec = SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db, service, p_sdp_rec);
1603 }
1604#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
1605 /* finished with BR/EDR services, now we check the result for GATT based service UUID */
1606 if (bta_dm_search_cb.service_index == BTA_MAX_SERVICE_ID)
1607 {
1608 if (bta_dm_search_cb.uuid_to_search != 0 && p_uuid != NULL)
1609 {
1610 p_uuid += (bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search);
1611 /* only support 16 bits UUID for now */
1612 service = p_uuid->uu.uuid16;
1613
1614 }
1615 /* all GATT based services */
1616 do
1617 {
1618 /* find a service record, report it */
1619 p_sdp_rec = SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db,
1620 0, p_sdp_rec);
1621 if (p_sdp_rec)
1622 {
1623 if (SDP_FindServiceUUIDInRec(p_sdp_rec, &service_uuid))
1624 {
1625 /* send result back to app now, one by one */
1626 bdcpy (result.disc_ble_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001627 BCM_STRNCPY_S((char*)result.disc_ble_res.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN));
1628 result.disc_ble_res.bd_name[BD_NAME_LEN] = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001629 result.disc_ble_res.service.len = service_uuid.len;
1630 result.disc_ble_res.service.uu.uuid16 = service_uuid.uu.uuid16;
1631
1632 bta_dm_search_cb.p_search_cback(BTA_DM_DISC_BLE_RES_EVT, &result);
1633 }
1634 }
1635
1636 if (bta_dm_search_cb.uuid_to_search > 0)
1637 break;
1638
1639 } while (p_sdp_rec);
1640 }
1641 else
1642#endif
1643 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001644 /* SDP_DB_FULL means some records with the
1645 required attributes were received */
1646 if (((p_data->sdp_event.sdp_result == SDP_DB_FULL) &&
1647 bta_dm_search_cb.services != BTA_ALL_SERVICE_MASK) ||
1648 (p_sdp_rec != NULL))
The Android Open Source Project5738f832012-12-12 16:00:35 -08001649 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001650 if (service != UUID_SERVCLASS_PNP_INFORMATION)
1651 {
1652 UINT16 tmp_svc = 0xFFFF;
1653 bta_dm_search_cb.services_found |=
1654 (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index-1));
1655 tmp_svc = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index-1];
1656 /* Add to the list of UUIDs */
1657 sdpu_uuid16_to_uuid128(tmp_svc, uuid_list[num_uuids]);
1658 num_uuids++;
1659 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001660 }
1661 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001662
1663 if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK &&
1664 bta_dm_search_cb.services_to_search == 0)
1665 {
1666#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
1667 if ( bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID &&
1668 bta_dm_search_cb.uuid_to_search > 0)
1669 bta_dm_search_cb.uuid_to_search --;
1670
1671 if (bta_dm_search_cb.uuid_to_search == 0 ||
1672 bta_dm_search_cb.service_index != BTA_BLE_SERVICE_ID)
1673#endif
1674 bta_dm_search_cb.service_index++;
1675 }
1676 else /* regular one service per search or PNP search */
1677 break;
1678
1679 }
1680 while(bta_dm_search_cb.service_index <= BTA_MAX_SERVICE_ID);
1681
1682// GKI_freebuf(bta_dm_search_cb.p_sdp_db);
1683// bta_dm_search_cb.p_sdp_db = NULL;
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001684 APPL_TRACE_DEBUG("%s services_found = %04x", __FUNCTION__,
1685 bta_dm_search_cb.services_found);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001686
1687 /* Collect the 128-bit services here and put them into the list */
1688 if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK)
1689 {
1690 p_sdp_rec = NULL;
1691 do
1692 {
1693 tBT_UUID temp_uuid;
1694 /* find a service record, report it */
1695 p_sdp_rec = SDP_FindServiceInDb_128bit(bta_dm_search_cb.p_sdp_db, p_sdp_rec);
1696 if (p_sdp_rec)
1697 {
1698 if (SDP_FindServiceUUIDInRec_128bit(p_sdp_rec, &temp_uuid))
1699 {
1700 memcpy(uuid_list[num_uuids], temp_uuid.uu.uuid128, MAX_UUID_SIZE);
1701 num_uuids++;
1702 }
1703 }
1704 } while (p_sdp_rec);
1705 }
1706 /* if there are more services to search for */
1707 if(bta_dm_search_cb.services_to_search)
1708 {
1709 /* Free up the p_sdp_db before checking the next one */
1710 bta_dm_free_sdp_db(NULL);
1711 bta_dm_find_services(bta_dm_search_cb.peer_bdaddr);
1712 }
1713 else
1714 {
1715 /* callbacks */
1716 /* start next bd_addr if necessary */
1717
1718 BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
1719
1720
1721 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1722 {
1723 p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
1724 p_msg->disc_result.result.disc_res.result = BTA_SUCCESS;
1725 p_msg->disc_result.result.disc_res.p_raw_data = NULL;
1726 p_msg->disc_result.result.disc_res.raw_data_size = 0;
1727 p_msg->disc_result.result.disc_res.num_uuids = num_uuids;
1728 p_msg->disc_result.result.disc_res.p_uuid_list = NULL;
1729 if (num_uuids > 0) {
1730 p_msg->disc_result.result.disc_res.p_uuid_list = (UINT8*)GKI_getbuf(num_uuids*MAX_UUID_SIZE);
1731 if (p_msg->disc_result.result.disc_res.p_uuid_list) {
1732 memcpy(p_msg->disc_result.result.disc_res.p_uuid_list, uuid_list,
1733 num_uuids*MAX_UUID_SIZE);
1734 } else {
1735 p_msg->disc_result.result.disc_res.num_uuids = 0;
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001736 APPL_TRACE_ERROR("%s: Unable to allocate memory for uuid_list", __func__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001737 }
1738 }
1739 //copy the raw_data to the discovery result structure
1740 //
The Android Open Source Project5738f832012-12-12 16:00:35 -08001741
1742 if ( bta_dm_search_cb.p_sdp_db != NULL && bta_dm_search_cb.p_sdp_db->raw_used != 0 &&
1743 bta_dm_search_cb.p_sdp_db->raw_data != NULL) {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001744 APPL_TRACE_DEBUG(
1745 "%s raw_data used = 0x%x raw_data_ptr = 0x%x", __func__,
1746 bta_dm_search_cb.p_sdp_db->raw_used,
1747 bta_dm_search_cb.p_sdp_db->raw_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001748
1749 p_msg->disc_result.result.disc_res.p_raw_data = GKI_getbuf(bta_dm_search_cb.p_sdp_db->raw_used);
1750 if ( NULL != p_msg->disc_result.result.disc_res.p_raw_data ) {
1751 memcpy( p_msg->disc_result.result.disc_res.p_raw_data,
1752 bta_dm_search_cb.p_sdp_db->raw_data,
1753 bta_dm_search_cb.p_sdp_db->raw_used );
1754
1755 p_msg->disc_result.result.disc_res.raw_data_size =
1756 bta_dm_search_cb.p_sdp_db->raw_used;
1757
1758 } else {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001759 APPL_TRACE_DEBUG("%s GKI Alloc failed to allocate %d bytes !!", __func__,
1760 bta_dm_search_cb.p_sdp_db->raw_used);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001761 }
1762
1763 bta_dm_search_cb.p_sdp_db->raw_data = NULL; //no need to free this - it is a global assigned.
1764 bta_dm_search_cb.p_sdp_db->raw_used = 0;
1765 bta_dm_search_cb.p_sdp_db->raw_size = 0;
1766 }
1767 else {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001768 APPL_TRACE_DEBUG("%s raw data size is 0 or raw_data is null!!", __func__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001769 }
1770 /* Done with p_sdp_db. Free it */
1771 bta_dm_free_sdp_db(NULL);
1772 p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
1773
1774 //Piggy back the SCN over result field
1775 if( scn_found )
1776 {
1777 p_msg->disc_result.result.disc_res.result = (3 + bta_dm_search_cb.peer_scn);
1778 p_msg->disc_result.result.disc_res.services |= BTA_USER_SERVICE_MASK;
1779
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001780 APPL_TRACE_EVENT(" Piggy back the SCN over result field SCN=%d", bta_dm_search_cb.peer_scn);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001781
1782 }
1783 bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
1784 BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
1785 bta_dm_get_remname(), (BD_NAME_LEN-1));
1786
1787 /* make sure the string is null terminated */
1788 p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
1789
1790 bta_sys_sendmsg(p_msg);
1791 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001792 }
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001793 } else {
The Android Open Source Project5738f832012-12-12 16:00:35 -08001794 /* conn failed. No need for timer */
1795 if(p_data->sdp_event.sdp_result == SDP_CONN_FAILED || p_data->sdp_event.sdp_result == SDP_CONN_REJECTED
1796 || p_data->sdp_event.sdp_result == SDP_SECURITY_ERR)
1797 bta_dm_search_cb.wait_disc = FALSE;
1798
1799 /* not able to connect go to next device */
1800 GKI_freebuf(bta_dm_search_cb.p_sdp_db);
1801 bta_dm_search_cb.p_sdp_db = NULL;
1802
1803 BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
1804
1805 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1806 {
1807 p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
1808 p_msg->disc_result.result.disc_res.result = BTA_FAILURE;
1809 p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
1810 bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
1811 BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
1812 bta_dm_get_remname(), (BD_NAME_LEN-1));
1813
1814 /* make sure the string is null terminated */
1815 p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
1816
1817 bta_sys_sendmsg(p_msg);
1818 }
1819 }
1820}
1821
1822/*******************************************************************************
1823**
1824** Function bta_dm_search_cmpl
1825**
1826** Description Sends event to application
1827**
1828** Returns void
1829**
1830*******************************************************************************/
1831void bta_dm_search_cmpl (tBTA_DM_MSG *p_data)
1832{
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001833 APPL_TRACE_EVENT("%s", __func__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001834
1835#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
1836 utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
1837#endif
1838
1839 if (p_data->hdr.layer_specific == BTA_DM_API_DI_DISCOVER_EVT)
1840 bta_dm_di_disc_cmpl(p_data);
1841 else
1842 bta_dm_search_cb.p_search_cback(BTA_DM_DISC_CMPL_EVT, NULL);
1843}
1844
1845/*******************************************************************************
1846**
1847** Function bta_dm_disc_result
1848**
1849** Description Service discovery result when discovering services on a device
1850**
1851** Returns void
1852**
1853*******************************************************************************/
1854void bta_dm_disc_result (tBTA_DM_MSG *p_data)
1855{
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001856 APPL_TRACE_EVENT("%s", __func__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001857
1858#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
1859 /* if any BR/EDR service discovery has been done, report the event */
1860 if ((bta_dm_search_cb.services & ((BTA_ALL_SERVICE_MASK | BTA_USER_SERVICE_MASK ) & ~BTA_BLE_SERVICE_MASK)))
1861#endif
1862 bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, &p_data->disc_result.result);
1863
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001864 tBTA_DM_MSG *p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG));
1865
The Android Open Source Project5738f832012-12-12 16:00:35 -08001866 /* send a message to change state */
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001867 if (p_msg != NULL)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001868 {
1869 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1870 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1871 bta_sys_sendmsg(p_msg);
1872 }
1873}
1874
1875/*******************************************************************************
1876**
1877** Function bta_dm_search_result
1878**
1879** Description Service discovery result while searching for devices
1880**
1881** Returns void
1882**
1883*******************************************************************************/
1884void bta_dm_search_result (tBTA_DM_MSG *p_data)
1885{
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001886 APPL_TRACE_DEBUG("%s searching:0x%04x, result:0x%04x", __func__,
The Android Open Source Project5738f832012-12-12 16:00:35 -08001887 bta_dm_search_cb.services,
1888 p_data->disc_result.result.disc_res.services);
1889
1890 /* call back if application wants name discovery or found services that application is searching */
1891 if (( !bta_dm_search_cb.services )
1892 ||(( bta_dm_search_cb.services ) && ( p_data->disc_result.result.disc_res.services )))
1893 {
1894 bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, &p_data->disc_result.result);
1895 }
1896
1897 /* if searching did not initiate to create link */
1898 if(!bta_dm_search_cb.wait_disc )
1899 {
The Android Open Source Project5738f832012-12-12 16:00:35 -08001900 /* if service searching is done with EIR, don't search next device */
1901 if( bta_dm_search_cb.p_btm_inq_info )
The Android Open Source Project5738f832012-12-12 16:00:35 -08001902 bta_dm_discover_next_device();
1903 }
1904 else
1905 {
1906 /* wait until link is disconnected or timeout */
1907 bta_dm_search_cb.sdp_results = TRUE;
1908 bta_dm_search_cb.search_timer.p_cback = (TIMER_CBACK*)&bta_dm_search_timer_cback;
1909 bta_sys_start_timer(&bta_dm_search_cb.search_timer, 0, 1000*(L2CAP_LINK_INACTIVITY_TOUT+1) );
1910 }
1911
1912}
1913
1914/*******************************************************************************
1915**
1916** Function bta_dm_search_timer_cback
1917**
1918** Description Called when ACL disconnect time is over
1919**
1920**
1921** Returns void
1922**
1923*******************************************************************************/
1924static void bta_dm_search_timer_cback (TIMER_LIST_ENT *p_tle)
1925{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08001926 UNUSED(p_tle);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001927
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001928 APPL_TRACE_EVENT("%s", __func__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001929 bta_dm_search_cb.wait_disc = FALSE;
1930
1931 /* proceed with next device */
1932 bta_dm_discover_next_device();
1933
1934}
1935
1936
1937/*******************************************************************************
1938**
1939** Function bta_dm_free_sdp_db
1940**
1941** Description Frees SDP data base
1942**
1943** Returns void
1944**
1945*******************************************************************************/
1946void bta_dm_free_sdp_db (tBTA_DM_MSG *p_data)
1947{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08001948 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001949 if(bta_dm_search_cb.p_sdp_db)
1950 {
1951 GKI_freebuf(bta_dm_search_cb.p_sdp_db);
1952 bta_dm_search_cb.p_sdp_db = NULL;
1953 }
1954
1955}
1956
1957/*******************************************************************************
1958**
1959** Function bta_dm_queue_search
1960**
1961** Description Queues search command while search is being cancelled
1962**
1963** Returns void
1964**
1965*******************************************************************************/
1966void bta_dm_queue_search (tBTA_DM_MSG *p_data)
1967{
Zhihai Xub69a1752013-11-06 19:23:13 -08001968 if(bta_dm_search_cb.p_search_queue)
1969 {
1970 GKI_freebuf(bta_dm_search_cb.p_search_queue);
1971 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001972
1973 bta_dm_search_cb.p_search_queue = (tBTA_DM_MSG *)GKI_getbuf(sizeof(tBTA_DM_API_SEARCH));
1974 memcpy(bta_dm_search_cb.p_search_queue, p_data, sizeof(tBTA_DM_API_SEARCH));
1975
1976}
1977
1978/*******************************************************************************
1979**
1980** Function bta_dm_queue_disc
1981**
1982** Description Queues discovery command while search is being cancelled
1983**
1984** Returns void
1985**
1986*******************************************************************************/
1987void bta_dm_queue_disc (tBTA_DM_MSG *p_data)
1988{
Zhihai Xub69a1752013-11-06 19:23:13 -08001989 if(bta_dm_search_cb.p_search_queue)
1990 {
1991 GKI_freebuf(bta_dm_search_cb.p_search_queue);
1992 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001993
1994 bta_dm_search_cb.p_search_queue = (tBTA_DM_MSG *)GKI_getbuf(sizeof(tBTA_DM_API_DISCOVER));
1995 memcpy(bta_dm_search_cb.p_search_queue, p_data, sizeof(tBTA_DM_API_DISCOVER));
1996
1997}
1998
1999/*******************************************************************************
2000**
2001** Function bta_dm_search_clear_queue
2002**
2003** Description Clears the queue if API search cancel is called
2004**
2005** Returns void
2006**
2007*******************************************************************************/
2008void bta_dm_search_clear_queue (tBTA_DM_MSG *p_data)
2009{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002010 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002011 if(bta_dm_search_cb.p_search_queue)
2012 {
2013 GKI_freebuf(bta_dm_search_cb.p_search_queue);
2014 bta_dm_search_cb.p_search_queue = NULL;
2015 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002016}
2017
2018/*******************************************************************************
2019**
2020** Function bta_dm_search_cancel_cmpl
2021**
2022** Description Search cancel is complete
2023**
2024** Returns void
2025**
2026*******************************************************************************/
2027void bta_dm_search_cancel_cmpl (tBTA_DM_MSG *p_data)
2028{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002029 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002030 if(bta_dm_search_cb.p_search_queue)
2031 {
2032 bta_sys_sendmsg(bta_dm_search_cb.p_search_queue);
2033 bta_dm_search_cb.p_search_queue = NULL;
2034 }
2035
2036}
2037
2038/*******************************************************************************
2039**
2040** Function bta_dm_search_cancel_transac_cmpl
2041**
2042** Description Current Service Discovery or remote name procedure is
2043** completed after search cancellation
2044**
2045** Returns void
2046**
2047*******************************************************************************/
2048void bta_dm_search_cancel_transac_cmpl(tBTA_DM_MSG *p_data)
2049{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002050 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002051 if(bta_dm_search_cb.p_sdp_db)
2052 {
2053 GKI_freebuf(bta_dm_search_cb.p_sdp_db);
2054 bta_dm_search_cb.p_sdp_db = NULL;
2055 }
2056
2057 bta_dm_search_cancel_notify(NULL);
2058}
2059
2060
2061/*******************************************************************************
2062**
2063** Function bta_dm_search_cancel_notify
2064**
2065** Description Notify application that search has been cancelled
2066**
2067** Returns void
2068**
2069*******************************************************************************/
2070void bta_dm_search_cancel_notify (tBTA_DM_MSG *p_data)
2071{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002072 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002073 if (bta_dm_search_cb.p_search_cback)
2074 {
2075 bta_dm_search_cb.p_search_cback(BTA_DM_SEARCH_CANCEL_CMPL_EVT, NULL);
2076 }
2077 if (!bta_dm_search_cb.name_discover_done)
2078 {
2079 BTM_CancelRemoteDeviceName();
2080 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002081#if (BLE_INCLUDED == TRUE) && (BTA_GATT_INCLUDED == TRUE)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002082 if (bta_dm_search_cb.gatt_disc_active)
2083 {
2084 bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
2085 }
2086#endif
2087
2088}
2089
2090/*******************************************************************************
2091**
2092** Function bta_dm_find_services
2093**
2094** Description Starts discovery on a device
2095**
2096** Returns void
2097**
2098*******************************************************************************/
2099static void bta_dm_find_services ( BD_ADDR bd_addr)
2100{
2101
2102 tSDP_UUID uuid;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002103 UINT16 num_attrs = 1;
2104 tBTA_DM_MSG *p_msg;
2105
2106 memset (&uuid, 0, sizeof(tSDP_UUID));
2107
2108 while(bta_dm_search_cb.service_index < BTA_MAX_SERVICE_ID)
2109 {
2110 if( bta_dm_search_cb.services_to_search
2111 & (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index)))
2112 {
2113 if((bta_dm_search_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)GKI_getbuf(BTA_DM_SDP_DB_SIZE)) != NULL)
2114 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002115 APPL_TRACE_DEBUG("bta_dm_search_cb.services = %04x***********", bta_dm_search_cb.services);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002116 /* try to search all services by search based on L2CAP UUID */
2117 if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK )
2118 {
Chris Mantonf8027002015-03-12 09:22:48 -07002119 LOG_INFO("%s services_to_search=%08x", __func__, bta_dm_search_cb.services_to_search);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002120 if (bta_dm_search_cb.services_to_search & BTA_RES_SERVICE_MASK)
2121 {
2122 uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[0];
2123 bta_dm_search_cb.services_to_search &= ~BTA_RES_SERVICE_MASK;
2124 }
2125 else
2126 {
2127 uuid.uu.uuid16 = UUID_PROTOCOL_L2CAP;
2128 bta_dm_search_cb.services_to_search = 0;
2129 }
2130 }
2131 else
2132 {
2133#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
2134 /* for LE only profile */
2135 if (bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID)
2136 {
2137 if (bta_dm_search_cb.uuid_to_search > 0 && bta_dm_search_cb.p_srvc_uuid)
2138 {
2139 memcpy(&uuid,
2140 (const void *)(bta_dm_search_cb.p_srvc_uuid + \
2141 bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search),
2142 sizeof(tBT_UUID));
2143
2144 bta_dm_search_cb.uuid_to_search -- ;
2145 }
2146 else
2147 uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index];
2148
2149 /* last one? clear the BLE service bit if all discovery has been done */
2150 if (bta_dm_search_cb.uuid_to_search == 0)
2151 bta_dm_search_cb.services_to_search &=
2152 (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index)));
2153
2154 }
2155 else
2156#endif
2157 {
2158 /* remove the service from services to be searched */
2159 bta_dm_search_cb.services_to_search &=
2160 (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index)));
2161 uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index];
2162 }
2163 }
2164
2165 if (uuid.len == 0)
Chris Mantonf8027002015-03-12 09:22:48 -07002166 uuid.len = LEN_UUID_16;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002167
2168 if (bta_dm_search_cb.service_index == BTA_USER_SERVICE_ID)
2169 {
2170 memcpy(&uuid, &bta_dm_search_cb.uuid, sizeof(tSDP_UUID));
2171 }
2172
Chris Mantonf8027002015-03-12 09:22:48 -07002173 LOG_INFO("%s search UUID = %04x", __func__, uuid.uu.uuid16);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002174 SDP_InitDiscoveryDb (bta_dm_search_cb.p_sdp_db, BTA_DM_SDP_DB_SIZE, 1, &uuid, 0, NULL);
2175
The Android Open Source Project5738f832012-12-12 16:00:35 -08002176 memset(g_disc_raw_data_buf, 0, sizeof(g_disc_raw_data_buf));
2177 bta_dm_search_cb.p_sdp_db->raw_data = g_disc_raw_data_buf;
2178
2179 bta_dm_search_cb.p_sdp_db->raw_size = MAX_DISC_RAW_DATA_BUF;
2180
2181 if (!SDP_ServiceSearchAttributeRequest (bd_addr, bta_dm_search_cb.p_sdp_db, &bta_dm_sdp_callback))
2182 {
2183 /* if discovery not successful with this device
2184 proceed to next one */
2185 GKI_freebuf(bta_dm_search_cb.p_sdp_db);
2186 bta_dm_search_cb.p_sdp_db = NULL;
2187 bta_dm_search_cb.service_index = BTA_MAX_SERVICE_ID;
2188
2189 }
2190 else
2191 {
2192#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
2193 if ((bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID &&
2194 bta_dm_search_cb.uuid_to_search == 0) ||
2195 bta_dm_search_cb.service_index != BTA_BLE_SERVICE_ID)
2196#endif
2197 bta_dm_search_cb.service_index++;
2198 return;
2199 }
2200 }
2201 else
2202 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002203 APPL_TRACE_ERROR("#### Failed to allocate SDP DB buffer! ####");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002204 }
2205 }
2206
2207 bta_dm_search_cb.service_index++;
2208 }
2209
2210 /* no more services to be discovered */
2211 if(bta_dm_search_cb.service_index >= BTA_MAX_SERVICE_ID)
2212 {
2213 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
2214 {
2215 p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
2216 p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
2217 bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
2218 BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
2219 bta_dm_get_remname(), (BD_NAME_LEN-1));
2220
2221 /* make sure the string is terminated */
2222 p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
2223
2224 bta_sys_sendmsg(p_msg);
2225 }
2226 }
2227}
2228
2229/*******************************************************************************
2230**
2231** Function bta_dm_discover_next_device
2232**
2233** Description Starts discovery on the next device in Inquiry data base
2234**
2235** Returns void
2236**
2237*******************************************************************************/
2238static void bta_dm_discover_next_device(void)
2239{
2240
2241 tBTA_DM_MSG * p_msg;
2242
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002243 APPL_TRACE_DEBUG("bta_dm_discover_next_device");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002244
2245 /* searching next device on inquiry result */
2246 if((bta_dm_search_cb.p_btm_inq_info = BTM_InqDbNext(bta_dm_search_cb.p_btm_inq_info)) != NULL)
2247 {
2248 bta_dm_search_cb.name_discover_done = FALSE;
2249 bta_dm_search_cb.peer_name[0] = 0;
2250 bta_dm_discover_device(bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr);
2251 }
2252 else
2253 {
2254 /* no devices, search complete */
2255 bta_dm_search_cb.services = 0;
2256
2257 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
2258 {
2259 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
2260 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
2261 bta_sys_sendmsg(p_msg);
2262 }
2263 }
2264}
2265
2266/*******************************************************************************
2267**
2268** Function bta_dm_discover_device
2269**
2270** Description Starts name and service discovery on the device
2271**
2272** Returns void
2273**
2274*******************************************************************************/
2275static void bta_dm_discover_device(BD_ADDR remote_bd_addr)
2276{
2277 tBTA_DM_MSG * p_msg;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002278 tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
Nitin Arorab4365c52015-06-25 18:30:09 -07002279
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002280#if BLE_INCLUDED == TRUE
Nitin Arorab4365c52015-06-25 18:30:09 -07002281 if (bta_dm_search_cb.transport == BTA_TRANSPORT_UNKNOWN)
2282 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002283 tBT_DEVICE_TYPE dev_type;
2284 tBLE_ADDR_TYPE addr_type;
2285
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002286 BTM_ReadDevInfo(remote_bd_addr, &dev_type, &addr_type);
Nitin Arorab4365c52015-06-25 18:30:09 -07002287 if (dev_type == BT_DEVICE_TYPE_BLE || addr_type == BLE_ADDR_RANDOM)
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002288 transport = BT_TRANSPORT_LE;
Nitin Arorab4365c52015-06-25 18:30:09 -07002289 } else {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002290 transport = bta_dm_search_cb.transport;
Nitin Arorab4365c52015-06-25 18:30:09 -07002291 }
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002292#endif
2293
Nitin Arorab4365c52015-06-25 18:30:09 -07002294 /* Reset transport state for next discovery */
2295 bta_dm_search_cb.transport = BTA_TRANSPORT_UNKNOWN;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002296
Nitin Arorab4365c52015-06-25 18:30:09 -07002297 APPL_TRACE_DEBUG("%s BDA:0x%02X%02X%02X%02X%02X%02X", __func__,
The Android Open Source Project5738f832012-12-12 16:00:35 -08002298 remote_bd_addr[0],remote_bd_addr[1],
2299 remote_bd_addr[2],remote_bd_addr[3],
2300 remote_bd_addr[4],remote_bd_addr[5]);
2301
2302 bdcpy(bta_dm_search_cb.peer_bdaddr, remote_bd_addr);
2303
Nitin Arorab4365c52015-06-25 18:30:09 -07002304 APPL_TRACE_DEBUG("%s name_discover_done = %d p_btm_inq_info 0x%x state = %d, transport=%d",
2305 __func__,
The Android Open Source Project5738f832012-12-12 16:00:35 -08002306 bta_dm_search_cb.name_discover_done,
Nitin Aroraddbb20b2014-07-11 14:33:05 -07002307 bta_dm_search_cb.p_btm_inq_info,
Nitin Arorab4365c52015-06-25 18:30:09 -07002308 bta_dm_search_cb.state,
2309 transport);
2310
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07002311 if (bta_dm_search_cb.p_btm_inq_info)
2312 {
Nitin Arorab4365c52015-06-25 18:30:09 -07002313 APPL_TRACE_DEBUG("%s appl_knows_rem_name %d", __func__,
2314 bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002315 }
2316
Nitin Aroraddbb20b2014-07-11 14:33:05 -07002317 if((bta_dm_search_cb.p_btm_inq_info)
2318 && (bta_dm_search_cb.p_btm_inq_info->results.device_type == BT_DEVICE_TYPE_BLE)
2319 && (bta_dm_search_cb.state == BTA_DM_SEARCH_ACTIVE))
2320 {
2321 /* Do not perform RNR for LE devices at inquiry complete*/
2322 bta_dm_search_cb.name_discover_done = TRUE;
2323 }
2324
The Android Open Source Project5738f832012-12-12 16:00:35 -08002325 /* if name discovery is not done and application needs remote name */
2326 if ((!bta_dm_search_cb.name_discover_done)
2327 && (( bta_dm_search_cb.p_btm_inq_info == NULL )
2328 ||(bta_dm_search_cb.p_btm_inq_info && (!bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name))))
2329 {
Nitin Arorab4365c52015-06-25 18:30:09 -07002330 if (bta_dm_read_remote_device_name(bta_dm_search_cb.peer_bdaddr, transport) == TRUE)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002331 return;
Nitin Arorab4365c52015-06-25 18:30:09 -07002332
2333 /* starting name discovery failed */
2334 bta_dm_search_cb.name_discover_done = TRUE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002335 }
2336
2337 /* if application wants to discover service */
2338 if ( bta_dm_search_cb.services )
2339 {
2340 /* initialize variables */
2341 bta_dm_search_cb.service_index = 0;
2342 bta_dm_search_cb.services_found = 0;
2343 bta_dm_search_cb.services_to_search = bta_dm_search_cb.services;
2344#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
2345 bta_dm_search_cb.uuid_to_search = bta_dm_search_cb.num_uuid;
2346#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08002347 if ((bta_dm_search_cb.p_btm_inq_info != NULL) &&
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07002348 bta_dm_search_cb.services != BTA_USER_SERVICE_MASK
The Android Open Source Project5738f832012-12-12 16:00:35 -08002349 &&(bta_dm_search_cb.sdp_search == FALSE))
2350 {
2351 /* check if EIR provides the information of supported services */
2352 bta_dm_eir_search_services( &bta_dm_search_cb.p_btm_inq_info->results,
2353 &bta_dm_search_cb.services_to_search,
2354 &bta_dm_search_cb.services_found );
2355 }
2356
2357 /* if seaching with EIR is not completed */
2358 if(bta_dm_search_cb.services_to_search)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002359 {
2360 /* check whether connection already exists to the device
2361 if connection exists, we don't have to wait for ACL
2362 link to go down to start search on next device */
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002363 if (BTM_IsAclConnectionUp(bta_dm_search_cb.peer_bdaddr, BT_TRANSPORT_BR_EDR))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002364 bta_dm_search_cb.wait_disc = FALSE;
2365 else
2366 bta_dm_search_cb.wait_disc = TRUE;
2367
2368#if (BLE_INCLUDED == TRUE && (defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE))
2369 if ( bta_dm_search_cb.p_btm_inq_info )
2370 {
Nitin Arorab4365c52015-06-25 18:30:09 -07002371 APPL_TRACE_DEBUG("%s p_btm_inq_info 0x%x results.device_type 0x%x services_to_search 0x%x",
2372 __func__,
The Android Open Source Project5738f832012-12-12 16:00:35 -08002373 bta_dm_search_cb.p_btm_inq_info,
2374 bta_dm_search_cb.p_btm_inq_info->results.device_type,
Nitin Arorab4365c52015-06-25 18:30:09 -07002375 bta_dm_search_cb.services_to_search);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002376 }
Chaojing Sune2805532015-04-22 13:40:21 -07002377
2378 if (transport == BT_TRANSPORT_LE)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002379 {
2380 if (bta_dm_search_cb.services_to_search & BTA_BLE_SERVICE_MASK)
2381 {
2382 //set the raw data buffer here
2383 memset(g_disc_raw_data_buf, 0, sizeof(g_disc_raw_data_buf));
2384 bta_dm_search_cb.p_ble_rawdata = g_disc_raw_data_buf;
2385
2386 bta_dm_search_cb.ble_raw_size = MAX_DISC_RAW_DATA_BUF;
2387 bta_dm_search_cb.ble_raw_used = 0;
2388
2389 /* start GATT for service discovery */
2390 btm_dm_start_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
2391 return;
2392 }
2393 }
2394 else
2395#endif
2396 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07002397 bta_dm_search_cb.sdp_results = FALSE;
2398 bta_dm_find_services(bta_dm_search_cb.peer_bdaddr);
2399 return;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002400 }
2401 }
2402 }
2403
2404 /* name discovery and service discovery are done for this device */
2405 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
2406 {
2407 p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
2408 /* initialize the data structure - includes p_raw_data and raw_data_size */
2409 memset(&(p_msg->disc_result.result), 0, sizeof(tBTA_DM_DISC_RES));
2410 p_msg->disc_result.result.disc_res.result = BTA_SUCCESS;
2411 p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
2412 bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
2413 BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
2414 (char*)bta_dm_search_cb.peer_name, (BD_NAME_LEN-1));
2415
2416 /* make sure the string is terminated */
2417 p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
2418
2419 bta_sys_sendmsg(p_msg);
2420 }
2421}
2422
2423/*******************************************************************************
2424**
2425** Function bta_dm_sdp_callback
2426**
2427** Description Callback from sdp with discovery status
2428**
2429** Returns void
2430**
2431*******************************************************************************/
2432static void bta_dm_sdp_callback (UINT16 sdp_status)
2433{
2434
2435 tBTA_DM_SDP_RESULT * p_msg;
2436
2437 if ((p_msg = (tBTA_DM_SDP_RESULT *) GKI_getbuf(sizeof(tBTA_DM_SDP_RESULT))) != NULL)
2438 {
2439 p_msg->hdr.event = BTA_DM_SDP_RESULT_EVT;
2440 p_msg->sdp_result = sdp_status;
2441 bta_sys_sendmsg(p_msg);
2442
2443 }
2444}
2445
2446/*******************************************************************************
2447**
2448** Function bta_dm_inq_results_cb
2449**
2450** Description Inquiry results callback from BTM
2451**
2452** Returns void
2453**
2454*******************************************************************************/
2455static void bta_dm_inq_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir)
2456{
2457
2458 tBTA_DM_SEARCH result;
2459 tBTM_INQ_INFO *p_inq_info;
2460 UINT16 service_class;
2461
2462 bdcpy(result.inq_res.bd_addr, p_inq->remote_bd_addr);
2463 memcpy(result.inq_res.dev_class, p_inq->dev_class, DEV_CLASS_LEN);
2464 BTM_COD_SERVICE_CLASS(service_class, p_inq->dev_class);
2465 result.inq_res.is_limited = (service_class & BTM_COD_SERVICE_LMTD_DISCOVER)?TRUE:FALSE;
2466 result.inq_res.rssi = p_inq->rssi;
2467
2468#if (BLE_INCLUDED == TRUE)
2469 result.inq_res.ble_addr_type = p_inq->ble_addr_type;
2470 result.inq_res.inq_result_type = p_inq->inq_result_type;
2471 result.inq_res.device_type = p_inq->device_type;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002472 result.inq_res.flag = p_inq->flag;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002473#endif
2474
2475 /* application will parse EIR to find out remote device name */
2476 result.inq_res.p_eir = p_eir;
2477
2478 if((p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr)) != NULL)
2479 {
2480 /* initialize remt_name_not_required to FALSE so that we get the name by default */
2481 result.inq_res.remt_name_not_required = FALSE;
2482
2483 }
2484
2485 if(bta_dm_search_cb.p_search_cback)
2486 bta_dm_search_cb.p_search_cback(BTA_DM_INQ_RES_EVT, &result);
2487
2488 if(p_inq_info)
2489 {
2490 /* application indicates if it knows the remote name, inside the callback
2491 copy that to the inquiry data base*/
2492 if(result.inq_res.remt_name_not_required)
2493 p_inq_info->appl_knows_rem_name = TRUE;
2494
2495 }
2496
2497
2498}
2499
2500
2501/*******************************************************************************
2502**
2503** Function bta_dm_inq_cmpl_cb
2504**
2505** Description Inquiry complete callback from BTM
2506**
2507** Returns void
2508**
2509*******************************************************************************/
2510static void bta_dm_inq_cmpl_cb (void * p_result)
2511{
The Android Open Source Project5738f832012-12-12 16:00:35 -08002512 tBTA_DM_MSG * p_msg;
2513
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07002514 if (bta_dm_search_cb.cancel_pending == FALSE)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002515 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07002516 APPL_TRACE_DEBUG("%s", __FUNCTION__);
2517 p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG));
2518 if (p_msg != NULL) {
2519 p_msg->inq_cmpl.hdr.event = BTA_DM_INQUIRY_CMPL_EVT;
2520 p_msg->inq_cmpl.num = ((tBTM_INQUIRY_CMPL *)p_result)->num_resp;
2521 bta_sys_sendmsg(p_msg);
2522 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002523 }
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07002524 else
2525 {
2526 bta_dm_search_cb.cancel_pending = FALSE;
2527 bta_dm_search_cancel_notify(NULL);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002528
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07002529 p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG));
2530 if (p_msg != NULL) {
2531 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
2532 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
2533 bta_sys_sendmsg(p_msg);
2534 }
2535 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002536}
2537
2538/*******************************************************************************
2539**
2540** Function bta_dm_service_search_remname_cback
2541**
2542** Description Remote name call back from BTM during service discovery
2543**
2544** Returns void
2545**
2546*******************************************************************************/
2547static void bta_dm_service_search_remname_cback (BD_ADDR bd_addr, DEV_CLASS dc, BD_NAME bd_name)
2548{
2549 tBTM_REMOTE_DEV_NAME rem_name;
2550 tBTM_STATUS btm_status;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002551 UNUSED(dc);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002552
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002553 APPL_TRACE_DEBUG("bta_dm_service_search_remname_cback name=<%s>", bd_name);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002554
2555 /* if this is what we are looking for */
2556 if (!bdcmp( bta_dm_search_cb.peer_bdaddr, bd_addr))
2557 {
2558 rem_name.length = strlen((char*)bd_name);
2559 if (rem_name.length > (BD_NAME_LEN-1))
2560 {
2561 rem_name.length = (BD_NAME_LEN-1);
2562 rem_name.remote_bd_name[(BD_NAME_LEN-1)] = 0;
2563 }
2564 BCM_STRNCPY_S((char*)rem_name.remote_bd_name, sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1));
2565 rem_name.status = BTM_SUCCESS;
2566
2567 bta_dm_remname_cback(&rem_name);
2568 }
2569 else
2570 {
2571 /* get name of device */
2572 btm_status = BTM_ReadRemoteDeviceName (bta_dm_search_cb.peer_bdaddr,
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002573 (tBTM_CMPL_CB *) bta_dm_remname_cback,
2574 BT_TRANSPORT_BR_EDR);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002575 if ( btm_status == BTM_BUSY )
2576 {
2577 /* wait for next chance(notification of remote name discovery done) */
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002578 APPL_TRACE_DEBUG("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName is busy");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002579 }
2580 else if ( btm_status != BTM_CMD_STARTED )
2581 {
2582 /* if failed to start getting remote name then continue */
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002583 APPL_TRACE_WARNING("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName returns 0x%02X", btm_status);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002584
2585 rem_name.length = 0;
2586 rem_name.remote_bd_name[0] = 0;
2587 rem_name.status = btm_status;
2588 bta_dm_remname_cback(&rem_name);
2589 }
2590 }
2591}
2592
2593
2594/*******************************************************************************
2595**
2596** Function bta_dm_remname_cback
2597**
2598** Description Remote name complete call back from BTM
2599**
2600** Returns void
2601**
2602*******************************************************************************/
2603static void bta_dm_remname_cback (tBTM_REMOTE_DEV_NAME *p_remote_name)
2604{
2605 tBTA_DM_REM_NAME * p_msg;
2606
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002607 APPL_TRACE_DEBUG("bta_dm_remname_cback len = %d name=<%s>", p_remote_name->length,
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002608 p_remote_name->remote_bd_name);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002609
2610 /* remote name discovery is done but it could be failed */
2611 bta_dm_search_cb.name_discover_done = TRUE;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002612 BCM_STRNCPY_S((char*)bta_dm_search_cb.peer_name, sizeof(BD_NAME), (char*)p_remote_name->remote_bd_name, (BD_NAME_LEN));
2613 bta_dm_search_cb.peer_name[BD_NAME_LEN]=0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002614
2615 BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002616
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002617#if BLE_INCLUDED == TRUE
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002618 if (bta_dm_search_cb.transport == BT_TRANSPORT_LE )
2619 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07002620 GAP_BleReadPeerPrefConnParams (bta_dm_search_cb.peer_bdaddr);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002621 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002622#endif
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07002623
The Android Open Source Project5738f832012-12-12 16:00:35 -08002624 if ((p_msg = (tBTA_DM_REM_NAME *) GKI_getbuf(sizeof(tBTA_DM_REM_NAME))) != NULL)
2625 {
2626 bdcpy (p_msg->result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002627 BCM_STRNCPY_S((char*)p_msg->result.disc_res.bd_name, sizeof(BD_NAME), (char*)p_remote_name->remote_bd_name, (BD_NAME_LEN));
The Android Open Source Project5738f832012-12-12 16:00:35 -08002628
2629 /* make sure the string is null terminated */
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002630 p_msg->result.disc_res.bd_name[BD_NAME_LEN] = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002631
2632 p_msg->hdr.event = BTA_DM_REMT_NAME_EVT;
2633 bta_sys_sendmsg(p_msg);
2634
2635 }
2636}
2637
2638/*******************************************************************************
2639**
2640** Function bta_dm_authorize_cback
2641**
2642** Description cback requesting authorization
2643**
2644** Returns void
2645**
2646*******************************************************************************/
2647static UINT8 bta_dm_authorize_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name,
2648 UINT8 *service_name, UINT8 service_id, BOOLEAN is_originator)
2649{
2650 tBTA_DM_SEC sec_event;
2651 UINT8 index = 1;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002652 UNUSED(service_name);
2653 UNUSED(is_originator);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002654
2655 bdcpy(sec_event.authorize.bd_addr, bd_addr);
2656 memcpy(sec_event.authorize.dev_class, dev_class, DEV_CLASS_LEN);
2657
2658 BCM_STRNCPY_S((char*)sec_event.authorize.bd_name, sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1));
2659
2660 /* make sure the string is null terminated */
2661 sec_event.authorize.bd_name[BD_NAME_LEN-1] = 0;
2662
2663#if ( defined(BTA_JV_INCLUDED) && BTA_JV_INCLUDED == TRUE )
2664 sec_event.authorize.service = service_id;
2665#endif
2666
2667 while(index < BTA_MAX_SERVICE_ID)
2668 {
2669 /* get the BTA service id corresponding to BTM id */
2670 if(bta_service_id_to_btm_srv_id_lkup_tbl[index] == service_id)
2671 {
2672 sec_event.authorize.service = index;
2673 break;
2674 }
2675 index++;
2676 }
2677
2678
2679 /* if supported service callback otherwise not authorized */
2680 if(bta_dm_cb.p_sec_cback && (index < BTA_MAX_SERVICE_ID
2681#if ( defined(BTA_JV_INCLUDED) && BTA_JV_INCLUDED == TRUE )
2682 /* pass through JV service ID */
2683 || (service_id >= BTA_FIRST_JV_SERVICE_ID && service_id <= BTA_LAST_JV_SERVICE_ID)
2684#endif
2685 ))
2686 {
2687 bta_dm_cb.p_sec_cback(BTA_DM_AUTHORIZE_EVT, &sec_event);
2688 return BTM_CMD_STARTED;
2689 }
2690 else
2691 {
2692 return BTM_NOT_AUTHORIZED;
2693 }
2694}
2695
2696
2697
2698
2699
2700/*******************************************************************************
2701**
2702** Function bta_dm_pinname_cback
2703**
2704** Description Callback requesting pin_key
2705**
2706** Returns void
2707**
2708*******************************************************************************/
2709static void bta_dm_pinname_cback (void *p_data)
2710{
2711 tBTM_REMOTE_DEV_NAME *p_result = (tBTM_REMOTE_DEV_NAME *)p_data;
2712 tBTA_DM_SEC sec_event;
2713 UINT32 bytes_to_copy;
2714 tBTA_DM_SEC_EVT event = bta_dm_cb.pin_evt;
2715
2716 if (BTA_DM_SP_CFM_REQ_EVT == event)
2717 {
Andre Eisenbach181d0752013-06-11 14:18:21 -07002718 /* Retrieved saved device class and bd_addr */
2719 bdcpy(sec_event.cfm_req.bd_addr, bta_dm_cb.pin_bd_addr);
2720 BTA_COPY_DEVICE_CLASS(sec_event.cfm_req.dev_class, bta_dm_cb.pin_dev_class);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002721
Andre Eisenbach181d0752013-06-11 14:18:21 -07002722 if (p_result && p_result->status == BTM_SUCCESS)
2723 {
2724 bytes_to_copy = (p_result->length < (BD_NAME_LEN-1))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002725 ? p_result->length : (BD_NAME_LEN-1);
Andre Eisenbach181d0752013-06-11 14:18:21 -07002726 memcpy(sec_event.cfm_req.bd_name, p_result->remote_bd_name, bytes_to_copy);
2727 sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0;
2728 }
2729 else /* No name found */
2730 sec_event.cfm_req.bd_name[0] = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002731
Andre Eisenbach181d0752013-06-11 14:18:21 -07002732 sec_event.key_notif.passkey = bta_dm_cb.num_val; /* get PIN code numeric number */
The Android Open Source Project5738f832012-12-12 16:00:35 -08002733
2734 /* 1 additional event data fields for this event */
2735 sec_event.cfm_req.just_works = bta_dm_cb.just_works;
2736 }
2737 else
2738 {
Andre Eisenbach181d0752013-06-11 14:18:21 -07002739 /* Retrieved saved device class and bd_addr */
2740 bdcpy(sec_event.pin_req.bd_addr, bta_dm_cb.pin_bd_addr);
2741 BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, bta_dm_cb.pin_dev_class);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002742
Andre Eisenbach181d0752013-06-11 14:18:21 -07002743 if (p_result && p_result->status == BTM_SUCCESS)
2744 {
2745 bytes_to_copy = (p_result->length < (BD_NAME_LEN-1))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002746 ? p_result->length : (BD_NAME_LEN-1);
Andre Eisenbach181d0752013-06-11 14:18:21 -07002747 memcpy(sec_event.pin_req.bd_name, p_result->remote_bd_name, bytes_to_copy);
2748 sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0;
2749 }
2750 else /* No name found */
2751 sec_event.pin_req.bd_name[0] = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002752
Andre Eisenbach181d0752013-06-11 14:18:21 -07002753 event = bta_dm_cb.pin_evt;
2754 sec_event.key_notif.passkey = bta_dm_cb.num_val; /* get PIN code numeric number */
The Android Open Source Project5738f832012-12-12 16:00:35 -08002755 }
2756
2757 if( bta_dm_cb.p_sec_cback )
2758 bta_dm_cb.p_sec_cback(event, &sec_event);
2759}
2760
The Android Open Source Project5738f832012-12-12 16:00:35 -08002761/*******************************************************************************
2762**
2763** Function bta_dm_pin_cback
2764**
2765** Description Callback requesting pin_key
2766**
2767** Returns void
2768**
2769*******************************************************************************/
Casper Bonde818d0f22015-05-21 11:08:45 +02002770static UINT8 bta_dm_pin_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name,
2771 BOOLEAN min_16_digit)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002772{
2773 tBTA_DM_SEC sec_event;
2774
2775 if (!bta_dm_cb.p_sec_cback)
2776 return BTM_NOT_AUTHORIZED;
2777
2778 /* If the device name is not known, save bdaddr and devclass and initiate a name request */
2779 if (bd_name[0] == 0)
2780 {
2781 bta_dm_cb.pin_evt = BTA_DM_PIN_REQ_EVT;
2782 bdcpy(bta_dm_cb.pin_bd_addr, bd_addr);
2783 BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, dev_class);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002784 if ((BTM_ReadRemoteDeviceName(bd_addr, bta_dm_pinname_cback, BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002785 return BTM_CMD_STARTED;
2786
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002787 APPL_TRACE_WARNING(" bta_dm_pin_cback() -> Failed to start Remote Name Request ");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002788 }
2789
2790 bdcpy(sec_event.pin_req.bd_addr, bd_addr);
2791 BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, dev_class);
2792 BCM_STRNCPY_S((char*)sec_event.pin_req.bd_name, sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1));
2793 sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0;
Casper Bonde818d0f22015-05-21 11:08:45 +02002794 sec_event.pin_req.min_16_digit = min_16_digit;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002795
2796 bta_dm_cb.p_sec_cback(BTA_DM_PIN_REQ_EVT, &sec_event);
2797 return BTM_CMD_STARTED;
2798}
2799
The Android Open Source Project5738f832012-12-12 16:00:35 -08002800/*******************************************************************************
2801**
2802** Function bta_dm_new_link_key_cback
2803**
2804** Description Callback from BTM to notify new link key
2805**
2806** Returns void
2807**
2808*******************************************************************************/
2809static UINT8 bta_dm_new_link_key_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,
2810 BD_NAME bd_name, LINK_KEY key, UINT8 key_type)
2811{
2812 tBTA_DM_SEC sec_event;
2813 tBTA_DM_AUTH_CMPL *p_auth_cmpl;
2814 UINT8 event;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002815 UNUSED(dev_class);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002816
2817 memset (&sec_event, 0, sizeof(tBTA_DM_SEC));
2818
2819 /* Not AMP Key type */
2820 if (key_type != HCI_LKEY_TYPE_AMP_WIFI && key_type != HCI_LKEY_TYPE_AMP_UWB)
2821 {
2822 event = BTA_DM_AUTH_CMPL_EVT;
2823 p_auth_cmpl = &sec_event.auth_cmpl;
2824
2825 bdcpy(p_auth_cmpl->bd_addr, bd_addr);
2826
2827 memcpy(p_auth_cmpl->bd_name, bd_name, (BD_NAME_LEN-1));
2828 p_auth_cmpl->bd_name[BD_NAME_LEN-1] = 0;
2829
2830 p_auth_cmpl->key_present = TRUE;
2831 p_auth_cmpl->key_type = key_type;
2832 p_auth_cmpl->success = TRUE;
2833
2834 memcpy(p_auth_cmpl->key, key, LINK_KEY_LEN);
2835 sec_event.auth_cmpl.fail_reason = HCI_SUCCESS;
2836
Andre Eisenbach12871662015-05-08 17:42:10 -07002837#if BLE_INCLUDED == TRUE
Chaojing Sune2805532015-04-22 13:40:21 -07002838 // Report the BR link key based on the BR/EDR address and type
2839 BTM_ReadDevInfo(bd_addr, &sec_event.auth_cmpl.dev_type, &sec_event.auth_cmpl.addr_type);
Andre Eisenbach12871662015-05-08 17:42:10 -07002840#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08002841 if(bta_dm_cb.p_sec_cback)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002842 bta_dm_cb.p_sec_cback(event, &sec_event);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002843 }
2844 else
2845 {
Chaojing Sune2805532015-04-22 13:40:21 -07002846 APPL_TRACE_WARNING("%s() Received AMP Key", __func__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002847 }
2848
2849 return BTM_CMD_STARTED;
2850}
2851
2852
2853/*******************************************************************************
2854**
2855** Function bta_dm_authentication_complete_cback
2856**
2857** Description Authentication complete callback from BTM
2858**
2859** Returns void
2860**
2861*******************************************************************************/
2862static UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,BD_NAME bd_name, int result)
2863{
The Android Open Source Project5738f832012-12-12 16:00:35 -08002864 tBTA_DM_SEC sec_event;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002865 UNUSED(dev_class);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002866
2867 if(result != BTM_SUCCESS)
2868 {
2869 memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
2870 bdcpy(sec_event.auth_cmpl.bd_addr, bd_addr);
2871
2872 memcpy(sec_event.auth_cmpl.bd_name, bd_name, (BD_NAME_LEN-1));
2873 sec_event.auth_cmpl.bd_name[BD_NAME_LEN-1] = 0;
2874
Andre Eisenbach12871662015-05-08 17:42:10 -07002875#if BLE_INCLUDED == TRUE
Chaojing Sune2805532015-04-22 13:40:21 -07002876 // Report the BR link key based on the BR/EDR address and type
2877 BTM_ReadDevInfo(bd_addr, &sec_event.auth_cmpl.dev_type, &sec_event.auth_cmpl.addr_type);
Andre Eisenbach12871662015-05-08 17:42:10 -07002878#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08002879 sec_event.auth_cmpl.fail_reason = (UINT8)result;
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07002880
Chaojing Sune2805532015-04-22 13:40:21 -07002881 if(bta_dm_cb.p_sec_cback)
2882 bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
2883
2884 bta_dm_remove_sec_dev_entry(bd_addr);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002885 }
2886
2887 return BTM_SUCCESS;
2888}
2889
2890/*******************************************************************************
2891**
2892** Function bta_dm_sp_cback
2893**
2894** Description simple pairing callback from BTM
2895**
2896** Returns void
2897**
2898*******************************************************************************/
2899static UINT8 bta_dm_sp_cback (tBTM_SP_EVT event, tBTM_SP_EVT_DATA *p_data)
2900{
2901 tBTM_STATUS status = BTM_CMD_STARTED;
2902 tBTA_DM_SEC sec_event;
2903 tBTA_DM_SEC_EVT pin_evt = BTA_DM_SP_KEY_NOTIF_EVT;
2904
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002905 APPL_TRACE_EVENT("bta_dm_sp_cback: %d", event);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002906 if (!bta_dm_cb.p_sec_cback)
2907 return BTM_NOT_AUTHORIZED;
2908
2909 /* TODO_SP */
2910 switch(event)
2911 {
2912 case BTM_SP_IO_REQ_EVT:
2913#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
2914 /* translate auth_req */
2915 bta_dm_co_io_req(p_data->io_req.bd_addr, &p_data->io_req.io_cap,
2916 &p_data->io_req.oob_data, &p_data->io_req.auth_req, p_data->io_req.is_orig);
2917#endif
2918#if BTM_OOB_INCLUDED == FALSE
2919 status = BTM_SUCCESS;
2920#endif
2921
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002922 APPL_TRACE_EVENT("io mitm: %d oob_data:%d", p_data->io_req.auth_req, p_data->io_req.oob_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002923 break;
2924 case BTM_SP_IO_RSP_EVT:
2925#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
2926 bta_dm_co_io_rsp(p_data->io_rsp.bd_addr, p_data->io_rsp.io_cap,
2927 p_data->io_rsp.oob_data, p_data->io_rsp.auth_req );
2928#endif
2929 break;
2930
2931 case BTM_SP_CFM_REQ_EVT:
2932 pin_evt = BTA_DM_SP_CFM_REQ_EVT;
2933 bta_dm_cb.just_works = sec_event.cfm_req.just_works = p_data->cfm_req.just_works;
2934 sec_event.cfm_req.loc_auth_req = p_data->cfm_req.loc_auth_req;
2935 sec_event.cfm_req.rmt_auth_req = p_data->cfm_req.rmt_auth_req;
2936 sec_event.cfm_req.loc_io_caps = p_data->cfm_req.loc_io_caps;
2937 sec_event.cfm_req.rmt_io_caps = p_data->cfm_req.rmt_io_caps;
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07002938
The Android Open Source Project5738f832012-12-12 16:00:35 -08002939 /* continue to next case */
2940#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
2941 /* Passkey entry mode, mobile device with output capability is very
2942 unlikely to receive key request, so skip this event */
2943 /*case BTM_SP_KEY_REQ_EVT: */
2944 case BTM_SP_KEY_NOTIF_EVT:
2945#endif
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002946 if(BTM_SP_CFM_REQ_EVT == event)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002947 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002948 /* Due to the switch case falling through below to BTM_SP_KEY_NOTIF_EVT,
2949 call remote name request using values from cfm_req */
2950 if(p_data->cfm_req.bd_name[0] == 0)
2951 {
2952 bta_dm_cb.pin_evt = pin_evt;
2953 bdcpy(bta_dm_cb.pin_bd_addr, p_data->cfm_req.bd_addr);
2954 BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->cfm_req.dev_class);
2955 if ((BTM_ReadRemoteDeviceName(p_data->cfm_req.bd_addr, bta_dm_pinname_cback,
2956 BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
2957 return BTM_CMD_STARTED;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002958 APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request ");
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002959 }
2960 else
2961 {
2962 /* Due to the switch case falling through below to BTM_SP_KEY_NOTIF_EVT,
2963 copy these values into key_notif from cfm_req */
2964 bdcpy(sec_event.key_notif.bd_addr, p_data->cfm_req.bd_addr);
2965 BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->cfm_req.dev_class);
2966 BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME),
2967 (char*)p_data->cfm_req.bd_name, (BD_NAME_LEN-1));
2968 sec_event.key_notif.bd_name[BD_NAME_LEN-1] = 0;
2969 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002970 }
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002971
2972 bta_dm_cb.num_val = sec_event.key_notif.passkey = p_data->key_notif.passkey;
2973 if (BTM_SP_KEY_NOTIF_EVT == event)
2974 {
2975 /* If the device name is not known, save bdaddr and devclass
2976 and initiate a name request with values from key_notif */
2977 if(p_data->key_notif.bd_name[0] == 0)
2978 {
2979 bta_dm_cb.pin_evt = pin_evt;
2980 bdcpy(bta_dm_cb.pin_bd_addr, p_data->key_notif.bd_addr);
2981 BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->key_notif.dev_class);
2982 if ((BTM_ReadRemoteDeviceName(p_data->key_notif.bd_addr, bta_dm_pinname_cback,
2983 BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
2984 return BTM_CMD_STARTED;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002985 APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request ");
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002986 }
2987 else
2988 {
2989 bdcpy(sec_event.key_notif.bd_addr, p_data->key_notif.bd_addr);
2990 BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->key_notif.dev_class);
2991 BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME),
2992 (char*)p_data->key_notif.bd_name, (BD_NAME_LEN-1));
2993 sec_event.key_notif.bd_name[BD_NAME_LEN-1] = 0;
2994 }
2995 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002996
2997 bta_dm_cb.p_sec_cback(pin_evt, &sec_event);
2998
2999 break;
3000
3001#if BTM_OOB_INCLUDED == TRUE
3002 case BTM_SP_LOC_OOB_EVT:
3003 bta_dm_co_loc_oob((BOOLEAN)(p_data->loc_oob.status == BTM_SUCCESS),
3004 p_data->loc_oob.c, p_data->loc_oob.r);
3005 break;
3006
3007 case BTM_SP_RMT_OOB_EVT:
3008 /* If the device name is not known, save bdaddr and devclass and initiate a name request */
3009 if (p_data->rmt_oob.bd_name[0] == 0)
3010 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003011 bta_dm_cb.pin_evt = BTA_DM_SP_RMT_OOB_EVT;
3012 bdcpy(bta_dm_cb.pin_bd_addr, p_data->rmt_oob.bd_addr);
3013 BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->rmt_oob.dev_class);
3014 if ((BTM_ReadRemoteDeviceName(p_data->rmt_oob.bd_addr, bta_dm_pinname_cback,
3015 BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
3016 return BTM_CMD_STARTED;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003017 APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request ");
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003018 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003019
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003020 bdcpy(sec_event.rmt_oob.bd_addr, p_data->rmt_oob.bd_addr);
3021 BTA_COPY_DEVICE_CLASS(sec_event.rmt_oob.dev_class, p_data->rmt_oob.dev_class);
3022 BCM_STRNCPY_S((char*)sec_event.rmt_oob.bd_name, sizeof(BD_NAME), (char*)p_data->rmt_oob.bd_name, (BD_NAME_LEN-1));
The Android Open Source Project5738f832012-12-12 16:00:35 -08003023 sec_event.rmt_oob.bd_name[BD_NAME_LEN-1] = 0;
3024
3025 bta_dm_cb.p_sec_cback(BTA_DM_SP_RMT_OOB_EVT, &sec_event);
3026
3027 bta_dm_co_rmt_oob(p_data->rmt_oob.bd_addr);
3028 break;
3029#endif
3030 case BTM_SP_COMPLT_EVT:
3031 /* do not report this event - handled by link_key_callback or auth_complete_callback */
3032 break;
3033
3034 case BTM_SP_KEYPRESS_EVT:
3035 memcpy(&sec_event.key_press, &p_data->key_press, sizeof(tBTM_SP_KEYPRESS));
3036 bta_dm_cb.p_sec_cback(BTA_DM_SP_KEYPRESS_EVT, &sec_event);
3037 break;
3038
3039 case BTM_SP_UPGRADE_EVT:
3040 bta_dm_co_lk_upgrade(p_data->upgrade.bd_addr, &p_data->upgrade.upgrade );
3041 break;
3042
3043 default:
3044 status = BTM_NOT_AUTHORIZED;
3045 break;
3046 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003047 APPL_TRACE_EVENT("dm status: %d", status);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003048 return status;
3049}
3050
3051/*******************************************************************************
3052**
3053** Function bta_dm_local_name_cback
3054**
3055** Description Callback from btm after local name is read
3056**
3057**
3058** Returns void
3059**
3060*******************************************************************************/
3061static void bta_dm_local_name_cback(UINT8 *p_name)
3062{
3063 tBTA_DM_SEC sec_event;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08003064 UNUSED(p_name);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003065
The Android Open Source Project5738f832012-12-12 16:00:35 -08003066 sec_event.enable.status = BTA_SUCCESS;
3067
3068 if(bta_dm_cb.p_sec_cback)
3069 bta_dm_cb.p_sec_cback(BTA_DM_ENABLE_EVT, &sec_event);
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -07003070
The Android Open Source Project5738f832012-12-12 16:00:35 -08003071}
3072
3073/*******************************************************************************
3074**
The Android Open Source Project5738f832012-12-12 16:00:35 -08003075** Function bta_dm_bl_change_cback
3076**
3077** Description Callback from btm when acl connection goes up or down
3078**
3079**
3080** Returns void
3081**
3082*******************************************************************************/
3083static void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data)
3084{
The Android Open Source Project5738f832012-12-12 16:00:35 -08003085 tBTA_DM_ACL_CHANGE * p_msg;
3086
3087 if ((p_msg = (tBTA_DM_ACL_CHANGE *) GKI_getbuf(sizeof(tBTA_DM_ACL_CHANGE))) != NULL)
3088 {
3089 p_msg->event = p_data->event;
3090 p_msg->is_new = FALSE;
3091
3092 switch(p_msg->event)
3093 {
3094 case BTM_BL_CONN_EVT:
3095 p_msg->is_new = TRUE;
3096 bdcpy(p_msg->bd_addr, p_data->conn.p_bda);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003097#if BLE_INCLUDED == TRUE
3098 p_msg->transport = p_data->conn.transport;
3099 p_msg->handle = p_data->conn.handle;
3100#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08003101 break;
3102 case BTM_BL_DISCN_EVT:
3103 bdcpy(p_msg->bd_addr, p_data->discn.p_bda);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003104#if BLE_INCLUDED == TRUE
3105 p_msg->transport = p_data->discn.transport;
3106 p_msg->handle = p_data->discn.handle;
3107#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08003108 break;
3109 case BTM_BL_UPDATE_EVT:
3110 p_msg->busy_level = p_data->update.busy_level;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003111 p_msg->busy_level_flags = p_data->update.busy_level_flags;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003112 break;
3113 case BTM_BL_ROLE_CHG_EVT:
3114 p_msg->new_role = p_data->role_chg.new_role;
3115 p_msg->hci_status = p_data->role_chg.hci_status;
3116 bdcpy(p_msg->bd_addr, p_data->role_chg.p_bda);
3117 break;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003118 case BTM_BL_COLLISION_EVT:
3119 bdcpy(p_msg->bd_addr, p_data->conn.p_bda);
3120 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003121 }
3122
3123 p_msg->hdr.event = BTA_DM_ACL_CHANGE_EVT;
3124 bta_sys_sendmsg(p_msg);
3125
3126 }
3127
3128}
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003129
3130/*******************************************************************************
3131**
3132** Function bta_dm_acl_change_cback
3133**
3134** Description Callback from btm when acl connection goes up or down
3135**
3136**
3137** Returns void
3138**
3139*******************************************************************************/
3140#if BLE_INCLUDED == TRUE
3141static void bta_dm_acl_change_cback(BD_ADDR p_bda, DEV_CLASS p_dc, BD_NAME p_bdn,
3142 UINT8 *features, BOOLEAN is_new,UINT16 handle,
3143 tBT_TRANSPORT transport)
3144#else
3145static void bta_dm_acl_change_cback(BD_ADDR p_bda, DEV_CLASS p_dc, BD_NAME p_bdn,
3146 UINT8 *features, BOOLEAN is_new)
3147#endif
3148{
3149 tBTA_DM_ACL_CHANGE *p_msg = (tBTA_DM_ACL_CHANGE *) GKI_getbuf(sizeof(tBTA_DM_ACL_CHANGE));
3150 if (p_msg != NULL)
3151 {
3152 memset(p_msg, 0, sizeof(tBTA_DM_ACL_CHANGE));
3153
3154 bdcpy(p_msg->bd_addr, p_bda);
3155 p_msg->is_new = is_new;
3156#if BLE_INCLUDED == TRUE
3157 p_msg->handle = handle;
3158 p_msg->transport = transport;
3159#endif
3160 /* This is collision case */
3161 if (features != NULL)
3162 {
3163 if ((features[0] == 0xFF) && !is_new)
3164 p_msg->event = BTM_BL_COLLISION_EVT;
3165 }
3166
3167 p_msg->hdr.event = BTA_DM_ACL_CHANGE_EVT;
3168 bta_sys_sendmsg(p_msg);
3169 }
3170}
3171
3172
The Android Open Source Project5738f832012-12-12 16:00:35 -08003173/*******************************************************************************
3174**
3175** Function bta_dm_rs_cback
3176**
3177** Description Receives the role switch complete event
3178**
3179** Returns
3180**
3181*******************************************************************************/
3182static void bta_dm_rs_cback (tBTM_ROLE_SWITCH_CMPL *p1)
3183{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08003184 UNUSED(p1);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003185 APPL_TRACE_WARNING("bta_dm_rs_cback:%d", bta_dm_cb.rs_event);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003186 if(bta_dm_cb.rs_event == BTA_DM_API_SEARCH_EVT)
3187 {
3188 bta_dm_cb.search_msg.rs_res = BTA_DM_RS_OK; /* do not care about the result for now */
3189 bta_dm_cb.rs_event = 0;
3190 bta_dm_search_start((tBTA_DM_MSG *)&bta_dm_cb.search_msg);
3191 }
3192}
3193
3194/*******************************************************************************
3195**
3196** Function bta_dm_check_av
3197**
3198** Description This function checks if AV is active
3199** if yes, make sure the AV link is master
3200**
3201** Returns BOOLEAN - TRUE, if switch is in progress
3202**
3203*******************************************************************************/
3204static BOOLEAN bta_dm_check_av(UINT16 event)
3205{
Mattias Agren9647e912013-04-08 12:23:42 +02003206 BOOLEAN avoid_roleswitch = FALSE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003207 BOOLEAN switching = FALSE;
3208 UINT8 i;
3209 tBTA_DM_PEER_DEVICE *p_dev;
3210
Mattias Agren9647e912013-04-08 12:23:42 +02003211#if defined(BTA_DM_AVOID_A2DP_ROLESWITCH_ON_INQUIRY) && (BTA_DM_AVOID_A2DP_ROLESWITCH_ON_INQUIRY == TRUE)
3212
3213 /* avoid role switch upon inquiry if a2dp is actively streaming as it
3214 introduces an audioglitch due to FW scheduling delays (unavoidable) */
3215 if (event == BTA_DM_API_SEARCH_EVT)
3216 {
3217 avoid_roleswitch = TRUE;
3218 }
3219#endif
3220
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003221 APPL_TRACE_WARNING("bta_dm_check_av:%d", bta_dm_cb.cur_av_count);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003222 if(bta_dm_cb.cur_av_count)
3223 {
3224 for(i=0; i<bta_dm_cb.device_list.count; i++)
3225 {
3226 p_dev = &bta_dm_cb.device_list.peer_device[i];
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003227 APPL_TRACE_WARNING("[%d]: state:%d, info:x%x, avoid_rs %d",
Mattias Agren9647e912013-04-08 12:23:42 +02003228 i, p_dev->conn_state, p_dev->info, avoid_roleswitch);
3229 if((p_dev->conn_state == BTA_DM_CONNECTED) && (p_dev->info & BTA_DM_DI_AV_ACTIVE) &&
3230 (avoid_roleswitch == FALSE))
The Android Open Source Project5738f832012-12-12 16:00:35 -08003231 {
3232 /* make master and take away the role switch policy */
3233 if(BTM_CMD_STARTED == BTM_SwitchRole (p_dev->peer_bdaddr, HCI_ROLE_MASTER, (tBTM_CMPL_CB *)bta_dm_rs_cback))
3234 {
3235 /* the role switch command is actually sent */
3236 bta_dm_cb.rs_event = event;
3237 switching = TRUE;
3238 }
3239 /* else either already master or can not switch for some reasons */
3240 bta_dm_policy_cback(BTA_SYS_PLCY_CLR, 0, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_dev->peer_bdaddr);
3241 break;
3242 }
3243 }
3244 }
3245 return switching;
3246}
3247
3248/*******************************************************************************
3249**
3250** Function bta_dm_acl_change
3251**
3252** Description Process BTA_DM_ACL_CHANGE_EVT
3253**
3254**
3255** Returns void
3256**
3257*******************************************************************************/
3258void bta_dm_acl_change(tBTA_DM_MSG *p_data)
3259{
3260
3261 UINT8 i;
3262 UINT8 *p;
3263 tBTA_DM_SEC conn;
3264 BOOLEAN is_new = p_data->acl_change.is_new;
3265 BD_ADDR_PTR p_bda = p_data->acl_change.bd_addr;
3266 BOOLEAN need_policy_change = FALSE;
3267 BOOLEAN issue_unpair_cb = FALSE;
3268
The Android Open Source Project5738f832012-12-12 16:00:35 -08003269 tBTA_DM_PEER_DEVICE *p_dev;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003270 memset(&conn, 0, sizeof(tBTA_DM_SEC));
The Android Open Source Project5738f832012-12-12 16:00:35 -08003271
3272 switch(p_data->acl_change.event)
3273 {
3274 case BTM_BL_UPDATE_EVT: /* busy level update */
3275 if( bta_dm_cb.p_sec_cback )
3276 {
3277 conn.busy_level.level = p_data->acl_change.busy_level;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003278 conn.busy_level.level_flags = p_data->acl_change.busy_level_flags;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003279 bta_dm_cb.p_sec_cback(BTA_DM_BUSY_LEVEL_EVT, &conn);
3280 }
3281 return;
3282
3283 case BTM_BL_ROLE_CHG_EVT: /* role change event */
3284 p_dev = bta_dm_find_peer_device(p_bda);
3285 if(p_dev)
3286 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003287 APPL_TRACE_DEBUG("bta_dm_acl_change role chg info:x%x new_role:%d dev count:%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003288 p_dev->info, p_data->acl_change.new_role, bta_dm_cb.device_list.count);
3289 if(p_dev->info & BTA_DM_DI_AV_ACTIVE)
3290 {
3291 /* there's AV activity on this link */
3292 if(p_data->acl_change.new_role == HCI_ROLE_SLAVE && bta_dm_cb.device_list.count > 1
3293 && p_data->acl_change.hci_status == HCI_SUCCESS)
3294 {
3295 /* more than one connections and the AV connection is role switched to slave
3296 * switch it back to master and remove the switch policy */
3297 BTM_SwitchRole(p_bda, BTM_ROLE_MASTER, NULL);
3298 need_policy_change = TRUE;
3299 }
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003300 else if (p_bta_dm_cfg->avoid_scatter && (p_data->acl_change.new_role == HCI_ROLE_MASTER))
The Android Open Source Project5738f832012-12-12 16:00:35 -08003301 {
3302 /* if the link updated to be master include AV activities, remove the switch policy */
3303 need_policy_change = TRUE;
3304 }
3305
3306 if(need_policy_change)
3307 {
3308 bta_dm_policy_cback(BTA_SYS_PLCY_CLR, 0, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_dev->peer_bdaddr);
3309 }
3310 }
3311 else
3312 {
3313 /* there's AV no activity on this link and role switch happened
3314 * check if AV is active
3315 * if so, make sure the AV link is master */
3316 bta_dm_check_av(0);
3317 }
3318 bta_sys_notify_role_chg(p_data->acl_change.bd_addr, p_data->acl_change.new_role, p_data->acl_change.hci_status);
3319 bdcpy(conn.role_chg.bd_addr, p_bda);
3320 conn.role_chg.new_role = (UINT8) p_data->acl_change.new_role;
3321 if( bta_dm_cb.p_sec_cback )
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003322 bta_dm_cb.p_sec_cback(BTA_DM_ROLE_CHG_EVT, (tBTA_DM_SEC *)&conn);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003323 }
3324 return;
3325 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003326
3327 /* Collision report from Stack: Notify profiles */
3328 if (p_data->acl_change.event == BTM_BL_COLLISION_EVT)
3329 {
3330 bta_sys_notify_collision (p_bda);
3331 return;
3332 }
3333
3334 if(is_new)
3335 {
3336 for(i=0; i<bta_dm_cb.device_list.count; i++)
3337 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003338 if (!bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda)
3339#if BLE_INCLUDED == TRUE
3340 && bta_dm_cb.device_list.peer_device[i].conn_handle == p_data->acl_change.handle
3341#endif
3342 )
The Android Open Source Project5738f832012-12-12 16:00:35 -08003343 break;
3344
3345 }
3346
3347 if(i == bta_dm_cb.device_list.count)
3348 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003349 if (bta_dm_cb.device_list.count < BTA_DM_NUM_PEER_DEVICE)
3350 {
3351 bdcpy(bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].peer_bdaddr, p_bda);
3352 bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].link_policy = bta_dm_cb.cur_policy;
3353 bta_dm_cb.device_list.count++;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003354#if BLE_INCLUDED == TRUE
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003355 bta_dm_cb.device_list.peer_device[i].conn_handle = p_data->acl_change.handle;
3356 if (p_data->acl_change.transport == BT_TRANSPORT_LE)
3357 bta_dm_cb.device_list.le_count++;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003358#endif
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003359 } else {
3360 APPL_TRACE_ERROR("%s max active connection reached, no resources", __func__);
3361 return;
3362 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003363 }
3364
3365 bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_CONNECTED;
3366 bta_dm_cb.device_list.peer_device[i].pref_role = BTA_ANY_ROLE;
3367 bdcpy(conn.link_up.bd_addr, p_bda);
3368 bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_NONE;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003369#if BLE_INCLUDED == TRUE
3370 conn.link_up.link_type = p_data->acl_change.transport;
3371 bta_dm_cb.device_list.peer_device[i].transport = p_data->acl_change.transport;
3372#endif
3373
3374 if (((NULL != (p = BTM_ReadLocalFeatures ())) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) &&
3375 ((NULL != (p = BTM_ReadRemoteFeatures (p_bda))) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)))
The Android Open Source Project5738f832012-12-12 16:00:35 -08003376 {
3377 /* both local and remote devices support SSR */
3378 bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_USE_SSR;
3379 }
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003380 APPL_TRACE_WARNING("%s info: 0x%x", __func__, bta_dm_cb.device_list.peer_device[i].info);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003381
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003382 if (bta_dm_cb.p_sec_cback)
3383 bta_dm_cb.p_sec_cback(BTA_DM_LINK_UP_EVT, (tBTA_DM_SEC *)&conn);
3384 } else {
The Android Open Source Project5738f832012-12-12 16:00:35 -08003385 for(i=0; i<bta_dm_cb.device_list.count; i++)
3386 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003387 if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda)
3388#if BLE_INCLUDED == TRUE
3389 ||bta_dm_cb.device_list.peer_device[i].transport != p_data->acl_change.transport
3390#endif
3391 )
The Android Open Source Project5738f832012-12-12 16:00:35 -08003392 continue;
3393
3394 if( bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_UNPAIRING )
3395 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003396 if (BTM_SecDeleteDevice(bta_dm_cb.device_list.peer_device[i].peer_bdaddr))
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003397 issue_unpair_cb = TRUE;
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003398
3399 APPL_TRACE_DEBUG("%s: Unpairing: issue unpair CB = %d ",__FUNCTION__, issue_unpair_cb);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003400 }
3401
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003402 conn.link_down.is_removed = bta_dm_cb.device_list.peer_device[i].remove_dev_pending;
3403
The Android Open Source Project5738f832012-12-12 16:00:35 -08003404 for(; i<bta_dm_cb.device_list.count ; i++)
3405 {
3406 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]));
3407 }
3408 break;
3409 }
3410 if(bta_dm_cb.device_list.count)
3411 bta_dm_cb.device_list.count--;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003412#if BLE_INCLUDED == TRUE
3413 if ((p_data->acl_change.transport == BT_TRANSPORT_LE) &&
3414 (bta_dm_cb.device_list.le_count))
3415 bta_dm_cb.device_list.le_count--;
3416 conn.link_down.link_type = p_data->acl_change.transport;
3417#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08003418
3419 if(bta_dm_search_cb.wait_disc && !bdcmp(bta_dm_search_cb.peer_bdaddr, p_bda))
3420 {
3421 bta_dm_search_cb.wait_disc = FALSE;
3422
3423 if(bta_dm_search_cb.sdp_results)
3424 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003425 APPL_TRACE_EVENT(" timer stopped ");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003426 bta_sys_stop_timer(&bta_dm_search_cb.search_timer);
3427 bta_dm_discover_next_device();
3428 }
3429
3430 }
3431
3432 if(bta_dm_cb.disabling)
3433 {
3434 if(!BTM_GetNumAclLinks())
3435 {
3436 bta_sys_stop_timer(&bta_dm_cb.disable_timer);
3437 bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_conn_down_timer_cback;
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003438 /*
3439 * Start a timer to make sure that the profiles
3440 * get the disconnect event.
3441 */
The Android Open Source Project5738f832012-12-12 16:00:35 -08003442 bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 1000);
3443 }
3444 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003445 if (conn.link_down.is_removed)
3446 {
3447 BTM_SecDeleteDevice(p_bda);
3448#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
3449 /* need to remove all pending background connection */
3450 BTA_GATTC_CancelOpen(0, p_bda, FALSE);
3451 /* remove all cached GATT information */
3452 BTA_GATTC_Refresh(p_bda);
3453#endif
3454 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003455
3456 bdcpy(conn.link_down.bd_addr, p_bda);
3457 conn.link_down.status = (UINT8) btm_get_acl_disc_reason_code();
3458 if( bta_dm_cb.p_sec_cback )
3459 {
3460 bta_dm_cb.p_sec_cback(BTA_DM_LINK_DOWN_EVT, &conn);
3461 if( issue_unpair_cb )
3462 bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &conn);
3463 }
3464 }
3465
3466 bta_dm_adjust_roles(TRUE);
3467}
3468
3469/*******************************************************************************
3470**
3471** Function bta_dm_disable_conn_down_timer_cback
3472**
3473** Description Sends disable event to application
3474**
3475**
3476** Returns void
3477**
3478*******************************************************************************/
3479static void bta_dm_disable_conn_down_timer_cback (TIMER_LIST_ENT *p_tle)
3480{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08003481 UNUSED(p_tle);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003482 tBTA_SYS_HW_MSG *sys_enable_event;
3483
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003484 /* disable the power managment module */
3485 bta_dm_disable_pm();
3486
The Android Open Source Project5738f832012-12-12 16:00:35 -08003487 /* register our callback to SYS HW manager */
3488 bta_sys_hw_register( BTA_SYS_HW_BLUETOOTH, bta_dm_sys_hw_cback );
3489
3490 /* send a message to BTA SYS */
3491 if ((sys_enable_event = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL)
3492 {
3493 sys_enable_event->hdr.event = BTA_SYS_API_DISABLE_EVT;
3494 sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH;
3495 bta_sys_sendmsg(sys_enable_event);
3496 }
3497
3498 bta_dm_cb.disabling = FALSE;
3499
3500}
3501
3502/*******************************************************************************
3503**
The Android Open Source Project5738f832012-12-12 16:00:35 -08003504** Function bta_dm_rm_cback
3505**
3506** Description Role management callback from sys
3507**
3508**
3509** Returns void
3510**
3511*******************************************************************************/
3512static void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
3513{
3514
3515 UINT8 j;
3516 tBTA_PREF_ROLES role;
3517 tBTA_DM_PEER_DEVICE *p_dev;
3518
3519 p_dev = bta_dm_find_peer_device(peer_addr);
3520 if( status == BTA_SYS_CONN_OPEN)
3521 {
3522 if(p_dev)
3523 {
3524 /* Do not set to connected if we are in the middle of unpairing. When AV stream is
3525 * started it fakes out a SYS_CONN_OPEN to potentially trigger a role switch command.
3526 * But this should not be done if we are in the middle of unpairing.
3527 */
3528 if (p_dev->conn_state != BTA_DM_UNPAIRING)
3529 p_dev->conn_state = BTA_DM_CONNECTED;
3530
3531 for(j=1; j<= p_bta_dm_rm_cfg[0].app_id; j++)
3532 {
3533 if(((p_bta_dm_rm_cfg[j].app_id == app_id) || (p_bta_dm_rm_cfg[j].app_id == BTA_ALL_APP_ID))
3534 && (p_bta_dm_rm_cfg[j].id == id))
3535 {
3536 role = p_bta_dm_rm_cfg[j].cfg;
3537
3538 if(role > p_dev->pref_role )
3539 p_dev->pref_role = role;
3540 break;
3541 }
3542 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003543 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003544 }
3545
3546 if((BTA_ID_AV == id)||(BTA_ID_AVK ==id))
3547 {
3548 if( status == BTA_SYS_CONN_BUSY)
3549 {
3550 if(p_dev)
3551 p_dev->info |= BTA_DM_DI_AV_ACTIVE;
3552 /* AV calls bta_sys_conn_open with the A2DP stream count as app_id */
3553 if(BTA_ID_AV == id)
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003554 bta_dm_cb.cur_av_count = bta_dm_get_av_count();
The Android Open Source Project5738f832012-12-12 16:00:35 -08003555 }
3556 else if( status == BTA_SYS_CONN_IDLE)
3557 {
3558 if(p_dev)
3559 p_dev->info &= ~BTA_DM_DI_AV_ACTIVE;
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003560
3561 /* get cur_av_count from connected services */
The Android Open Source Project5738f832012-12-12 16:00:35 -08003562 if(BTA_ID_AV == id)
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003563 bta_dm_cb.cur_av_count = bta_dm_get_av_count();
The Android Open Source Project5738f832012-12-12 16:00:35 -08003564 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003565 APPL_TRACE_WARNING("bta_dm_rm_cback:%d, status:%d", bta_dm_cb.cur_av_count, status);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003566 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003567
3568 bta_dm_adjust_roles(FALSE);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003569}
3570
3571/*******************************************************************************
3572**
3573** Function bta_dm_delay_role_switch_cback
3574**
3575** Description Callback from btm to delay a role switch
3576**
3577** Returns void
3578**
3579*******************************************************************************/
3580static void bta_dm_delay_role_switch_cback(TIMER_LIST_ENT *p_tle)
3581{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08003582 UNUSED(p_tle);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003583 APPL_TRACE_EVENT("bta_dm_delay_role_switch_cback: initiating Delayed RS");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003584 bta_dm_adjust_roles (FALSE);
3585}
3586
3587/*******************************************************************************
3588**
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003589** Function bta_dm_remove_sec_dev_entry
3590**
3591** Description Removes device entry from Security device DB if ACL connection with
3592** remtoe device does not exist, else schedule for dev entry removal upon
3593 ACL close
3594**
3595** Returns void
3596**
3597*******************************************************************************/
3598static void bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr)
3599{
3600 UINT16 index = 0;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003601 if ( BTM_IsAclConnectionUp(remote_bd_addr, BT_TRANSPORT_LE) ||
3602 BTM_IsAclConnectionUp(remote_bd_addr, BT_TRANSPORT_BR_EDR))
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003603 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003604 APPL_TRACE_DEBUG("%s ACL is not down. Schedule for Dev Removal when ACL closes",
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003605 __FUNCTION__);
3606 for (index = 0; index < bta_dm_cb.device_list.count; index ++)
3607 {
3608 if (!bdcmp( bta_dm_cb.device_list.peer_device[index].peer_bdaddr, remote_bd_addr))
3609 break;
3610 }
3611 if (index != bta_dm_cb.device_list.count)
3612 {
3613 bta_dm_cb.device_list.peer_device[index].remove_dev_pending = TRUE;
3614 }
3615 else
3616 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003617 APPL_TRACE_ERROR(" %s Device does not exist in DB", __FUNCTION__);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003618 }
3619 }
3620 else
3621 {
3622 BTM_SecDeleteDevice (remote_bd_addr);
Zhihai Xubd68d682013-11-15 17:55:46 -08003623#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
3624 /* need to remove all pending background connection */
3625 BTA_GATTC_CancelOpen(0, remote_bd_addr, FALSE);
3626 /* remove all cached GATT information */
3627 BTA_GATTC_Refresh(remote_bd_addr);
3628#endif
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003629 }
3630}
3631
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07003632
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003633/*******************************************************************************
3634**
The Android Open Source Project5738f832012-12-12 16:00:35 -08003635** Function bta_dm_adjust_roles
3636**
3637** Description Adjust roles
3638**
3639**
3640** Returns void
3641**
3642*******************************************************************************/
3643static void bta_dm_adjust_roles(BOOLEAN delay_role_switch)
3644{
3645
3646 UINT8 i;
3647 BOOLEAN set_master_role = FALSE;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003648#if BLE_INCLUDED == TRUE
3649 UINT8 br_count = bta_dm_cb.device_list.count - bta_dm_cb.device_list.le_count;
3650#else
3651 UINT8 br_count = bta_dm_cb.device_list.count;
3652#endif
3653 if (br_count)
The Android Open Source Project5738f832012-12-12 16:00:35 -08003654 {
3655
3656 /* the configuration is no scatternet
3657 * or AV connection exists and there are more than one ACL link */
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003658 if ( (p_bta_dm_rm_cfg[0].cfg == BTA_DM_NO_SCATTERNET) ||
3659 (bta_dm_cb.cur_av_count && br_count > 1) )
The Android Open Source Project5738f832012-12-12 16:00:35 -08003660 {
3661
3662 L2CA_SetDesireRole (HCI_ROLE_MASTER);
3663 set_master_role = TRUE;
3664
3665 }
3666
3667 for(i=0; i<bta_dm_cb.device_list.count; i++)
3668 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003669 if (bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED
3670#if BLE_INCLUDED == TRUE
3671 && bta_dm_cb.device_list.peer_device[i].transport == BT_TRANSPORT_BR_EDR
3672#endif
3673 )
The Android Open Source Project5738f832012-12-12 16:00:35 -08003674 {
3675 if(!set_master_role && (bta_dm_cb.device_list.peer_device[i].pref_role != BTA_ANY_ROLE)
3676 && (p_bta_dm_rm_cfg[0].cfg == BTA_DM_PARTIAL_SCATTERNET))
3677 {
3678 L2CA_SetDesireRole (HCI_ROLE_MASTER);
3679 set_master_role = TRUE;
3680 }
3681
3682 if((bta_dm_cb.device_list.peer_device[i].pref_role == BTA_MASTER_ROLE_ONLY)
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003683 || (bta_dm_cb.device_list.count > 1))
The Android Open Source Project5738f832012-12-12 16:00:35 -08003684 {
3685
3686 /* Initiating immediate role switch with certain remote devices
3687 has caused issues due to role switch colliding with link encryption setup and
3688 causing encryption (and in turn the link) to fail . These device . Firmware
3689 versions are stored in a blacklist and role switch with these devices are
3690 delayed to avoid the collision with link encryption setup */
3691
tturneye31d4172015-09-21 10:49:09 -07003692 if (bta_dm_cb.device_list.peer_device[i].pref_role != BTA_SLAVE_ROLE_ONLY &&
3693 delay_role_switch == FALSE)
The Android Open Source Project5738f832012-12-12 16:00:35 -08003694 {
3695 BTM_SwitchRole (bta_dm_cb.device_list.peer_device[i].peer_bdaddr,
3696 HCI_ROLE_MASTER, NULL);
3697 }
3698 else
3699 {
3700 bta_dm_cb.switch_delay_timer.p_cback =
3701 (TIMER_CBACK*)&bta_dm_delay_role_switch_cback;
3702 bta_sys_start_timer(&bta_dm_cb.switch_delay_timer, 0, 500);
3703 }
3704 }
3705
3706 }
3707 }
3708
3709
3710 if(!set_master_role)
3711 {
3712
3713 L2CA_SetDesireRole (L2CAP_DESIRED_LINK_ROLE);
3714
3715 }
3716
3717 }
3718 else
3719 {
3720 L2CA_SetDesireRole (L2CAP_DESIRED_LINK_ROLE);
3721 }
3722
3723
3724}
3725
3726/*******************************************************************************
3727**
3728** Function bta_dm_get_remname
3729**
3730** Description Returns a pointer to the remote name stored in the DM control
3731** block if it exists, or from the BTM memory.
3732**
3733** Returns char * - Pointer to the remote device name
3734*******************************************************************************/
3735static char *bta_dm_get_remname(void)
3736{
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003737 char *p_name = (char *)bta_dm_search_cb.peer_name;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003738 char *p_temp;
3739
3740 /* If the name isn't already stored, try retrieving from BTM */
3741 if (*p_name == '\0')
3742 if ((p_temp = BTM_SecReadDevName(bta_dm_search_cb.peer_bdaddr)) != NULL)
3743 p_name = p_temp;
3744
3745 return p_name;
3746}
3747
3748/*******************************************************************************
3749**
3750** Function bta_dm_bond_cancel_complete_cback
3751**
3752** Description Authentication complete callback from BTM
3753**
3754** Returns void
3755**
3756*******************************************************************************/
3757static void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result)
3758{
3759
3760 tBTA_DM_SEC sec_event;
3761
3762 if (result == BTM_SUCCESS)
3763 sec_event.bond_cancel_cmpl.result = BTA_SUCCESS;
3764 else
3765 sec_event.bond_cancel_cmpl.result = BTA_FAILURE;
3766
3767 if(bta_dm_cb.p_sec_cback)
3768 {
3769 bta_dm_cb.p_sec_cback(BTA_DM_BOND_CANCEL_CMPL_EVT, &sec_event);
3770 }
3771}
3772
The Android Open Source Project5738f832012-12-12 16:00:35 -08003773/*******************************************************************************
3774**
3775** Function bta_dm_set_eir
3776**
3777** Description This function creates EIR tagged data and writes it to controller.
3778**
3779** Returns None
3780**
3781*******************************************************************************/
3782static void bta_dm_set_eir (char *local_name)
3783{
3784 BT_HDR *p_buf;
3785 UINT8 *p;
3786 UINT8 *p_length;
3787#if (BTA_EIR_CANNED_UUID_LIST != TRUE)
3788 UINT8 *p_type;
3789 UINT8 max_num_uuid;
3790#if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
3791 UINT8 custom_uuid_idx;
Chris Manton1e61ce12014-10-24 09:12:41 -07003792#endif // BTA_EIR_SERVER_NUM_CUSTOM_UUID
3793#endif // BTA_EIR_CANNED_UUID_LIST
The Android Open Source Project5738f832012-12-12 16:00:35 -08003794#if (BTM_EIR_DEFAULT_FEC_REQUIRED == FALSE)
3795 UINT8 free_eir_length = HCI_EXT_INQ_RESPONSE_LEN;
Chris Manton1e61ce12014-10-24 09:12:41 -07003796#else // BTM_EIR_DEFAULT_FEC_REQUIRED
The Android Open Source Project5738f832012-12-12 16:00:35 -08003797 UINT8 free_eir_length = HCI_DM5_PACKET_SIZE;
Casper Bonde818d0f22015-05-21 11:08:45 +02003798#endif // BTM_EIR_DEFAULT_FEC_REQUIRED
The Android Open Source Project5738f832012-12-12 16:00:35 -08003799 UINT8 num_uuid;
3800 UINT8 data_type;
3801 UINT8 local_name_len;
3802
3803 /* wait until complete to disable */
3804 if (bta_dm_cb.disable_timer.in_use)
3805 return;
3806
3807#if ( BTA_EIR_CANNED_UUID_LIST != TRUE )
3808 /* wait until App is ready */
3809 if (bta_dm_cb.app_ready_timer.in_use)
3810 return;
3811
3812 /* if local name is not provided, get it from controller */
3813 if( local_name == NULL )
3814 {
3815 if( BTM_ReadLocalDeviceName( &local_name ) != BTM_SUCCESS )
3816 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003817 APPL_TRACE_ERROR("Fail to read local device name for EIR");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003818 }
3819 }
Chris Manton1e61ce12014-10-24 09:12:41 -07003820#endif // BTA_EIR_CANNED_UUID_LIST
The Android Open Source Project5738f832012-12-12 16:00:35 -08003821
3822 /* Allocate a buffer to hold HCI command */
3823 if ((p_buf = (BT_HDR *)GKI_getpoolbuf(BTM_CMD_POOL_ID)) == NULL)
3824 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003825 APPL_TRACE_ERROR("bta_dm_set_eir couldn't allocate buffer");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003826 return;
3827 }
3828 p = (UINT8 *)p_buf + BTM_HCI_EIR_OFFSET;
3829
3830 memset(p, 0x00, HCI_EXT_INQ_RESPONSE_LEN );
3831
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003832 APPL_TRACE_DEBUG("BTA is generating EIR");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003833
3834 if( local_name )
3835 local_name_len = strlen( local_name );
3836 else
3837 local_name_len = 0;
3838
3839 data_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE;
3840 /* if local name is longer than minimum length of shortened name */
3841 /* check whether it needs to be shortened or not */
3842 if( local_name_len > p_bta_dm_eir_cfg->bta_dm_eir_min_name_len )
3843 {
3844 /* get number of UUID 16-bit list */
3845#if (BTA_EIR_CANNED_UUID_LIST == TRUE)
3846 num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len/LEN_UUID_16;
Chris Manton1e61ce12014-10-24 09:12:41 -07003847#else // BTA_EIR_CANNED_UUID_LIST
The Android Open Source Project5738f832012-12-12 16:00:35 -08003848 max_num_uuid = (free_eir_length - 2)/LEN_UUID_16;
3849 data_type = BTM_GetEirSupportedServices( bta_dm_cb.eir_uuid, &p,
3850 max_num_uuid, &num_uuid );
3851 p = (UINT8 *)p_buf + BTM_HCI_EIR_OFFSET; /* reset p */
Chris Manton1e61ce12014-10-24 09:12:41 -07003852#endif // BTA_EIR_CANNED_UUID_LIST
The Android Open Source Project5738f832012-12-12 16:00:35 -08003853
3854 /* if UUID doesn't fit remaing space, shorten local name */
3855 if ( local_name_len > (free_eir_length - 4 - num_uuid*LEN_UUID_16))
3856 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003857 APPL_TRACE_WARNING("BTA EIR: local name is shortened");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003858 local_name_len = p_bta_dm_eir_cfg->bta_dm_eir_min_name_len;
3859 data_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE;
3860 }
3861 else
3862 data_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE;
3863 }
3864
3865 UINT8_TO_STREAM(p, local_name_len + 1);
3866 UINT8_TO_STREAM(p, data_type);
Andre Eisenbach3aa60542013-03-22 18:00:51 -07003867
3868 if (local_name != NULL)
3869 {
3870 memcpy(p, local_name, local_name_len);
3871 p += local_name_len;
3872 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003873 free_eir_length -= local_name_len + 2;
3874
3875#if (BTA_EIR_CANNED_UUID_LIST == TRUE)
3876 /* if UUID list is provided as static data in configuration */
3877 if(( p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len > 0 )
3878 &&(p_bta_dm_eir_cfg->bta_dm_eir_uuid16))
3879 {
3880 if( free_eir_length > LEN_UUID_16 + 2)
3881 {
3882 free_eir_length -= 2;
3883
3884 if( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len)
3885 {
3886 num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len / LEN_UUID_16;
3887 data_type = BTM_EIR_COMPLETE_16BITS_UUID_TYPE;
3888 }
3889 else /* not enough room for all UUIDs */
3890 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003891 APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003892 num_uuid = free_eir_length / LEN_UUID_16;
3893 data_type = BTM_EIR_MORE_16BITS_UUID_TYPE;
3894 }
3895 UINT8_TO_STREAM(p, num_uuid * LEN_UUID_16 + 1);
3896 UINT8_TO_STREAM(p, data_type);
3897 memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_uuid16, num_uuid * LEN_UUID_16 );
3898 p += num_uuid * LEN_UUID_16;
3899 free_eir_length -= num_uuid * LEN_UUID_16;
3900 }
3901 }
3902#else /* (BTA_EIR_CANNED_UUID_LIST == TRUE) */
3903 /* if UUID list is dynamic */
3904 if ( free_eir_length >= 2)
3905 {
3906 p_length = p++;
3907 p_type = p++;
3908 num_uuid = 0;
3909
3910 max_num_uuid = (free_eir_length - 2)/LEN_UUID_16;
3911 data_type = BTM_GetEirSupportedServices( bta_dm_cb.eir_uuid, &p, max_num_uuid, &num_uuid );
3912
3913 if( data_type == BTM_EIR_MORE_16BITS_UUID_TYPE )
3914 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003915 APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003916 }
3917#if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
3918 else
3919 {
3920 for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++)
3921 {
3922 if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_16)
3923 {
3924 if ( num_uuid < max_num_uuid )
3925 {
3926 UINT16_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid16);
3927 num_uuid++;
3928 }
3929 else
3930 {
3931 data_type = BTM_EIR_MORE_16BITS_UUID_TYPE;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003932 APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003933 break;
3934 }
3935 }
3936 }
3937 }
3938#endif /* (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) */
3939
3940 UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_16 + 1);
3941 UINT8_TO_STREAM(p_type, data_type);
3942 free_eir_length -= num_uuid * LEN_UUID_16 + 2;
3943 }
3944#endif /* (BTA_EIR_CANNED_UUID_LIST == TRUE) */
3945
3946#if ( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
3947 /* Adding 32-bit UUID list */
3948 if ( free_eir_length >= 2)
3949 {
3950 p_length = p++;
3951 p_type = p++;
3952 num_uuid = 0;
3953 data_type = BTM_EIR_COMPLETE_32BITS_UUID_TYPE;
3954
3955 max_num_uuid = (free_eir_length - 2)/LEN_UUID_32;
3956
3957 for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++)
3958 {
3959 if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_32)
3960 {
3961 if ( num_uuid < max_num_uuid )
3962 {
3963 UINT32_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid32);
3964 num_uuid++;
3965 }
3966 else
3967 {
3968 data_type = BTM_EIR_MORE_32BITS_UUID_TYPE;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003969 APPL_TRACE_WARNING("BTA EIR: UUID 32-bit list is truncated");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003970 break;
3971 }
3972 }
3973 }
3974
3975 UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_32 + 1);
3976 UINT8_TO_STREAM(p_type, data_type);
3977 free_eir_length -= num_uuid * LEN_UUID_32 + 2;
3978 }
3979
3980 /* Adding 128-bit UUID list */
3981 if ( free_eir_length >= 2)
3982 {
3983 p_length = p++;
3984 p_type = p++;
3985 num_uuid = 0;
3986 data_type = BTM_EIR_COMPLETE_128BITS_UUID_TYPE;
3987
3988 max_num_uuid = (free_eir_length - 2)/LEN_UUID_128;
3989
3990 for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++)
3991 {
3992 if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_128)
3993 {
3994 if ( num_uuid < max_num_uuid )
3995 {
3996 ARRAY16_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid128);
3997 num_uuid++;
3998 }
3999 else
4000 {
4001 data_type = BTM_EIR_MORE_128BITS_UUID_TYPE;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004002 APPL_TRACE_WARNING("BTA EIR: UUID 128-bit list is truncated");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004003 break;
4004 }
4005 }
4006 }
4007
4008 UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_128 + 1);
4009 UINT8_TO_STREAM(p_type, data_type);
4010 free_eir_length -= num_uuid * LEN_UUID_128 + 2;
4011 }
4012#endif /* ( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) */
4013
4014 /* if Flags are provided in configuration */
4015 if(( p_bta_dm_eir_cfg->bta_dm_eir_flag_len > 0 )
4016 &&( p_bta_dm_eir_cfg->bta_dm_eir_flags )
4017 &&( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 2 ))
4018 {
4019 UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 1);
4020 UINT8_TO_STREAM(p, BTM_EIR_FLAGS_TYPE);
4021 memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_flags,
4022 p_bta_dm_eir_cfg->bta_dm_eir_flag_len);
4023 p += p_bta_dm_eir_cfg->bta_dm_eir_flag_len;
4024 free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 2;
4025 }
4026
The Android Open Source Project5738f832012-12-12 16:00:35 -08004027 /* if Manufacturer Specific are provided in configuration */
4028 if(( p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len > 0 )
4029 &&( p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec )
4030 &&( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2 ))
4031 {
4032 p_length = p;
4033
4034 UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 1);
4035 UINT8_TO_STREAM(p, BTM_EIR_MANUFACTURER_SPECIFIC_TYPE);
4036 memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec,
4037 p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len);
4038 p += p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len;
4039 free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2;
4040
4041 }
4042 else
4043 {
4044 p_length = NULL;
4045 }
4046
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004047 /* if Inquiry Tx Resp Power compiled */
4048 if ((p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power) &&
4049 (free_eir_length >= 3))
4050 {
4051 UINT8_TO_STREAM(p, 2); /* Length field */
4052 UINT8_TO_STREAM(p, BTM_EIR_TX_POWER_LEVEL_TYPE);
4053 UINT8_TO_STREAM(p, *(p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power));
4054 free_eir_length -= 3;
4055 }
4056
The Android Open Source Project5738f832012-12-12 16:00:35 -08004057 if( free_eir_length )
4058 UINT8_TO_STREAM(p, 0); /* terminator of significant part */
4059
4060 BTM_WriteEIR( p_buf );
4061
4062}
The Android Open Source Project5738f832012-12-12 16:00:35 -08004063
The Android Open Source Project5738f832012-12-12 16:00:35 -08004064/*******************************************************************************
4065**
4066** Function bta_dm_eir_search_services
4067**
4068** Description This function searches services in received EIR
4069**
4070** Returns None
4071**
4072*******************************************************************************/
4073static void bta_dm_eir_search_services( tBTM_INQ_RESULTS *p_result,
4074 tBTA_SERVICE_MASK *p_services_to_search,
4075 tBTA_SERVICE_MASK *p_services_found)
4076{
4077 tBTA_SERVICE_MASK service_index = 0;
4078 tBTM_EIR_SEARCH_RESULT result;
4079
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004080 APPL_TRACE_DEBUG("BTA searching services in EIR of BDA:0x%02X%02X%02X%02X%02X%02X",
The Android Open Source Project5738f832012-12-12 16:00:35 -08004081 p_result->remote_bd_addr[0],p_result->remote_bd_addr[1],
4082 p_result->remote_bd_addr[2],p_result->remote_bd_addr[3],
4083 p_result->remote_bd_addr[4],p_result->remote_bd_addr[5]);
4084
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004085 APPL_TRACE_DEBUG(" with services_to_search=0x%08X", *p_services_to_search);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004086
4087#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
4088 /* always do GATT based service discovery by SDP instead of from EIR */
4089 /* if GATT based service is also to be put in EIR, need to modify this */
4090 while (service_index < (BTA_MAX_SERVICE_ID - 1))
4091#else
4092 while(service_index < BTA_MAX_SERVICE_ID)
4093#endif
4094 {
4095 if( *p_services_to_search
4096 & (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)))
4097 {
4098 result = BTM_HasInquiryEirService( p_result,
4099 bta_service_id_to_uuid_lkup_tbl[service_index] );
4100
4101 /* Searching for HSP v1.2 only device */
4102 if ((result != BTM_EIR_FOUND) &&
4103 (bta_service_id_to_uuid_lkup_tbl[service_index] == UUID_SERVCLASS_HEADSET))
4104 {
4105 result = BTM_HasInquiryEirService (p_result, UUID_SERVCLASS_HEADSET_HS);
4106 }
4107
4108 if( result == BTM_EIR_FOUND )
4109 {
4110 /* If Plug and Play service record, need to check to see if Broadcom stack */
4111 /* However, EIR data doesn't have EXT_BRCM_VERSION so just skip it */
4112 if( bta_service_id_to_uuid_lkup_tbl[service_index]
4113 != UUID_SERVCLASS_PNP_INFORMATION )
4114 {
4115
4116 *p_services_found |=
4117 (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index));
4118 /* remove the service from services to be searched */
4119 *p_services_to_search &=
4120 (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)));
4121 }
4122 }
4123 else if( result == BTM_EIR_NOT_FOUND )
4124 {
4125 /* remove the service from services to be searched */
4126 *p_services_to_search &=
4127 (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)));
4128 }
4129 }
4130
4131 service_index++;
4132 }
4133
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004134 APPL_TRACE_ERROR("BTA EIR search result, services_to_search=0x%08X, services_found=0x%08X",
The Android Open Source Project5738f832012-12-12 16:00:35 -08004135 *p_services_to_search, *p_services_found);
4136}
The Android Open Source Project5738f832012-12-12 16:00:35 -08004137
Chris Manton1e61ce12014-10-24 09:12:41 -07004138#if (BTA_EIR_CANNED_UUID_LIST != TRUE)
The Android Open Source Project5738f832012-12-12 16:00:35 -08004139/*******************************************************************************
4140**
4141** Function bta_dm_eir_update_uuid
4142**
4143** Description This function adds or removes service UUID in EIR database.
4144**
4145** Returns None
4146**
4147*******************************************************************************/
4148void bta_dm_eir_update_uuid(UINT16 uuid16, BOOLEAN adding)
4149{
4150 /* if this UUID is not advertised in EIR */
4151 if( !BTM_HasEirService( p_bta_dm_eir_cfg->uuid_mask, uuid16 ))
4152 return;
4153
4154 if( adding )
4155 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004156 APPL_TRACE_EVENT("Adding UUID=0x%04X into EIR", uuid16);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004157
4158 BTM_AddEirService( bta_dm_cb.eir_uuid, uuid16 );
4159 }
4160 else
4161 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004162 APPL_TRACE_EVENT("Removing UUID=0x%04X from EIR", uuid16);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004163
4164 BTM_RemoveEirService( bta_dm_cb.eir_uuid, uuid16 );
4165 }
4166
4167 bta_dm_set_eir (NULL);
4168
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004169 APPL_TRACE_EVENT("bta_dm_eir_update_uuid UUID bit mask=0x%08X %08X",
The Android Open Source Project5738f832012-12-12 16:00:35 -08004170 bta_dm_cb.eir_uuid[1], bta_dm_cb.eir_uuid[0] );
4171}
4172#endif
4173
4174/*******************************************************************************
4175**
4176** Function bta_dm_enable_test_mode
4177**
4178** Description enable test mode
4179**
4180**
4181** Returns void
4182**
4183*******************************************************************************/
4184void bta_dm_enable_test_mode(tBTA_DM_MSG *p_data)
4185{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08004186 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004187 BTM_EnableTestMode();
4188}
4189
4190/*******************************************************************************
4191**
4192** Function bta_dm_disable_test_mode
4193**
4194** Description disable test mode
4195**
4196**
4197** Returns void
4198**
4199*******************************************************************************/
4200void bta_dm_disable_test_mode(tBTA_DM_MSG *p_data)
4201{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08004202 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004203 BTM_DeviceReset(NULL);
4204}
4205
4206/*******************************************************************************
4207**
4208** Function bta_dm_execute_callback
4209**
4210** Description Just execute a generic call back in the context of the BTU/BTA tack
4211**
4212**
4213** Returns void
4214**
4215*******************************************************************************/
4216void bta_dm_execute_callback(tBTA_DM_MSG *p_data)
4217{
4218 /* sanity check */
4219 if(p_data->exec_cback.p_exec_cback == NULL)
4220 {
4221 return;
4222 }
4223
4224 p_data->exec_cback.p_exec_cback(p_data->exec_cback.p_param);
4225}
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07004226
The Android Open Source Project5738f832012-12-12 16:00:35 -08004227/*******************************************************************************
4228**
4229** Function bta_dm_encrypt_cback
4230**
4231** Description link encryption complete callback.
4232**
4233** Returns None
4234**
4235*******************************************************************************/
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004236void bta_dm_encrypt_cback(BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, tBTM_STATUS result)
The Android Open Source Project5738f832012-12-12 16:00:35 -08004237{
4238 tBTA_STATUS bta_status = BTA_SUCCESS;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004239 tBTA_DM_ENCRYPT_CBACK *p_callback = NULL;
4240 UINT8 i ;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08004241 UNUSED(p_ref_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004242
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004243 for (i=0; i<bta_dm_cb.device_list.count; i++)
4244 {
4245 if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, bd_addr) == 0 &&
4246 bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED)
4247 break;
4248 }
4249
4250 if (i < bta_dm_cb.device_list.count)
4251 {
4252 p_callback = bta_dm_cb.device_list.peer_device[i].p_encrypt_cback;
4253 bta_dm_cb.device_list.peer_device[i].p_encrypt_cback = NULL;
4254 }
4255
The Android Open Source Project5738f832012-12-12 16:00:35 -08004256 switch (result)
4257 {
4258 case BTM_SUCCESS:
4259 break;
4260 case BTM_WRONG_MODE:
4261 bta_status = BTA_WRONG_MODE;
4262 break;
4263 case BTM_NO_RESOURCES:
4264 bta_status = BTA_NO_RESOURCES;
4265 break;
4266 case BTM_BUSY:
4267 bta_status = BTA_BUSY;
4268 break;
4269 default:
4270 bta_status = BTA_FAILURE;
4271 break;
4272 }
4273
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004274 APPL_TRACE_DEBUG("bta_dm_encrypt_cback status =%d p_callback=0x%x", bta_status, p_callback);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004275
4276 if (p_callback)
4277 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004278 (*p_callback)(bd_addr, transport, bta_status);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004279 }
4280}
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07004281
The Android Open Source Project5738f832012-12-12 16:00:35 -08004282/*******************************************************************************
4283**
4284** Function bta_dm_set_encryption
4285**
4286** Description This function to encrypt the link
4287**
4288** Returns None
4289**
4290*******************************************************************************/
4291void bta_dm_set_encryption (tBTA_DM_MSG *p_data)
4292{
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004293 UINT8 i ;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004294
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004295 APPL_TRACE_DEBUG("bta_dm_set_encryption"); //todo
The Android Open Source Project5738f832012-12-12 16:00:35 -08004296 if (!p_data->set_encryption.p_callback)
4297 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004298 APPL_TRACE_ERROR("bta_dm_set_encryption callback is not provided");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004299 return;
4300 }
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004301 for (i=0; i<bta_dm_cb.device_list.count; i++)
The Android Open Source Project5738f832012-12-12 16:00:35 -08004302 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004303 if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_data->set_encryption.bd_addr) == 0 &&
4304 bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED)
4305 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004306 }
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004307 if (i < bta_dm_cb.device_list.count)
4308 {
4309 if (bta_dm_cb.device_list.peer_device[i].p_encrypt_cback)
4310 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004311 APPL_TRACE_ERROR("earlier enc was not done for same device");
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004312 (*p_data->set_encryption.p_callback)(p_data->set_encryption.bd_addr,
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07004313 p_data->set_encryption.transport,
4314 BTA_BUSY);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004315 return;
4316 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08004317
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07004318 if (BTM_SetEncryption(p_data->set_encryption.bd_addr, p_data->set_encryption.transport,
4319 bta_dm_encrypt_cback, &p_data->set_encryption.sec_act)
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004320 == BTM_CMD_STARTED)
4321 {
4322 bta_dm_cb.device_list.peer_device[i].p_encrypt_cback = p_data->set_encryption.p_callback;
4323 }
4324 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08004325}
4326
The Android Open Source Project5738f832012-12-12 16:00:35 -08004327#if (BLE_INCLUDED == TRUE)
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004328/*******************************************************************************
4329**
4330** Function bta_dm_observe_results_cb
4331**
4332** Description Callback for BLE Observe result
4333**
4334**
4335** Returns void
4336**
4337*******************************************************************************/
4338static void bta_dm_observe_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir)
4339{
4340;
4341 tBTA_DM_SEARCH result;
4342 tBTM_INQ_INFO *p_inq_info;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004343 APPL_TRACE_DEBUG("bta_dm_observe_results_cb")
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004344
4345 bdcpy(result.inq_res.bd_addr, p_inq->remote_bd_addr);
4346 result.inq_res.rssi = p_inq->rssi;
4347 result.inq_res.ble_addr_type = p_inq->ble_addr_type;
4348 result.inq_res.inq_result_type = p_inq->inq_result_type;
4349 result.inq_res.device_type = p_inq->device_type;
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07004350 result.inq_res.flag = p_inq->flag;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004351
4352 /* application will parse EIR to find out remote device name */
4353 result.inq_res.p_eir = p_eir;
4354
4355 if((p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr)) != NULL)
4356 {
4357 /* initialize remt_name_not_required to FALSE so that we get the name by default */
4358 result.inq_res.remt_name_not_required = FALSE;
4359 }
4360
4361 if(bta_dm_search_cb.p_scan_cback)
4362 bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_RES_EVT, &result);
4363
4364 if(p_inq_info)
4365 {
4366 /* application indicates if it knows the remote name, inside the callback
4367 copy that to the inquiry data base*/
4368 if(result.inq_res.remt_name_not_required)
4369 p_inq_info->appl_knows_rem_name = TRUE;
4370 }
4371}
4372
4373/*******************************************************************************
4374**
4375** Function bta_dm_observe_cmpl_cb
4376**
4377** Description Callback for BLE Observe complete
4378**
4379**
4380** Returns void
4381**
4382*******************************************************************************/
4383static void bta_dm_observe_cmpl_cb (void * p_result)
4384{
4385 tBTA_DM_SEARCH data;
4386
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004387 APPL_TRACE_DEBUG("bta_dm_observe_cmpl_cb");
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004388
4389 data.inq_cmpl.num_resps = ((tBTM_INQUIRY_CMPL *)p_result)->num_resp;
4390 if (bta_dm_search_cb.p_scan_cback)
4391 {
4392 bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_CMPL_EVT, &data);
4393 }
4394}
4395
The Android Open Source Project5738f832012-12-12 16:00:35 -08004396#if (SMP_INCLUDED == TRUE)
4397/*******************************************************************************
4398**
4399** Function bta_dm_ble_smp_cback
4400**
4401** Description Callback for BLE SMP
4402**
4403**
4404** Returns void
4405**
4406*******************************************************************************/
4407static UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_DATA *p_data)
4408{
4409 tBTM_STATUS status = BTM_SUCCESS;
4410 tBTA_DM_SEC sec_event;
Satya Calloji444a8da2015-03-06 10:38:22 -08004411 char *p_name = NULL;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004412 UINT8 i;
Satya Calloji444a8da2015-03-06 10:38:22 -08004413 tBT_DEVICE_TYPE dev_type;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004414
4415 if (!bta_dm_cb.p_sec_cback)
4416 return BTM_NOT_AUTHORIZED;
4417
4418 memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
4419 switch (event)
4420 {
4421 case BTM_LE_IO_REQ_EVT:
4422#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
4423
4424 bta_dm_co_ble_io_req(bda,
4425 &p_data->io_req.io_cap,
4426 &p_data->io_req.oob_data,
4427 &p_data->io_req.auth_req,
4428 &p_data->io_req.max_key_size,
4429 &p_data->io_req.init_keys,
4430 &p_data->io_req.resp_keys);
4431#endif
4432#if BTM_OOB_INCLUDED == FALSE
4433 status = BTM_SUCCESS;
4434#endif
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004435 APPL_TRACE_EVENT("io mitm: %d oob_data:%d", p_data->io_req.auth_req, p_data->io_req.oob_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004436
4437 break;
4438
4439 case BTM_LE_SEC_REQUEST_EVT:
4440 bdcpy(sec_event.ble_req.bd_addr, bda);
Andre Eisenbach181d0752013-06-11 14:18:21 -07004441 p_name = BTM_SecReadDevName(bda);
4442 if (p_name != NULL)
4443 {
4444 BCM_STRNCPY_S((char*)sec_event.ble_req.bd_name,
4445 sizeof(BD_NAME), p_name, (BD_NAME_LEN));
4446 }
4447 else
4448 {
4449 sec_event.ble_req.bd_name[0] = 0;
4450 }
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07004451 sec_event.ble_req.bd_name[BD_NAME_LEN] = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004452 bta_dm_cb.p_sec_cback(BTA_DM_BLE_SEC_REQ_EVT, &sec_event);
4453 break;
4454
4455 case BTM_LE_KEY_NOTIF_EVT:
4456 bdcpy(sec_event.key_notif.bd_addr, bda);
Andre Eisenbach181d0752013-06-11 14:18:21 -07004457 p_name = BTM_SecReadDevName(bda);
4458 if (p_name != NULL)
4459 {
4460 BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name,
4461 sizeof(BD_NAME), p_name, (BD_NAME_LEN));
4462 }
4463 else
4464 {
4465 sec_event.key_notif.bd_name[0] = 0;
4466 }
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07004467 sec_event.ble_req.bd_name[BD_NAME_LEN] = 0;
4468 sec_event.key_notif.passkey = p_data->key_notif;
4469 bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_NOTIF_EVT, &sec_event);
4470 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004471
4472 case BTM_LE_KEY_REQ_EVT:
4473 bdcpy(sec_event.ble_req.bd_addr, bda);
4474 bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_REQ_EVT, &sec_event);
4475 break;
4476
4477 case BTM_LE_OOB_REQ_EVT:
4478 bdcpy(sec_event.ble_req.bd_addr, bda);
4479 bta_dm_cb.p_sec_cback(BTA_DM_BLE_OOB_REQ_EVT, &sec_event);
4480 break;
4481
Satya Calloji444a8da2015-03-06 10:38:22 -08004482 case BTM_LE_NC_REQ_EVT:
4483 bdcpy(sec_event.key_notif.bd_addr, bda);
4484 BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN));
4485 sec_event.ble_req.bd_name[BD_NAME_LEN] = 0;
4486 sec_event.key_notif.passkey = p_data->key_notif;
4487 bta_dm_cb.p_sec_cback(BTA_DM_BLE_NC_REQ_EVT, &sec_event);
4488 break;
4489
The Android Open Source Project5738f832012-12-12 16:00:35 -08004490 case BTM_LE_KEY_EVT:
4491 bdcpy(sec_event.ble_key.bd_addr, bda);
4492 sec_event.ble_key.key_type = p_data->key.key_type;
Satya Calloji444a8da2015-03-06 10:38:22 -08004493 sec_event.ble_key.p_key_value = p_data->key.p_key_value;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004494 bta_dm_cb.p_sec_cback(BTA_DM_BLE_KEY_EVT, &sec_event);
4495 break;
4496
4497 case BTM_LE_COMPLT_EVT:
4498 bdcpy(sec_event.auth_cmpl.bd_addr, bda);
Andre Eisenbach12871662015-05-08 17:42:10 -07004499#if BLE_INCLUDED == TRUE
Chaojing Sune2805532015-04-22 13:40:21 -07004500 BTM_ReadDevInfo(bda, &sec_event.auth_cmpl.dev_type, &sec_event.auth_cmpl.addr_type);
Andre Eisenbach12871662015-05-08 17:42:10 -07004501#endif
Andre Eisenbach181d0752013-06-11 14:18:21 -07004502 p_name = BTM_SecReadDevName(bda);
4503 if (p_name != NULL)
4504 {
4505 BCM_STRNCPY_S((char*)sec_event.auth_cmpl.bd_name,
4506 sizeof(BD_NAME), p_name, (BD_NAME_LEN));
4507 }
4508 else
4509 {
4510 sec_event.auth_cmpl.bd_name[0] = 0;
4511 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004512 if (p_data->complt.reason != 0)
4513 {
4514 sec_event.auth_cmpl.fail_reason = BTA_DM_AUTH_CONVERT_SMP_CODE(((UINT8)p_data->complt.reason));
4515 /* delete this device entry from Sec Dev DB */
4516 bta_dm_remove_sec_dev_entry (bda);
4517 }
4518 else
4519 {
4520 sec_event.auth_cmpl.success = TRUE;
Andre Eisenbacha2502802015-05-29 14:05:30 -07004521 if (!p_data->complt.smp_over_br)
4522 GATT_ConfigServiceChangeCCC(bda, TRUE, BT_TRANSPORT_LE);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004523 }
Satya Calloji444a8da2015-03-06 10:38:22 -08004524
The Android Open Source Project5738f832012-12-12 16:00:35 -08004525 if (bta_dm_cb.p_sec_cback)
4526 {
4527 //bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
4528 bta_dm_cb.p_sec_cback(BTA_DM_BLE_AUTH_CMPL_EVT, &sec_event);
4529 }
4530
4531 break;
4532
4533 default:
4534 status = BTM_NOT_AUTHORIZED;
4535 break;
4536 }
4537 return status;
4538}
4539#endif /* SMP_INCLUDED == TRUE */
4540
4541/*******************************************************************************
4542**
4543** Function bta_dm_ble_id_key_cback
4544**
4545** Description Callback for BLE local ID keys
4546**
4547**
4548** Returns void
4549**
4550*******************************************************************************/
4551static void bta_dm_ble_id_key_cback (UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key)
4552{
4553 UINT8 evt;
4554 tBTA_DM_SEC dm_key;
4555
4556 switch (key_type)
4557 {
4558 case BTM_BLE_KEY_TYPE_ID:
4559 case BTM_BLE_KEY_TYPE_ER:
4560 if (bta_dm_cb.p_sec_cback)
4561 {
4562 memcpy(&dm_key.ble_id_keys, p_key, sizeof(tBTM_BLE_LOCAL_KEYS));
4563
4564 evt = (key_type == BTM_BLE_KEY_TYPE_ID) ? BTA_DM_BLE_LOCAL_IR_EVT :\
4565 BTA_DM_BLE_LOCAL_ER_EVT;
4566 bta_dm_cb.p_sec_cback(evt, &dm_key);
4567 }
4568 break;
4569
4570 default:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004571 APPL_TRACE_DEBUG("Unknown key type %d", key_type);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004572 break;
4573 }
4574 return;
4575
4576}
4577
4578/*******************************************************************************
4579**
4580** Function bta_dm_add_blekey
4581**
4582** Description This function adds an BLE Key to an security database entry.
4583** This function shall only be called AFTER BTA_DmAddBleDevice has been called.
4584** It is normally called during host startup to restore all required information
4585** stored in the NVRAM.
4586**
4587** Parameters:
4588**
4589*******************************************************************************/
4590void bta_dm_add_blekey (tBTA_DM_MSG *p_data)
4591{
4592 if (!BTM_SecAddBleKey (p_data->add_ble_key.bd_addr,
4593 (tBTM_LE_KEY_VALUE *)&p_data->add_ble_key.blekey,
4594 p_data->add_ble_key.key_type))
4595 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004596 APPL_TRACE_ERROR ("BTA_DM: Error adding BLE Key for device %08x%04x",
The Android Open Source Project5738f832012-12-12 16:00:35 -08004597 (p_data->add_ble_key.bd_addr[0]<<24)+(p_data->add_ble_key.bd_addr[1]<<16)+\
4598 (p_data->add_ble_key.bd_addr[2]<<8)+p_data->add_ble_key.bd_addr[3],
4599 (p_data->add_ble_key.bd_addr[4]<<8)+p_data->add_ble_key.bd_addr[5]);
4600 }
4601}
4602
4603/*******************************************************************************
4604**
4605** Function bta_dm_add_ble_device
4606**
4607** Description This function adds an BLE device to an security database entry.
4608** It is normally called during host startup to restore all required information
4609** stored in the NVRAM.
4610**
4611** Parameters:
4612**
4613*******************************************************************************/
4614void bta_dm_add_ble_device (tBTA_DM_MSG *p_data)
4615{
4616 if (!BTM_SecAddBleDevice (p_data->add_ble_device.bd_addr, NULL,
4617 p_data->add_ble_device.dev_type ,
4618 p_data->add_ble_device.addr_type))
4619 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004620 APPL_TRACE_ERROR ("BTA_DM: Error adding BLE Device for device %08x%04x",
The Android Open Source Project5738f832012-12-12 16:00:35 -08004621 (p_data->add_ble_device.bd_addr[0]<<24)+(p_data->add_ble_device.bd_addr[1]<<16)+ \
4622 (p_data->add_ble_device.bd_addr[2]<<8)+p_data->add_ble_device.bd_addr[3],
4623 (p_data->add_ble_device.bd_addr[4]<<8)+p_data->add_ble_device.bd_addr[5]);
4624 }
4625}
4626
4627/*******************************************************************************
4628**
4629** Function bta_dm_add_ble_device
4630**
4631** Description This function adds an BLE device to an security database entry.
4632** It is normally called during host startup to restore all required information
4633** stored in the NVRAM.
4634**
4635** Parameters:
4636**
4637*******************************************************************************/
4638void bta_dm_ble_passkey_reply (tBTA_DM_MSG *p_data)
4639{
4640 if (p_data->pin_reply.accept)
4641 {
The Android Open Source Project5738f832012-12-12 16:00:35 -08004642 BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_SUCCESS, p_data->ble_passkey_reply.passkey);
4643 }
4644 else
4645 {
4646 BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_NOT_AUTHORIZED, p_data->ble_passkey_reply.passkey);
4647 }
4648
4649}
4650
4651/*******************************************************************************
4652**
Satya Calloji444a8da2015-03-06 10:38:22 -08004653** Function bta_dm_ble_confirm_reply
4654**
4655** Description This is response to SM numeric comparison request submitted
4656** to application.
4657**
4658** Parameters:
4659**
4660*******************************************************************************/
4661void bta_dm_ble_confirm_reply (tBTA_DM_MSG *p_data)
4662{
4663 if (p_data->confirm.accept)
4664 {
4665 BTM_BleConfirmReply(p_data->confirm.bd_addr, BTM_SUCCESS);
4666 }
4667 else
4668 {
4669 BTM_BleConfirmReply(p_data->ble_passkey_reply.bd_addr, BTM_NOT_AUTHORIZED);
4670 }
4671}
4672
4673/*******************************************************************************
4674**
The Android Open Source Project5738f832012-12-12 16:00:35 -08004675** Function bta_dm_security_grant
4676**
4677** Description This function grant SMP security request access.
4678**
4679** Parameters:
4680**
4681*******************************************************************************/
4682void bta_dm_security_grant (tBTA_DM_MSG *p_data)
4683{
4684 BTM_SecurityGrant(p_data->ble_sec_grant.bd_addr, p_data->ble_sec_grant.res);
4685}
4686
4687/*******************************************************************************
4688**
4689** Function bta_dm_ble_set_bg_conn_type
4690**
4691** Description This function set the BLE background connection type
4692**
4693** Parameters:
4694**
4695*******************************************************************************/
4696void bta_dm_ble_set_bg_conn_type (tBTA_DM_MSG *p_data)
4697{
4698 BTM_BleSetBgConnType(p_data->ble_set_bd_conn_type.bg_conn_type,
4699 p_data->ble_set_bd_conn_type.p_select_cback);
4700}
4701
4702/*******************************************************************************
4703**
4704** Function bta_dm_ble_set_conn_params
4705**
4706** Description This function set the preferred connection parameters.
4707**
4708** Parameters:
4709**
4710*******************************************************************************/
4711void bta_dm_ble_set_conn_params (tBTA_DM_MSG *p_data)
4712{
4713 BTM_BleSetPrefConnParams(p_data->ble_set_conn_params.peer_bda,
4714 p_data->ble_set_conn_params.conn_int_min,
4715 p_data->ble_set_conn_params.conn_int_max,
4716 p_data->ble_set_conn_params.slave_latency,
4717 p_data->ble_set_conn_params.supervision_tout);
4718}
4719
4720/*******************************************************************************
4721**
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07004722** Function bta_dm_ble_set_conn_scan_params
The Android Open Source Project5738f832012-12-12 16:00:35 -08004723**
Satya Calloji5725fc62015-03-31 13:24:32 -07004724** Description This function sets BLE scan parameters.
4725**
4726** Parameters:
4727**
4728*******************************************************************************/
4729void bta_dm_ble_set_scan_params(tBTA_DM_MSG *p_data)
4730{
4731 BTM_BleSetScanParams(p_data->ble_set_scan_params.client_if,
4732 p_data->ble_set_scan_params.scan_int,
4733 p_data->ble_set_scan_params.scan_window,
4734 p_data->ble_set_scan_params.scan_mode,
4735 p_data->ble_set_scan_params.scan_param_setup_cback);
4736}
4737
4738/*******************************************************************************
4739**
4740** Function bta_dm_ble_set_conn_scan_params
4741**
The Android Open Source Project5738f832012-12-12 16:00:35 -08004742** Description This function set the preferred connection scan parameters.
4743**
4744** Parameters:
4745**
4746*******************************************************************************/
Satya Calloji5725fc62015-03-31 13:24:32 -07004747void bta_dm_ble_set_conn_scan_params (tBTA_DM_MSG *p_data)
The Android Open Source Project5738f832012-12-12 16:00:35 -08004748{
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07004749 BTM_BleSetConnScanParams(p_data->ble_set_conn_scan_params.scan_int,
4750 p_data->ble_set_conn_scan_params.scan_window);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004751}
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004752/*******************************************************************************
4753**
4754** Function bta_dm_ble_update_conn_params
4755**
4756** Description This function update LE connection parameters.
4757**
4758** Parameters:
4759**
4760*******************************************************************************/
4761void bta_dm_ble_update_conn_params (tBTA_DM_MSG *p_data)
4762{
4763 if (!L2CA_UpdateBleConnParams(p_data->ble_update_conn_params.bd_addr,
4764 p_data->ble_update_conn_params.min_int,
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07004765 p_data->ble_update_conn_params.max_int,
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004766 p_data->ble_update_conn_params.latency,
4767 p_data->ble_update_conn_params.timeout))
4768 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004769 APPL_TRACE_ERROR("Update connection parameters failed!");
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004770 }
4771}
The Android Open Source Project5738f832012-12-12 16:00:35 -08004772
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004773#if BLE_PRIVACY_SPT == TRUE
4774/*******************************************************************************
4775**
4776** Function bta_dm_ble_config_local_privacy
4777**
4778** Description This function set the local device LE privacy settings.
4779**
4780** Parameters:
4781**
4782*******************************************************************************/
4783void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data)
4784{
4785 BTM_BleConfigPrivacy (p_data->ble_local_privacy.privacy_enable);
4786}
4787#endif
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07004788
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004789/*******************************************************************************
4790**
4791** Function bta_dm_ble_observe
4792**
4793** Description This function set the preferred connection scan parameters.
4794**
4795** Parameters:
4796**
4797*******************************************************************************/
4798void bta_dm_ble_observe (tBTA_DM_MSG *p_data)
4799{
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004800 tBTM_STATUS status;
4801 if (p_data->ble_observe.start)
4802 {
4803 /*Save the callback to be called when a scan results are available */
4804 bta_dm_search_cb.p_scan_cback = p_data->ble_observe.p_cback;
4805 if ((status = BTM_BleObserve(TRUE, p_data->ble_observe.duration,
Priti Agherab6b14bb2014-06-06 13:54:08 -07004806 bta_dm_observe_results_cb, bta_dm_observe_cmpl_cb))!= BTM_CMD_STARTED)
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004807 {
4808 tBTA_DM_SEARCH data;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004809 APPL_TRACE_WARNING(" %s BTM_BleObserve failed. status %d",__FUNCTION__,status);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004810 data.inq_cmpl.num_resps = 0;
4811 if (bta_dm_search_cb.p_scan_cback)
4812 {
4813 bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_CMPL_EVT, &data);
4814 }
4815 }
4816 }
4817 else
4818 {
4819 bta_dm_search_cb.p_scan_cback = NULL;
4820 BTM_BleObserve(FALSE, 0, NULL,NULL );
4821 }
4822}
Andre Eisenbach5c44e452013-08-06 18:19:37 -07004823/*******************************************************************************
4824**
Satya Calloji5725fc62015-03-31 13:24:32 -07004825** Function bta_dm_ble_set_adv_params
Andre Eisenbach5c44e452013-08-06 18:19:37 -07004826**
4827** Description This function set the adv parameters.
4828**
4829** Parameters:
4830**
4831*******************************************************************************/
4832void bta_dm_ble_set_adv_params (tBTA_DM_MSG *p_data)
4833{
4834 BTM_BleSetAdvParams(p_data->ble_set_adv_params.adv_int_min,
4835 p_data->ble_set_adv_params.adv_int_max,
4836 p_data->ble_set_adv_params.p_dir_bda,
4837 BTA_DM_BLE_ADV_CHNL_MAP);
4838}
Andre Eisenbacheeeac992013-11-08 10:23:52 -08004839
Andre Eisenbach5c44e452013-08-06 18:19:37 -07004840/*******************************************************************************
4841**
4842** Function bta_dm_ble_set_adv_config
4843**
4844** Description This function set the customized ADV data configuration
4845**
4846** Parameters:
4847**
4848*******************************************************************************/
4849void bta_dm_ble_set_adv_config (tBTA_DM_MSG *p_data)
4850{
Wei Wanga6ce7752014-05-20 06:30:32 +00004851 tBTA_STATUS status = BTA_FAILURE;
4852
4853 if (BTM_BleWriteAdvData(p_data->ble_set_adv_data.data_mask,
4854 (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg) == BTM_SUCCESS)
4855 {
4856 status = BTA_SUCCESS;
4857 }
4858
4859 if (p_data->ble_set_adv_data.p_adv_data_cback)
4860 (*p_data->ble_set_adv_data.p_adv_data_cback)(status);
Andre Eisenbach5c44e452013-08-06 18:19:37 -07004861}
4862
Andre Eisenbacheeeac992013-11-08 10:23:52 -08004863/*******************************************************************************
4864**
4865** Function bta_dm_ble_set_scan_rsp
4866**
4867** Description This function set the customized ADV scan resp. configuration
4868**
4869** Parameters:
4870**
4871*******************************************************************************/
4872void bta_dm_ble_set_scan_rsp (tBTA_DM_MSG *p_data)
4873{
Wei Wanga6ce7752014-05-20 06:30:32 +00004874 tBTA_STATUS status = BTA_FAILURE;
4875
4876 if(BTM_BleWriteScanRsp(p_data->ble_set_adv_data.data_mask,
4877 (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg) == BTM_SUCCESS)
4878 {
4879 status = BTA_SUCCESS;
4880 }
4881
4882 if (p_data->ble_set_adv_data.p_adv_data_cback)
4883 (*p_data->ble_set_adv_data.p_adv_data_cback)(status);
Andre Eisenbacheeeac992013-11-08 10:23:52 -08004884}
4885
4886/*******************************************************************************
4887**
Priti Aghera636d6712014-12-18 13:55:48 -08004888** Function bta_dm_ble_set_data_length
4889**
4890** Description This function set the maximum transmission packet size
4891**
4892** Parameters
4893**
4894*******************************************************************************/
4895void bta_dm_ble_set_data_length(tBTA_DM_MSG *p_data)
4896{
4897 if (BTM_SetBleDataLength(p_data->ble_set_data_length.remote_bda,
4898 p_data->ble_set_data_length.tx_data_length) != BTM_SUCCESS)
4899 {
4900 APPL_TRACE_ERROR("%s failed", __FUNCTION__);
4901 }
4902}
4903
4904/*******************************************************************************
4905**
Andre Eisenbacheeeac992013-11-08 10:23:52 -08004906** Function bta_dm_ble_broadcast
4907**
4908** Description Starts or stops LE broadcasts
4909**
4910** Parameters:
4911**
4912*******************************************************************************/
4913void bta_dm_ble_broadcast (tBTA_DM_MSG *p_data)
4914{
4915 BTM_BleBroadcast(p_data->ble_observe.start);
4916}
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004917
Wei Wanga6ce7752014-05-20 06:30:32 +00004918/*******************************************************************************
4919**
4920** Function bta_dm_ble_multi_adv_enb
4921**
4922** Description This function enables a single advertising instance
4923**
4924** Parameters:
4925**
4926*******************************************************************************/
4927void bta_dm_ble_multi_adv_enb(tBTA_DM_MSG *p_data)
4928{
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07004929 tBTM_STATUS btm_status = 0;
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07004930
4931 bta_dm_cb.p_multi_adv_cback = p_data->ble_multi_adv_enb.p_cback;
4932 if(BTM_BleMaxMultiAdvInstanceCount() > 0 && NULL != p_data->ble_multi_adv_enb.p_ref)
4933 {
4934 btm_status = BTM_BleEnableAdvInstance((tBTM_BLE_ADV_PARAMS*)
4935 p_data->ble_multi_adv_enb.p_params,
4936 p_data->ble_multi_adv_enb.p_cback,
4937 p_data->ble_multi_adv_enb.p_ref);
4938 }
4939
4940 if(BTM_CMD_STARTED != btm_status)
4941 {
4942 bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_ENB_EVT, 0xFF,
4943 p_data->ble_multi_adv_enb.p_ref, BTA_FAILURE);
4944 }
Wei Wanga6ce7752014-05-20 06:30:32 +00004945}
4946/*******************************************************************************
4947**
4948** Function bta_dm_ble_multi_adv_param_upd
4949**
4950** Description This function updates multiple advertising instance parameters
4951**
4952** Parameters:
4953**
4954*******************************************************************************/
4955void bta_dm_ble_multi_adv_upd_param(tBTA_DM_MSG *p_data)
4956{
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07004957 tBTM_STATUS btm_status = 0;
4958 void *p_ref = NULL;
4959
4960 if(BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_param.inst_id > 0
4961 && p_data->ble_multi_adv_param.inst_id < BTM_BleMaxMultiAdvInstanceCount())
4962 {
4963 btm_status = BTM_BleUpdateAdvInstParam(p_data->ble_multi_adv_param.inst_id,
4964 (tBTM_BLE_ADV_PARAMS*)p_data->ble_multi_adv_param.p_params);
4965 }
4966
4967 if(BTM_CMD_STARTED != btm_status)
4968 {
4969 p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_param.inst_id);
4970 bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_PARAM_EVT,
4971 p_data->ble_multi_adv_param.inst_id, p_ref, BTA_FAILURE);
4972 }
Wei Wanga6ce7752014-05-20 06:30:32 +00004973}
4974/*******************************************************************************
4975**
4976** Function bta_dm_ble_multi_adv_data
4977**
4978** Description This function write multiple advertising instance adv data
4979** or scan response data
4980**
4981** Parameters:
4982**
4983*******************************************************************************/
4984void bta_dm_ble_multi_adv_data(tBTA_DM_MSG *p_data)
4985{
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07004986 tBTM_STATUS btm_status = 0;
4987 void *p_ref = NULL;
4988
4989 if(BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_data.inst_id > 0
4990 && p_data->ble_multi_adv_data.inst_id < BTM_BleMaxMultiAdvInstanceCount())
4991 {
4992 btm_status = BTM_BleCfgAdvInstData(p_data->ble_multi_adv_data.inst_id,
4993 p_data->ble_multi_adv_data.is_scan_rsp,
4994 p_data->ble_multi_adv_data.data_mask,
4995 (tBTM_BLE_ADV_DATA*)p_data->ble_multi_adv_data.p_data);
4996 }
4997
4998 if(BTM_CMD_STARTED != btm_status)
4999 {
5000 p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_data.inst_id);
5001 bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_DATA_EVT,
5002 p_data->ble_multi_adv_data.inst_id, p_ref, BTA_FAILURE);
5003 }
5004
Wei Wanga6ce7752014-05-20 06:30:32 +00005005}
5006/*******************************************************************************
5007**
5008** Function btm_dm_ble_multi_adv_disable
5009**
5010** Description This function disable a single adv instance
5011**
5012** Parameters:
5013**
5014*******************************************************************************/
5015void btm_dm_ble_multi_adv_disable(tBTA_DM_MSG *p_data)
5016{
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005017 tBTM_STATUS btm_status = 0;
5018 void *p_ref = NULL;
5019
5020 if(BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_disable.inst_id > 0
5021 && p_data->ble_multi_adv_disable.inst_id < BTM_BleMaxMultiAdvInstanceCount())
5022 {
5023 btm_status = BTM_BleDisableAdvInstance(p_data->ble_multi_adv_disable.inst_id);
5024 }
5025
5026 if(BTM_CMD_STARTED != btm_status)
5027 {
5028 p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_disable.inst_id);
5029 bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_DISABLE_EVT,
5030 p_data->ble_multi_adv_disable.inst_id, p_ref, BTA_FAILURE);
5031 }
Wei Wanga6ce7752014-05-20 06:30:32 +00005032}
5033
Satya Callojic4e25962014-05-10 23:46:24 -07005034/*******************************************************************************
5035**
5036** Function bta_dm_ble_setup_storage
5037**
5038** Description This function configures up the storage parameters for ADV batch scanning
5039**
5040** Parameters:
5041**
5042*******************************************************************************/
5043void bta_dm_ble_setup_storage (tBTA_DM_MSG *p_data)
5044{
Satya Callojic4e25962014-05-10 23:46:24 -07005045 tBTM_STATUS btm_status = 0;
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005046 tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
Satya Callojic4e25962014-05-10 23:46:24 -07005047
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005048 BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
5049
5050 if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
5051 {
5052 btm_status = BTM_BleSetStorageConfig(p_data->ble_set_storage.batch_scan_full_max,
5053 p_data->ble_set_storage.batch_scan_trunc_max,
5054 p_data->ble_set_storage.batch_scan_notify_threshold,
5055 p_data->ble_set_storage.p_setup_cback,
5056 p_data->ble_set_storage.p_thres_cback,
5057 p_data->ble_set_storage.p_read_rep_cback,
5058 p_data->ble_set_storage.ref_value);
5059 }
Satya Callojic4e25962014-05-10 23:46:24 -07005060
5061 if(BTM_CMD_STARTED != btm_status)
5062 bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_CFG_STRG_EVT, p_data->ble_set_storage.ref_value,
5063 btm_status);
Satya Callojic4e25962014-05-10 23:46:24 -07005064}
5065
5066/*******************************************************************************
5067**
5068** Function bta_dm_ble_enable_batch_scan
5069**
5070** Description This function sets up the parameters and enables batch scan
5071**
5072** Parameters:
5073**
5074*******************************************************************************/
5075void bta_dm_ble_enable_batch_scan (tBTA_DM_MSG *p_data)
5076{
Satya Callojic4e25962014-05-10 23:46:24 -07005077 tBTM_STATUS btm_status = 0;
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005078 tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
Satya Callojic4e25962014-05-10 23:46:24 -07005079
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005080 BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
5081
5082 if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
5083 {
5084 btm_status = BTM_BleEnableBatchScan(p_data->ble_enable_scan.scan_mode,
5085 p_data->ble_enable_scan.scan_int,
5086 p_data->ble_enable_scan.scan_window,
5087 p_data->ble_enable_scan.discard_rule,
5088 p_data->ble_enable_scan.addr_type,
5089 p_data->ble_enable_scan.ref_value);
5090 }
Satya Callojic4e25962014-05-10 23:46:24 -07005091
5092 if(BTM_CMD_STARTED != btm_status)
5093 bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_ENABLE_EVT, p_data->ble_enable_scan.ref_value,
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005094 btm_status);
Satya Callojic4e25962014-05-10 23:46:24 -07005095}
5096
5097/*******************************************************************************
5098**
5099** Function bta_dm_ble_disable_batch_scan
5100**
5101** Description This function disables the batch scan
5102**
5103** Parameters:
5104**
5105*******************************************************************************/
5106void bta_dm_ble_disable_batch_scan (tBTA_DM_MSG *p_data)
5107{
5108 UNUSED(p_data);
Satya Callojic4e25962014-05-10 23:46:24 -07005109 tBTM_STATUS btm_status = 0;
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005110 tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
Satya Callojic4e25962014-05-10 23:46:24 -07005111
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005112 BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
5113
5114 if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
5115 {
5116 btm_status = BTM_BleDisableBatchScan(p_data->ble_disable_scan.ref_value);
5117 }
Satya Callojic4e25962014-05-10 23:46:24 -07005118
5119 if(BTM_CMD_STARTED != btm_status)
5120 bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_DISABLE_EVT, p_data->ble_enable_scan.ref_value,
5121 btm_status);
Satya Callojic4e25962014-05-10 23:46:24 -07005122}
5123
5124/*******************************************************************************
5125**
5126** Function bta_dm_ble_read_scan_reports
5127**
5128** Description This function reads the batch scan reports
5129**
5130** Parameters:
5131**
5132*******************************************************************************/
5133void bta_dm_ble_read_scan_reports(tBTA_DM_MSG *p_data)
5134{
Satya Callojic4e25962014-05-10 23:46:24 -07005135 tBTM_STATUS btm_status = 0;
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005136 tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
Satya Callojic4e25962014-05-10 23:46:24 -07005137
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005138 BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
5139
5140 if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
5141 {
5142 btm_status = BTM_BleReadScanReports(p_data->ble_read_reports.scan_type,
5143 p_data->ble_read_reports.ref_value);
5144 }
Satya Callojic4e25962014-05-10 23:46:24 -07005145
5146 if(BTM_CMD_STARTED != btm_status)
5147 bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_READ_REPTS_EVT, p_data->ble_enable_scan.ref_value,
5148 btm_status);
Satya Callojic4e25962014-05-10 23:46:24 -07005149}
5150
5151/*******************************************************************************
5152**
Satya Calloji1acb61c2014-06-14 23:16:18 -07005153** Function bta_dm_ble_track_advertiser
5154**
5155** Description This function tracks the specific advertiser
5156**
5157** Parameters:
5158**
5159*******************************************************************************/
5160void bta_dm_ble_track_advertiser(tBTA_DM_MSG *p_data)
5161{
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005162 tBTM_STATUS btm_status = 0;
5163 BD_ADDR bda;
5164 memset(&bda, 0 , sizeof(BD_ADDR));
5165 tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
Satya Callojif5387072015-02-09 17:40:52 -08005166 tBTA_DM_BLE_TRACK_ADV_DATA track_adv_data;
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005167
5168 BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
5169
5170 if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
5171 {
Satya Callojif5387072015-02-09 17:40:52 -08005172 btm_status = BTM_BleTrackAdvertiser((tBTM_BLE_TRACK_ADV_CBACK *)
5173 p_data->ble_track_advert.p_track_adv_cback,
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005174 p_data->ble_track_advert.ref_value);
5175 }
5176
5177 if(BTM_CMD_STARTED != btm_status)
Satya Callojif5387072015-02-09 17:40:52 -08005178 {
5179 memset(&track_adv_data, 0, sizeof(tBTA_DM_BLE_TRACK_ADV_DATA));
5180 track_adv_data.advertiser_info_present = NO_ADV_INFO_PRESENT; /* Indicates failure */
5181 track_adv_data.client_if = (UINT8)p_data->ble_track_advert.ref_value;
5182 p_data->ble_track_advert.p_track_adv_cback(&track_adv_data);
5183 }
Satya Calloji1acb61c2014-06-14 23:16:18 -07005184}
5185
5186/*******************************************************************************
5187**
Satya Callojic4e25962014-05-10 23:46:24 -07005188** Function bta_ble_scan_setup_cb
5189**
5190** Description Handle the setup callback from BTM layer and forward it to app layer
5191**
5192** Parameters:
5193**
5194*******************************************************************************/
5195void bta_ble_scan_setup_cb(tBTM_BLE_BATCH_SCAN_EVT evt, tBTM_BLE_REF_VALUE ref_value,
5196 tBTM_STATUS status)
5197{
5198 tBTA_BLE_BATCH_SCAN_EVT bta_evt = 0;
5199
Satya Callojif1dba912014-07-15 17:37:13 -07005200 APPL_TRACE_DEBUG("bta_ble_scan_setup_cb : evt: %d, ref_value: %d, status:%d", evt,
5201 ref_value, status);
5202
Satya Callojic4e25962014-05-10 23:46:24 -07005203 switch(evt)
5204 {
5205 case BTM_BLE_BATCH_SCAN_ENABLE_EVT:
5206 bta_evt = BTA_BLE_BATCH_SCAN_ENB_EVT;
5207 break;
5208 case BTM_BLE_BATCH_SCAN_CFG_STRG_EVT:
5209 bta_evt = BTA_BLE_BATCH_SCAN_CFG_STRG_EVT;
5210 break;
5211 case BTM_BLE_BATCH_SCAN_DISABLE_EVT:
5212 bta_evt = BTA_BLE_BATCH_SCAN_DIS_EVT;
5213 break;
5214 case BTM_BLE_BATCH_SCAN_PARAM_EVT:
5215 bta_evt = BTA_BLE_BATCH_SCAN_PARAM_EVT;
5216 break;
5217 default:
5218 break;
5219 }
5220
5221 if(NULL != bta_dm_cb.p_setup_cback)
5222 bta_dm_cb.p_setup_cback(bta_evt, ref_value, status);
5223}
5224
Satya Calloji1a9247a2014-06-05 13:15:15 -07005225
5226#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
5227/*******************************************************************************
5228**
5229** Function bta_ble_scan_pf_cmpl
5230**
5231** Description ADV payload filtering operation complete callback
5232**
5233**
5234** Returns TRUE if handled, otherwise FALSE.
5235**
5236*******************************************************************************/
5237static void bta_ble_scan_cfg_cmpl(tBTM_BLE_PF_ACTION action, tBTM_BLE_SCAN_COND_OP cfg_op,
5238 tBTM_BLE_PF_AVBL_SPACE avbl_space, tBTM_STATUS status,
5239 tBTM_BLE_REF_VALUE ref_value)
5240{
5241 tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS: BTA_FAILURE;
5242
5243 APPL_TRACE_DEBUG("bta_ble_scan_cfg_cmpl: %d, %d, %d, %d", action, cfg_op, avbl_space, status);
5244
5245 if(bta_dm_cb.p_scan_filt_cfg_cback)
5246 bta_dm_cb.p_scan_filt_cfg_cback(action, cfg_op, avbl_space, st, ref_value);
5247}
5248
5249/*******************************************************************************
5250**
Satya Calloji1a9247a2014-06-05 13:15:15 -07005251** Function bta_dm_cfg_filter_cond
5252**
5253** Description This function configure adv payload filtering condition
5254**
5255** Parameters:
5256**
5257*******************************************************************************/
5258void bta_dm_cfg_filter_cond (tBTA_DM_MSG *p_data)
5259{
5260 tBTM_STATUS st = BTM_MODE_UNSUPPORTED;
5261 tBTA_STATUS status = BTA_FAILURE;
5262
5263 tBTM_BLE_VSC_CB cmn_vsc_cb;
5264
5265 APPL_TRACE_DEBUG("bta_dm_cfg_filter_cond");
5266 BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
5267 if(0 != cmn_vsc_cb.filter_support)
5268 {
5269 if ((st = BTM_BleCfgFilterCondition(p_data->ble_cfg_filter_cond.action,
5270 p_data->ble_cfg_filter_cond.cond_type,
5271 (tBTM_BLE_PF_FILT_INDEX)p_data->ble_cfg_filter_cond.filt_index,
5272 (tBTM_BLE_PF_COND_PARAM *)p_data->ble_cfg_filter_cond.p_cond_param,
5273 bta_ble_scan_cfg_cmpl, p_data->ble_cfg_filter_cond.ref_value))
5274 == BTM_CMD_STARTED)
5275 {
5276 bta_dm_cb.p_scan_filt_cfg_cback = p_data->ble_cfg_filter_cond.p_filt_cfg_cback;
5277 return;
5278 }
5279 }
5280
5281 if (p_data->ble_cfg_filter_cond.p_filt_cfg_cback)
5282 p_data->ble_cfg_filter_cond.p_filt_cfg_cback(BTA_DM_BLE_PF_CONFIG_EVT,
5283 p_data->ble_cfg_filter_cond.cond_type, 0, status,
5284 p_data->ble_cfg_filter_cond.ref_value);
5285 return;
5286}
5287
5288/*******************************************************************************
5289**
5290** Function bta_dm_enable_scan_filter
5291**
5292** Description This function enable/disable adv payload filtering condition
5293**
5294** Parameters:
5295**
5296*******************************************************************************/
5297void bta_dm_enable_scan_filter(tBTA_DM_MSG *p_data)
5298{
5299 tBTM_STATUS st = BTM_MODE_UNSUPPORTED;
5300 tBTA_STATUS status = BTA_FAILURE;
5301
5302 tBTM_BLE_VSC_CB cmn_vsc_cb;
5303 APPL_TRACE_DEBUG("bta_dm_enable_scan_filter");
5304 BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
5305
5306 if(0 != cmn_vsc_cb.filter_support)
5307 {
5308 if((st = BTM_BleEnableDisableFilterFeature(p_data->ble_enable_scan_filt.action,
5309 p_data->ble_enable_scan_filt.p_filt_status_cback,
5310 (tBTM_BLE_REF_VALUE)p_data->ble_enable_scan_filt.ref_value)) == BTM_CMD_STARTED)
5311 bta_dm_cb.p_scan_filt_status_cback = p_data->ble_enable_scan_filt.p_filt_status_cback;
5312 return;
5313 }
5314
5315 if (p_data->ble_enable_scan_filt.p_filt_status_cback)
5316 p_data->ble_enable_scan_filt.p_filt_status_cback (BTA_DM_BLE_PF_ENABLE_EVT,
5317 p_data->ble_enable_scan_filt.ref_value, status);
5318
5319}
Satya Callojie5ba8842014-07-03 17:18:02 -07005320
Satya Calloji1a9247a2014-06-05 13:15:15 -07005321/*******************************************************************************
5322**
5323** Function bta_dm_scan_filter_param_setup
5324**
5325** Description This function sets up scan filter params
5326**
5327** Parameters:
5328**
5329*******************************************************************************/
5330void bta_dm_scan_filter_param_setup (tBTA_DM_MSG *p_data)
5331{
5332 tBTM_STATUS st = BTM_MODE_UNSUPPORTED;
5333 tBTA_STATUS status = BTA_FAILURE;
5334
5335 tBTM_BLE_VSC_CB cmn_vsc_cb;
5336
5337 APPL_TRACE_DEBUG("bta_dm_scan_filter_param_setup");
5338 BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
5339 if(0 != cmn_vsc_cb.filter_support)
5340 {
5341 if ((st = BTM_BleAdvFilterParamSetup(p_data->ble_scan_filt_param_setup.action,
5342 p_data->ble_scan_filt_param_setup.filt_index,
Nitin Arora643aea52014-09-11 18:35:55 -07005343 (tBTM_BLE_PF_FILT_PARAMS *)&p_data->ble_scan_filt_param_setup.filt_params,
Satya Calloji1a9247a2014-06-05 13:15:15 -07005344 p_data->ble_scan_filt_param_setup.p_target,
5345 p_data->ble_scan_filt_param_setup.p_filt_param_cback,
5346 p_data->ble_scan_filt_param_setup.ref_value)) == BTM_CMD_STARTED)
5347 {
5348 bta_dm_cb.p_scan_filt_param_cback = p_data->ble_scan_filt_param_setup.p_filt_param_cback;
5349 return;
5350 }
5351 }
5352
5353 if (p_data->ble_scan_filt_param_setup.p_filt_param_cback)
5354 p_data->ble_scan_filt_param_setup.p_filt_param_cback (BTA_DM_BLE_PF_ENABLE_EVT, 0,
5355 p_data->ble_scan_filt_param_setup.ref_value, status);
5356
5357 return;
5358}
5359#endif
5360
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005361/*******************************************************************************
5362**
5363** Function bta_ble_enable_scan_cmpl
5364**
5365** Description ADV payload filtering enable / disable complete callback
5366**
5367**
5368** Returns None
5369**
5370*******************************************************************************/
5371static void bta_ble_energy_info_cmpl(tBTM_BLE_TX_TIME_MS tx_time,
5372 tBTM_BLE_RX_TIME_MS rx_time,
5373 tBTM_BLE_IDLE_TIME_MS idle_time,
5374 tBTM_BLE_ENERGY_USED energy_used,
5375 tBTM_STATUS status)
5376{
5377 tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS: BTA_FAILURE;
5378 tBTA_DM_CONTRL_STATE ctrl_state = 0;
5379
5380 if (BTA_SUCCESS == st)
5381 ctrl_state = bta_dm_pm_obtain_controller_state();
5382
5383 if (bta_dm_cb.p_energy_info_cback)
5384 bta_dm_cb.p_energy_info_cback(tx_time, rx_time, idle_time, energy_used, ctrl_state, st);
5385}
5386
5387/*******************************************************************************
5388**
5389** Function bta_dm_ble_get_energy_info
5390**
5391** Description This function obtains the energy info
5392**
5393** Parameters:
5394**
5395*******************************************************************************/
5396void bta_dm_ble_get_energy_info(tBTA_DM_MSG *p_data)
5397{
5398 tBTM_STATUS btm_status = 0;
5399
5400 bta_dm_cb.p_energy_info_cback = p_data->ble_energy_info.p_energy_info_cback;
5401 btm_status = BTM_BleGetEnergyInfo(bta_ble_energy_info_cmpl);
5402 if (BTM_CMD_STARTED != btm_status)
5403 bta_ble_energy_info_cmpl(0, 0, 0, 0, btm_status);
5404}
5405
The Android Open Source Project5738f832012-12-12 16:00:35 -08005406#if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE))
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07005407#ifndef BTA_DM_GATT_CLOSE_DELAY_TOUT
5408#define BTA_DM_GATT_CLOSE_DELAY_TOUT 1000
5409#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08005410
5411/*******************************************************************************
5412**
Andre Eisenbache1202ca2013-05-15 04:55:08 -07005413** Function bta_dm_gattc_register
5414**
5415** Description Register with GATTC in DM if BLE is needed.
5416**
5417**
5418** Returns void
5419**
5420*******************************************************************************/
5421static void bta_dm_gattc_register(void)
5422{
5423 tBT_UUID app_uuid = {LEN_UUID_128,{0}};
5424
5425 if (bta_dm_search_cb.client_if == BTA_GATTS_INVALID_IF)
5426 {
5427 memset (&app_uuid.uu.uuid128, 0x87, LEN_UUID_128);
5428 BTA_GATTC_AppRegister(&app_uuid, bta_dm_gattc_callback);
5429 }
5430}
5431
5432/*******************************************************************************
5433**
The Android Open Source Project5738f832012-12-12 16:00:35 -08005434** Function btm_dm_start_disc_gatt_services
5435**
5436** Description This function starts a GATT service search request.
5437**
5438** Parameters:
5439**
5440*******************************************************************************/
5441static void btm_dm_start_disc_gatt_services (UINT16 conn_id)
5442{
5443 tBT_UUID *p_uuid = bta_dm_search_cb.p_srvc_uuid +
5444 bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search;
5445
5446 p_uuid = bta_dm_search_cb.p_srvc_uuid +
5447 bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search;
5448
5449 /* always search for all services */
5450 BTA_GATTC_ServiceSearchRequest(conn_id, p_uuid);
5451}
5452
5453/*******************************************************************************
5454**
5455** Function bta_dm_gatt_disc_result
5456**
5457** Description This function process the GATT service search result.
5458**
5459** Parameters:
5460**
5461*******************************************************************************/
5462static void bta_dm_gatt_disc_result(tBTA_GATT_ID service_id)
5463{
5464 tBTA_DM_SEARCH result;
5465
5466 /*
5467 * This logic will not work for gatt case. We are checking against the bluetooth profiles here
5468 * just copy the GATTID in raw data field and send it across.
5469 */
5470
5471
5472 if ( bta_dm_search_cb.ble_raw_used + sizeof(tBTA_GATT_ID) < bta_dm_search_cb.ble_raw_size )
5473 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07005474 APPL_TRACE_DEBUG("ADDING BLE SERVICE uuid=0x%x, ble_ptr = 0x%x, ble_raw_used = 0x%x",
5475 service_id.uuid.uu.uuid16,bta_dm_search_cb.p_ble_rawdata,bta_dm_search_cb.ble_raw_used);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005476
Andre Eisenbachca22ac42013-02-13 17:02:11 +09005477 if(bta_dm_search_cb.p_ble_rawdata)
5478 {
5479 memcpy((bta_dm_search_cb.p_ble_rawdata + bta_dm_search_cb.ble_raw_used), &service_id,
5480 sizeof(service_id) );
The Android Open Source Project5738f832012-12-12 16:00:35 -08005481
Andre Eisenbachca22ac42013-02-13 17:02:11 +09005482 bta_dm_search_cb.ble_raw_used += sizeof(service_id);
5483 }
5484 else
5485 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005486 APPL_TRACE_ERROR("p_ble_rawdata is NULL");
Andre Eisenbachca22ac42013-02-13 17:02:11 +09005487 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08005488
5489 }
5490 else
5491 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005492 APPL_TRACE_ERROR("%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 );
The Android Open Source Project5738f832012-12-12 16:00:35 -08005493 }
5494
Chris Mantonf8027002015-03-12 09:22:48 -07005495 LOG_INFO("%s service_id_uuid_len=%d ", __func__, service_id.uuid.len);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005496 if ( bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE)
5497 {
5498
5499 /* send result back to app now, one by one */
5500 bdcpy (result.disc_ble_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
5501 BCM_STRNCPY_S((char*)result.disc_ble_res.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN-1));
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08005502 result.disc_ble_res.bd_name[BD_NAME_LEN] = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08005503 memcpy(&result.disc_ble_res.service, &service_id.uuid, sizeof(tBT_UUID));
5504
5505 bta_dm_search_cb.p_search_cback(BTA_DM_DISC_BLE_RES_EVT, &result);
5506 }
5507}
5508
5509/*******************************************************************************
5510**
5511** Function bta_dm_gatt_disc_complete
5512**
5513** Description This function process the GATT service search complete.
5514**
5515** Parameters:
5516**
5517*******************************************************************************/
5518static void bta_dm_gatt_disc_complete(UINT16 conn_id, tBTA_GATT_STATUS status)
5519{
5520 tBTA_DM_MSG *p_msg;
5521
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005522 APPL_TRACE_DEBUG("bta_dm_gatt_disc_complete conn_id = %d",conn_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005523
5524 if (bta_dm_search_cb.uuid_to_search > 0) bta_dm_search_cb.uuid_to_search --;
5525
5526 if (status == BTA_GATT_OK && bta_dm_search_cb.uuid_to_search > 0)
5527 {
5528 btm_dm_start_disc_gatt_services(conn_id);
5529 }
5530 else
5531 {
5532 bta_dm_search_cb.uuid_to_search = 0;
5533
5534 /* no more services to be discovered */
5535 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
5536 {
5537 p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
5538 p_msg->disc_result.result.disc_res.result = (status == BTA_GATT_OK) ? BTA_SUCCESS :BTA_FAILURE;
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07005539 APPL_TRACE_DEBUG("%s service found: 0x%08x", __FUNCTION__,
5540 bta_dm_search_cb.services_found);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005541 p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08005542 p_msg->disc_result.result.disc_res.num_uuids = 0;
5543 p_msg->disc_result.result.disc_res.p_uuid_list = NULL;
The Android Open Source Project5738f832012-12-12 16:00:35 -08005544 bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
5545 BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
5546 bta_dm_get_remname(), (BD_NAME_LEN-1));
5547
5548 /* make sure the string is terminated */
5549 p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
5550
Chaojing Sune2805532015-04-22 13:40:21 -07005551 p_msg->disc_result.result.disc_res.device_type |= BT_DEVICE_TYPE_BLE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08005552 if ( bta_dm_search_cb.ble_raw_used > 0 )
5553 {
5554 p_msg->disc_result.result.disc_res.p_raw_data = GKI_getbuf(bta_dm_search_cb.ble_raw_used);
5555
5556 memcpy( p_msg->disc_result.result.disc_res.p_raw_data,
5557 bta_dm_search_cb.p_ble_rawdata,
5558 bta_dm_search_cb.ble_raw_used );
5559
5560 p_msg->disc_result.result.disc_res.raw_data_size = bta_dm_search_cb.ble_raw_used;
5561 }
5562 else
5563 {
5564 p_msg->disc_result.result.disc_res.p_raw_data = NULL;
5565 bta_dm_search_cb.p_ble_rawdata = 0;
5566 }
5567
5568 bta_sys_sendmsg(p_msg);
5569 }
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07005570
The Android Open Source Project5738f832012-12-12 16:00:35 -08005571 if (conn_id != BTA_GATT_INVALID_CONN_ID)
5572 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07005573 /* start a GATT channel close delay timer */
5574 bta_sys_start_timer(&bta_dm_search_cb.gatt_close_timer, BTA_DM_DISC_CLOSE_TOUT_EVT,
5575 BTA_DM_GATT_CLOSE_DELAY_TOUT);
5576 bdcpy(bta_dm_search_cb.pending_close_bda, bta_dm_search_cb.peer_bdaddr);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005577 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08005578 bta_dm_search_cb.gatt_disc_active = FALSE;
5579 }
5580}
5581
5582/*******************************************************************************
5583**
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07005584** Function bta_dm_close_gatt_conn
5585**
5586** Description This function close the GATT connection after delay timeout.
5587**
5588** Parameters:
5589**
5590*******************************************************************************/
5591void bta_dm_close_gatt_conn(tBTA_DM_MSG *p_data)
5592{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08005593 UNUSED(p_data);
5594
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07005595 if (bta_dm_search_cb.conn_id != BTA_GATT_INVALID_CONN_ID)
5596 BTA_GATTC_Close(bta_dm_search_cb.conn_id);
5597
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07005598 memset(bta_dm_search_cb.pending_close_bda, 0, BD_ADDR_LEN);
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07005599 bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID;
5600}
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07005601/*******************************************************************************
5602**
The Android Open Source Project5738f832012-12-12 16:00:35 -08005603** Function btm_dm_start_gatt_discovery
5604**
5605** Description This is GATT initiate the service search by open a GATT connection
5606** first.
5607**
5608** Parameters:
5609**
5610*******************************************************************************/
5611void btm_dm_start_gatt_discovery (BD_ADDR bd_addr)
5612{
5613 bta_dm_search_cb.gatt_disc_active = TRUE;
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07005614
5615 /* connection is already open */
5616 if (bdcmp(bta_dm_search_cb.pending_close_bda, bd_addr) == 0 &&
5617 bta_dm_search_cb.conn_id != BTA_GATT_INVALID_CONN_ID)
5618 {
5619 memset(bta_dm_search_cb.pending_close_bda, 0, BD_ADDR_LEN);
5620 bta_sys_stop_timer(&bta_dm_search_cb.gatt_close_timer);
5621 btm_dm_start_disc_gatt_services(bta_dm_search_cb.conn_id);
5622 }
5623 else
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07005624 BTA_GATTC_Open(bta_dm_search_cb.client_if, bd_addr, TRUE, BTA_GATT_TRANSPORT_LE);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005625}
5626
5627/*******************************************************************************
5628**
5629** Function bta_dm_cancel_gatt_discovery
5630**
5631** Description This is GATT cancel the GATT service search.
5632**
5633** Parameters:
5634**
5635*******************************************************************************/
5636static void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr)
5637{
5638 if (bta_dm_search_cb.conn_id == BTA_GATT_INVALID_CONN_ID)
5639 {
5640 BTA_GATTC_CancelOpen(bta_dm_search_cb.client_if, bd_addr, TRUE);
5641 }
5642
5643 bta_dm_gatt_disc_complete(bta_dm_search_cb.conn_id, (tBTA_GATT_STATUS) BTA_GATT_ERROR);
5644}
5645
5646/*******************************************************************************
5647**
5648** Function bta_dm_proc_open_evt
5649**
5650** Description process BTA_GATTC_OPEN_EVT in DM.
5651**
5652** Parameters:
5653**
5654*******************************************************************************/
5655void bta_dm_proc_open_evt(tBTA_GATTC_OPEN *p_data)
5656{
5657 UINT8 *p1;
5658 UINT8 *p2;
5659
5660 p1 = bta_dm_search_cb.peer_bdaddr;
5661 p2 = p_data->remote_bda;
5662
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005663 APPL_TRACE_DEBUG("DM Search state= %d search_cb.peer_dbaddr: [%08x%04x] connected_bda= [%08x%04x] ",
The Android Open Source Project5738f832012-12-12 16:00:35 -08005664 bta_dm_search_cb.state,
5665 ((p1[0])<<24)+((p1[1])<<16)+((p1[2])<<8)+(p1[3]),
5666 ((p1[4])<<8)+ p1[5],
5667 ((p2[0])<<24)+((p2[1])<<16)+((p2[2])<<8)+(p2[3]),
5668 ((p2[4])<<8)+ p2[5]);
5669
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005670 APPL_TRACE_DEBUG("BTA_GATTC_OPEN_EVT conn_id = %d client_if=%d status = %d" ,
The Android Open Source Project5738f832012-12-12 16:00:35 -08005671 p_data->conn_id,
5672 p_data->client_if,
5673 p_data->status);
5674
5675 bta_dm_search_cb.conn_id = p_data->conn_id;
5676
5677 if (p_data->status == BTA_GATT_OK)
5678 {
5679 btm_dm_start_disc_gatt_services(p_data->conn_id);
5680 }
5681 else
5682 {
5683 bta_dm_gatt_disc_complete(BTA_GATT_INVALID_CONN_ID, p_data->status);
5684 }
5685}
5686
5687/*******************************************************************************
5688**
5689** Function bta_dm_gattc_callback
5690**
5691** Description This is GATT client callback function used in DM.
5692**
5693** Parameters:
5694**
5695*******************************************************************************/
5696static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data)
5697{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005698 APPL_TRACE_DEBUG("bta_dm_gattc_callback event = %d", event);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005699
5700 switch (event)
5701 {
5702 case BTA_GATTC_REG_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005703 APPL_TRACE_DEBUG("BTA_GATTC_REG_EVT client_if = %d", p_data->reg_oper.client_if);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005704 if (p_data->reg_oper.status == BTA_GATT_OK)
5705 bta_dm_search_cb.client_if = p_data->reg_oper.client_if;
5706 else
5707 bta_dm_search_cb.client_if = BTA_GATTS_INVALID_IF;
5708 break;
5709
5710 case BTA_GATTC_OPEN_EVT:
5711 bta_dm_proc_open_evt(&p_data->open);
5712 break;
5713
5714 case BTA_GATTC_SEARCH_RES_EVT:
5715 bta_dm_gatt_disc_result(p_data->srvc_res.service_uuid.id);
5716 break;
5717
5718 case BTA_GATTC_SEARCH_CMPL_EVT:
5719 if ( bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE)
5720 bta_dm_gatt_disc_complete(p_data->search_cmpl.conn_id, p_data->search_cmpl.status);
5721 break;
5722
5723 case BTA_GATTC_CLOSE_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005724 APPL_TRACE_DEBUG("BTA_GATTC_CLOSE_EVT reason = %d", p_data->close.reason);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005725 /* in case of disconnect before search is completed */
5726 if ( (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) &&
Nitin Arora4e9acf62014-02-18 15:28:59 -08005727 (bta_dm_search_cb.state != BTA_DM_SEARCH_ACTIVE) &&
The Android Open Source Project5738f832012-12-12 16:00:35 -08005728 !memcmp(p_data->close.remote_bda, bta_dm_search_cb.peer_bdaddr, BD_ADDR_LEN))
5729 {
5730 bta_dm_gatt_disc_complete((UINT16)BTA_GATT_INVALID_CONN_ID, (tBTA_GATT_STATUS) BTA_GATT_ERROR);
5731 }
5732 break;
5733
5734 default:
5735 break;
5736 }
5737}
Satya Callojic4e25962014-05-10 23:46:24 -07005738
The Android Open Source Project5738f832012-12-12 16:00:35 -08005739#endif /* BTA_GATT_INCLUDED */
Andre Eisenbachb203d472013-11-20 17:23:06 -08005740
Bernhard Rosenkränzer104e3f22014-11-12 21:53:08 +01005741#if BLE_VND_INCLUDED == TRUE
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -07005742/*******************************************************************************
5743**
5744** Function bta_dm_ctrl_features_rd_cmpl_cback
5745**
5746** Description callback to handle controller feature read complete
5747**
5748** Parameters:
5749**
5750*******************************************************************************/
5751static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result)
5752{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005753 APPL_TRACE_DEBUG("%s status = %d ", __FUNCTION__, result);
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -07005754 if (result == BTM_SUCCESS)
5755 {
5756 if(bta_dm_cb.p_sec_cback)
5757 bta_dm_cb.p_sec_cback(BTA_DM_LE_FEATURES_READ, NULL);
5758 }
5759 else
5760 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005761 APPL_TRACE_ERROR("%s Ctrl BLE feature read failed: status :%d",__FUNCTION__, result);
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -07005762 }
5763
5764}
Bernhard Rosenkränzer104e3f22014-11-12 21:53:08 +01005765#endif /* BLE_VND_INCLUDED */
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -07005766
The Android Open Source Project5738f832012-12-12 16:00:35 -08005767#endif /* BLE_INCLUDED */