blob: a7e3679ca84702c50588e363eafb11c695ac08f1 [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
Marie Janssen49120dc2015-07-07 16:47:20 -070026#define LOG_TAG "bt_bta_dm"
27
Marie Janssendb554582015-06-26 14:53:46 -070028#include <string.h>
29
Mike J. Chen597c5772014-02-11 16:23:31 -080030#include "bt_target.h"
The Android Open Source Project5738f832012-12-12 16:00:35 -080031#include "bt_types.h"
The Android Open Source Project5738f832012-12-12 16:00:35 -080032#include "bta_api.h"
The Android Open Source Project5738f832012-12-12 16:00:35 -080033#include "bta_dm_co.h"
Marie Janssendb554582015-06-26 14:53:46 -070034#include "bta_dm_int.h"
35#include "bta_sys.h"
The Android Open Source Project5738f832012-12-12 16:00:35 -080036#include "btm_api.h"
37#include "btm_int.h"
38#include "btu.h"
Kévin PETIT22c6e502014-02-12 17:24:01 +000039#include "gap_api.h" /* For GAP_BleReadPeerPrefConnParams */
Marie Janssendb554582015-06-26 14:53:46 -070040#include "gki.h"
41#include "l2c_api.h"
Chris Mantonf8027002015-03-12 09:22:48 -070042#include "osi/include/log.h"
Arman Uguraybb954522015-06-02 21:11:07 -070043#include "osi/include/osi.h"
Marie Janssendb554582015-06-26 14:53:46 -070044#include "sdp_api.h"
45#include "utl.h"
Chris Mantonf8027002015-03-12 09:22:48 -070046
Mike J. Chena02a48c2014-01-31 17:49:43 -080047#if (GAP_INCLUDED == TRUE)
48#include "gap_api.h"
49#endif
50
The Android Open Source Project5738f832012-12-12 16:00:35 -080051static void bta_dm_inq_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir);
52static void bta_dm_inq_cmpl_cb (void * p_result);
53static void bta_dm_service_search_remname_cback (BD_ADDR bd_addr, DEV_CLASS dc, BD_NAME bd_name);
54static void bta_dm_remname_cback (tBTM_REMOTE_DEV_NAME *p_remote_name);
55static void bta_dm_find_services ( BD_ADDR bd_addr);
56static void bta_dm_discover_next_device(void);
57static void bta_dm_sdp_callback (UINT16 sdp_status);
58static 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 +020059static 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 -080060static 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);
61static UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,BD_NAME bd_name, int result);
62static void bta_dm_local_name_cback(BD_ADDR bd_addr);
63static BOOLEAN bta_dm_check_av(UINT16 event);
The Android Open Source Project5738f832012-12-12 16:00:35 -080064static void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data);
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -070065
66
67#if BLE_INCLUDED == TRUE
68static void bta_dm_acl_change_cback(BD_ADDR p_bda, DEV_CLASS p_dc,
69 BD_NAME p_bdn, UINT8 *features,
70 BOOLEAN is_new, UINT16 handle,
71 tBT_TRANSPORT transport);
72#else
73static void bta_dm_acl_change_cback(BD_ADDR p_bda, DEV_CLASS p_dc,
74 BD_NAME p_bdn, UINT8 *features,
75 BOOLEAN is_new);
76#endif
77
78
The Android Open Source Project5738f832012-12-12 16:00:35 -080079static void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr);
80
81/* Extended Inquiry Response */
82static UINT8 bta_dm_sp_cback (tBTM_SP_EVT event, tBTM_SP_EVT_DATA *p_data);
83
The Android Open Source Project5738f832012-12-12 16:00:35 -080084static void bta_dm_set_eir (char *local_name);
The Android Open Source Project5738f832012-12-12 16:00:35 -080085
The Android Open Source Project5738f832012-12-12 16:00:35 -080086static void bta_dm_eir_search_services( tBTM_INQ_RESULTS *p_result,
87 tBTA_SERVICE_MASK *p_services_to_search,
88 tBTA_SERVICE_MASK *p_services_found);
The Android Open Source Project5738f832012-12-12 16:00:35 -080089
The Android Open Source Project5738f832012-12-12 16:00:35 -080090static void bta_dm_search_timer_cback (TIMER_LIST_ENT *p_tle);
The Android Open Source Project5738f832012-12-12 16:00:35 -080091static void bta_dm_disable_conn_down_timer_cback (TIMER_LIST_ENT *p_tle);
92static void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr);
93static void bta_dm_adjust_roles(BOOLEAN delay_role_switch);
94static char *bta_dm_get_remname(void);
95static void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result);
96
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -070097static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr,tBT_TRANSPORT transport);
The Android Open Source Project5738f832012-12-12 16:00:35 -080098static void bta_dm_discover_device(BD_ADDR remote_bd_addr);
99
100static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status );
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800101static void bta_dm_disable_search_and_disc(void);
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700102
The Android Open Source Project5738f832012-12-12 16:00:35 -0800103#if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
104 #if ((defined SMP_INCLUDED) && (SMP_INCLUDED == TRUE))
105static UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_DATA *p_data);
106 #endif
107static void bta_dm_ble_id_key_cback (UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key);
108 #if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE))
Andre Eisenbache1202ca2013-05-15 04:55:08 -0700109static void bta_dm_gattc_register(void);
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700110static void btm_dm_start_gatt_discovery(BD_ADDR bd_addr);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800111static void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr);
112static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data);
Prerepa Viswanadham81b03192014-07-23 17:49:48 -0700113extern tBTA_DM_CONTRL_STATE bta_dm_pm_obtain_controller_state(void);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800114 #endif
Bernhard Rosenkränzer104e3f22014-11-12 21:53:08 +0100115
116#if BLE_VND_INCLUDED == TRUE
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -0700117static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result);
Bernhard Rosenkränzer104e3f22014-11-12 21:53:08 +0100118#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -0800119
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800120#ifndef BTA_DM_BLE_ADV_CHNL_MAP
121#define BTA_DM_BLE_ADV_CHNL_MAP (BTM_BLE_ADV_CHNL_37|BTM_BLE_ADV_CHNL_38|BTM_BLE_ADV_CHNL_39)
122#endif
123#endif
Matthew Xief751b012013-08-13 20:05:34 -0700124
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700125static void bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr);
126static void bta_dm_observe_results_cb(tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir);
127static void bta_dm_observe_cmpl_cb(void * p_result);
128static void bta_dm_delay_role_switch_cback(TIMER_LIST_ENT *p_tle);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800129extern void sdpu_uuid16_to_uuid128(UINT16 uuid16, UINT8* p_uuid128);
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700130static void bta_dm_disable_timer_cback(TIMER_LIST_ENT *p_tle);
131
The Android Open Source Project5738f832012-12-12 16:00:35 -0800132
133const UINT16 bta_service_id_to_uuid_lkup_tbl [BTA_MAX_SERVICE_ID] =
134{
135 UUID_SERVCLASS_PNP_INFORMATION, /* Reserved */
136 UUID_SERVCLASS_SERIAL_PORT, /* BTA_SPP_SERVICE_ID */
137 UUID_SERVCLASS_DIALUP_NETWORKING, /* BTA_DUN_SERVICE_ID */
138 UUID_SERVCLASS_AUDIO_SOURCE, /* BTA_A2DP_SOURCE_SERVICE_ID */
139 UUID_SERVCLASS_LAN_ACCESS_USING_PPP, /* BTA_LAP_SERVICE_ID */
140 UUID_SERVCLASS_HEADSET, /* BTA_HSP_HS_SERVICE_ID */
141 UUID_SERVCLASS_HF_HANDSFREE, /* BTA_HFP_HS_SERVICE_ID */
142 UUID_SERVCLASS_OBEX_OBJECT_PUSH, /* BTA_OPP_SERVICE_ID */
143 UUID_SERVCLASS_OBEX_FILE_TRANSFER, /* BTA_FTP_SERVICE_ID */
144 UUID_SERVCLASS_CORDLESS_TELEPHONY, /* BTA_CTP_SERVICE_ID */
145 UUID_SERVCLASS_INTERCOM, /* BTA_ICP_SERVICE_ID */
146 UUID_SERVCLASS_IRMC_SYNC, /* BTA_SYNC_SERVICE_ID */
147 UUID_SERVCLASS_DIRECT_PRINTING, /* BTA_BPP_SERVICE_ID */
148 UUID_SERVCLASS_IMAGING_RESPONDER, /* BTA_BIP_SERVICE_ID */
149 UUID_SERVCLASS_PANU, /* BTA_PANU_SERVICE_ID */
150 UUID_SERVCLASS_NAP, /* BTA_NAP_SERVICE_ID */
151 UUID_SERVCLASS_GN, /* BTA_GN_SERVICE_ID */
152 UUID_SERVCLASS_SAP, /* BTA_SAP_SERVICE_ID */
153 UUID_SERVCLASS_AUDIO_SINK, /* BTA_A2DP_SERVICE_ID */
154 UUID_SERVCLASS_AV_REMOTE_CONTROL, /* BTA_AVRCP_SERVICE_ID */
155 UUID_SERVCLASS_HUMAN_INTERFACE, /* BTA_HID_SERVICE_ID */
156 UUID_SERVCLASS_VIDEO_SINK, /* BTA_VDP_SERVICE_ID */
157 UUID_SERVCLASS_PBAP_PSE, /* BTA_PBAP_SERVICE_ID */
158 UUID_SERVCLASS_HEADSET_AUDIO_GATEWAY, /* BTA_HSP_SERVICE_ID */
159 UUID_SERVCLASS_AG_HANDSFREE, /* BTA_HFP_SERVICE_ID */
160 UUID_SERVCLASS_MESSAGE_ACCESS, /* BTA_MAP_SERVICE_ID */
161 UUID_SERVCLASS_MESSAGE_NOTIFICATION, /* BTA_MN_SERVICE_ID */
162 UUID_SERVCLASS_HDP_PROFILE, /* BTA_HDP_SERVICE_ID */
163 UUID_SERVCLASS_PBAP_PCE /* BTA_PCE_SERVICE_ID */
164#if BLE_INCLUDED && BTA_GATT_INCLUDED
165 ,UUID_PROTOCOL_ATT /* BTA_GATT_SERVICE_ID */
166#endif
167};
168
169/*
170 * NOTE : The number of element in bta_service_id_to_btm_srv_id_lkup_tbl should be matching with
171 * the value BTA_MAX_SERVICE_ID in bta_api.h
172 *
173 * i.e., If you add new Service ID for BTA, the correct security ID of the new service
174 * from Security service definitions (btm_api.h) should be added to this lookup table.
175 */
176const UINT32 bta_service_id_to_btm_srv_id_lkup_tbl [BTA_MAX_SERVICE_ID] =
177{
178 0, /* Reserved */
179 BTM_SEC_SERVICE_SERIAL_PORT, /* BTA_SPP_SERVICE_ID */
180 BTM_SEC_SERVICE_DUN, /* BTA_DUN_SERVICE_ID */
181 BTM_SEC_SERVICE_AVDTP, /* BTA_AUDIO_SOURCE_SERVICE_ID */
182 BTM_SEC_SERVICE_LAN_ACCESS, /* BTA_LAP_SERVICE_ID */
183 BTM_SEC_SERVICE_HEADSET_AG, /* BTA_HSP_SERVICE_ID */
184 BTM_SEC_SERVICE_AG_HANDSFREE, /* BTA_HFP_SERVICE_ID */
185 BTM_SEC_SERVICE_OBEX, /* BTA_OPP_SERVICE_ID */
186 BTM_SEC_SERVICE_OBEX_FTP, /* BTA_FTP_SERVICE_ID */
187 BTM_SEC_SERVICE_CORDLESS, /* BTA_CTP_SERVICE_ID */
188 BTM_SEC_SERVICE_INTERCOM, /* BTA_ICP_SERVICE_ID */
189 BTM_SEC_SERVICE_IRMC_SYNC, /* BTA_SYNC_SERVICE_ID */
190 BTM_SEC_SERVICE_BPP_JOB, /* BTA_BPP_SERVICE_ID */
191 BTM_SEC_SERVICE_BIP, /* BTA_BIP_SERVICE_ID */
192 BTM_SEC_SERVICE_BNEP_PANU, /* BTA_PANU_SERVICE_ID */
193 BTM_SEC_SERVICE_BNEP_NAP, /* BTA_NAP_SERVICE_ID */
194 BTM_SEC_SERVICE_BNEP_GN, /* BTA_GN_SERVICE_ID */
195 BTM_SEC_SERVICE_SAP, /* BTA_SAP_SERVICE_ID */
196 BTM_SEC_SERVICE_AVDTP, /* BTA_A2DP_SERVICE_ID */
197 BTM_SEC_SERVICE_AVCTP, /* BTA_AVRCP_SERVICE_ID */
Andre Eisenbach2e7fa682013-08-08 15:42:48 -0700198 BTM_SEC_SERVICE_HIDH_SEC_CTRL, /* BTA_HID_SERVICE_ID */
The Android Open Source Project5738f832012-12-12 16:00:35 -0800199 BTM_SEC_SERVICE_AVDTP, /* BTA_VDP_SERVICE_ID */
200 BTM_SEC_SERVICE_PBAP, /* BTA_PBAP_SERVICE_ID */
201 BTM_SEC_SERVICE_HEADSET, /* BTA_HSP_HS_SERVICE_ID */
202 BTM_SEC_SERVICE_HF_HANDSFREE, /* BTA_HFP_HS_SERVICE_ID */
203 BTM_SEC_SERVICE_MAP, /* BTA_MAP_SERVICE_ID */
204 BTM_SEC_SERVICE_MAP, /* BTA_MN_SERVICE_ID */
205 BTM_SEC_SERVICE_HDP_SNK, /* BTA_HDP_SERVICE_ID */
206 BTM_SEC_SERVICE_PBAP /* BTA_PCE_SERVICE_ID */
207#if BLE_INCLUDED && BTA_GATT_INCLUDED
208 ,BTM_SEC_SERVICE_ATT /* BTA_GATT_SERVICE_ID */
209#endif
Andre Eisenbach6975b4d2013-08-05 16:55:38 -0700210
The Android Open Source Project5738f832012-12-12 16:00:35 -0800211};
212
213/* bta security callback */
214const tBTM_APPL_INFO bta_security =
215{
216 &bta_dm_authorize_cback,
217 &bta_dm_pin_cback,
218 &bta_dm_new_link_key_cback,
The Android Open Source Project5738f832012-12-12 16:00:35 -0800219 &bta_dm_authentication_complete_cback,
The Android Open Source Project5738f832012-12-12 16:00:35 -0800220 &bta_dm_bond_cancel_complete_cback,
221#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
222 &bta_dm_sp_cback
223#else
224 NULL
225#endif
226#if BLE_INCLUDED == TRUE
227#if SMP_INCLUDED == TRUE
228 ,&bta_dm_ble_smp_cback
229#endif
230 ,&bta_dm_ble_id_key_cback
231#endif
232
233};
234
The Android Open Source Project5738f832012-12-12 16:00:35 -0800235#define MAX_DISC_RAW_DATA_BUF (4096)
236UINT8 g_disc_raw_data_buf[MAX_DISC_RAW_DATA_BUF];
237
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700238extern DEV_CLASS local_device_default_class;
239
The Android Open Source Project5738f832012-12-12 16:00:35 -0800240/*******************************************************************************
241**
The Android Open Source Project5738f832012-12-12 16:00:35 -0800242** Function bta_dm_enable
243**
244** Description Initialises the BT device manager
245**
246**
247** Returns void
248**
249*******************************************************************************/
250void bta_dm_enable(tBTA_DM_MSG *p_data)
251{
252 tBTA_SYS_HW_MSG *sys_enable_event;
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700253 tBTA_DM_ENABLE enable_event;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800254
The Android Open Source Project5738f832012-12-12 16:00:35 -0800255 /* if already in use, return an error */
256 if( bta_dm_cb.is_bta_dm_active == TRUE )
257 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700258 APPL_TRACE_WARNING("%s Device already started by another application", __func__);
259 memset(&enable_event, 0, sizeof(tBTA_DM_ENABLE));
260 enable_event.status = BTA_FAILURE;
261 if (p_data->enable.p_sec_cback != NULL)
262 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 -0800263 return;
264 }
265
The Android Open Source Project5738f832012-12-12 16:00:35 -0800266 /* first, register our callback to SYS HW manager */
267 bta_sys_hw_register( BTA_SYS_HW_BLUETOOTH, bta_dm_sys_hw_cback );
268
269 /* make sure security callback is saved - if no callback, do not erase the previous one,
270 it could be an error recovery mechanism */
271 if( p_data->enable.p_sec_cback != NULL )
272 bta_dm_cb.p_sec_cback = p_data->enable.p_sec_cback;
273 /* notify BTA DM is now active */
274 bta_dm_cb.is_bta_dm_active = TRUE;
275
276 /* send a message to BTA SYS */
277 if ((sys_enable_event = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL)
278 {
279 sys_enable_event->hdr.event = BTA_SYS_API_ENABLE_EVT;
280 sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH;
281
282 bta_sys_sendmsg(sys_enable_event);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800283 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800284}
285
The Android Open Source Project5738f832012-12-12 16:00:35 -0800286/*******************************************************************************
287**
288** Function bta_dm_sys_hw_cback
289**
290** Description callback register to SYS to get HW status updates
291**
292**
293** Returns void
294**
295*******************************************************************************/
296static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status )
297{
298 DEV_CLASS dev_class;
299 tBTA_DM_SEC_CBACK *temp_cback;
300#if BLE_INCLUDED == TRUE
301 UINT8 key_mask = 0;
302 BT_OCTET16 er;
303 tBTA_BLE_LOCAL_ID_KEYS id_key;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800304#endif
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700305
306 APPL_TRACE_DEBUG("%s with event: %i", __func__, status);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800307
308 /* On H/W error evt, report to the registered DM application callback */
309 if (status == BTA_SYS_HW_ERROR_EVT) {
310 if( bta_dm_cb.p_sec_cback != NULL )
311 bta_dm_cb.p_sec_cback(BTA_DM_HW_ERROR_EVT, NULL);
312 return;
313 }
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700314
The Android Open Source Project5738f832012-12-12 16:00:35 -0800315 if( status == BTA_SYS_HW_OFF_EVT )
316 {
317 if( bta_dm_cb.p_sec_cback != NULL )
318 bta_dm_cb.p_sec_cback(BTA_DM_DISABLE_EVT, NULL);
319
320 /* reinitialize the control block */
321 memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));
322
323 /* unregister from SYS */
324 bta_sys_hw_unregister( BTA_SYS_HW_BLUETOOTH );
325 /* notify BTA DM is now unactive */
326 bta_dm_cb.is_bta_dm_active = FALSE;
327 }
328 else
329 if( status == BTA_SYS_HW_ON_EVT )
330 {
331 /* FIXME: We should not unregister as the SYS shall invoke this callback on a H/W error.
332 * We need to revisit when this platform has more than one BLuetooth H/W chip */
333 //bta_sys_hw_unregister( BTA_SYS_HW_BLUETOOTH);
334
335 /* save security callback */
336 temp_cback = bta_dm_cb.p_sec_cback;
337 /* make sure the control block is properly initialized */
338 memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));
339 /* and retrieve the callback */
340 bta_dm_cb.p_sec_cback=temp_cback;
341 bta_dm_cb.is_bta_dm_active = TRUE;
342
343 /* hw is ready, go on with BTA DM initialization */
344 memset(&bta_dm_search_cb, 0x00, sizeof(bta_dm_search_cb));
345 memset(&bta_dm_conn_srvcs, 0x00, sizeof(bta_dm_conn_srvcs));
346 memset(&bta_dm_di_cb, 0, sizeof(tBTA_DM_DI_CB));
347
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700348 memcpy(dev_class, p_bta_dm_cfg->dev_class, sizeof(dev_class));
The Android Open Source Project5738f832012-12-12 16:00:35 -0800349 BTM_SetDeviceClass (dev_class);
350
351#if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
352 /* load BLE local information: ID keys, ER if available */
353 bta_dm_co_ble_load_local_keys(&key_mask, er, &id_key);
354
355 if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ER)
356 {
357 BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ER, (tBTM_BLE_LOCAL_KEYS *)&er);
358 }
359 if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ID)
360 {
361 BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ID, (tBTM_BLE_LOCAL_KEYS *)&id_key);
362 }
Mike J. Chen597c5772014-02-11 16:23:31 -0800363#if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE))
Andre Eisenbach6975b4d2013-08-05 16:55:38 -0700364 bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800365#endif
Mike J. Chen597c5772014-02-11 16:23:31 -0800366#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -0800367
368 BTM_SecRegister((tBTM_APPL_INFO*)&bta_security);
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700369 BTM_SetDefaultLinkSuperTout(p_bta_dm_cfg->link_timeout);
370 BTM_WritePageTimeout(p_bta_dm_cfg->page_timeout);
371 bta_dm_cb.cur_policy = p_bta_dm_cfg->policy_settings;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800372 BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800373 BTM_RegBusyLevelNotif (bta_dm_bl_change_cback, NULL, BTM_BL_UPDATE_MASK|BTM_BL_ROLE_CHG_MASK);
Satya Calloji3f24f462014-09-16 22:44:43 -0700374
375#if BLE_VND_INCLUDED == TRUE
376 BTM_BleReadControllerFeatures (bta_dm_ctrl_features_rd_cmpl_cback);
377#endif
378
The Android Open Source Project5738f832012-12-12 16:00:35 -0800379 /* Earlier, we used to invoke BTM_ReadLocalAddr which was just copying the bd_addr
380 from the control block and invoking the callback which was sending the DM_ENABLE_EVT.
381 But then we have a few HCI commands being invoked above which were still in progress
382 when the ENABLE_EVT was sent. So modified this to fetch the local name which forces
383 the DM_ENABLE_EVT to be sent only after all the init steps are complete */
384 BTM_ReadLocalDeviceNameFromController((tBTM_CMPL_CB *)bta_dm_local_name_cback);
385
386 bta_sys_rm_register((tBTA_SYS_CONN_CBACK*)bta_dm_rm_cback);
387
388 /* initialize bluetooth low power manager */
389 bta_dm_init_pm();
390
391 bta_sys_policy_register((tBTA_SYS_CONN_CBACK*)bta_dm_policy_cback);
392
Andre Eisenbache1202ca2013-05-15 04:55:08 -0700393#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
Andre Eisenbache1202ca2013-05-15 04:55:08 -0700394 bta_dm_gattc_register();
395#endif
396
The Android Open Source Project5738f832012-12-12 16:00:35 -0800397 }
398 else
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700399 APPL_TRACE_DEBUG(" --- ignored event");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800400
401}
402
403
404/*******************************************************************************
405**
406** Function bta_dm_disable
407**
408** Description Disables the BT device manager
409**
410**
411** Returns void
412**
413*******************************************************************************/
414void bta_dm_disable (tBTA_DM_MSG *p_data)
415{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -0800416 UNUSED(p_data);
417
The Android Open Source Project5738f832012-12-12 16:00:35 -0800418 /* Set l2cap idle timeout to 0 (so BTE immediately disconnects ACL link after last channel is closed) */
Satya Calloji444a8da2015-03-06 10:38:22 -0800419 L2CA_SetIdleTimeoutByBdAddr((UINT8 *)BT_BD_ANY, 0, BT_TRANSPORT_BR_EDR);
420 L2CA_SetIdleTimeoutByBdAddr((UINT8 *)BT_BD_ANY, 0, BT_TRANSPORT_LE);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800421
422 /* disable all active subsystems */
423 bta_sys_disable(BTA_SYS_HW_BLUETOOTH);
424
425 BTM_SetDiscoverability(BTM_NON_DISCOVERABLE, 0, 0);
426 BTM_SetConnectability(BTM_NON_CONNECTABLE, 0, 0);
427
428 bta_dm_disable_pm();
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800429 bta_dm_disable_search_and_disc();
The Android Open Source Project5738f832012-12-12 16:00:35 -0800430 bta_dm_cb.disabling = TRUE;
431
Nitin Arora021e17a2014-01-29 19:18:39 -0800432#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
433 BTM_BleClearBgConnDev();
434#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -0800435
436 if(BTM_GetNumAclLinks()==0)
437 {
438#if (defined(BTA_DISABLE_DELAY) && BTA_DISABLE_DELAY > 0)
439 /* If BTA_DISABLE_DELAY is defined and greater than zero, then delay the shutdown by
440 * BTA_DISABLE_DELAY milliseconds
441 */
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700442 APPL_TRACE_WARNING("%s BTA_DISABLE_DELAY set to %d ms",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800443 __FUNCTION__, BTA_DISABLE_DELAY);
444 bta_sys_stop_timer(&bta_dm_cb.disable_timer);
445 bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_conn_down_timer_cback;
446 bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, BTA_DISABLE_DELAY);
447#else
448 bta_dm_disable_conn_down_timer_cback(NULL);
449#endif
450 }
451 else
452 {
453 bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_timer_cback;
Arman Uguraybb954522015-06-02 21:11:07 -0700454 bta_dm_cb.disable_timer.param = INT_TO_PTR(0);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800455 bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 5000);
456 }
457
458}
459
460/*******************************************************************************
461**
462** Function bta_dm_disable_timer_cback
463**
464** Description Called if the disable timer expires
465** Used to close ACL connections which are still active
466**
467**
468**
469** Returns void
470**
471*******************************************************************************/
472static void bta_dm_disable_timer_cback (TIMER_LIST_ENT *p_tle)
473{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -0800474 UNUSED(p_tle);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800475 UINT8 i;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700476 tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
lungtsai_lind6fc0512014-08-25 13:19:56 +0800477 BOOLEAN trigger_disc = FALSE;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700478
The Android Open Source Project5738f832012-12-12 16:00:35 -0800479
lungtsai_lind6fc0512014-08-25 13:19:56 +0800480 APPL_TRACE_EVENT(" bta_dm_disable_timer_cback trial %d ", p_tle->param);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800481
Arman Uguraybb954522015-06-02 21:11:07 -0700482 if(BTM_GetNumAclLinks() && PTR_TO_INT(p_tle->param) == 0)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800483 {
484 for(i=0; i<bta_dm_cb.device_list.count; i++)
485 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700486#if (BLE_INCLUDED == TRUE)
487 transport = bta_dm_cb.device_list.peer_device[i].transport;
488#endif
489 btm_remove_acl(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, transport);
lungtsai_lind6fc0512014-08-25 13:19:56 +0800490 trigger_disc = TRUE;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800491 }
492
lungtsai_lind6fc0512014-08-25 13:19:56 +0800493 /* Retrigger disable timer in case ACL disconnect failed, DISABLE_EVT still need
494 to be sent out to avoid jave layer disable timeout */
495 if (trigger_disc)
496 {
497 bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_timer_cback;
Arman Uguraybb954522015-06-02 21:11:07 -0700498 bta_dm_cb.disable_timer.param = INT_TO_PTR(1);
lungtsai_lind6fc0512014-08-25 13:19:56 +0800499 bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 1500);
500 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800501 }
502 else
503 {
504 bta_dm_cb.disabling = FALSE;
505
506 bta_sys_remove_uuid(UUID_SERVCLASS_PNP_INFORMATION);
507 bta_dm_cb.p_sec_cback(BTA_DM_DISABLE_EVT, NULL);
508 }
509}
510
511
512
513
514/*******************************************************************************
515**
516** Function bta_dm_set_dev_name
517**
518** Description Sets local device name
519**
520**
521** Returns void
522**
523*******************************************************************************/
524void bta_dm_set_dev_name (tBTA_DM_MSG *p_data)
525{
526
527 BTM_SetLocalDeviceName((char*)p_data->set_name.name);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800528 bta_dm_set_eir ((char*)p_data->set_name.name);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800529}
530
531/*******************************************************************************
532**
533** Function bta_dm_set_visibility
534**
535** Description Sets discoverability, connectability and pairability
536**
537**
538** Returns void
539**
540*******************************************************************************/
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700541void bta_dm_set_visibility(tBTA_DM_MSG *p_data)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800542{
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700543 UINT16 window, interval;
544 UINT16 le_disc_mode = BTM_BleReadDiscoverability();
545 UINT16 disc_mode = BTM_ReadDiscoverability(&window, &interval);
546 UINT16 le_conn_mode = BTM_BleReadConnectability();
547 UINT16 conn_mode = BTM_ReadConnectability(&window, &interval);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800548
549 /* set modes for Discoverability and connectability if not ignore */
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700550 if (p_data->set_visibility.disc_mode != (BTA_DM_IGNORE | BTA_DM_LE_IGNORE))
551 {
552 if ((p_data->set_visibility.disc_mode & BTA_DM_LE_IGNORE) == BTA_DM_LE_IGNORE)
553 p_data->set_visibility.disc_mode =
554 ((p_data->set_visibility.disc_mode & ~BTA_DM_LE_IGNORE) | le_disc_mode);
555
556 if ((p_data->set_visibility.disc_mode & BTA_DM_IGNORE) == BTA_DM_IGNORE)
557 p_data->set_visibility.disc_mode =
558 ((p_data->set_visibility.disc_mode & ~BTA_DM_IGNORE) | disc_mode);
559
560 BTM_SetDiscoverability(p_data->set_visibility.disc_mode,
The Android Open Source Project5738f832012-12-12 16:00:35 -0800561 bta_dm_cb.inquiry_scan_window,
562 bta_dm_cb.inquiry_scan_interval);
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700563 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800564
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700565 if (p_data->set_visibility.conn_mode != (BTA_DM_IGNORE | BTA_DM_LE_IGNORE))
566 {
567 if ((p_data->set_visibility.conn_mode & BTA_DM_LE_IGNORE) == BTA_DM_LE_IGNORE)
568 p_data->set_visibility.conn_mode =
569 ((p_data->set_visibility.conn_mode & ~BTA_DM_LE_IGNORE) | le_conn_mode);
570
571 if ((p_data->set_visibility.conn_mode & BTA_DM_IGNORE) == BTA_DM_IGNORE)
572 p_data->set_visibility.conn_mode =
573 ((p_data->set_visibility.conn_mode & ~BTA_DM_IGNORE) | conn_mode);
574
575 BTM_SetConnectability(p_data->set_visibility.conn_mode,
The Android Open Source Project5738f832012-12-12 16:00:35 -0800576 bta_dm_cb.page_scan_window,
577 bta_dm_cb.page_scan_interval);
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700578 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800579
580 /* Send False or True if not ignore */
581 if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE )
582 {
583
584 if (p_data->set_visibility.pair_mode == BTA_DM_NON_PAIRABLE)
585 bta_dm_cb.disable_pair_mode = TRUE;
586 else
587 bta_dm_cb.disable_pair_mode = FALSE;
588
589 }
590
591 /* Send False or True if not ignore */
592 if (p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE)
593 {
594
595 if (p_data->set_visibility.conn_paired_only == BTA_DM_CONN_ALL)
596 bta_dm_cb.conn_paired_only = FALSE;
597 else
598 bta_dm_cb.conn_paired_only = TRUE;
599
600 }
601
602 /* Change mode if either mode is not ignore */
603 if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE || p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE)
604 BTM_SetPairableMode((BOOLEAN)(!(bta_dm_cb.disable_pair_mode)),bta_dm_cb.conn_paired_only);
605
606}
607
The Android Open Source Project5738f832012-12-12 16:00:35 -0800608/*******************************************************************************
609**
Satya Calloji6fc95262015-04-21 16:34:54 -0700610** Function bta_dm_process_remove_device
The Android Open Source Project5738f832012-12-12 16:00:35 -0800611**
612** Description Removes device, Disconnects ACL link if required.
613****
614*******************************************************************************/
Satya Calloji6fc95262015-04-21 16:34:54 -0700615void bta_dm_process_remove_device(BD_ADDR bd_addr)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800616{
Zhihai Xubd68d682013-11-15 17:55:46 -0800617#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
Satya Calloji6fc95262015-04-21 16:34:54 -0700618 /* need to remove all pending background connection before unpair */
619 BTA_GATTC_CancelOpen(0, bd_addr, FALSE);
Zhihai Xubd68d682013-11-15 17:55:46 -0800620#endif
621
Satya Calloji6fc95262015-04-21 16:34:54 -0700622 BTM_SecDeleteDevice(bd_addr);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800623
Satya Calloji6fc95262015-04-21 16:34:54 -0700624#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
625 /* remove all cached GATT information */
626 BTA_GATTC_Refresh(bd_addr);
627#endif
628
629 if (bta_dm_cb.p_sec_cback)
630 {
631 tBTA_DM_SEC sec_event;
632 bdcpy(sec_event.link_down.bd_addr, bd_addr);
633 /* No connection, set status to success (acl disc code not valid) */
634 sec_event.link_down.status = HCI_SUCCESS;
635 bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &sec_event);
636 }
637}
638
639/*******************************************************************************
640**
641** Function bta_dm_remove_device
642**
643** Description Removes device, disconnects ACL link if required.
644****
645*******************************************************************************/
646void bta_dm_remove_device(tBTA_DM_MSG *p_data)
647{
648 tBTA_DM_API_REMOVE_DEVICE *p_dev = &p_data->remove_dev;
649 if (p_dev == NULL)
650 return;
651
652 BD_ADDR other_address;
653 bdcpy(other_address, p_dev->bd_addr);
654
655 /* If ACL exists for the device in the remove_bond message*/
656 BOOLEAN continue_delete_dev = FALSE;
657 UINT8 other_transport = BT_TRANSPORT_INVALID;
658
659 if (BTM_IsAclConnectionUp(p_dev->bd_addr, BT_TRANSPORT_LE) ||
660 BTM_IsAclConnectionUp(p_dev->bd_addr, BT_TRANSPORT_BR_EDR))
661 {
662 APPL_TRACE_DEBUG("%s: ACL Up count %d", __func__, bta_dm_cb.device_list.count);
663 continue_delete_dev = FALSE;
664
665 /* Take the link down first, and mark the device for removal when disconnected */
666 for(int i=0; i < bta_dm_cb.device_list.count; i++)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800667 {
Satya Calloji6fc95262015-04-21 16:34:54 -0700668 if (!bdcmp(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_dev->bd_addr))
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700669 {
670 bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_UNPAIRING;
Satya Calloji6fc95262015-04-21 16:34:54 -0700671 btm_remove_acl( p_dev->bd_addr, bta_dm_cb.device_list.peer_device[i].transport);
672 APPL_TRACE_DEBUG("%s:transport = %d", __func__,
673 bta_dm_cb.device_list.peer_device[i].transport);
674
675 /* save the other transport to check if device is connected on other_transport */
676 if(bta_dm_cb.device_list.peer_device[i].transport == BT_TRANSPORT_LE)
677 other_transport = BT_TRANSPORT_BR_EDR;
678 else
679 other_transport = BT_TRANSPORT_LE;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700680 break;
681 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800682 }
683 }
Satya Calloji6fc95262015-04-21 16:34:54 -0700684 else
The Android Open Source Project5738f832012-12-12 16:00:35 -0800685 {
Satya Calloji6fc95262015-04-21 16:34:54 -0700686 continue_delete_dev = TRUE;
687 }
Zhihai Xubd68d682013-11-15 17:55:46 -0800688
Satya Calloji6fc95262015-04-21 16:34:54 -0700689 // If it is DUMO device and device is paired as different address, unpair that device
690 // if different address
691 BOOLEAN continue_delete_other_dev = FALSE;
692 if ((other_transport && (BTM_ReadConnectedTransportAddress(other_address, other_transport))) ||
693 (!other_transport && (BTM_ReadConnectedTransportAddress(other_address, BT_TRANSPORT_BR_EDR) ||
694 BTM_ReadConnectedTransportAddress(other_address, BT_TRANSPORT_LE))))
695 {
696 continue_delete_other_dev = FALSE;
697 /* Take the link down first, and mark the device for removal when disconnected */
698 for(int i=0; i < bta_dm_cb.device_list.count; i++)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800699 {
Satya Calloji6fc95262015-04-21 16:34:54 -0700700 if (!bdcmp(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, other_address))
701 {
702 bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_UNPAIRING;
703 btm_remove_acl(other_address,bta_dm_cb.device_list.peer_device[i].transport);
704 break;
705 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800706 }
707 }
Satya Calloji6fc95262015-04-21 16:34:54 -0700708 else
709 {
710 APPL_TRACE_DEBUG("%s: continue to delete the other dev ", __func__);
711 continue_delete_other_dev = TRUE;
712 }
713
714 /* Delete the device mentioned in the msg */
715 if (continue_delete_dev)
716 bta_dm_process_remove_device(p_dev->bd_addr);
717
718 /* Delete the other paired device too */
719 BD_ADDR dummy_bda = {0};
720 if (continue_delete_other_dev && (bdcmp(other_address, dummy_bda) != 0))
721 bta_dm_process_remove_device(other_address);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800722}
723
724/*******************************************************************************
725**
726** Function bta_dm_add_device
727**
728** Description This function adds a Link Key to an security database entry.
729** It is normally called during host startup to restore all required information
730** stored in the NVRAM.
731****
732*******************************************************************************/
733void bta_dm_add_device (tBTA_DM_MSG *p_data)
734{
735 tBTA_DM_API_ADD_DEVICE *p_dev = &p_data->add_dev;
736 UINT8 *p_dc = NULL;
737 UINT8 *p_lc = NULL;
738 UINT32 trusted_services_mask[BTM_SEC_SERVICE_ARRAY_SIZE];
739 UINT8 index = 0;
740 UINT8 btm_mask_index = 0;
741
742 memset (trusted_services_mask, 0, sizeof(trusted_services_mask));
743
744 /* If not all zeros, the device class has been specified */
745 if (p_dev->dc_known)
746 p_dc = (UINT8 *)p_dev->dc;
747
748 if (p_dev->link_key_known)
749 p_lc = (UINT8 *)p_dev->link_key;
750
751 if (p_dev->is_trusted)
752 {
753 /* covert BTA service mask to BTM mask */
754 while (p_dev->tm && (index < BTA_MAX_SERVICE_ID))
755 {
756 if (p_dev->tm & (UINT32)(1<<index))
757 {
758
759 btm_mask_index = bta_service_id_to_btm_srv_id_lkup_tbl[index] / BTM_SEC_ARRAY_BITS;
760 trusted_services_mask[btm_mask_index] |= (UINT32)(1 << (bta_service_id_to_btm_srv_id_lkup_tbl[index] - (UINT32)(btm_mask_index * 32)));
761
762 p_dev->tm &= (UINT32)(~(1<<index));
763
764 }
765 index++;
766 }
767 }
768
769 if (!BTM_SecAddDevice (p_dev->bd_addr, p_dc, p_dev->bd_name, p_dev->features,
Casper Bonde818d0f22015-05-21 11:08:45 +0200770 trusted_services_mask, p_lc, p_dev->key_type, p_dev->io_cap,
771 p_dev->pin_length))
The Android Open Source Project5738f832012-12-12 16:00:35 -0800772 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700773 APPL_TRACE_ERROR ("BTA_DM: Error adding device %08x%04x",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800774 (p_dev->bd_addr[0]<<24)+(p_dev->bd_addr[1]<<16)+(p_dev->bd_addr[2]<<8)+p_dev->bd_addr[3],
775 (p_dev->bd_addr[4]<<8)+p_dev->bd_addr[5]);
776 }
777}
778
779/*******************************************************************************
780**
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800781** Function bta_dm_close_acl
782**
783** Description This function forces to close the connection to a remote device
784** and optionaly remove the device from security database if
785** required.
786****
787*******************************************************************************/
788void bta_dm_close_acl(tBTA_DM_MSG *p_data)
789{
790 tBTA_DM_API_REMOVE_ACL *p_remove_acl = &p_data->remove_acl;
791 UINT8 index;
792
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700793 APPL_TRACE_DEBUG("bta_dm_close_acl");
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800794
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700795 if (BTM_IsAclConnectionUp(p_remove_acl->bd_addr, p_remove_acl->transport))
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800796 {
797 for (index = 0; index < bta_dm_cb.device_list.count; index ++)
798 {
799 if (!bdcmp( bta_dm_cb.device_list.peer_device[index].peer_bdaddr, p_remove_acl->bd_addr))
800 break;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700801 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800802 if (index != bta_dm_cb.device_list.count)
803 {
804 if (p_remove_acl->remove_dev)
805 bta_dm_cb.device_list.peer_device[index].remove_dev_pending = TRUE;
806 }
807 else
808 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700809 APPL_TRACE_ERROR("unknown device, remove ACL failed");
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800810 }
811 /* Disconnect the ACL link */
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700812 btm_remove_acl(p_remove_acl->bd_addr, p_remove_acl->transport);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800813 }
814 /* if to remove the device from security database ? do it now */
815 else if (p_remove_acl->remove_dev)
816 {
817 if (!BTM_SecDeleteDevice(p_remove_acl->bd_addr))
818 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700819 APPL_TRACE_ERROR("delete device from security database failed.");
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800820 }
821#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
822 /* need to remove all pending background connection if any */
823 BTA_GATTC_CancelOpen(0, p_remove_acl->bd_addr, FALSE);
824 /* remove all cached GATT information */
825 BTA_GATTC_Refresh(p_remove_acl->bd_addr);
826#endif
827 }
828 /* otherwise, no action needed */
829
830}
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -0700831
832/*******************************************************************************
833**
834** Function bta_dm_remove_all_acl
835**
836** Description This function forces to close all the ACL links specified by link type
837****
838*******************************************************************************/
839void bta_dm_remove_all_acl(tBTA_DM_MSG *p_data)
840{
841 const tBTA_DM_LINK_TYPE link_type = p_data->remove_all_acl.link_type;
842 tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
843
844 APPL_TRACE_DEBUG("%s link type = %d", __func__, link_type);
845
846 for (UINT8 i=0; i < bta_dm_cb.device_list.count; i++)
847 {
848 BD_ADDR addr = {0};
849 bdcpy(addr, bta_dm_cb.device_list.peer_device[i].peer_bdaddr);
850#if defined (BLE_INCLUDED) && (BLE_INCLUDED == TRUE)
851 transport = bta_dm_cb.device_list.peer_device[i].transport;
852#endif
853 if ((link_type == BTA_DM_LINK_TYPE_ALL) ||
854 ((link_type == BTA_DM_LINK_TYPE_LE) && (transport == BT_TRANSPORT_LE)) ||
855 ((link_type == BTA_DM_LINK_TYPE_BR_EDR) && (transport == BT_TRANSPORT_BR_EDR)))
856 {
857 /* Disconnect the ACL link */
858 btm_remove_acl(addr, transport);
859 }
860 }
861}
862
863
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800864/*******************************************************************************
865**
The Android Open Source Project5738f832012-12-12 16:00:35 -0800866** Function bta_dm_bond
867**
868** Description Bonds with peer device
869**
870**
871** Returns void
872**
873*******************************************************************************/
874void bta_dm_bond (tBTA_DM_MSG *p_data)
875{
876 tBTM_STATUS status;
877 tBTA_DM_SEC sec_event;
878 char *p_name;
879
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700880 if (p_data->bond.transport == BTA_TRANSPORT_UNKNOWN)
881 status = BTM_SecBond ( p_data->bond.bd_addr, 0, NULL, 0 );
882 else
883 status = BTM_SecBondByTransport ( p_data->bond.bd_addr, p_data->bond.transport, 0, NULL, 0 );
884
The Android Open Source Project5738f832012-12-12 16:00:35 -0800885
886 if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED))
887 {
888
The Android Open Source Project5738f832012-12-12 16:00:35 -0800889 memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
890 bdcpy(sec_event.auth_cmpl.bd_addr, p_data->bond.bd_addr);
Kim Schulz2a2701c2013-09-16 15:59:33 +0200891 p_name = BTM_SecReadDevName(p_data->bond.bd_addr);
892 if (p_name != NULL)
893 {
894 memcpy(sec_event.auth_cmpl.bd_name, p_name, (BD_NAME_LEN-1));
895 sec_event.auth_cmpl.bd_name[BD_NAME_LEN-1] = 0;
896 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800897
898/* taken care of by memset [above]
899 sec_event.auth_cmpl.key_present = FALSE;
900 sec_event.auth_cmpl.success = FALSE;
901*/
902 sec_event.auth_cmpl.fail_reason = HCI_ERR_ILLEGAL_COMMAND;
903 if (status == BTM_SUCCESS)
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800904 {
The Android Open Source Project5738f832012-12-12 16:00:35 -0800905 sec_event.auth_cmpl.success = TRUE;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800906 }
907 else
908 {
909 /* delete this device entry from Sec Dev DB */
910 bta_dm_remove_sec_dev_entry(p_data->bond.bd_addr);
911 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800912 bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
913 }
914
915}
916
917/*******************************************************************************
918**
919** Function bta_dm_bond_cancel
920**
921** Description Cancels bonding with a peer device
922**
923**
924** Returns void
925**
926*******************************************************************************/
927void bta_dm_bond_cancel (tBTA_DM_MSG *p_data)
928{
929 tBTM_STATUS status;
930 tBTA_DM_SEC sec_event;
931
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700932 APPL_TRACE_EVENT(" bta_dm_bond_cancel ");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800933 status = BTM_SecBondCancel ( p_data->bond_cancel.bd_addr );
934
935 if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED && status != BTM_SUCCESS))
936 {
937 sec_event.bond_cancel_cmpl.result = BTA_FAILURE;
938
939 bta_dm_cb.p_sec_cback(BTA_DM_BOND_CANCEL_CMPL_EVT, &sec_event);
940 }
941
942}
943
944/*******************************************************************************
945**
946** Function bta_dm_pin_reply
947**
948** Description Send the pin_reply to a request from BTM
949**
950**
951** Returns void
952**
953*******************************************************************************/
954void bta_dm_pin_reply (tBTA_DM_MSG *p_data)
955{
956 UINT32 trusted_mask[BTM_SEC_SERVICE_ARRAY_SIZE];
957 UINT32 * current_trusted_mask;
958
959 current_trusted_mask = BTM_ReadTrustedMask(p_data->pin_reply.bd_addr);
960
961 if(current_trusted_mask)
962 {
963 memcpy(trusted_mask, current_trusted_mask, sizeof(trusted_mask));
964 }
965 else
966 {
967 memset(trusted_mask, 0, sizeof(trusted_mask));
968 }
969
970 if(p_data->pin_reply.accept)
971 {
972
973 BTM_PINCodeReply(p_data->pin_reply.bd_addr, BTM_SUCCESS, p_data->pin_reply.pin_len, p_data->pin_reply.p_pin, trusted_mask );
974 }
975 else
976 {
977 BTM_PINCodeReply(p_data->pin_reply.bd_addr, BTM_NOT_AUTHORIZED, 0, NULL, trusted_mask );
978 }
979
980}
981
982/*******************************************************************************
983**
The Android Open Source Project5738f832012-12-12 16:00:35 -0800984** Function bta_dm_policy_cback
985**
986** Description process the link policy changes
987**
988** Returns void
989**
990*******************************************************************************/
991static void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
992{
993 tBTA_DM_PEER_DEVICE *p_dev = NULL;
994 UINT16 policy = app_id;
995 UINT32 mask = (UINT32)(1 << id);
996
997 if(peer_addr)
998 p_dev = bta_dm_find_peer_device(peer_addr);
999
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001000 APPL_TRACE_DEBUG(" bta_dm_policy_cback cmd:%d, policy:0x%x",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001001 status, policy);
1002 switch(status)
1003 {
1004 case BTA_SYS_PLCY_SET:
1005 if(!p_dev)
1006 return;
1007 /* restore the default link policy */
1008 p_dev->link_policy |= policy;
1009 BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
1010 break;
1011
1012 case BTA_SYS_PLCY_CLR:
1013 if(!p_dev)
1014 return;
1015 /* clear the policy from the default link policy */
1016 p_dev->link_policy &= (~policy);
1017 BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
1018
1019 if(policy & (HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_PARK_MODE))
1020 {
1021 /* if clearing sniff/park, wake the link */
1022 bta_dm_pm_active(p_dev->peer_bdaddr);
1023 }
1024 break;
1025
1026 case BTA_SYS_PLCY_DEF_SET:
1027 /* want to restore/set the role switch policy */
1028 bta_dm_cb.role_policy_mask &= ~mask;
1029 if(0 == bta_dm_cb.role_policy_mask)
1030 {
1031 /* if nobody wants to insist on the role */
1032 bta_dm_cb.cur_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH;
1033 BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
1034 }
1035 break;
1036
1037 case BTA_SYS_PLCY_DEF_CLR:
1038 /* want to remove the role switch policy */
1039 bta_dm_cb.role_policy_mask |= mask;
1040 bta_dm_cb.cur_policy &= ~HCI_ENABLE_MASTER_SLAVE_SWITCH;
1041 BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
1042 break;
1043 }
1044}
1045
The Android Open Source Project5738f832012-12-12 16:00:35 -08001046/*******************************************************************************
1047**
1048** Function bta_dm_confirm
1049**
1050** Description Send the user confirm request reply in response to a
1051** request from BTM
1052**
1053** Returns void
1054**
1055*******************************************************************************/
1056void bta_dm_confirm(tBTA_DM_MSG *p_data)
1057{
1058 tBTM_STATUS res = BTM_NOT_AUTHORIZED;
1059
1060 if(p_data->confirm.accept == TRUE)
1061 res = BTM_SUCCESS;
1062 BTM_ConfirmReqReply(res, p_data->confirm.bd_addr);
1063}
1064
1065/*******************************************************************************
1066**
The Android Open Source Project5738f832012-12-12 16:00:35 -08001067** Function bta_dm_loc_oob
1068**
1069** Description Retrieve the OOB data from the local LM
1070**
1071** Returns void
1072**
1073*******************************************************************************/
1074#if (BTM_OOB_INCLUDED == TRUE)
1075void bta_dm_loc_oob(tBTA_DM_MSG *p_data)
1076{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08001077 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001078 BTM_ReadLocalOobData();
1079}
1080
1081/*******************************************************************************
1082**
1083** Function bta_dm_ci_io_req_act
1084**
1085** Description respond to the IO capabilities request from BTM
1086**
1087** Returns void
1088**
1089*******************************************************************************/
1090void bta_dm_ci_io_req_act(tBTA_DM_MSG *p_data)
1091{
1092 tBTM_AUTH_REQ auth_req = BTM_AUTH_AP_NO;
1093 if(p_data->ci_io_req.auth_req)
1094 auth_req = BTM_AUTH_AP_YES;
1095 BTM_IoCapRsp(p_data->ci_io_req.bd_addr, p_data->ci_io_req.io_cap,
1096 p_data->ci_io_req.oob_data, auth_req);
1097}
1098
1099/*******************************************************************************
1100**
1101** Function bta_dm_ci_rmt_oob_act
1102**
1103** Description respond to the OOB data request for the remote device from BTM
1104**
1105**
1106** Returns void
1107**
1108*******************************************************************************/
1109void bta_dm_ci_rmt_oob_act(tBTA_DM_MSG *p_data)
1110{
1111 tBTM_STATUS res = BTM_NOT_AUTHORIZED;
1112
1113 if(p_data->ci_rmt_oob.accept == TRUE)
1114 res = BTM_SUCCESS;
1115 BTM_RemoteOobDataReply(res, p_data->ci_rmt_oob.bd_addr,
1116 p_data->ci_rmt_oob.c, p_data->ci_rmt_oob.r );
1117}
1118#endif /* BTM_OOB_INCLUDED */
1119
1120/*******************************************************************************
1121**
1122** Function bta_dm_search_start
1123**
1124** Description Starts an inquiry
1125**
1126**
1127** Returns void
1128**
1129*******************************************************************************/
1130void bta_dm_search_start (tBTA_DM_MSG *p_data)
1131{
1132 tBTM_INQUIRY_CMPL result;
1133
Andre Eisenbache1202ca2013-05-15 04:55:08 -07001134#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001135 UINT16 len = (UINT16)(sizeof(tBT_UUID) * p_data->search.num_uuid);
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001136 bta_dm_gattc_register();
The Android Open Source Project5738f832012-12-12 16:00:35 -08001137#endif
1138
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001139 APPL_TRACE_DEBUG("%s avoid_scatter=%d", __func__, p_bta_dm_cfg->avoid_scatter);
1140
1141 if (p_bta_dm_cfg->avoid_scatter &&
The Android Open Source Project5738f832012-12-12 16:00:35 -08001142 (p_data->search.rs_res == BTA_DM_RS_NONE) && bta_dm_check_av(BTA_DM_API_SEARCH_EVT))
1143 {
1144 memcpy(&bta_dm_cb.search_msg, &p_data->search, sizeof(tBTA_DM_API_SEARCH));
1145 return;
1146 }
1147
1148 BTM_ClearInqDb(NULL);
1149 /* save search params */
1150 bta_dm_search_cb.p_search_cback = p_data->search.p_cback;
1151 bta_dm_search_cb.services = p_data->search.services;
1152
1153#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
1154 utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
1155
1156 if ((bta_dm_search_cb.num_uuid = p_data->search.num_uuid) != 0 &&
1157 p_data->search.p_uuid != NULL)
1158 {
1159 if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len)) == NULL)
1160 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001161 APPL_TRACE_ERROR("%s no resources", __func__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001162
1163 result.status = BTA_FAILURE;
1164 result.num_resp = 0;
1165 bta_dm_inq_cmpl_cb ((void *)&result);
1166 return;
1167 }
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001168
The Android Open Source Project5738f832012-12-12 16:00:35 -08001169 memcpy(bta_dm_search_cb.p_srvc_uuid, p_data->search.p_uuid, len);
1170 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001171#endif
1172 result.status = BTM_StartInquiry( (tBTM_INQ_PARMS*)&p_data->search.inq_params,
1173 bta_dm_inq_results_cb,
1174 (tBTM_CMPL_CB*) bta_dm_inq_cmpl_cb);
1175
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001176 APPL_TRACE_EVENT("%s status=%d", __func__, result.status);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001177 if (result.status != BTM_CMD_STARTED)
1178 {
1179 result.num_resp = 0;
1180 bta_dm_inq_cmpl_cb ((void *)&result);
1181 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001182}
1183
1184/*******************************************************************************
1185**
1186** Function bta_dm_search_cancel
1187**
1188** Description Cancels an ongoing search for devices
1189**
1190**
1191** Returns void
1192**
1193*******************************************************************************/
1194void bta_dm_search_cancel (tBTA_DM_MSG *p_data)
1195{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08001196 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001197 tBTA_DM_MSG * p_msg;
1198
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001199 if (BTM_IsInquiryActive())
The Android Open Source Project5738f832012-12-12 16:00:35 -08001200 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001201 if (BTM_CancelInquiry() != BTM_CMD_STARTED)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001202 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001203 bta_dm_search_cancel_notify(NULL);
1204 p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG));
1205 if (p_msg != NULL)
1206 {
1207 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1208 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1209 bta_sys_sendmsg(p_msg);
1210 }
1211 } else {
1212 /* flag a search cancel is pending */
1213 bta_dm_search_cb.cancel_pending = TRUE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001214 }
1215 }
1216 /* If no Service Search going on then issue cancel remote name in case it is active */
1217 else if (!bta_dm_search_cb.name_discover_done)
1218 {
1219 BTM_CancelRemoteDeviceName();
Matthew Xiec358eed2015-01-28 17:30:13 -08001220
1221 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1222 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001223 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
Matthew Xiec358eed2015-01-28 17:30:13 -08001224 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1225 bta_sys_sendmsg(p_msg);
1226 }
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001227
The Android Open Source Project5738f832012-12-12 16:00:35 -08001228 }
Matthew Xiec358eed2015-01-28 17:30:13 -08001229 else {
1230 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1231 {
1232 p_msg->hdr.event = BTA_DM_INQUIRY_CMPL_EVT;
1233 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1234 bta_sys_sendmsg(p_msg);
1235 }
1236 }
1237
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001238#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
The Android Open Source Project5738f832012-12-12 16:00:35 -08001239 if (bta_dm_search_cb.gatt_disc_active)
1240 {
1241 bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
1242 }
1243#endif
1244}
1245
1246/*******************************************************************************
1247**
1248** Function bta_dm_discover
1249**
1250** Description Discovers services on a remote device
1251**
1252**
1253** Returns void
1254**
1255*******************************************************************************/
1256void bta_dm_discover (tBTA_DM_MSG *p_data)
1257{
1258#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
1259 UINT16 len = (UINT16)(sizeof(tBT_UUID) * p_data->discover.num_uuid);
1260#endif
Chris Mantonf8027002015-03-12 09:22:48 -07001261 APPL_TRACE_EVENT("%s services_to_search=0x%04X, sdp_search=%d", __func__,
The Android Open Source Project5738f832012-12-12 16:00:35 -08001262 p_data->discover.services, p_data->discover.sdp_search);
1263
1264 /* save the search condition */
1265 bta_dm_search_cb.services = p_data->discover.services;
1266
1267#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001268 bta_dm_gattc_register();
The Android Open Source Project5738f832012-12-12 16:00:35 -08001269 utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
1270 if ((bta_dm_search_cb.num_uuid = p_data->discover.num_uuid) != 0 &&
1271 p_data->discover.p_uuid != NULL)
1272 {
1273 if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len)) == NULL)
1274 {
1275 p_data->discover.p_cback(BTA_DM_DISC_CMPL_EVT, NULL);
1276 return;
1277 }
1278 memcpy(bta_dm_search_cb.p_srvc_uuid, p_data->discover.p_uuid, len);
1279 }
1280 bta_dm_search_cb.uuid_to_search = bta_dm_search_cb.num_uuid;
1281#endif
1282
1283 bta_dm_search_cb.p_search_cback = p_data->discover.p_cback;
1284 bta_dm_search_cb.sdp_search = p_data->discover.sdp_search;
1285 bta_dm_search_cb.services_to_search = bta_dm_search_cb.services;
1286 bta_dm_search_cb.service_index = 0;
1287 bta_dm_search_cb.services_found = 0;
1288 bta_dm_search_cb.peer_name[0] = 0;
1289 bta_dm_search_cb.sdp_search = p_data->discover.sdp_search;
1290 bta_dm_search_cb.p_btm_inq_info = BTM_InqDbRead (p_data->discover.bd_addr);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001291 bta_dm_search_cb.transport = p_data->discover.transport;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001292
1293 bta_dm_search_cb.name_discover_done = FALSE;
1294 memcpy(&bta_dm_search_cb.uuid, &p_data->discover.uuid, sizeof(tSDP_UUID));
1295 bta_dm_discover_device(p_data->discover.bd_addr);
1296}
1297
1298/*******************************************************************************
1299**
1300** Function bta_dm_di_disc_cmpl
1301**
1302** Description Sends event to application when DI discovery complete
1303**
1304** Returns void
1305**
1306*******************************************************************************/
1307void bta_dm_di_disc_cmpl(tBTA_DM_MSG *p_data)
1308{
1309 tBTA_DM_DI_DISC_CMPL di_disc;
1310
1311 memset(&di_disc, 0, sizeof(tBTA_DM_DI_DISC_CMPL));
1312 bdcpy(di_disc.bd_addr, bta_dm_search_cb.peer_bdaddr);
1313
1314 if((p_data->hdr.offset == SDP_SUCCESS)
1315 || (p_data->hdr.offset == SDP_DB_FULL))
1316 {
1317 di_disc.num_record = SDP_GetNumDiRecords(bta_dm_di_cb.p_di_db);
1318 }
1319 else
1320 di_disc.result = BTA_FAILURE;
1321
1322 bta_dm_di_cb.p_di_db = NULL;
1323 bta_dm_search_cb.p_search_cback(BTA_DM_DI_DISC_CMPL_EVT, (tBTA_DM_SEARCH *) &di_disc);
1324}
1325
1326/*******************************************************************************
1327**
1328** Function bta_dm_di_disc_callback
1329**
1330** Description This function queries a remote device for DI information.
1331**
1332**
1333** Returns void
1334**
1335*******************************************************************************/
1336static void bta_dm_di_disc_callback(UINT16 result)
1337{
1338 tBTA_DM_MSG * p_msg;
1339
1340 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1341 {
1342 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1343 p_msg->hdr.layer_specific = BTA_DM_API_DI_DISCOVER_EVT;
1344 p_msg->hdr.offset = result;
1345 bta_sys_sendmsg(p_msg);
1346 }
1347}
1348
1349/*******************************************************************************
1350**
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001351** Function bta_dm_disable_search_and_disc
1352**
1353** Description Cancels an ongoing search or discovery for devices in case of
1354** a Bluetooth disable
1355**
1356**
1357** Returns void
1358**
1359*******************************************************************************/
1360static void bta_dm_disable_search_and_disc (void)
1361{
1362 tBTA_DM_DI_DISC_CMPL di_disc;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001363
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001364 if (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE)
1365 bta_dm_search_cancel(NULL);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001366
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001367 if (bta_dm_di_cb.p_di_db != NULL)
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001368 {
1369 memset(&di_disc, 0, sizeof(tBTA_DM_DI_DISC_CMPL));
1370 bdcpy(di_disc.bd_addr, bta_dm_search_cb.peer_bdaddr);
1371 di_disc.result = BTA_FAILURE;
1372
1373 bta_dm_di_cb.p_di_db = NULL;
1374 bta_dm_search_cb.p_search_cback(BTA_DM_DI_DISC_CMPL_EVT, NULL);
1375 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001376}
1377
1378/*******************************************************************************
1379**
The Android Open Source Project5738f832012-12-12 16:00:35 -08001380** Function bta_dm_di_disc
1381**
1382** Description This function queries a remote device for DI information.
1383**
1384**
1385** Returns void
1386**
1387*******************************************************************************/
1388void bta_dm_di_disc (tBTA_DM_MSG *p_data)
1389{
1390 UINT16 result = BTA_FAILURE;
1391 tBTA_DM_MSG *p_msg;
1392
1393 bta_dm_search_cb.p_search_cback = p_data->di_disc.p_cback;
1394 bdcpy(bta_dm_search_cb.peer_bdaddr, p_data->di_disc.bd_addr);
1395 bta_dm_di_cb.p_di_db = p_data->di_disc.p_sdp_db;
1396
1397 if((bta_dm_search_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)GKI_getbuf(BTA_DM_SDP_DB_SIZE)) != NULL)
1398 {
1399 if ( SDP_DiDiscover(bta_dm_search_cb.peer_bdaddr, p_data->di_disc.p_sdp_db,
1400 p_data->di_disc.len, bta_dm_di_disc_callback) == SDP_SUCCESS)
1401 {
1402 result = BTA_SUCCESS;
1403 }
1404 }
1405 else
1406 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001407 APPL_TRACE_ERROR("No buffer to start DI discovery");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001408 }
1409
1410 if ( result == BTA_FAILURE &&
1411 (p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1412 {
1413 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1414 p_msg->hdr.layer_specific = BTA_DM_API_DI_DISCOVER_EVT;
1415 p_data->hdr.offset = result;
1416 bta_sys_sendmsg(p_msg);
1417 }
1418}
1419
1420/*******************************************************************************
1421**
1422** Function bta_dm_read_remote_device_name
1423**
1424** Description Initiate to get remote device name
1425**
1426** Returns TRUE if started to get remote name
1427**
1428*******************************************************************************/
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001429static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr,tBT_TRANSPORT transport)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001430{
1431 tBTM_STATUS btm_status;
1432
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001433 APPL_TRACE_DEBUG("bta_dm_read_remote_device_name");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001434
1435 bdcpy(bta_dm_search_cb.peer_bdaddr, bd_addr);
1436 bta_dm_search_cb.peer_name[0] = 0;
1437
1438 btm_status = BTM_ReadRemoteDeviceName (bta_dm_search_cb.peer_bdaddr,
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001439 (tBTM_CMPL_CB *) bta_dm_remname_cback,
1440 transport);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001441
1442 if ( btm_status == BTM_CMD_STARTED )
1443 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001444 APPL_TRACE_DEBUG("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is started");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001445
1446 return (TRUE);
1447 }
1448 else if ( btm_status == BTM_BUSY )
1449 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001450 APPL_TRACE_DEBUG("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is busy");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001451
1452 /* Remote name discovery is on going now so BTM cannot notify through "bta_dm_remname_cback" */
1453 /* adding callback to get notified that current reading remore name done */
1454 BTM_SecAddRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
1455
1456 return (TRUE);
1457 }
1458 else
1459 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001460 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 -08001461
1462 return (FALSE);
1463 }
1464}
1465
1466/*******************************************************************************
1467**
1468** Function bta_dm_inq_cmpl
1469**
1470** Description Process the inquiry complete event from BTM
1471**
1472** Returns void
1473**
1474*******************************************************************************/
1475void bta_dm_inq_cmpl (tBTA_DM_MSG *p_data)
1476{
1477 tBTA_DM_MSG * p_msg;
1478 tBTA_DM_SEARCH data;
1479
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001480 APPL_TRACE_DEBUG("bta_dm_inq_cmpl");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001481
1482 data.inq_cmpl.num_resps = p_data->inq_cmpl.num;
1483 bta_dm_search_cb.p_search_cback(BTA_DM_INQ_CMPL_EVT, &data);
1484
1485 if((bta_dm_search_cb.p_btm_inq_info = BTM_InqDbFirst()) != NULL)
1486 {
1487 /* start name and service discovery from the first device on inquiry result */
1488 bta_dm_search_cb.name_discover_done = FALSE;
1489 bta_dm_search_cb.peer_name[0] = 0;
1490 bta_dm_discover_device(bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr);
1491 }
1492 else
1493 {
1494 /* no devices, search complete */
1495 bta_dm_search_cb.services = 0;
1496
1497 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1498 {
1499 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1500 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1501 bta_sys_sendmsg(p_msg);
1502 }
1503 }
1504 }
1505
1506/*******************************************************************************
1507**
1508** Function bta_dm_rmt_name
1509**
1510** Description Process the remote name result from BTM
1511**
1512** Returns void
1513**
1514*******************************************************************************/
1515void bta_dm_rmt_name (tBTA_DM_MSG *p_data)
1516{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001517 APPL_TRACE_DEBUG("bta_dm_rmt_name");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001518
1519 if( p_data->rem_name.result.disc_res.bd_name[0] && bta_dm_search_cb.p_btm_inq_info)
1520 {
1521 bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name = TRUE;
1522 }
1523
1524 bta_dm_discover_device(bta_dm_search_cb.peer_bdaddr);
1525}
1526
1527/*******************************************************************************
1528**
1529** Function bta_dm_disc_rmt_name
1530**
1531** Description Process the remote name result from BTM when application
1532** wants to find the name for a bdaddr
1533**
1534** Returns void
1535**
1536*******************************************************************************/
1537void bta_dm_disc_rmt_name (tBTA_DM_MSG *p_data)
1538{
1539 tBTM_INQ_INFO *p_btm_inq_info;
1540
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001541 APPL_TRACE_DEBUG("bta_dm_disc_rmt_name");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001542
1543 p_btm_inq_info = BTM_InqDbRead (p_data->rem_name.result.disc_res.bd_addr);
1544 if( p_btm_inq_info )
1545 {
1546 if( p_data->rem_name.result.disc_res.bd_name[0] )
1547 {
1548 p_btm_inq_info->appl_knows_rem_name = TRUE;
1549 }
1550 }
1551
1552 bta_dm_discover_device(p_data->rem_name.result.disc_res.bd_addr);
1553}
1554
1555/*******************************************************************************
1556**
1557** Function bta_dm_sdp_result
1558**
1559** Description Process the discovery result from sdp
1560**
1561** Returns void
1562**
1563*******************************************************************************/
1564void bta_dm_sdp_result (tBTA_DM_MSG *p_data)
1565{
1566
1567 tSDP_DISC_REC *p_sdp_rec = NULL;
1568 tBTA_DM_MSG *p_msg;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001569 BOOLEAN scn_found = FALSE;
1570 UINT16 service = 0xFFFF;
1571 tSDP_PROTOCOL_ELEM pe;
1572
1573#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
1574 tBT_UUID *p_uuid = bta_dm_search_cb.p_srvc_uuid;
1575 tBTA_DM_SEARCH result;
1576 tBT_UUID service_uuid;
1577#endif
1578
1579 UINT32 num_uuids = 0;
1580 UINT8 uuid_list[32][MAX_UUID_SIZE]; // assuming a max of 32 services
1581
1582 if((p_data->sdp_event.sdp_result == SDP_SUCCESS)
1583 || (p_data->sdp_event.sdp_result == SDP_NO_RECS_MATCH)
1584 || (p_data->sdp_event.sdp_result == SDP_DB_FULL))
1585 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001586 APPL_TRACE_DEBUG("sdp_result::0x%x", p_data->sdp_event.sdp_result);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001587 do
1588 {
1589
The Android Open Source Project5738f832012-12-12 16:00:35 -08001590 p_sdp_rec = NULL;
1591 if( bta_dm_search_cb.service_index == (BTA_USER_SERVICE_ID+1) )
1592 {
1593 p_sdp_rec = SDP_FindServiceUUIDInDb(bta_dm_search_cb.p_sdp_db, &bta_dm_search_cb.uuid, p_sdp_rec);
1594
1595 if (p_sdp_rec && SDP_FindProtocolListElemInRec(p_sdp_rec, UUID_PROTOCOL_RFCOMM, &pe))
1596 {
1597 bta_dm_search_cb.peer_scn = (UINT8) pe.params[0];
1598 scn_found = TRUE;
1599 }
1600 }
1601 else
1602 {
1603 service = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index-1];
1604 p_sdp_rec = SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db, service, p_sdp_rec);
1605 }
1606#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
1607 /* finished with BR/EDR services, now we check the result for GATT based service UUID */
1608 if (bta_dm_search_cb.service_index == BTA_MAX_SERVICE_ID)
1609 {
1610 if (bta_dm_search_cb.uuid_to_search != 0 && p_uuid != NULL)
1611 {
1612 p_uuid += (bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search);
1613 /* only support 16 bits UUID for now */
1614 service = p_uuid->uu.uuid16;
1615
1616 }
1617 /* all GATT based services */
1618 do
1619 {
1620 /* find a service record, report it */
1621 p_sdp_rec = SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db,
1622 0, p_sdp_rec);
1623 if (p_sdp_rec)
1624 {
1625 if (SDP_FindServiceUUIDInRec(p_sdp_rec, &service_uuid))
1626 {
1627 /* send result back to app now, one by one */
1628 bdcpy (result.disc_ble_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001629 BCM_STRNCPY_S((char*)result.disc_ble_res.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN));
1630 result.disc_ble_res.bd_name[BD_NAME_LEN] = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001631 result.disc_ble_res.service.len = service_uuid.len;
1632 result.disc_ble_res.service.uu.uuid16 = service_uuid.uu.uuid16;
1633
1634 bta_dm_search_cb.p_search_cback(BTA_DM_DISC_BLE_RES_EVT, &result);
1635 }
1636 }
1637
1638 if (bta_dm_search_cb.uuid_to_search > 0)
1639 break;
1640
1641 } while (p_sdp_rec);
1642 }
1643 else
1644#endif
1645 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001646 /* SDP_DB_FULL means some records with the
1647 required attributes were received */
1648 if (((p_data->sdp_event.sdp_result == SDP_DB_FULL) &&
1649 bta_dm_search_cb.services != BTA_ALL_SERVICE_MASK) ||
1650 (p_sdp_rec != NULL))
The Android Open Source Project5738f832012-12-12 16:00:35 -08001651 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001652 if (service != UUID_SERVCLASS_PNP_INFORMATION)
1653 {
1654 UINT16 tmp_svc = 0xFFFF;
1655 bta_dm_search_cb.services_found |=
1656 (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index-1));
1657 tmp_svc = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index-1];
1658 /* Add to the list of UUIDs */
1659 sdpu_uuid16_to_uuid128(tmp_svc, uuid_list[num_uuids]);
1660 num_uuids++;
1661 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001662 }
1663 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001664
1665 if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK &&
1666 bta_dm_search_cb.services_to_search == 0)
1667 {
1668#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
1669 if ( bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID &&
1670 bta_dm_search_cb.uuid_to_search > 0)
1671 bta_dm_search_cb.uuid_to_search --;
1672
1673 if (bta_dm_search_cb.uuid_to_search == 0 ||
1674 bta_dm_search_cb.service_index != BTA_BLE_SERVICE_ID)
1675#endif
1676 bta_dm_search_cb.service_index++;
1677 }
1678 else /* regular one service per search or PNP search */
1679 break;
1680
1681 }
1682 while(bta_dm_search_cb.service_index <= BTA_MAX_SERVICE_ID);
1683
1684// GKI_freebuf(bta_dm_search_cb.p_sdp_db);
1685// bta_dm_search_cb.p_sdp_db = NULL;
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001686 APPL_TRACE_DEBUG("%s services_found = %04x", __FUNCTION__,
1687 bta_dm_search_cb.services_found);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001688
1689 /* Collect the 128-bit services here and put them into the list */
1690 if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK)
1691 {
1692 p_sdp_rec = NULL;
1693 do
1694 {
1695 tBT_UUID temp_uuid;
1696 /* find a service record, report it */
1697 p_sdp_rec = SDP_FindServiceInDb_128bit(bta_dm_search_cb.p_sdp_db, p_sdp_rec);
1698 if (p_sdp_rec)
1699 {
1700 if (SDP_FindServiceUUIDInRec_128bit(p_sdp_rec, &temp_uuid))
1701 {
1702 memcpy(uuid_list[num_uuids], temp_uuid.uu.uuid128, MAX_UUID_SIZE);
1703 num_uuids++;
1704 }
1705 }
1706 } while (p_sdp_rec);
1707 }
1708 /* if there are more services to search for */
1709 if(bta_dm_search_cb.services_to_search)
1710 {
1711 /* Free up the p_sdp_db before checking the next one */
1712 bta_dm_free_sdp_db(NULL);
1713 bta_dm_find_services(bta_dm_search_cb.peer_bdaddr);
1714 }
1715 else
1716 {
1717 /* callbacks */
1718 /* start next bd_addr if necessary */
1719
1720 BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
1721
1722
1723 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1724 {
1725 p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
1726 p_msg->disc_result.result.disc_res.result = BTA_SUCCESS;
1727 p_msg->disc_result.result.disc_res.p_raw_data = NULL;
1728 p_msg->disc_result.result.disc_res.raw_data_size = 0;
1729 p_msg->disc_result.result.disc_res.num_uuids = num_uuids;
1730 p_msg->disc_result.result.disc_res.p_uuid_list = NULL;
1731 if (num_uuids > 0) {
1732 p_msg->disc_result.result.disc_res.p_uuid_list = (UINT8*)GKI_getbuf(num_uuids*MAX_UUID_SIZE);
1733 if (p_msg->disc_result.result.disc_res.p_uuid_list) {
1734 memcpy(p_msg->disc_result.result.disc_res.p_uuid_list, uuid_list,
1735 num_uuids*MAX_UUID_SIZE);
1736 } else {
1737 p_msg->disc_result.result.disc_res.num_uuids = 0;
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001738 APPL_TRACE_ERROR("%s: Unable to allocate memory for uuid_list", __func__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001739 }
1740 }
1741 //copy the raw_data to the discovery result structure
1742 //
The Android Open Source Project5738f832012-12-12 16:00:35 -08001743
1744 if ( bta_dm_search_cb.p_sdp_db != NULL && bta_dm_search_cb.p_sdp_db->raw_used != 0 &&
1745 bta_dm_search_cb.p_sdp_db->raw_data != NULL) {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001746 APPL_TRACE_DEBUG(
1747 "%s raw_data used = 0x%x raw_data_ptr = 0x%x", __func__,
1748 bta_dm_search_cb.p_sdp_db->raw_used,
1749 bta_dm_search_cb.p_sdp_db->raw_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001750
1751 p_msg->disc_result.result.disc_res.p_raw_data = GKI_getbuf(bta_dm_search_cb.p_sdp_db->raw_used);
1752 if ( NULL != p_msg->disc_result.result.disc_res.p_raw_data ) {
1753 memcpy( p_msg->disc_result.result.disc_res.p_raw_data,
1754 bta_dm_search_cb.p_sdp_db->raw_data,
1755 bta_dm_search_cb.p_sdp_db->raw_used );
1756
1757 p_msg->disc_result.result.disc_res.raw_data_size =
1758 bta_dm_search_cb.p_sdp_db->raw_used;
1759
1760 } else {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001761 APPL_TRACE_DEBUG("%s GKI Alloc failed to allocate %d bytes !!", __func__,
1762 bta_dm_search_cb.p_sdp_db->raw_used);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001763 }
1764
1765 bta_dm_search_cb.p_sdp_db->raw_data = NULL; //no need to free this - it is a global assigned.
1766 bta_dm_search_cb.p_sdp_db->raw_used = 0;
1767 bta_dm_search_cb.p_sdp_db->raw_size = 0;
1768 }
1769 else {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001770 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 -08001771 }
1772 /* Done with p_sdp_db. Free it */
1773 bta_dm_free_sdp_db(NULL);
1774 p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
1775
1776 //Piggy back the SCN over result field
1777 if( scn_found )
1778 {
1779 p_msg->disc_result.result.disc_res.result = (3 + bta_dm_search_cb.peer_scn);
1780 p_msg->disc_result.result.disc_res.services |= BTA_USER_SERVICE_MASK;
1781
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001782 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 -08001783
1784 }
1785 bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
1786 BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
1787 bta_dm_get_remname(), (BD_NAME_LEN-1));
1788
1789 /* make sure the string is null terminated */
1790 p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
1791
1792 bta_sys_sendmsg(p_msg);
1793 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001794 }
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001795 } else {
The Android Open Source Project5738f832012-12-12 16:00:35 -08001796 /* conn failed. No need for timer */
1797 if(p_data->sdp_event.sdp_result == SDP_CONN_FAILED || p_data->sdp_event.sdp_result == SDP_CONN_REJECTED
1798 || p_data->sdp_event.sdp_result == SDP_SECURITY_ERR)
1799 bta_dm_search_cb.wait_disc = FALSE;
1800
1801 /* not able to connect go to next device */
1802 GKI_freebuf(bta_dm_search_cb.p_sdp_db);
1803 bta_dm_search_cb.p_sdp_db = NULL;
1804
1805 BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
1806
1807 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1808 {
1809 p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
1810 p_msg->disc_result.result.disc_res.result = BTA_FAILURE;
1811 p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
1812 bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
1813 BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
1814 bta_dm_get_remname(), (BD_NAME_LEN-1));
1815
1816 /* make sure the string is null terminated */
1817 p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
1818
1819 bta_sys_sendmsg(p_msg);
1820 }
1821 }
1822}
1823
1824/*******************************************************************************
1825**
1826** Function bta_dm_search_cmpl
1827**
1828** Description Sends event to application
1829**
1830** Returns void
1831**
1832*******************************************************************************/
1833void bta_dm_search_cmpl (tBTA_DM_MSG *p_data)
1834{
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001835 APPL_TRACE_EVENT("%s", __func__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001836
1837#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
1838 utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
1839#endif
1840
1841 if (p_data->hdr.layer_specific == BTA_DM_API_DI_DISCOVER_EVT)
1842 bta_dm_di_disc_cmpl(p_data);
1843 else
1844 bta_dm_search_cb.p_search_cback(BTA_DM_DISC_CMPL_EVT, NULL);
1845}
1846
1847/*******************************************************************************
1848**
1849** Function bta_dm_disc_result
1850**
1851** Description Service discovery result when discovering services on a device
1852**
1853** Returns void
1854**
1855*******************************************************************************/
1856void bta_dm_disc_result (tBTA_DM_MSG *p_data)
1857{
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001858 APPL_TRACE_EVENT("%s", __func__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001859
1860#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
1861 /* if any BR/EDR service discovery has been done, report the event */
1862 if ((bta_dm_search_cb.services & ((BTA_ALL_SERVICE_MASK | BTA_USER_SERVICE_MASK ) & ~BTA_BLE_SERVICE_MASK)))
1863#endif
1864 bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, &p_data->disc_result.result);
1865
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001866 tBTA_DM_MSG *p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG));
1867
The Android Open Source Project5738f832012-12-12 16:00:35 -08001868 /* send a message to change state */
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001869 if (p_msg != NULL)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001870 {
1871 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1872 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1873 bta_sys_sendmsg(p_msg);
1874 }
1875}
1876
1877/*******************************************************************************
1878**
1879** Function bta_dm_search_result
1880**
1881** Description Service discovery result while searching for devices
1882**
1883** Returns void
1884**
1885*******************************************************************************/
1886void bta_dm_search_result (tBTA_DM_MSG *p_data)
1887{
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001888 APPL_TRACE_DEBUG("%s searching:0x%04x, result:0x%04x", __func__,
The Android Open Source Project5738f832012-12-12 16:00:35 -08001889 bta_dm_search_cb.services,
1890 p_data->disc_result.result.disc_res.services);
1891
1892 /* call back if application wants name discovery or found services that application is searching */
1893 if (( !bta_dm_search_cb.services )
1894 ||(( bta_dm_search_cb.services ) && ( p_data->disc_result.result.disc_res.services )))
1895 {
1896 bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, &p_data->disc_result.result);
1897 }
1898
1899 /* if searching did not initiate to create link */
1900 if(!bta_dm_search_cb.wait_disc )
1901 {
The Android Open Source Project5738f832012-12-12 16:00:35 -08001902 /* if service searching is done with EIR, don't search next device */
1903 if( bta_dm_search_cb.p_btm_inq_info )
The Android Open Source Project5738f832012-12-12 16:00:35 -08001904 bta_dm_discover_next_device();
1905 }
1906 else
1907 {
1908 /* wait until link is disconnected or timeout */
1909 bta_dm_search_cb.sdp_results = TRUE;
1910 bta_dm_search_cb.search_timer.p_cback = (TIMER_CBACK*)&bta_dm_search_timer_cback;
1911 bta_sys_start_timer(&bta_dm_search_cb.search_timer, 0, 1000*(L2CAP_LINK_INACTIVITY_TOUT+1) );
1912 }
1913
1914}
1915
1916/*******************************************************************************
1917**
1918** Function bta_dm_search_timer_cback
1919**
1920** Description Called when ACL disconnect time is over
1921**
1922**
1923** Returns void
1924**
1925*******************************************************************************/
1926static void bta_dm_search_timer_cback (TIMER_LIST_ENT *p_tle)
1927{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08001928 UNUSED(p_tle);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001929
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07001930 APPL_TRACE_EVENT("%s", __func__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001931 bta_dm_search_cb.wait_disc = FALSE;
1932
1933 /* proceed with next device */
1934 bta_dm_discover_next_device();
1935
1936}
1937
1938
1939/*******************************************************************************
1940**
1941** Function bta_dm_free_sdp_db
1942**
1943** Description Frees SDP data base
1944**
1945** Returns void
1946**
1947*******************************************************************************/
1948void bta_dm_free_sdp_db (tBTA_DM_MSG *p_data)
1949{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08001950 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001951 if(bta_dm_search_cb.p_sdp_db)
1952 {
1953 GKI_freebuf(bta_dm_search_cb.p_sdp_db);
1954 bta_dm_search_cb.p_sdp_db = NULL;
1955 }
1956
1957}
1958
1959/*******************************************************************************
1960**
1961** Function bta_dm_queue_search
1962**
1963** Description Queues search command while search is being cancelled
1964**
1965** Returns void
1966**
1967*******************************************************************************/
1968void bta_dm_queue_search (tBTA_DM_MSG *p_data)
1969{
Zhihai Xub69a1752013-11-06 19:23:13 -08001970 if(bta_dm_search_cb.p_search_queue)
1971 {
1972 GKI_freebuf(bta_dm_search_cb.p_search_queue);
1973 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001974
1975 bta_dm_search_cb.p_search_queue = (tBTA_DM_MSG *)GKI_getbuf(sizeof(tBTA_DM_API_SEARCH));
1976 memcpy(bta_dm_search_cb.p_search_queue, p_data, sizeof(tBTA_DM_API_SEARCH));
1977
1978}
1979
1980/*******************************************************************************
1981**
1982** Function bta_dm_queue_disc
1983**
1984** Description Queues discovery command while search is being cancelled
1985**
1986** Returns void
1987**
1988*******************************************************************************/
1989void bta_dm_queue_disc (tBTA_DM_MSG *p_data)
1990{
Zhihai Xub69a1752013-11-06 19:23:13 -08001991 if(bta_dm_search_cb.p_search_queue)
1992 {
1993 GKI_freebuf(bta_dm_search_cb.p_search_queue);
1994 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001995
1996 bta_dm_search_cb.p_search_queue = (tBTA_DM_MSG *)GKI_getbuf(sizeof(tBTA_DM_API_DISCOVER));
1997 memcpy(bta_dm_search_cb.p_search_queue, p_data, sizeof(tBTA_DM_API_DISCOVER));
1998
1999}
2000
2001/*******************************************************************************
2002**
2003** Function bta_dm_search_clear_queue
2004**
2005** Description Clears the queue if API search cancel is called
2006**
2007** Returns void
2008**
2009*******************************************************************************/
2010void bta_dm_search_clear_queue (tBTA_DM_MSG *p_data)
2011{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002012 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002013 if(bta_dm_search_cb.p_search_queue)
2014 {
2015 GKI_freebuf(bta_dm_search_cb.p_search_queue);
2016 bta_dm_search_cb.p_search_queue = NULL;
2017 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002018}
2019
2020/*******************************************************************************
2021**
2022** Function bta_dm_search_cancel_cmpl
2023**
2024** Description Search cancel is complete
2025**
2026** Returns void
2027**
2028*******************************************************************************/
2029void bta_dm_search_cancel_cmpl (tBTA_DM_MSG *p_data)
2030{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002031 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002032 if(bta_dm_search_cb.p_search_queue)
2033 {
2034 bta_sys_sendmsg(bta_dm_search_cb.p_search_queue);
2035 bta_dm_search_cb.p_search_queue = NULL;
2036 }
2037
2038}
2039
2040/*******************************************************************************
2041**
2042** Function bta_dm_search_cancel_transac_cmpl
2043**
2044** Description Current Service Discovery or remote name procedure is
2045** completed after search cancellation
2046**
2047** Returns void
2048**
2049*******************************************************************************/
2050void bta_dm_search_cancel_transac_cmpl(tBTA_DM_MSG *p_data)
2051{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002052 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002053 if(bta_dm_search_cb.p_sdp_db)
2054 {
2055 GKI_freebuf(bta_dm_search_cb.p_sdp_db);
2056 bta_dm_search_cb.p_sdp_db = NULL;
2057 }
2058
2059 bta_dm_search_cancel_notify(NULL);
2060}
2061
2062
2063/*******************************************************************************
2064**
2065** Function bta_dm_search_cancel_notify
2066**
2067** Description Notify application that search has been cancelled
2068**
2069** Returns void
2070**
2071*******************************************************************************/
2072void bta_dm_search_cancel_notify (tBTA_DM_MSG *p_data)
2073{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002074 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002075 if (bta_dm_search_cb.p_search_cback)
2076 {
2077 bta_dm_search_cb.p_search_cback(BTA_DM_SEARCH_CANCEL_CMPL_EVT, NULL);
2078 }
2079 if (!bta_dm_search_cb.name_discover_done)
2080 {
2081 BTM_CancelRemoteDeviceName();
2082 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002083#if (BLE_INCLUDED == TRUE) && (BTA_GATT_INCLUDED == TRUE)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002084 if (bta_dm_search_cb.gatt_disc_active)
2085 {
2086 bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
2087 }
2088#endif
2089
2090}
2091
2092/*******************************************************************************
2093**
2094** Function bta_dm_find_services
2095**
2096** Description Starts discovery on a device
2097**
2098** Returns void
2099**
2100*******************************************************************************/
2101static void bta_dm_find_services ( BD_ADDR bd_addr)
2102{
2103
2104 tSDP_UUID uuid;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002105 tBTA_DM_MSG *p_msg;
2106
2107 memset (&uuid, 0, sizeof(tSDP_UUID));
2108
2109 while(bta_dm_search_cb.service_index < BTA_MAX_SERVICE_ID)
2110 {
2111 if( bta_dm_search_cb.services_to_search
2112 & (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index)))
2113 {
2114 if((bta_dm_search_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)GKI_getbuf(BTA_DM_SDP_DB_SIZE)) != NULL)
2115 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002116 APPL_TRACE_DEBUG("bta_dm_search_cb.services = %04x***********", bta_dm_search_cb.services);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002117 /* try to search all services by search based on L2CAP UUID */
2118 if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK )
2119 {
Marie Janssendb554582015-06-26 14:53:46 -07002120 LOG_INFO(LOG_TAG, "%s services_to_search=%08x", __func__, bta_dm_search_cb.services_to_search);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002121 if (bta_dm_search_cb.services_to_search & BTA_RES_SERVICE_MASK)
2122 {
2123 uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[0];
2124 bta_dm_search_cb.services_to_search &= ~BTA_RES_SERVICE_MASK;
2125 }
2126 else
2127 {
2128 uuid.uu.uuid16 = UUID_PROTOCOL_L2CAP;
2129 bta_dm_search_cb.services_to_search = 0;
2130 }
2131 }
2132 else
2133 {
2134#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
2135 /* for LE only profile */
2136 if (bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID)
2137 {
2138 if (bta_dm_search_cb.uuid_to_search > 0 && bta_dm_search_cb.p_srvc_uuid)
2139 {
2140 memcpy(&uuid,
2141 (const void *)(bta_dm_search_cb.p_srvc_uuid + \
2142 bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search),
2143 sizeof(tBT_UUID));
2144
2145 bta_dm_search_cb.uuid_to_search -- ;
2146 }
2147 else
2148 uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index];
2149
2150 /* last one? clear the BLE service bit if all discovery has been done */
2151 if (bta_dm_search_cb.uuid_to_search == 0)
2152 bta_dm_search_cb.services_to_search &=
2153 (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index)));
2154
2155 }
2156 else
2157#endif
2158 {
2159 /* remove the service from services to be searched */
2160 bta_dm_search_cb.services_to_search &=
2161 (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index)));
2162 uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index];
2163 }
2164 }
2165
2166 if (uuid.len == 0)
Chris Mantonf8027002015-03-12 09:22:48 -07002167 uuid.len = LEN_UUID_16;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002168
2169 if (bta_dm_search_cb.service_index == BTA_USER_SERVICE_ID)
2170 {
2171 memcpy(&uuid, &bta_dm_search_cb.uuid, sizeof(tSDP_UUID));
2172 }
2173
Marie Janssendb554582015-06-26 14:53:46 -07002174 LOG_INFO(LOG_TAG, "%s search UUID = %04x", __func__, uuid.uu.uuid16);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002175 SDP_InitDiscoveryDb (bta_dm_search_cb.p_sdp_db, BTA_DM_SDP_DB_SIZE, 1, &uuid, 0, NULL);
2176
The Android Open Source Project5738f832012-12-12 16:00:35 -08002177 memset(g_disc_raw_data_buf, 0, sizeof(g_disc_raw_data_buf));
2178 bta_dm_search_cb.p_sdp_db->raw_data = g_disc_raw_data_buf;
2179
2180 bta_dm_search_cb.p_sdp_db->raw_size = MAX_DISC_RAW_DATA_BUF;
2181
2182 if (!SDP_ServiceSearchAttributeRequest (bd_addr, bta_dm_search_cb.p_sdp_db, &bta_dm_sdp_callback))
2183 {
2184 /* if discovery not successful with this device
2185 proceed to next one */
2186 GKI_freebuf(bta_dm_search_cb.p_sdp_db);
2187 bta_dm_search_cb.p_sdp_db = NULL;
2188 bta_dm_search_cb.service_index = BTA_MAX_SERVICE_ID;
2189
2190 }
2191 else
2192 {
2193#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
2194 if ((bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID &&
2195 bta_dm_search_cb.uuid_to_search == 0) ||
2196 bta_dm_search_cb.service_index != BTA_BLE_SERVICE_ID)
2197#endif
2198 bta_dm_search_cb.service_index++;
2199 return;
2200 }
2201 }
2202 else
2203 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002204 APPL_TRACE_ERROR("#### Failed to allocate SDP DB buffer! ####");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002205 }
2206 }
2207
2208 bta_dm_search_cb.service_index++;
2209 }
2210
2211 /* no more services to be discovered */
2212 if(bta_dm_search_cb.service_index >= BTA_MAX_SERVICE_ID)
2213 {
2214 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
2215 {
2216 p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
2217 p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
2218 bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
2219 BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
2220 bta_dm_get_remname(), (BD_NAME_LEN-1));
2221
2222 /* make sure the string is terminated */
2223 p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
2224
2225 bta_sys_sendmsg(p_msg);
2226 }
2227 }
2228}
2229
2230/*******************************************************************************
2231**
2232** Function bta_dm_discover_next_device
2233**
2234** Description Starts discovery on the next device in Inquiry data base
2235**
2236** Returns void
2237**
2238*******************************************************************************/
2239static void bta_dm_discover_next_device(void)
2240{
2241
2242 tBTA_DM_MSG * p_msg;
2243
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002244 APPL_TRACE_DEBUG("bta_dm_discover_next_device");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002245
2246 /* searching next device on inquiry result */
2247 if((bta_dm_search_cb.p_btm_inq_info = BTM_InqDbNext(bta_dm_search_cb.p_btm_inq_info)) != NULL)
2248 {
2249 bta_dm_search_cb.name_discover_done = FALSE;
2250 bta_dm_search_cb.peer_name[0] = 0;
2251 bta_dm_discover_device(bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr);
2252 }
2253 else
2254 {
2255 /* no devices, search complete */
2256 bta_dm_search_cb.services = 0;
2257
2258 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
2259 {
2260 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
2261 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
2262 bta_sys_sendmsg(p_msg);
2263 }
2264 }
2265}
2266
2267/*******************************************************************************
2268**
2269** Function bta_dm_discover_device
2270**
2271** Description Starts name and service discovery on the device
2272**
2273** Returns void
2274**
2275*******************************************************************************/
2276static void bta_dm_discover_device(BD_ADDR remote_bd_addr)
2277{
2278 tBTA_DM_MSG * p_msg;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002279 tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
Nitin Arorab4365c52015-06-25 18:30:09 -07002280
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002281#if BLE_INCLUDED == TRUE
Nitin Arorab4365c52015-06-25 18:30:09 -07002282 if (bta_dm_search_cb.transport == BTA_TRANSPORT_UNKNOWN)
2283 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002284 tBT_DEVICE_TYPE dev_type;
2285 tBLE_ADDR_TYPE addr_type;
2286
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002287 BTM_ReadDevInfo(remote_bd_addr, &dev_type, &addr_type);
Nitin Arorab4365c52015-06-25 18:30:09 -07002288 if (dev_type == BT_DEVICE_TYPE_BLE || addr_type == BLE_ADDR_RANDOM)
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002289 transport = BT_TRANSPORT_LE;
Nitin Arorab4365c52015-06-25 18:30:09 -07002290 } else {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002291 transport = bta_dm_search_cb.transport;
Nitin Arorab4365c52015-06-25 18:30:09 -07002292 }
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002293#endif
2294
Nitin Arorab4365c52015-06-25 18:30:09 -07002295 /* Reset transport state for next discovery */
2296 bta_dm_search_cb.transport = BTA_TRANSPORT_UNKNOWN;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002297
Nitin Arorab4365c52015-06-25 18:30:09 -07002298 APPL_TRACE_DEBUG("%s BDA:0x%02X%02X%02X%02X%02X%02X", __func__,
The Android Open Source Project5738f832012-12-12 16:00:35 -08002299 remote_bd_addr[0],remote_bd_addr[1],
2300 remote_bd_addr[2],remote_bd_addr[3],
2301 remote_bd_addr[4],remote_bd_addr[5]);
2302
2303 bdcpy(bta_dm_search_cb.peer_bdaddr, remote_bd_addr);
2304
Nitin Arorab4365c52015-06-25 18:30:09 -07002305 APPL_TRACE_DEBUG("%s name_discover_done = %d p_btm_inq_info 0x%x state = %d, transport=%d",
2306 __func__,
The Android Open Source Project5738f832012-12-12 16:00:35 -08002307 bta_dm_search_cb.name_discover_done,
Nitin Aroraddbb20b2014-07-11 14:33:05 -07002308 bta_dm_search_cb.p_btm_inq_info,
Nitin Arorab4365c52015-06-25 18:30:09 -07002309 bta_dm_search_cb.state,
2310 transport);
2311
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07002312 if (bta_dm_search_cb.p_btm_inq_info)
2313 {
Nitin Arorab4365c52015-06-25 18:30:09 -07002314 APPL_TRACE_DEBUG("%s appl_knows_rem_name %d", __func__,
2315 bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002316 }
2317
Nitin Aroraddbb20b2014-07-11 14:33:05 -07002318 if((bta_dm_search_cb.p_btm_inq_info)
2319 && (bta_dm_search_cb.p_btm_inq_info->results.device_type == BT_DEVICE_TYPE_BLE)
2320 && (bta_dm_search_cb.state == BTA_DM_SEARCH_ACTIVE))
2321 {
2322 /* Do not perform RNR for LE devices at inquiry complete*/
2323 bta_dm_search_cb.name_discover_done = TRUE;
2324 }
2325
The Android Open Source Project5738f832012-12-12 16:00:35 -08002326 /* if name discovery is not done and application needs remote name */
2327 if ((!bta_dm_search_cb.name_discover_done)
2328 && (( bta_dm_search_cb.p_btm_inq_info == NULL )
2329 ||(bta_dm_search_cb.p_btm_inq_info && (!bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name))))
2330 {
Nitin Arorab4365c52015-06-25 18:30:09 -07002331 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 -08002332 return;
Nitin Arorab4365c52015-06-25 18:30:09 -07002333
2334 /* starting name discovery failed */
2335 bta_dm_search_cb.name_discover_done = TRUE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002336 }
2337
2338 /* if application wants to discover service */
2339 if ( bta_dm_search_cb.services )
2340 {
2341 /* initialize variables */
2342 bta_dm_search_cb.service_index = 0;
2343 bta_dm_search_cb.services_found = 0;
2344 bta_dm_search_cb.services_to_search = bta_dm_search_cb.services;
2345#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
2346 bta_dm_search_cb.uuid_to_search = bta_dm_search_cb.num_uuid;
2347#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08002348 if ((bta_dm_search_cb.p_btm_inq_info != NULL) &&
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07002349 bta_dm_search_cb.services != BTA_USER_SERVICE_MASK
The Android Open Source Project5738f832012-12-12 16:00:35 -08002350 &&(bta_dm_search_cb.sdp_search == FALSE))
2351 {
2352 /* check if EIR provides the information of supported services */
2353 bta_dm_eir_search_services( &bta_dm_search_cb.p_btm_inq_info->results,
2354 &bta_dm_search_cb.services_to_search,
2355 &bta_dm_search_cb.services_found );
2356 }
2357
2358 /* if seaching with EIR is not completed */
2359 if(bta_dm_search_cb.services_to_search)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002360 {
2361 /* check whether connection already exists to the device
2362 if connection exists, we don't have to wait for ACL
2363 link to go down to start search on next device */
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002364 if (BTM_IsAclConnectionUp(bta_dm_search_cb.peer_bdaddr, BT_TRANSPORT_BR_EDR))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002365 bta_dm_search_cb.wait_disc = FALSE;
2366 else
2367 bta_dm_search_cb.wait_disc = TRUE;
2368
2369#if (BLE_INCLUDED == TRUE && (defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE))
2370 if ( bta_dm_search_cb.p_btm_inq_info )
2371 {
Nitin Arorab4365c52015-06-25 18:30:09 -07002372 APPL_TRACE_DEBUG("%s p_btm_inq_info 0x%x results.device_type 0x%x services_to_search 0x%x",
2373 __func__,
The Android Open Source Project5738f832012-12-12 16:00:35 -08002374 bta_dm_search_cb.p_btm_inq_info,
2375 bta_dm_search_cb.p_btm_inq_info->results.device_type,
Nitin Arorab4365c52015-06-25 18:30:09 -07002376 bta_dm_search_cb.services_to_search);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002377 }
Chaojing Sune2805532015-04-22 13:40:21 -07002378
2379 if (transport == BT_TRANSPORT_LE)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002380 {
2381 if (bta_dm_search_cb.services_to_search & BTA_BLE_SERVICE_MASK)
2382 {
2383 //set the raw data buffer here
2384 memset(g_disc_raw_data_buf, 0, sizeof(g_disc_raw_data_buf));
2385 bta_dm_search_cb.p_ble_rawdata = g_disc_raw_data_buf;
2386
2387 bta_dm_search_cb.ble_raw_size = MAX_DISC_RAW_DATA_BUF;
2388 bta_dm_search_cb.ble_raw_used = 0;
2389
2390 /* start GATT for service discovery */
2391 btm_dm_start_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
2392 return;
2393 }
2394 }
2395 else
2396#endif
2397 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07002398 bta_dm_search_cb.sdp_results = FALSE;
2399 bta_dm_find_services(bta_dm_search_cb.peer_bdaddr);
2400 return;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002401 }
2402 }
2403 }
2404
2405 /* name discovery and service discovery are done for this device */
2406 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
2407 {
2408 p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
2409 /* initialize the data structure - includes p_raw_data and raw_data_size */
2410 memset(&(p_msg->disc_result.result), 0, sizeof(tBTA_DM_DISC_RES));
2411 p_msg->disc_result.result.disc_res.result = BTA_SUCCESS;
2412 p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
2413 bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
2414 BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
2415 (char*)bta_dm_search_cb.peer_name, (BD_NAME_LEN-1));
2416
2417 /* make sure the string is terminated */
2418 p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
2419
2420 bta_sys_sendmsg(p_msg);
2421 }
2422}
2423
2424/*******************************************************************************
2425**
2426** Function bta_dm_sdp_callback
2427**
2428** Description Callback from sdp with discovery status
2429**
2430** Returns void
2431**
2432*******************************************************************************/
2433static void bta_dm_sdp_callback (UINT16 sdp_status)
2434{
2435
2436 tBTA_DM_SDP_RESULT * p_msg;
2437
2438 if ((p_msg = (tBTA_DM_SDP_RESULT *) GKI_getbuf(sizeof(tBTA_DM_SDP_RESULT))) != NULL)
2439 {
2440 p_msg->hdr.event = BTA_DM_SDP_RESULT_EVT;
2441 p_msg->sdp_result = sdp_status;
2442 bta_sys_sendmsg(p_msg);
2443
2444 }
2445}
2446
2447/*******************************************************************************
2448**
2449** Function bta_dm_inq_results_cb
2450**
2451** Description Inquiry results callback from BTM
2452**
2453** Returns void
2454**
2455*******************************************************************************/
2456static void bta_dm_inq_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir)
2457{
2458
2459 tBTA_DM_SEARCH result;
2460 tBTM_INQ_INFO *p_inq_info;
2461 UINT16 service_class;
2462
2463 bdcpy(result.inq_res.bd_addr, p_inq->remote_bd_addr);
2464 memcpy(result.inq_res.dev_class, p_inq->dev_class, DEV_CLASS_LEN);
2465 BTM_COD_SERVICE_CLASS(service_class, p_inq->dev_class);
2466 result.inq_res.is_limited = (service_class & BTM_COD_SERVICE_LMTD_DISCOVER)?TRUE:FALSE;
2467 result.inq_res.rssi = p_inq->rssi;
2468
2469#if (BLE_INCLUDED == TRUE)
2470 result.inq_res.ble_addr_type = p_inq->ble_addr_type;
2471 result.inq_res.inq_result_type = p_inq->inq_result_type;
2472 result.inq_res.device_type = p_inq->device_type;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002473 result.inq_res.flag = p_inq->flag;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002474#endif
2475
2476 /* application will parse EIR to find out remote device name */
2477 result.inq_res.p_eir = p_eir;
2478
2479 if((p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr)) != NULL)
2480 {
2481 /* initialize remt_name_not_required to FALSE so that we get the name by default */
2482 result.inq_res.remt_name_not_required = FALSE;
2483
2484 }
2485
2486 if(bta_dm_search_cb.p_search_cback)
2487 bta_dm_search_cb.p_search_cback(BTA_DM_INQ_RES_EVT, &result);
2488
2489 if(p_inq_info)
2490 {
2491 /* application indicates if it knows the remote name, inside the callback
2492 copy that to the inquiry data base*/
2493 if(result.inq_res.remt_name_not_required)
2494 p_inq_info->appl_knows_rem_name = TRUE;
2495
2496 }
2497
2498
2499}
2500
2501
2502/*******************************************************************************
2503**
2504** Function bta_dm_inq_cmpl_cb
2505**
2506** Description Inquiry complete callback from BTM
2507**
2508** Returns void
2509**
2510*******************************************************************************/
2511static void bta_dm_inq_cmpl_cb (void * p_result)
2512{
The Android Open Source Project5738f832012-12-12 16:00:35 -08002513 tBTA_DM_MSG * p_msg;
2514
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07002515 if (bta_dm_search_cb.cancel_pending == FALSE)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002516 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07002517 APPL_TRACE_DEBUG("%s", __FUNCTION__);
2518 p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG));
2519 if (p_msg != NULL) {
2520 p_msg->inq_cmpl.hdr.event = BTA_DM_INQUIRY_CMPL_EVT;
2521 p_msg->inq_cmpl.num = ((tBTM_INQUIRY_CMPL *)p_result)->num_resp;
2522 bta_sys_sendmsg(p_msg);
2523 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002524 }
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07002525 else
2526 {
2527 bta_dm_search_cb.cancel_pending = FALSE;
2528 bta_dm_search_cancel_notify(NULL);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002529
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07002530 p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG));
2531 if (p_msg != NULL) {
2532 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
2533 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
2534 bta_sys_sendmsg(p_msg);
2535 }
2536 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002537}
2538
2539/*******************************************************************************
2540**
2541** Function bta_dm_service_search_remname_cback
2542**
2543** Description Remote name call back from BTM during service discovery
2544**
2545** Returns void
2546**
2547*******************************************************************************/
2548static void bta_dm_service_search_remname_cback (BD_ADDR bd_addr, DEV_CLASS dc, BD_NAME bd_name)
2549{
2550 tBTM_REMOTE_DEV_NAME rem_name;
2551 tBTM_STATUS btm_status;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002552 UNUSED(dc);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002553
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002554 APPL_TRACE_DEBUG("bta_dm_service_search_remname_cback name=<%s>", bd_name);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002555
2556 /* if this is what we are looking for */
2557 if (!bdcmp( bta_dm_search_cb.peer_bdaddr, bd_addr))
2558 {
2559 rem_name.length = strlen((char*)bd_name);
2560 if (rem_name.length > (BD_NAME_LEN-1))
2561 {
2562 rem_name.length = (BD_NAME_LEN-1);
2563 rem_name.remote_bd_name[(BD_NAME_LEN-1)] = 0;
2564 }
2565 BCM_STRNCPY_S((char*)rem_name.remote_bd_name, sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1));
2566 rem_name.status = BTM_SUCCESS;
2567
2568 bta_dm_remname_cback(&rem_name);
2569 }
2570 else
2571 {
2572 /* get name of device */
2573 btm_status = BTM_ReadRemoteDeviceName (bta_dm_search_cb.peer_bdaddr,
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002574 (tBTM_CMPL_CB *) bta_dm_remname_cback,
2575 BT_TRANSPORT_BR_EDR);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002576 if ( btm_status == BTM_BUSY )
2577 {
2578 /* wait for next chance(notification of remote name discovery done) */
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002579 APPL_TRACE_DEBUG("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName is busy");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002580 }
2581 else if ( btm_status != BTM_CMD_STARTED )
2582 {
2583 /* if failed to start getting remote name then continue */
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002584 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 -08002585
2586 rem_name.length = 0;
2587 rem_name.remote_bd_name[0] = 0;
2588 rem_name.status = btm_status;
2589 bta_dm_remname_cback(&rem_name);
2590 }
2591 }
2592}
2593
2594
2595/*******************************************************************************
2596**
2597** Function bta_dm_remname_cback
2598**
2599** Description Remote name complete call back from BTM
2600**
2601** Returns void
2602**
2603*******************************************************************************/
2604static void bta_dm_remname_cback (tBTM_REMOTE_DEV_NAME *p_remote_name)
2605{
2606 tBTA_DM_REM_NAME * p_msg;
2607
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002608 APPL_TRACE_DEBUG("bta_dm_remname_cback len = %d name=<%s>", p_remote_name->length,
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002609 p_remote_name->remote_bd_name);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002610
2611 /* remote name discovery is done but it could be failed */
2612 bta_dm_search_cb.name_discover_done = TRUE;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002613 BCM_STRNCPY_S((char*)bta_dm_search_cb.peer_name, sizeof(BD_NAME), (char*)p_remote_name->remote_bd_name, (BD_NAME_LEN));
2614 bta_dm_search_cb.peer_name[BD_NAME_LEN]=0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002615
2616 BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002617
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002618#if BLE_INCLUDED == TRUE
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002619 if (bta_dm_search_cb.transport == BT_TRANSPORT_LE )
2620 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07002621 GAP_BleReadPeerPrefConnParams (bta_dm_search_cb.peer_bdaddr);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002622 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002623#endif
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07002624
The Android Open Source Project5738f832012-12-12 16:00:35 -08002625 if ((p_msg = (tBTA_DM_REM_NAME *) GKI_getbuf(sizeof(tBTA_DM_REM_NAME))) != NULL)
2626 {
2627 bdcpy (p_msg->result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002628 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 -08002629
2630 /* make sure the string is null terminated */
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002631 p_msg->result.disc_res.bd_name[BD_NAME_LEN] = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002632
2633 p_msg->hdr.event = BTA_DM_REMT_NAME_EVT;
2634 bta_sys_sendmsg(p_msg);
2635
2636 }
2637}
2638
2639/*******************************************************************************
2640**
2641** Function bta_dm_authorize_cback
2642**
2643** Description cback requesting authorization
2644**
2645** Returns void
2646**
2647*******************************************************************************/
2648static UINT8 bta_dm_authorize_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name,
2649 UINT8 *service_name, UINT8 service_id, BOOLEAN is_originator)
2650{
2651 tBTA_DM_SEC sec_event;
2652 UINT8 index = 1;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002653 UNUSED(service_name);
2654 UNUSED(is_originator);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002655
2656 bdcpy(sec_event.authorize.bd_addr, bd_addr);
2657 memcpy(sec_event.authorize.dev_class, dev_class, DEV_CLASS_LEN);
2658
2659 BCM_STRNCPY_S((char*)sec_event.authorize.bd_name, sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1));
2660
2661 /* make sure the string is null terminated */
2662 sec_event.authorize.bd_name[BD_NAME_LEN-1] = 0;
2663
2664#if ( defined(BTA_JV_INCLUDED) && BTA_JV_INCLUDED == TRUE )
2665 sec_event.authorize.service = service_id;
2666#endif
2667
2668 while(index < BTA_MAX_SERVICE_ID)
2669 {
2670 /* get the BTA service id corresponding to BTM id */
2671 if(bta_service_id_to_btm_srv_id_lkup_tbl[index] == service_id)
2672 {
2673 sec_event.authorize.service = index;
2674 break;
2675 }
2676 index++;
2677 }
2678
2679
2680 /* if supported service callback otherwise not authorized */
2681 if(bta_dm_cb.p_sec_cback && (index < BTA_MAX_SERVICE_ID
2682#if ( defined(BTA_JV_INCLUDED) && BTA_JV_INCLUDED == TRUE )
2683 /* pass through JV service ID */
2684 || (service_id >= BTA_FIRST_JV_SERVICE_ID && service_id <= BTA_LAST_JV_SERVICE_ID)
2685#endif
2686 ))
2687 {
2688 bta_dm_cb.p_sec_cback(BTA_DM_AUTHORIZE_EVT, &sec_event);
2689 return BTM_CMD_STARTED;
2690 }
2691 else
2692 {
2693 return BTM_NOT_AUTHORIZED;
2694 }
2695}
2696
2697
2698
2699
2700
2701/*******************************************************************************
2702**
2703** Function bta_dm_pinname_cback
2704**
2705** Description Callback requesting pin_key
2706**
2707** Returns void
2708**
2709*******************************************************************************/
2710static void bta_dm_pinname_cback (void *p_data)
2711{
2712 tBTM_REMOTE_DEV_NAME *p_result = (tBTM_REMOTE_DEV_NAME *)p_data;
2713 tBTA_DM_SEC sec_event;
2714 UINT32 bytes_to_copy;
2715 tBTA_DM_SEC_EVT event = bta_dm_cb.pin_evt;
2716
2717 if (BTA_DM_SP_CFM_REQ_EVT == event)
2718 {
Andre Eisenbach181d0752013-06-11 14:18:21 -07002719 /* Retrieved saved device class and bd_addr */
2720 bdcpy(sec_event.cfm_req.bd_addr, bta_dm_cb.pin_bd_addr);
2721 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 -08002722
Andre Eisenbach181d0752013-06-11 14:18:21 -07002723 if (p_result && p_result->status == BTM_SUCCESS)
2724 {
2725 bytes_to_copy = (p_result->length < (BD_NAME_LEN-1))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002726 ? p_result->length : (BD_NAME_LEN-1);
Andre Eisenbach181d0752013-06-11 14:18:21 -07002727 memcpy(sec_event.cfm_req.bd_name, p_result->remote_bd_name, bytes_to_copy);
2728 sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0;
2729 }
2730 else /* No name found */
2731 sec_event.cfm_req.bd_name[0] = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002732
Andre Eisenbach181d0752013-06-11 14:18:21 -07002733 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 -08002734
2735 /* 1 additional event data fields for this event */
2736 sec_event.cfm_req.just_works = bta_dm_cb.just_works;
2737 }
2738 else
2739 {
Andre Eisenbach181d0752013-06-11 14:18:21 -07002740 /* Retrieved saved device class and bd_addr */
2741 bdcpy(sec_event.pin_req.bd_addr, bta_dm_cb.pin_bd_addr);
2742 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 -08002743
Andre Eisenbach181d0752013-06-11 14:18:21 -07002744 if (p_result && p_result->status == BTM_SUCCESS)
2745 {
2746 bytes_to_copy = (p_result->length < (BD_NAME_LEN-1))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002747 ? p_result->length : (BD_NAME_LEN-1);
Andre Eisenbach181d0752013-06-11 14:18:21 -07002748 memcpy(sec_event.pin_req.bd_name, p_result->remote_bd_name, bytes_to_copy);
2749 sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0;
2750 }
2751 else /* No name found */
2752 sec_event.pin_req.bd_name[0] = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002753
Andre Eisenbach181d0752013-06-11 14:18:21 -07002754 event = bta_dm_cb.pin_evt;
2755 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 -08002756 }
2757
2758 if( bta_dm_cb.p_sec_cback )
2759 bta_dm_cb.p_sec_cback(event, &sec_event);
2760}
2761
The Android Open Source Project5738f832012-12-12 16:00:35 -08002762/*******************************************************************************
2763**
2764** Function bta_dm_pin_cback
2765**
2766** Description Callback requesting pin_key
2767**
2768** Returns void
2769**
2770*******************************************************************************/
Casper Bonde818d0f22015-05-21 11:08:45 +02002771static UINT8 bta_dm_pin_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name,
2772 BOOLEAN min_16_digit)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002773{
2774 tBTA_DM_SEC sec_event;
2775
2776 if (!bta_dm_cb.p_sec_cback)
2777 return BTM_NOT_AUTHORIZED;
2778
2779 /* If the device name is not known, save bdaddr and devclass and initiate a name request */
2780 if (bd_name[0] == 0)
2781 {
2782 bta_dm_cb.pin_evt = BTA_DM_PIN_REQ_EVT;
2783 bdcpy(bta_dm_cb.pin_bd_addr, bd_addr);
2784 BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, dev_class);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002785 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 -08002786 return BTM_CMD_STARTED;
2787
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002788 APPL_TRACE_WARNING(" bta_dm_pin_cback() -> Failed to start Remote Name Request ");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002789 }
2790
2791 bdcpy(sec_event.pin_req.bd_addr, bd_addr);
2792 BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, dev_class);
2793 BCM_STRNCPY_S((char*)sec_event.pin_req.bd_name, sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1));
2794 sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0;
Casper Bonde818d0f22015-05-21 11:08:45 +02002795 sec_event.pin_req.min_16_digit = min_16_digit;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002796
2797 bta_dm_cb.p_sec_cback(BTA_DM_PIN_REQ_EVT, &sec_event);
2798 return BTM_CMD_STARTED;
2799}
2800
The Android Open Source Project5738f832012-12-12 16:00:35 -08002801/*******************************************************************************
2802**
2803** Function bta_dm_new_link_key_cback
2804**
2805** Description Callback from BTM to notify new link key
2806**
2807** Returns void
2808**
2809*******************************************************************************/
2810static UINT8 bta_dm_new_link_key_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,
2811 BD_NAME bd_name, LINK_KEY key, UINT8 key_type)
2812{
2813 tBTA_DM_SEC sec_event;
2814 tBTA_DM_AUTH_CMPL *p_auth_cmpl;
2815 UINT8 event;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002816 UNUSED(dev_class);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002817
2818 memset (&sec_event, 0, sizeof(tBTA_DM_SEC));
2819
2820 /* Not AMP Key type */
2821 if (key_type != HCI_LKEY_TYPE_AMP_WIFI && key_type != HCI_LKEY_TYPE_AMP_UWB)
2822 {
2823 event = BTA_DM_AUTH_CMPL_EVT;
2824 p_auth_cmpl = &sec_event.auth_cmpl;
2825
2826 bdcpy(p_auth_cmpl->bd_addr, bd_addr);
2827
2828 memcpy(p_auth_cmpl->bd_name, bd_name, (BD_NAME_LEN-1));
2829 p_auth_cmpl->bd_name[BD_NAME_LEN-1] = 0;
2830
2831 p_auth_cmpl->key_present = TRUE;
2832 p_auth_cmpl->key_type = key_type;
2833 p_auth_cmpl->success = TRUE;
2834
2835 memcpy(p_auth_cmpl->key, key, LINK_KEY_LEN);
2836 sec_event.auth_cmpl.fail_reason = HCI_SUCCESS;
2837
Andre Eisenbach91fbc7e2015-05-08 17:42:10 -07002838#if BLE_INCLUDED == TRUE
Chaojing Sune2805532015-04-22 13:40:21 -07002839 // Report the BR link key based on the BR/EDR address and type
2840 BTM_ReadDevInfo(bd_addr, &sec_event.auth_cmpl.dev_type, &sec_event.auth_cmpl.addr_type);
Andre Eisenbach91fbc7e2015-05-08 17:42:10 -07002841#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08002842 if(bta_dm_cb.p_sec_cback)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002843 bta_dm_cb.p_sec_cback(event, &sec_event);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002844 }
2845 else
2846 {
Chaojing Sune2805532015-04-22 13:40:21 -07002847 APPL_TRACE_WARNING("%s() Received AMP Key", __func__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002848 }
2849
2850 return BTM_CMD_STARTED;
2851}
2852
2853
2854/*******************************************************************************
2855**
2856** Function bta_dm_authentication_complete_cback
2857**
2858** Description Authentication complete callback from BTM
2859**
2860** Returns void
2861**
2862*******************************************************************************/
2863static UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,BD_NAME bd_name, int result)
2864{
The Android Open Source Project5738f832012-12-12 16:00:35 -08002865 tBTA_DM_SEC sec_event;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002866 UNUSED(dev_class);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002867
2868 if(result != BTM_SUCCESS)
2869 {
2870 memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
2871 bdcpy(sec_event.auth_cmpl.bd_addr, bd_addr);
2872
2873 memcpy(sec_event.auth_cmpl.bd_name, bd_name, (BD_NAME_LEN-1));
2874 sec_event.auth_cmpl.bd_name[BD_NAME_LEN-1] = 0;
2875
Andre Eisenbach91fbc7e2015-05-08 17:42:10 -07002876#if BLE_INCLUDED == TRUE
Chaojing Sune2805532015-04-22 13:40:21 -07002877 // Report the BR link key based on the BR/EDR address and type
2878 BTM_ReadDevInfo(bd_addr, &sec_event.auth_cmpl.dev_type, &sec_event.auth_cmpl.addr_type);
Andre Eisenbach91fbc7e2015-05-08 17:42:10 -07002879#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08002880 sec_event.auth_cmpl.fail_reason = (UINT8)result;
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07002881
Chaojing Sune2805532015-04-22 13:40:21 -07002882 if(bta_dm_cb.p_sec_cback)
2883 bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
2884
2885 bta_dm_remove_sec_dev_entry(bd_addr);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002886 }
2887
2888 return BTM_SUCCESS;
2889}
2890
2891/*******************************************************************************
2892**
2893** Function bta_dm_sp_cback
2894**
2895** Description simple pairing callback from BTM
2896**
2897** Returns void
2898**
2899*******************************************************************************/
2900static UINT8 bta_dm_sp_cback (tBTM_SP_EVT event, tBTM_SP_EVT_DATA *p_data)
2901{
2902 tBTM_STATUS status = BTM_CMD_STARTED;
2903 tBTA_DM_SEC sec_event;
2904 tBTA_DM_SEC_EVT pin_evt = BTA_DM_SP_KEY_NOTIF_EVT;
2905
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002906 APPL_TRACE_EVENT("bta_dm_sp_cback: %d", event);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002907 if (!bta_dm_cb.p_sec_cback)
2908 return BTM_NOT_AUTHORIZED;
2909
2910 /* TODO_SP */
2911 switch(event)
2912 {
2913 case BTM_SP_IO_REQ_EVT:
2914#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
2915 /* translate auth_req */
2916 bta_dm_co_io_req(p_data->io_req.bd_addr, &p_data->io_req.io_cap,
2917 &p_data->io_req.oob_data, &p_data->io_req.auth_req, p_data->io_req.is_orig);
2918#endif
2919#if BTM_OOB_INCLUDED == FALSE
2920 status = BTM_SUCCESS;
2921#endif
2922
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002923 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 -08002924 break;
2925 case BTM_SP_IO_RSP_EVT:
2926#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
2927 bta_dm_co_io_rsp(p_data->io_rsp.bd_addr, p_data->io_rsp.io_cap,
2928 p_data->io_rsp.oob_data, p_data->io_rsp.auth_req );
2929#endif
2930 break;
2931
2932 case BTM_SP_CFM_REQ_EVT:
2933 pin_evt = BTA_DM_SP_CFM_REQ_EVT;
2934 bta_dm_cb.just_works = sec_event.cfm_req.just_works = p_data->cfm_req.just_works;
2935 sec_event.cfm_req.loc_auth_req = p_data->cfm_req.loc_auth_req;
2936 sec_event.cfm_req.rmt_auth_req = p_data->cfm_req.rmt_auth_req;
2937 sec_event.cfm_req.loc_io_caps = p_data->cfm_req.loc_io_caps;
2938 sec_event.cfm_req.rmt_io_caps = p_data->cfm_req.rmt_io_caps;
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07002939
The Android Open Source Project5738f832012-12-12 16:00:35 -08002940 /* continue to next case */
2941#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
2942 /* Passkey entry mode, mobile device with output capability is very
2943 unlikely to receive key request, so skip this event */
2944 /*case BTM_SP_KEY_REQ_EVT: */
2945 case BTM_SP_KEY_NOTIF_EVT:
2946#endif
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002947 if(BTM_SP_CFM_REQ_EVT == event)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002948 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002949 /* Due to the switch case falling through below to BTM_SP_KEY_NOTIF_EVT,
2950 call remote name request using values from cfm_req */
2951 if(p_data->cfm_req.bd_name[0] == 0)
2952 {
2953 bta_dm_cb.pin_evt = pin_evt;
2954 bdcpy(bta_dm_cb.pin_bd_addr, p_data->cfm_req.bd_addr);
2955 BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->cfm_req.dev_class);
2956 if ((BTM_ReadRemoteDeviceName(p_data->cfm_req.bd_addr, bta_dm_pinname_cback,
2957 BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
2958 return BTM_CMD_STARTED;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002959 APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request ");
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002960 }
2961 else
2962 {
2963 /* Due to the switch case falling through below to BTM_SP_KEY_NOTIF_EVT,
2964 copy these values into key_notif from cfm_req */
2965 bdcpy(sec_event.key_notif.bd_addr, p_data->cfm_req.bd_addr);
2966 BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->cfm_req.dev_class);
2967 BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME),
2968 (char*)p_data->cfm_req.bd_name, (BD_NAME_LEN-1));
2969 sec_event.key_notif.bd_name[BD_NAME_LEN-1] = 0;
2970 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002971 }
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002972
2973 bta_dm_cb.num_val = sec_event.key_notif.passkey = p_data->key_notif.passkey;
2974 if (BTM_SP_KEY_NOTIF_EVT == event)
2975 {
2976 /* If the device name is not known, save bdaddr and devclass
2977 and initiate a name request with values from key_notif */
2978 if(p_data->key_notif.bd_name[0] == 0)
2979 {
2980 bta_dm_cb.pin_evt = pin_evt;
2981 bdcpy(bta_dm_cb.pin_bd_addr, p_data->key_notif.bd_addr);
2982 BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->key_notif.dev_class);
2983 if ((BTM_ReadRemoteDeviceName(p_data->key_notif.bd_addr, bta_dm_pinname_cback,
2984 BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
2985 return BTM_CMD_STARTED;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002986 APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request ");
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002987 }
2988 else
2989 {
2990 bdcpy(sec_event.key_notif.bd_addr, p_data->key_notif.bd_addr);
2991 BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->key_notif.dev_class);
2992 BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME),
2993 (char*)p_data->key_notif.bd_name, (BD_NAME_LEN-1));
2994 sec_event.key_notif.bd_name[BD_NAME_LEN-1] = 0;
2995 }
2996 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002997
2998 bta_dm_cb.p_sec_cback(pin_evt, &sec_event);
2999
3000 break;
3001
3002#if BTM_OOB_INCLUDED == TRUE
3003 case BTM_SP_LOC_OOB_EVT:
3004 bta_dm_co_loc_oob((BOOLEAN)(p_data->loc_oob.status == BTM_SUCCESS),
3005 p_data->loc_oob.c, p_data->loc_oob.r);
3006 break;
3007
3008 case BTM_SP_RMT_OOB_EVT:
3009 /* If the device name is not known, save bdaddr and devclass and initiate a name request */
3010 if (p_data->rmt_oob.bd_name[0] == 0)
3011 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003012 bta_dm_cb.pin_evt = BTA_DM_SP_RMT_OOB_EVT;
3013 bdcpy(bta_dm_cb.pin_bd_addr, p_data->rmt_oob.bd_addr);
3014 BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->rmt_oob.dev_class);
3015 if ((BTM_ReadRemoteDeviceName(p_data->rmt_oob.bd_addr, bta_dm_pinname_cback,
3016 BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
3017 return BTM_CMD_STARTED;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003018 APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request ");
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003019 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003020
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003021 bdcpy(sec_event.rmt_oob.bd_addr, p_data->rmt_oob.bd_addr);
3022 BTA_COPY_DEVICE_CLASS(sec_event.rmt_oob.dev_class, p_data->rmt_oob.dev_class);
3023 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 -08003024 sec_event.rmt_oob.bd_name[BD_NAME_LEN-1] = 0;
3025
3026 bta_dm_cb.p_sec_cback(BTA_DM_SP_RMT_OOB_EVT, &sec_event);
3027
3028 bta_dm_co_rmt_oob(p_data->rmt_oob.bd_addr);
3029 break;
3030#endif
3031 case BTM_SP_COMPLT_EVT:
3032 /* do not report this event - handled by link_key_callback or auth_complete_callback */
3033 break;
3034
3035 case BTM_SP_KEYPRESS_EVT:
3036 memcpy(&sec_event.key_press, &p_data->key_press, sizeof(tBTM_SP_KEYPRESS));
3037 bta_dm_cb.p_sec_cback(BTA_DM_SP_KEYPRESS_EVT, &sec_event);
3038 break;
3039
3040 case BTM_SP_UPGRADE_EVT:
3041 bta_dm_co_lk_upgrade(p_data->upgrade.bd_addr, &p_data->upgrade.upgrade );
3042 break;
3043
3044 default:
3045 status = BTM_NOT_AUTHORIZED;
3046 break;
3047 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003048 APPL_TRACE_EVENT("dm status: %d", status);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003049 return status;
3050}
3051
3052/*******************************************************************************
3053**
3054** Function bta_dm_local_name_cback
3055**
3056** Description Callback from btm after local name is read
3057**
3058**
3059** Returns void
3060**
3061*******************************************************************************/
3062static void bta_dm_local_name_cback(UINT8 *p_name)
3063{
3064 tBTA_DM_SEC sec_event;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08003065 UNUSED(p_name);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003066
The Android Open Source Project5738f832012-12-12 16:00:35 -08003067 sec_event.enable.status = BTA_SUCCESS;
3068
3069 if(bta_dm_cb.p_sec_cback)
3070 bta_dm_cb.p_sec_cback(BTA_DM_ENABLE_EVT, &sec_event);
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -07003071
The Android Open Source Project5738f832012-12-12 16:00:35 -08003072}
3073
3074/*******************************************************************************
3075**
The Android Open Source Project5738f832012-12-12 16:00:35 -08003076** Function bta_dm_bl_change_cback
3077**
3078** Description Callback from btm when acl connection goes up or down
3079**
3080**
3081** Returns void
3082**
3083*******************************************************************************/
3084static void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data)
3085{
The Android Open Source Project5738f832012-12-12 16:00:35 -08003086 tBTA_DM_ACL_CHANGE * p_msg;
3087
3088 if ((p_msg = (tBTA_DM_ACL_CHANGE *) GKI_getbuf(sizeof(tBTA_DM_ACL_CHANGE))) != NULL)
3089 {
3090 p_msg->event = p_data->event;
3091 p_msg->is_new = FALSE;
3092
3093 switch(p_msg->event)
3094 {
3095 case BTM_BL_CONN_EVT:
3096 p_msg->is_new = TRUE;
3097 bdcpy(p_msg->bd_addr, p_data->conn.p_bda);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003098#if BLE_INCLUDED == TRUE
3099 p_msg->transport = p_data->conn.transport;
3100 p_msg->handle = p_data->conn.handle;
3101#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08003102 break;
3103 case BTM_BL_DISCN_EVT:
3104 bdcpy(p_msg->bd_addr, p_data->discn.p_bda);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003105#if BLE_INCLUDED == TRUE
3106 p_msg->transport = p_data->discn.transport;
3107 p_msg->handle = p_data->discn.handle;
3108#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08003109 break;
3110 case BTM_BL_UPDATE_EVT:
3111 p_msg->busy_level = p_data->update.busy_level;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003112 p_msg->busy_level_flags = p_data->update.busy_level_flags;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003113 break;
3114 case BTM_BL_ROLE_CHG_EVT:
3115 p_msg->new_role = p_data->role_chg.new_role;
3116 p_msg->hci_status = p_data->role_chg.hci_status;
3117 bdcpy(p_msg->bd_addr, p_data->role_chg.p_bda);
3118 break;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003119 case BTM_BL_COLLISION_EVT:
3120 bdcpy(p_msg->bd_addr, p_data->conn.p_bda);
3121 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003122 }
3123
3124 p_msg->hdr.event = BTA_DM_ACL_CHANGE_EVT;
3125 bta_sys_sendmsg(p_msg);
3126
3127 }
3128
3129}
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003130
3131/*******************************************************************************
3132**
3133** Function bta_dm_acl_change_cback
3134**
3135** Description Callback from btm when acl connection goes up or down
3136**
3137**
3138** Returns void
3139**
3140*******************************************************************************/
3141#if BLE_INCLUDED == TRUE
3142static void bta_dm_acl_change_cback(BD_ADDR p_bda, DEV_CLASS p_dc, BD_NAME p_bdn,
3143 UINT8 *features, BOOLEAN is_new,UINT16 handle,
3144 tBT_TRANSPORT transport)
3145#else
3146static void bta_dm_acl_change_cback(BD_ADDR p_bda, DEV_CLASS p_dc, BD_NAME p_bdn,
3147 UINT8 *features, BOOLEAN is_new)
3148#endif
3149{
3150 tBTA_DM_ACL_CHANGE *p_msg = (tBTA_DM_ACL_CHANGE *) GKI_getbuf(sizeof(tBTA_DM_ACL_CHANGE));
3151 if (p_msg != NULL)
3152 {
3153 memset(p_msg, 0, sizeof(tBTA_DM_ACL_CHANGE));
3154
3155 bdcpy(p_msg->bd_addr, p_bda);
3156 p_msg->is_new = is_new;
3157#if BLE_INCLUDED == TRUE
3158 p_msg->handle = handle;
3159 p_msg->transport = transport;
3160#endif
3161 /* This is collision case */
3162 if (features != NULL)
3163 {
3164 if ((features[0] == 0xFF) && !is_new)
3165 p_msg->event = BTM_BL_COLLISION_EVT;
3166 }
3167
3168 p_msg->hdr.event = BTA_DM_ACL_CHANGE_EVT;
3169 bta_sys_sendmsg(p_msg);
3170 }
3171}
3172
3173
The Android Open Source Project5738f832012-12-12 16:00:35 -08003174/*******************************************************************************
3175**
3176** Function bta_dm_rs_cback
3177**
3178** Description Receives the role switch complete event
3179**
3180** Returns
3181**
3182*******************************************************************************/
3183static void bta_dm_rs_cback (tBTM_ROLE_SWITCH_CMPL *p1)
3184{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08003185 UNUSED(p1);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003186 APPL_TRACE_WARNING("bta_dm_rs_cback:%d", bta_dm_cb.rs_event);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003187 if(bta_dm_cb.rs_event == BTA_DM_API_SEARCH_EVT)
3188 {
3189 bta_dm_cb.search_msg.rs_res = BTA_DM_RS_OK; /* do not care about the result for now */
3190 bta_dm_cb.rs_event = 0;
3191 bta_dm_search_start((tBTA_DM_MSG *)&bta_dm_cb.search_msg);
3192 }
3193}
3194
3195/*******************************************************************************
3196**
3197** Function bta_dm_check_av
3198**
3199** Description This function checks if AV is active
3200** if yes, make sure the AV link is master
3201**
3202** Returns BOOLEAN - TRUE, if switch is in progress
3203**
3204*******************************************************************************/
3205static BOOLEAN bta_dm_check_av(UINT16 event)
3206{
Mattias Agren9647e912013-04-08 12:23:42 +02003207 BOOLEAN avoid_roleswitch = FALSE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003208 BOOLEAN switching = FALSE;
3209 UINT8 i;
3210 tBTA_DM_PEER_DEVICE *p_dev;
3211
Mattias Agren9647e912013-04-08 12:23:42 +02003212#if defined(BTA_DM_AVOID_A2DP_ROLESWITCH_ON_INQUIRY) && (BTA_DM_AVOID_A2DP_ROLESWITCH_ON_INQUIRY == TRUE)
3213
3214 /* avoid role switch upon inquiry if a2dp is actively streaming as it
3215 introduces an audioglitch due to FW scheduling delays (unavoidable) */
3216 if (event == BTA_DM_API_SEARCH_EVT)
3217 {
3218 avoid_roleswitch = TRUE;
3219 }
3220#endif
3221
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003222 APPL_TRACE_WARNING("bta_dm_check_av:%d", bta_dm_cb.cur_av_count);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003223 if(bta_dm_cb.cur_av_count)
3224 {
3225 for(i=0; i<bta_dm_cb.device_list.count; i++)
3226 {
3227 p_dev = &bta_dm_cb.device_list.peer_device[i];
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003228 APPL_TRACE_WARNING("[%d]: state:%d, info:x%x, avoid_rs %d",
Mattias Agren9647e912013-04-08 12:23:42 +02003229 i, p_dev->conn_state, p_dev->info, avoid_roleswitch);
3230 if((p_dev->conn_state == BTA_DM_CONNECTED) && (p_dev->info & BTA_DM_DI_AV_ACTIVE) &&
3231 (avoid_roleswitch == FALSE))
The Android Open Source Project5738f832012-12-12 16:00:35 -08003232 {
3233 /* make master and take away the role switch policy */
3234 if(BTM_CMD_STARTED == BTM_SwitchRole (p_dev->peer_bdaddr, HCI_ROLE_MASTER, (tBTM_CMPL_CB *)bta_dm_rs_cback))
3235 {
3236 /* the role switch command is actually sent */
3237 bta_dm_cb.rs_event = event;
3238 switching = TRUE;
3239 }
3240 /* else either already master or can not switch for some reasons */
3241 bta_dm_policy_cback(BTA_SYS_PLCY_CLR, 0, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_dev->peer_bdaddr);
3242 break;
3243 }
3244 }
3245 }
3246 return switching;
3247}
3248
3249/*******************************************************************************
3250**
3251** Function bta_dm_acl_change
3252**
3253** Description Process BTA_DM_ACL_CHANGE_EVT
3254**
3255**
3256** Returns void
3257**
3258*******************************************************************************/
3259void bta_dm_acl_change(tBTA_DM_MSG *p_data)
3260{
3261
3262 UINT8 i;
3263 UINT8 *p;
3264 tBTA_DM_SEC conn;
3265 BOOLEAN is_new = p_data->acl_change.is_new;
3266 BD_ADDR_PTR p_bda = p_data->acl_change.bd_addr;
3267 BOOLEAN need_policy_change = FALSE;
3268 BOOLEAN issue_unpair_cb = FALSE;
3269
The Android Open Source Project5738f832012-12-12 16:00:35 -08003270 tBTA_DM_PEER_DEVICE *p_dev;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003271 memset(&conn, 0, sizeof(tBTA_DM_SEC));
The Android Open Source Project5738f832012-12-12 16:00:35 -08003272
3273 switch(p_data->acl_change.event)
3274 {
3275 case BTM_BL_UPDATE_EVT: /* busy level update */
3276 if( bta_dm_cb.p_sec_cback )
3277 {
3278 conn.busy_level.level = p_data->acl_change.busy_level;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003279 conn.busy_level.level_flags = p_data->acl_change.busy_level_flags;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003280 bta_dm_cb.p_sec_cback(BTA_DM_BUSY_LEVEL_EVT, &conn);
3281 }
3282 return;
3283
3284 case BTM_BL_ROLE_CHG_EVT: /* role change event */
3285 p_dev = bta_dm_find_peer_device(p_bda);
3286 if(p_dev)
3287 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003288 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 -08003289 p_dev->info, p_data->acl_change.new_role, bta_dm_cb.device_list.count);
3290 if(p_dev->info & BTA_DM_DI_AV_ACTIVE)
3291 {
3292 /* there's AV activity on this link */
3293 if(p_data->acl_change.new_role == HCI_ROLE_SLAVE && bta_dm_cb.device_list.count > 1
3294 && p_data->acl_change.hci_status == HCI_SUCCESS)
3295 {
3296 /* more than one connections and the AV connection is role switched to slave
3297 * switch it back to master and remove the switch policy */
3298 BTM_SwitchRole(p_bda, BTM_ROLE_MASTER, NULL);
3299 need_policy_change = TRUE;
3300 }
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003301 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 -08003302 {
3303 /* if the link updated to be master include AV activities, remove the switch policy */
3304 need_policy_change = TRUE;
3305 }
3306
3307 if(need_policy_change)
3308 {
3309 bta_dm_policy_cback(BTA_SYS_PLCY_CLR, 0, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_dev->peer_bdaddr);
3310 }
3311 }
3312 else
3313 {
3314 /* there's AV no activity on this link and role switch happened
3315 * check if AV is active
3316 * if so, make sure the AV link is master */
3317 bta_dm_check_av(0);
3318 }
3319 bta_sys_notify_role_chg(p_data->acl_change.bd_addr, p_data->acl_change.new_role, p_data->acl_change.hci_status);
3320 bdcpy(conn.role_chg.bd_addr, p_bda);
3321 conn.role_chg.new_role = (UINT8) p_data->acl_change.new_role;
3322 if( bta_dm_cb.p_sec_cback )
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003323 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 -08003324 }
3325 return;
3326 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003327
3328 /* Collision report from Stack: Notify profiles */
3329 if (p_data->acl_change.event == BTM_BL_COLLISION_EVT)
3330 {
3331 bta_sys_notify_collision (p_bda);
3332 return;
3333 }
3334
3335 if(is_new)
3336 {
3337 for(i=0; i<bta_dm_cb.device_list.count; i++)
3338 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003339 if (!bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda)
3340#if BLE_INCLUDED == TRUE
3341 && bta_dm_cb.device_list.peer_device[i].conn_handle == p_data->acl_change.handle
3342#endif
3343 )
The Android Open Source Project5738f832012-12-12 16:00:35 -08003344 break;
3345
3346 }
3347
3348 if(i == bta_dm_cb.device_list.count)
3349 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003350 if (bta_dm_cb.device_list.count < BTA_DM_NUM_PEER_DEVICE)
3351 {
3352 bdcpy(bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].peer_bdaddr, p_bda);
3353 bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].link_policy = bta_dm_cb.cur_policy;
3354 bta_dm_cb.device_list.count++;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003355#if BLE_INCLUDED == TRUE
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003356 bta_dm_cb.device_list.peer_device[i].conn_handle = p_data->acl_change.handle;
3357 if (p_data->acl_change.transport == BT_TRANSPORT_LE)
3358 bta_dm_cb.device_list.le_count++;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003359#endif
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003360 } else {
3361 APPL_TRACE_ERROR("%s max active connection reached, no resources", __func__);
3362 return;
3363 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003364 }
3365
3366 bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_CONNECTED;
3367 bta_dm_cb.device_list.peer_device[i].pref_role = BTA_ANY_ROLE;
3368 bdcpy(conn.link_up.bd_addr, p_bda);
3369 bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_NONE;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003370#if BLE_INCLUDED == TRUE
3371 conn.link_up.link_type = p_data->acl_change.transport;
3372 bta_dm_cb.device_list.peer_device[i].transport = p_data->acl_change.transport;
3373#endif
3374
3375 if (((NULL != (p = BTM_ReadLocalFeatures ())) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) &&
3376 ((NULL != (p = BTM_ReadRemoteFeatures (p_bda))) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)))
The Android Open Source Project5738f832012-12-12 16:00:35 -08003377 {
3378 /* both local and remote devices support SSR */
3379 bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_USE_SSR;
3380 }
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003381 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 -08003382
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003383 if (bta_dm_cb.p_sec_cback)
3384 bta_dm_cb.p_sec_cback(BTA_DM_LINK_UP_EVT, (tBTA_DM_SEC *)&conn);
3385 } else {
The Android Open Source Project5738f832012-12-12 16:00:35 -08003386 for(i=0; i<bta_dm_cb.device_list.count; i++)
3387 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003388 if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda)
3389#if BLE_INCLUDED == TRUE
3390 ||bta_dm_cb.device_list.peer_device[i].transport != p_data->acl_change.transport
3391#endif
3392 )
The Android Open Source Project5738f832012-12-12 16:00:35 -08003393 continue;
3394
3395 if( bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_UNPAIRING )
3396 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003397 if (BTM_SecDeleteDevice(bta_dm_cb.device_list.peer_device[i].peer_bdaddr))
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003398 issue_unpair_cb = TRUE;
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003399
3400 APPL_TRACE_DEBUG("%s: Unpairing: issue unpair CB = %d ",__FUNCTION__, issue_unpair_cb);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003401 }
3402
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003403 conn.link_down.is_removed = bta_dm_cb.device_list.peer_device[i].remove_dev_pending;
3404
The Android Open Source Project5738f832012-12-12 16:00:35 -08003405 for(; i<bta_dm_cb.device_list.count ; i++)
3406 {
3407 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]));
3408 }
3409 break;
3410 }
3411 if(bta_dm_cb.device_list.count)
3412 bta_dm_cb.device_list.count--;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003413#if BLE_INCLUDED == TRUE
3414 if ((p_data->acl_change.transport == BT_TRANSPORT_LE) &&
3415 (bta_dm_cb.device_list.le_count))
3416 bta_dm_cb.device_list.le_count--;
3417 conn.link_down.link_type = p_data->acl_change.transport;
3418#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08003419
3420 if(bta_dm_search_cb.wait_disc && !bdcmp(bta_dm_search_cb.peer_bdaddr, p_bda))
3421 {
3422 bta_dm_search_cb.wait_disc = FALSE;
3423
3424 if(bta_dm_search_cb.sdp_results)
3425 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003426 APPL_TRACE_EVENT(" timer stopped ");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003427 bta_sys_stop_timer(&bta_dm_search_cb.search_timer);
3428 bta_dm_discover_next_device();
3429 }
3430
3431 }
3432
3433 if(bta_dm_cb.disabling)
3434 {
3435 if(!BTM_GetNumAclLinks())
3436 {
3437 bta_sys_stop_timer(&bta_dm_cb.disable_timer);
3438 bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_conn_down_timer_cback;
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003439 /*
3440 * Start a timer to make sure that the profiles
3441 * get the disconnect event.
3442 */
The Android Open Source Project5738f832012-12-12 16:00:35 -08003443 bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 1000);
3444 }
3445 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003446 if (conn.link_down.is_removed)
3447 {
3448 BTM_SecDeleteDevice(p_bda);
3449#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
3450 /* need to remove all pending background connection */
3451 BTA_GATTC_CancelOpen(0, p_bda, FALSE);
3452 /* remove all cached GATT information */
3453 BTA_GATTC_Refresh(p_bda);
3454#endif
3455 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003456
3457 bdcpy(conn.link_down.bd_addr, p_bda);
3458 conn.link_down.status = (UINT8) btm_get_acl_disc_reason_code();
3459 if( bta_dm_cb.p_sec_cback )
3460 {
3461 bta_dm_cb.p_sec_cback(BTA_DM_LINK_DOWN_EVT, &conn);
3462 if( issue_unpair_cb )
3463 bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &conn);
3464 }
3465 }
3466
3467 bta_dm_adjust_roles(TRUE);
3468}
3469
3470/*******************************************************************************
3471**
3472** Function bta_dm_disable_conn_down_timer_cback
3473**
3474** Description Sends disable event to application
3475**
3476**
3477** Returns void
3478**
3479*******************************************************************************/
3480static void bta_dm_disable_conn_down_timer_cback (TIMER_LIST_ENT *p_tle)
3481{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08003482 UNUSED(p_tle);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003483 tBTA_SYS_HW_MSG *sys_enable_event;
3484
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003485 /* disable the power managment module */
3486 bta_dm_disable_pm();
3487
The Android Open Source Project5738f832012-12-12 16:00:35 -08003488 /* register our callback to SYS HW manager */
3489 bta_sys_hw_register( BTA_SYS_HW_BLUETOOTH, bta_dm_sys_hw_cback );
3490
3491 /* send a message to BTA SYS */
3492 if ((sys_enable_event = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL)
3493 {
3494 sys_enable_event->hdr.event = BTA_SYS_API_DISABLE_EVT;
3495 sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH;
3496 bta_sys_sendmsg(sys_enable_event);
3497 }
3498
3499 bta_dm_cb.disabling = FALSE;
3500
3501}
3502
3503/*******************************************************************************
3504**
The Android Open Source Project5738f832012-12-12 16:00:35 -08003505** Function bta_dm_rm_cback
3506**
3507** Description Role management callback from sys
3508**
3509**
3510** Returns void
3511**
3512*******************************************************************************/
3513static void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
3514{
3515
3516 UINT8 j;
3517 tBTA_PREF_ROLES role;
3518 tBTA_DM_PEER_DEVICE *p_dev;
3519
3520 p_dev = bta_dm_find_peer_device(peer_addr);
3521 if( status == BTA_SYS_CONN_OPEN)
3522 {
3523 if(p_dev)
3524 {
3525 /* Do not set to connected if we are in the middle of unpairing. When AV stream is
3526 * started it fakes out a SYS_CONN_OPEN to potentially trigger a role switch command.
3527 * But this should not be done if we are in the middle of unpairing.
3528 */
3529 if (p_dev->conn_state != BTA_DM_UNPAIRING)
3530 p_dev->conn_state = BTA_DM_CONNECTED;
3531
3532 for(j=1; j<= p_bta_dm_rm_cfg[0].app_id; j++)
3533 {
3534 if(((p_bta_dm_rm_cfg[j].app_id == app_id) || (p_bta_dm_rm_cfg[j].app_id == BTA_ALL_APP_ID))
3535 && (p_bta_dm_rm_cfg[j].id == id))
3536 {
3537 role = p_bta_dm_rm_cfg[j].cfg;
3538
3539 if(role > p_dev->pref_role )
3540 p_dev->pref_role = role;
3541 break;
3542 }
3543 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003544 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003545 }
3546
3547 if((BTA_ID_AV == id)||(BTA_ID_AVK ==id))
3548 {
3549 if( status == BTA_SYS_CONN_BUSY)
3550 {
3551 if(p_dev)
3552 p_dev->info |= BTA_DM_DI_AV_ACTIVE;
3553 /* AV calls bta_sys_conn_open with the A2DP stream count as app_id */
3554 if(BTA_ID_AV == id)
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003555 bta_dm_cb.cur_av_count = bta_dm_get_av_count();
The Android Open Source Project5738f832012-12-12 16:00:35 -08003556 }
3557 else if( status == BTA_SYS_CONN_IDLE)
3558 {
3559 if(p_dev)
3560 p_dev->info &= ~BTA_DM_DI_AV_ACTIVE;
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003561
3562 /* get cur_av_count from connected services */
The Android Open Source Project5738f832012-12-12 16:00:35 -08003563 if(BTA_ID_AV == id)
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07003564 bta_dm_cb.cur_av_count = bta_dm_get_av_count();
The Android Open Source Project5738f832012-12-12 16:00:35 -08003565 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003566 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 -08003567 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003568
3569 bta_dm_adjust_roles(FALSE);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003570}
3571
3572/*******************************************************************************
3573**
3574** Function bta_dm_delay_role_switch_cback
3575**
3576** Description Callback from btm to delay a role switch
3577**
3578** Returns void
3579**
3580*******************************************************************************/
3581static void bta_dm_delay_role_switch_cback(TIMER_LIST_ENT *p_tle)
3582{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08003583 UNUSED(p_tle);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003584 APPL_TRACE_EVENT("bta_dm_delay_role_switch_cback: initiating Delayed RS");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003585 bta_dm_adjust_roles (FALSE);
3586}
3587
3588/*******************************************************************************
3589**
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003590** Function bta_dm_remove_sec_dev_entry
3591**
3592** Description Removes device entry from Security device DB if ACL connection with
3593** remtoe device does not exist, else schedule for dev entry removal upon
3594 ACL close
3595**
3596** Returns void
3597**
3598*******************************************************************************/
3599static void bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr)
3600{
3601 UINT16 index = 0;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003602 if ( BTM_IsAclConnectionUp(remote_bd_addr, BT_TRANSPORT_LE) ||
3603 BTM_IsAclConnectionUp(remote_bd_addr, BT_TRANSPORT_BR_EDR))
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003604 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003605 APPL_TRACE_DEBUG("%s ACL is not down. Schedule for Dev Removal when ACL closes",
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003606 __FUNCTION__);
3607 for (index = 0; index < bta_dm_cb.device_list.count; index ++)
3608 {
3609 if (!bdcmp( bta_dm_cb.device_list.peer_device[index].peer_bdaddr, remote_bd_addr))
3610 break;
3611 }
3612 if (index != bta_dm_cb.device_list.count)
3613 {
3614 bta_dm_cb.device_list.peer_device[index].remove_dev_pending = TRUE;
3615 }
3616 else
3617 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003618 APPL_TRACE_ERROR(" %s Device does not exist in DB", __FUNCTION__);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003619 }
3620 }
3621 else
3622 {
3623 BTM_SecDeleteDevice (remote_bd_addr);
Zhihai Xubd68d682013-11-15 17:55:46 -08003624#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
3625 /* need to remove all pending background connection */
3626 BTA_GATTC_CancelOpen(0, remote_bd_addr, FALSE);
3627 /* remove all cached GATT information */
3628 BTA_GATTC_Refresh(remote_bd_addr);
3629#endif
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003630 }
3631}
3632
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07003633
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003634/*******************************************************************************
3635**
The Android Open Source Project5738f832012-12-12 16:00:35 -08003636** Function bta_dm_adjust_roles
3637**
3638** Description Adjust roles
3639**
3640**
3641** Returns void
3642**
3643*******************************************************************************/
3644static void bta_dm_adjust_roles(BOOLEAN delay_role_switch)
3645{
3646
3647 UINT8 i;
3648 BOOLEAN set_master_role = FALSE;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003649#if BLE_INCLUDED == TRUE
3650 UINT8 br_count = bta_dm_cb.device_list.count - bta_dm_cb.device_list.le_count;
3651#else
3652 UINT8 br_count = bta_dm_cb.device_list.count;
3653#endif
3654 if (br_count)
The Android Open Source Project5738f832012-12-12 16:00:35 -08003655 {
3656
3657 /* the configuration is no scatternet
3658 * or AV connection exists and there are more than one ACL link */
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003659 if ( (p_bta_dm_rm_cfg[0].cfg == BTA_DM_NO_SCATTERNET) ||
3660 (bta_dm_cb.cur_av_count && br_count > 1) )
The Android Open Source Project5738f832012-12-12 16:00:35 -08003661 {
3662
3663 L2CA_SetDesireRole (HCI_ROLE_MASTER);
3664 set_master_role = TRUE;
3665
3666 }
3667
3668 for(i=0; i<bta_dm_cb.device_list.count; i++)
3669 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003670 if (bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED
3671#if BLE_INCLUDED == TRUE
3672 && bta_dm_cb.device_list.peer_device[i].transport == BT_TRANSPORT_BR_EDR
3673#endif
3674 )
The Android Open Source Project5738f832012-12-12 16:00:35 -08003675 {
3676 if(!set_master_role && (bta_dm_cb.device_list.peer_device[i].pref_role != BTA_ANY_ROLE)
3677 && (p_bta_dm_rm_cfg[0].cfg == BTA_DM_PARTIAL_SCATTERNET))
3678 {
3679 L2CA_SetDesireRole (HCI_ROLE_MASTER);
3680 set_master_role = TRUE;
3681 }
3682
3683 if((bta_dm_cb.device_list.peer_device[i].pref_role == BTA_MASTER_ROLE_ONLY)
Nitin Shivpure66df3202015-08-12 18:15:11 +05303684 || (br_count > 1))
The Android Open Source Project5738f832012-12-12 16:00:35 -08003685 {
3686
3687 /* Initiating immediate role switch with certain remote devices
3688 has caused issues due to role switch colliding with link encryption setup and
3689 causing encryption (and in turn the link) to fail . These device . Firmware
3690 versions are stored in a blacklist and role switch with these devices are
3691 delayed to avoid the collision with link encryption setup */
3692
tturneye31d4172015-09-21 10:49:09 -07003693 if (bta_dm_cb.device_list.peer_device[i].pref_role != BTA_SLAVE_ROLE_ONLY &&
3694 delay_role_switch == FALSE)
The Android Open Source Project5738f832012-12-12 16:00:35 -08003695 {
3696 BTM_SwitchRole (bta_dm_cb.device_list.peer_device[i].peer_bdaddr,
3697 HCI_ROLE_MASTER, NULL);
3698 }
3699 else
3700 {
3701 bta_dm_cb.switch_delay_timer.p_cback =
3702 (TIMER_CBACK*)&bta_dm_delay_role_switch_cback;
3703 bta_sys_start_timer(&bta_dm_cb.switch_delay_timer, 0, 500);
3704 }
3705 }
3706
3707 }
3708 }
3709
3710
3711 if(!set_master_role)
3712 {
3713
3714 L2CA_SetDesireRole (L2CAP_DESIRED_LINK_ROLE);
3715
3716 }
3717
3718 }
3719 else
3720 {
3721 L2CA_SetDesireRole (L2CAP_DESIRED_LINK_ROLE);
3722 }
3723
3724
3725}
3726
3727/*******************************************************************************
3728**
3729** Function bta_dm_get_remname
3730**
3731** Description Returns a pointer to the remote name stored in the DM control
3732** block if it exists, or from the BTM memory.
3733**
3734** Returns char * - Pointer to the remote device name
3735*******************************************************************************/
3736static char *bta_dm_get_remname(void)
3737{
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003738 char *p_name = (char *)bta_dm_search_cb.peer_name;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003739 char *p_temp;
3740
3741 /* If the name isn't already stored, try retrieving from BTM */
3742 if (*p_name == '\0')
3743 if ((p_temp = BTM_SecReadDevName(bta_dm_search_cb.peer_bdaddr)) != NULL)
3744 p_name = p_temp;
3745
3746 return p_name;
3747}
3748
3749/*******************************************************************************
3750**
3751** Function bta_dm_bond_cancel_complete_cback
3752**
3753** Description Authentication complete callback from BTM
3754**
3755** Returns void
3756**
3757*******************************************************************************/
3758static void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result)
3759{
3760
3761 tBTA_DM_SEC sec_event;
3762
3763 if (result == BTM_SUCCESS)
3764 sec_event.bond_cancel_cmpl.result = BTA_SUCCESS;
3765 else
3766 sec_event.bond_cancel_cmpl.result = BTA_FAILURE;
3767
3768 if(bta_dm_cb.p_sec_cback)
3769 {
3770 bta_dm_cb.p_sec_cback(BTA_DM_BOND_CANCEL_CMPL_EVT, &sec_event);
3771 }
3772}
3773
The Android Open Source Project5738f832012-12-12 16:00:35 -08003774/*******************************************************************************
3775**
3776** Function bta_dm_set_eir
3777**
3778** Description This function creates EIR tagged data and writes it to controller.
3779**
3780** Returns None
3781**
3782*******************************************************************************/
3783static void bta_dm_set_eir (char *local_name)
3784{
3785 BT_HDR *p_buf;
3786 UINT8 *p;
3787 UINT8 *p_length;
3788#if (BTA_EIR_CANNED_UUID_LIST != TRUE)
3789 UINT8 *p_type;
3790 UINT8 max_num_uuid;
3791#if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
3792 UINT8 custom_uuid_idx;
Chris Manton1e61ce12014-10-24 09:12:41 -07003793#endif // BTA_EIR_SERVER_NUM_CUSTOM_UUID
3794#endif // BTA_EIR_CANNED_UUID_LIST
The Android Open Source Project5738f832012-12-12 16:00:35 -08003795#if (BTM_EIR_DEFAULT_FEC_REQUIRED == FALSE)
3796 UINT8 free_eir_length = HCI_EXT_INQ_RESPONSE_LEN;
Chris Manton1e61ce12014-10-24 09:12:41 -07003797#else // BTM_EIR_DEFAULT_FEC_REQUIRED
The Android Open Source Project5738f832012-12-12 16:00:35 -08003798 UINT8 free_eir_length = HCI_DM5_PACKET_SIZE;
Casper Bonde818d0f22015-05-21 11:08:45 +02003799#endif // BTM_EIR_DEFAULT_FEC_REQUIRED
The Android Open Source Project5738f832012-12-12 16:00:35 -08003800 UINT8 num_uuid;
3801 UINT8 data_type;
3802 UINT8 local_name_len;
3803
3804 /* wait until complete to disable */
3805 if (bta_dm_cb.disable_timer.in_use)
3806 return;
3807
3808#if ( BTA_EIR_CANNED_UUID_LIST != TRUE )
3809 /* wait until App is ready */
3810 if (bta_dm_cb.app_ready_timer.in_use)
3811 return;
3812
3813 /* if local name is not provided, get it from controller */
3814 if( local_name == NULL )
3815 {
3816 if( BTM_ReadLocalDeviceName( &local_name ) != BTM_SUCCESS )
3817 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003818 APPL_TRACE_ERROR("Fail to read local device name for EIR");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003819 }
3820 }
Chris Manton1e61ce12014-10-24 09:12:41 -07003821#endif // BTA_EIR_CANNED_UUID_LIST
The Android Open Source Project5738f832012-12-12 16:00:35 -08003822
3823 /* Allocate a buffer to hold HCI command */
3824 if ((p_buf = (BT_HDR *)GKI_getpoolbuf(BTM_CMD_POOL_ID)) == NULL)
3825 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003826 APPL_TRACE_ERROR("bta_dm_set_eir couldn't allocate buffer");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003827 return;
3828 }
3829 p = (UINT8 *)p_buf + BTM_HCI_EIR_OFFSET;
3830
3831 memset(p, 0x00, HCI_EXT_INQ_RESPONSE_LEN );
3832
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003833 APPL_TRACE_DEBUG("BTA is generating EIR");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003834
3835 if( local_name )
3836 local_name_len = strlen( local_name );
3837 else
3838 local_name_len = 0;
3839
3840 data_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE;
3841 /* if local name is longer than minimum length of shortened name */
3842 /* check whether it needs to be shortened or not */
3843 if( local_name_len > p_bta_dm_eir_cfg->bta_dm_eir_min_name_len )
3844 {
3845 /* get number of UUID 16-bit list */
3846#if (BTA_EIR_CANNED_UUID_LIST == TRUE)
3847 num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len/LEN_UUID_16;
Chris Manton1e61ce12014-10-24 09:12:41 -07003848#else // BTA_EIR_CANNED_UUID_LIST
The Android Open Source Project5738f832012-12-12 16:00:35 -08003849 max_num_uuid = (free_eir_length - 2)/LEN_UUID_16;
3850 data_type = BTM_GetEirSupportedServices( bta_dm_cb.eir_uuid, &p,
3851 max_num_uuid, &num_uuid );
3852 p = (UINT8 *)p_buf + BTM_HCI_EIR_OFFSET; /* reset p */
Chris Manton1e61ce12014-10-24 09:12:41 -07003853#endif // BTA_EIR_CANNED_UUID_LIST
The Android Open Source Project5738f832012-12-12 16:00:35 -08003854
3855 /* if UUID doesn't fit remaing space, shorten local name */
3856 if ( local_name_len > (free_eir_length - 4 - num_uuid*LEN_UUID_16))
3857 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003858 APPL_TRACE_WARNING("BTA EIR: local name is shortened");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003859 local_name_len = p_bta_dm_eir_cfg->bta_dm_eir_min_name_len;
3860 data_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE;
3861 }
3862 else
3863 data_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE;
3864 }
3865
3866 UINT8_TO_STREAM(p, local_name_len + 1);
3867 UINT8_TO_STREAM(p, data_type);
Andre Eisenbach3aa60542013-03-22 18:00:51 -07003868
3869 if (local_name != NULL)
3870 {
3871 memcpy(p, local_name, local_name_len);
3872 p += local_name_len;
3873 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003874 free_eir_length -= local_name_len + 2;
3875
3876#if (BTA_EIR_CANNED_UUID_LIST == TRUE)
3877 /* if UUID list is provided as static data in configuration */
3878 if(( p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len > 0 )
3879 &&(p_bta_dm_eir_cfg->bta_dm_eir_uuid16))
3880 {
3881 if( free_eir_length > LEN_UUID_16 + 2)
3882 {
3883 free_eir_length -= 2;
3884
3885 if( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len)
3886 {
3887 num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len / LEN_UUID_16;
3888 data_type = BTM_EIR_COMPLETE_16BITS_UUID_TYPE;
3889 }
3890 else /* not enough room for all UUIDs */
3891 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003892 APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003893 num_uuid = free_eir_length / LEN_UUID_16;
3894 data_type = BTM_EIR_MORE_16BITS_UUID_TYPE;
3895 }
3896 UINT8_TO_STREAM(p, num_uuid * LEN_UUID_16 + 1);
3897 UINT8_TO_STREAM(p, data_type);
3898 memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_uuid16, num_uuid * LEN_UUID_16 );
3899 p += num_uuid * LEN_UUID_16;
3900 free_eir_length -= num_uuid * LEN_UUID_16;
3901 }
3902 }
3903#else /* (BTA_EIR_CANNED_UUID_LIST == TRUE) */
3904 /* if UUID list is dynamic */
3905 if ( free_eir_length >= 2)
3906 {
3907 p_length = p++;
3908 p_type = p++;
3909 num_uuid = 0;
3910
3911 max_num_uuid = (free_eir_length - 2)/LEN_UUID_16;
3912 data_type = BTM_GetEirSupportedServices( bta_dm_cb.eir_uuid, &p, max_num_uuid, &num_uuid );
3913
3914 if( data_type == BTM_EIR_MORE_16BITS_UUID_TYPE )
3915 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003916 APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003917 }
3918#if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
3919 else
3920 {
3921 for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++)
3922 {
3923 if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_16)
3924 {
3925 if ( num_uuid < max_num_uuid )
3926 {
3927 UINT16_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid16);
3928 num_uuid++;
3929 }
3930 else
3931 {
3932 data_type = BTM_EIR_MORE_16BITS_UUID_TYPE;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003933 APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003934 break;
3935 }
3936 }
3937 }
3938 }
3939#endif /* (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) */
3940
3941 UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_16 + 1);
3942 UINT8_TO_STREAM(p_type, data_type);
3943 free_eir_length -= num_uuid * LEN_UUID_16 + 2;
3944 }
3945#endif /* (BTA_EIR_CANNED_UUID_LIST == TRUE) */
3946
3947#if ( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
3948 /* Adding 32-bit UUID list */
3949 if ( free_eir_length >= 2)
3950 {
3951 p_length = p++;
3952 p_type = p++;
3953 num_uuid = 0;
3954 data_type = BTM_EIR_COMPLETE_32BITS_UUID_TYPE;
3955
3956 max_num_uuid = (free_eir_length - 2)/LEN_UUID_32;
3957
3958 for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++)
3959 {
3960 if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_32)
3961 {
3962 if ( num_uuid < max_num_uuid )
3963 {
3964 UINT32_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid32);
3965 num_uuid++;
3966 }
3967 else
3968 {
3969 data_type = BTM_EIR_MORE_32BITS_UUID_TYPE;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003970 APPL_TRACE_WARNING("BTA EIR: UUID 32-bit list is truncated");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003971 break;
3972 }
3973 }
3974 }
3975
3976 UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_32 + 1);
3977 UINT8_TO_STREAM(p_type, data_type);
3978 free_eir_length -= num_uuid * LEN_UUID_32 + 2;
3979 }
3980
3981 /* Adding 128-bit UUID list */
3982 if ( free_eir_length >= 2)
3983 {
3984 p_length = p++;
3985 p_type = p++;
3986 num_uuid = 0;
3987 data_type = BTM_EIR_COMPLETE_128BITS_UUID_TYPE;
3988
3989 max_num_uuid = (free_eir_length - 2)/LEN_UUID_128;
3990
3991 for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++)
3992 {
3993 if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_128)
3994 {
3995 if ( num_uuid < max_num_uuid )
3996 {
3997 ARRAY16_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid128);
3998 num_uuid++;
3999 }
4000 else
4001 {
4002 data_type = BTM_EIR_MORE_128BITS_UUID_TYPE;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004003 APPL_TRACE_WARNING("BTA EIR: UUID 128-bit list is truncated");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004004 break;
4005 }
4006 }
4007 }
4008
4009 UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_128 + 1);
4010 UINT8_TO_STREAM(p_type, data_type);
4011 free_eir_length -= num_uuid * LEN_UUID_128 + 2;
4012 }
4013#endif /* ( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) */
4014
4015 /* if Flags are provided in configuration */
4016 if(( p_bta_dm_eir_cfg->bta_dm_eir_flag_len > 0 )
4017 &&( p_bta_dm_eir_cfg->bta_dm_eir_flags )
4018 &&( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 2 ))
4019 {
4020 UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 1);
4021 UINT8_TO_STREAM(p, BTM_EIR_FLAGS_TYPE);
4022 memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_flags,
4023 p_bta_dm_eir_cfg->bta_dm_eir_flag_len);
4024 p += p_bta_dm_eir_cfg->bta_dm_eir_flag_len;
4025 free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 2;
4026 }
4027
The Android Open Source Project5738f832012-12-12 16:00:35 -08004028 /* if Manufacturer Specific are provided in configuration */
4029 if(( p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len > 0 )
4030 &&( p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec )
4031 &&( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2 ))
4032 {
4033 p_length = p;
4034
4035 UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 1);
4036 UINT8_TO_STREAM(p, BTM_EIR_MANUFACTURER_SPECIFIC_TYPE);
4037 memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec,
4038 p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len);
4039 p += p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len;
4040 free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2;
4041
4042 }
4043 else
4044 {
4045 p_length = NULL;
4046 }
4047
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004048 /* if Inquiry Tx Resp Power compiled */
4049 if ((p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power) &&
4050 (free_eir_length >= 3))
4051 {
4052 UINT8_TO_STREAM(p, 2); /* Length field */
4053 UINT8_TO_STREAM(p, BTM_EIR_TX_POWER_LEVEL_TYPE);
4054 UINT8_TO_STREAM(p, *(p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power));
4055 free_eir_length -= 3;
4056 }
4057
The Android Open Source Project5738f832012-12-12 16:00:35 -08004058 if( free_eir_length )
4059 UINT8_TO_STREAM(p, 0); /* terminator of significant part */
4060
4061 BTM_WriteEIR( p_buf );
4062
4063}
The Android Open Source Project5738f832012-12-12 16:00:35 -08004064
The Android Open Source Project5738f832012-12-12 16:00:35 -08004065/*******************************************************************************
4066**
4067** Function bta_dm_eir_search_services
4068**
4069** Description This function searches services in received EIR
4070**
4071** Returns None
4072**
4073*******************************************************************************/
4074static void bta_dm_eir_search_services( tBTM_INQ_RESULTS *p_result,
4075 tBTA_SERVICE_MASK *p_services_to_search,
4076 tBTA_SERVICE_MASK *p_services_found)
4077{
4078 tBTA_SERVICE_MASK service_index = 0;
4079 tBTM_EIR_SEARCH_RESULT result;
4080
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004081 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 -08004082 p_result->remote_bd_addr[0],p_result->remote_bd_addr[1],
4083 p_result->remote_bd_addr[2],p_result->remote_bd_addr[3],
4084 p_result->remote_bd_addr[4],p_result->remote_bd_addr[5]);
4085
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004086 APPL_TRACE_DEBUG(" with services_to_search=0x%08X", *p_services_to_search);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004087
4088#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
4089 /* always do GATT based service discovery by SDP instead of from EIR */
4090 /* if GATT based service is also to be put in EIR, need to modify this */
4091 while (service_index < (BTA_MAX_SERVICE_ID - 1))
4092#else
4093 while(service_index < BTA_MAX_SERVICE_ID)
4094#endif
4095 {
4096 if( *p_services_to_search
4097 & (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)))
4098 {
4099 result = BTM_HasInquiryEirService( p_result,
4100 bta_service_id_to_uuid_lkup_tbl[service_index] );
4101
4102 /* Searching for HSP v1.2 only device */
4103 if ((result != BTM_EIR_FOUND) &&
4104 (bta_service_id_to_uuid_lkup_tbl[service_index] == UUID_SERVCLASS_HEADSET))
4105 {
4106 result = BTM_HasInquiryEirService (p_result, UUID_SERVCLASS_HEADSET_HS);
4107 }
4108
4109 if( result == BTM_EIR_FOUND )
4110 {
4111 /* If Plug and Play service record, need to check to see if Broadcom stack */
4112 /* However, EIR data doesn't have EXT_BRCM_VERSION so just skip it */
4113 if( bta_service_id_to_uuid_lkup_tbl[service_index]
4114 != UUID_SERVCLASS_PNP_INFORMATION )
4115 {
4116
4117 *p_services_found |=
4118 (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index));
4119 /* remove the service from services to be searched */
4120 *p_services_to_search &=
4121 (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)));
4122 }
4123 }
4124 else if( result == BTM_EIR_NOT_FOUND )
4125 {
4126 /* remove the service from services to be searched */
4127 *p_services_to_search &=
4128 (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)));
4129 }
4130 }
4131
4132 service_index++;
4133 }
4134
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004135 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 -08004136 *p_services_to_search, *p_services_found);
4137}
The Android Open Source Project5738f832012-12-12 16:00:35 -08004138
Chris Manton1e61ce12014-10-24 09:12:41 -07004139#if (BTA_EIR_CANNED_UUID_LIST != TRUE)
The Android Open Source Project5738f832012-12-12 16:00:35 -08004140/*******************************************************************************
4141**
4142** Function bta_dm_eir_update_uuid
4143**
4144** Description This function adds or removes service UUID in EIR database.
4145**
4146** Returns None
4147**
4148*******************************************************************************/
4149void bta_dm_eir_update_uuid(UINT16 uuid16, BOOLEAN adding)
4150{
4151 /* if this UUID is not advertised in EIR */
4152 if( !BTM_HasEirService( p_bta_dm_eir_cfg->uuid_mask, uuid16 ))
4153 return;
4154
4155 if( adding )
4156 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004157 APPL_TRACE_EVENT("Adding UUID=0x%04X into EIR", uuid16);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004158
4159 BTM_AddEirService( bta_dm_cb.eir_uuid, uuid16 );
4160 }
4161 else
4162 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004163 APPL_TRACE_EVENT("Removing UUID=0x%04X from EIR", uuid16);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004164
4165 BTM_RemoveEirService( bta_dm_cb.eir_uuid, uuid16 );
4166 }
4167
4168 bta_dm_set_eir (NULL);
4169
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004170 APPL_TRACE_EVENT("bta_dm_eir_update_uuid UUID bit mask=0x%08X %08X",
The Android Open Source Project5738f832012-12-12 16:00:35 -08004171 bta_dm_cb.eir_uuid[1], bta_dm_cb.eir_uuid[0] );
4172}
4173#endif
4174
4175/*******************************************************************************
4176**
4177** Function bta_dm_enable_test_mode
4178**
4179** Description enable test mode
4180**
4181**
4182** Returns void
4183**
4184*******************************************************************************/
4185void bta_dm_enable_test_mode(tBTA_DM_MSG *p_data)
4186{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08004187 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004188 BTM_EnableTestMode();
4189}
4190
4191/*******************************************************************************
4192**
4193** Function bta_dm_disable_test_mode
4194**
4195** Description disable test mode
4196**
4197**
4198** Returns void
4199**
4200*******************************************************************************/
4201void bta_dm_disable_test_mode(tBTA_DM_MSG *p_data)
4202{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08004203 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004204 BTM_DeviceReset(NULL);
4205}
4206
4207/*******************************************************************************
4208**
4209** Function bta_dm_execute_callback
4210**
4211** Description Just execute a generic call back in the context of the BTU/BTA tack
4212**
4213**
4214** Returns void
4215**
4216*******************************************************************************/
4217void bta_dm_execute_callback(tBTA_DM_MSG *p_data)
4218{
4219 /* sanity check */
4220 if(p_data->exec_cback.p_exec_cback == NULL)
4221 {
4222 return;
4223 }
4224
4225 p_data->exec_cback.p_exec_cback(p_data->exec_cback.p_param);
4226}
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07004227
The Android Open Source Project5738f832012-12-12 16:00:35 -08004228/*******************************************************************************
4229**
4230** Function bta_dm_encrypt_cback
4231**
4232** Description link encryption complete callback.
4233**
4234** Returns None
4235**
4236*******************************************************************************/
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004237void 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 -08004238{
4239 tBTA_STATUS bta_status = BTA_SUCCESS;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004240 tBTA_DM_ENCRYPT_CBACK *p_callback = NULL;
4241 UINT8 i ;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08004242 UNUSED(p_ref_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004243
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004244 for (i=0; i<bta_dm_cb.device_list.count; i++)
4245 {
4246 if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, bd_addr) == 0 &&
4247 bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED)
4248 break;
4249 }
4250
4251 if (i < bta_dm_cb.device_list.count)
4252 {
4253 p_callback = bta_dm_cb.device_list.peer_device[i].p_encrypt_cback;
4254 bta_dm_cb.device_list.peer_device[i].p_encrypt_cback = NULL;
4255 }
4256
The Android Open Source Project5738f832012-12-12 16:00:35 -08004257 switch (result)
4258 {
4259 case BTM_SUCCESS:
4260 break;
4261 case BTM_WRONG_MODE:
4262 bta_status = BTA_WRONG_MODE;
4263 break;
4264 case BTM_NO_RESOURCES:
4265 bta_status = BTA_NO_RESOURCES;
4266 break;
4267 case BTM_BUSY:
4268 bta_status = BTA_BUSY;
4269 break;
4270 default:
4271 bta_status = BTA_FAILURE;
4272 break;
4273 }
4274
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004275 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 -08004276
4277 if (p_callback)
4278 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004279 (*p_callback)(bd_addr, transport, bta_status);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004280 }
4281}
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07004282
The Android Open Source Project5738f832012-12-12 16:00:35 -08004283/*******************************************************************************
4284**
4285** Function bta_dm_set_encryption
4286**
4287** Description This function to encrypt the link
4288**
4289** Returns None
4290**
4291*******************************************************************************/
4292void bta_dm_set_encryption (tBTA_DM_MSG *p_data)
4293{
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004294 UINT8 i ;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004295
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004296 APPL_TRACE_DEBUG("bta_dm_set_encryption"); //todo
The Android Open Source Project5738f832012-12-12 16:00:35 -08004297 if (!p_data->set_encryption.p_callback)
4298 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004299 APPL_TRACE_ERROR("bta_dm_set_encryption callback is not provided");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004300 return;
4301 }
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004302 for (i=0; i<bta_dm_cb.device_list.count; i++)
The Android Open Source Project5738f832012-12-12 16:00:35 -08004303 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004304 if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_data->set_encryption.bd_addr) == 0 &&
4305 bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED)
4306 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004307 }
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004308 if (i < bta_dm_cb.device_list.count)
4309 {
4310 if (bta_dm_cb.device_list.peer_device[i].p_encrypt_cback)
4311 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004312 APPL_TRACE_ERROR("earlier enc was not done for same device");
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004313 (*p_data->set_encryption.p_callback)(p_data->set_encryption.bd_addr,
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07004314 p_data->set_encryption.transport,
4315 BTA_BUSY);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004316 return;
4317 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08004318
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07004319 if (BTM_SetEncryption(p_data->set_encryption.bd_addr, p_data->set_encryption.transport,
4320 bta_dm_encrypt_cback, &p_data->set_encryption.sec_act)
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004321 == BTM_CMD_STARTED)
4322 {
4323 bta_dm_cb.device_list.peer_device[i].p_encrypt_cback = p_data->set_encryption.p_callback;
4324 }
4325 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08004326}
4327
The Android Open Source Project5738f832012-12-12 16:00:35 -08004328#if (BLE_INCLUDED == TRUE)
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004329/*******************************************************************************
4330**
4331** Function bta_dm_observe_results_cb
4332**
4333** Description Callback for BLE Observe result
4334**
4335**
4336** Returns void
4337**
4338*******************************************************************************/
4339static void bta_dm_observe_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir)
4340{
4341;
4342 tBTA_DM_SEARCH result;
4343 tBTM_INQ_INFO *p_inq_info;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004344 APPL_TRACE_DEBUG("bta_dm_observe_results_cb")
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004345
4346 bdcpy(result.inq_res.bd_addr, p_inq->remote_bd_addr);
4347 result.inq_res.rssi = p_inq->rssi;
4348 result.inq_res.ble_addr_type = p_inq->ble_addr_type;
4349 result.inq_res.inq_result_type = p_inq->inq_result_type;
4350 result.inq_res.device_type = p_inq->device_type;
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07004351 result.inq_res.flag = p_inq->flag;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004352
4353 /* application will parse EIR to find out remote device name */
4354 result.inq_res.p_eir = p_eir;
4355
4356 if((p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr)) != NULL)
4357 {
4358 /* initialize remt_name_not_required to FALSE so that we get the name by default */
4359 result.inq_res.remt_name_not_required = FALSE;
4360 }
4361
4362 if(bta_dm_search_cb.p_scan_cback)
4363 bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_RES_EVT, &result);
4364
4365 if(p_inq_info)
4366 {
4367 /* application indicates if it knows the remote name, inside the callback
4368 copy that to the inquiry data base*/
4369 if(result.inq_res.remt_name_not_required)
4370 p_inq_info->appl_knows_rem_name = TRUE;
4371 }
4372}
4373
4374/*******************************************************************************
4375**
4376** Function bta_dm_observe_cmpl_cb
4377**
4378** Description Callback for BLE Observe complete
4379**
4380**
4381** Returns void
4382**
4383*******************************************************************************/
4384static void bta_dm_observe_cmpl_cb (void * p_result)
4385{
4386 tBTA_DM_SEARCH data;
4387
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004388 APPL_TRACE_DEBUG("bta_dm_observe_cmpl_cb");
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004389
4390 data.inq_cmpl.num_resps = ((tBTM_INQUIRY_CMPL *)p_result)->num_resp;
4391 if (bta_dm_search_cb.p_scan_cback)
4392 {
4393 bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_CMPL_EVT, &data);
4394 }
4395}
4396
The Android Open Source Project5738f832012-12-12 16:00:35 -08004397#if (SMP_INCLUDED == TRUE)
4398/*******************************************************************************
4399**
4400** Function bta_dm_ble_smp_cback
4401**
4402** Description Callback for BLE SMP
4403**
4404**
4405** Returns void
4406**
4407*******************************************************************************/
4408static UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_DATA *p_data)
4409{
4410 tBTM_STATUS status = BTM_SUCCESS;
4411 tBTA_DM_SEC sec_event;
Satya Calloji444a8da2015-03-06 10:38:22 -08004412 char *p_name = NULL;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004413
4414 if (!bta_dm_cb.p_sec_cback)
4415 return BTM_NOT_AUTHORIZED;
4416
4417 memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
4418 switch (event)
4419 {
4420 case BTM_LE_IO_REQ_EVT:
4421#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
4422
4423 bta_dm_co_ble_io_req(bda,
4424 &p_data->io_req.io_cap,
4425 &p_data->io_req.oob_data,
4426 &p_data->io_req.auth_req,
4427 &p_data->io_req.max_key_size,
4428 &p_data->io_req.init_keys,
4429 &p_data->io_req.resp_keys);
4430#endif
4431#if BTM_OOB_INCLUDED == FALSE
4432 status = BTM_SUCCESS;
4433#endif
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004434 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 -08004435
4436 break;
4437
4438 case BTM_LE_SEC_REQUEST_EVT:
4439 bdcpy(sec_event.ble_req.bd_addr, bda);
Andre Eisenbach181d0752013-06-11 14:18:21 -07004440 p_name = BTM_SecReadDevName(bda);
4441 if (p_name != NULL)
4442 {
4443 BCM_STRNCPY_S((char*)sec_event.ble_req.bd_name,
4444 sizeof(BD_NAME), p_name, (BD_NAME_LEN));
4445 }
4446 else
4447 {
4448 sec_event.ble_req.bd_name[0] = 0;
4449 }
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07004450 sec_event.ble_req.bd_name[BD_NAME_LEN] = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004451 bta_dm_cb.p_sec_cback(BTA_DM_BLE_SEC_REQ_EVT, &sec_event);
4452 break;
4453
4454 case BTM_LE_KEY_NOTIF_EVT:
4455 bdcpy(sec_event.key_notif.bd_addr, bda);
Andre Eisenbach181d0752013-06-11 14:18:21 -07004456 p_name = BTM_SecReadDevName(bda);
4457 if (p_name != NULL)
4458 {
4459 BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name,
4460 sizeof(BD_NAME), p_name, (BD_NAME_LEN));
4461 }
4462 else
4463 {
4464 sec_event.key_notif.bd_name[0] = 0;
4465 }
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07004466 sec_event.ble_req.bd_name[BD_NAME_LEN] = 0;
4467 sec_event.key_notif.passkey = p_data->key_notif;
4468 bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_NOTIF_EVT, &sec_event);
4469 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004470
4471 case BTM_LE_KEY_REQ_EVT:
4472 bdcpy(sec_event.ble_req.bd_addr, bda);
4473 bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_REQ_EVT, &sec_event);
4474 break;
4475
4476 case BTM_LE_OOB_REQ_EVT:
4477 bdcpy(sec_event.ble_req.bd_addr, bda);
4478 bta_dm_cb.p_sec_cback(BTA_DM_BLE_OOB_REQ_EVT, &sec_event);
4479 break;
4480
Satya Calloji444a8da2015-03-06 10:38:22 -08004481 case BTM_LE_NC_REQ_EVT:
4482 bdcpy(sec_event.key_notif.bd_addr, bda);
4483 BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN));
4484 sec_event.ble_req.bd_name[BD_NAME_LEN] = 0;
4485 sec_event.key_notif.passkey = p_data->key_notif;
4486 bta_dm_cb.p_sec_cback(BTA_DM_BLE_NC_REQ_EVT, &sec_event);
4487 break;
4488
The Android Open Source Project5738f832012-12-12 16:00:35 -08004489 case BTM_LE_KEY_EVT:
4490 bdcpy(sec_event.ble_key.bd_addr, bda);
4491 sec_event.ble_key.key_type = p_data->key.key_type;
Satya Calloji444a8da2015-03-06 10:38:22 -08004492 sec_event.ble_key.p_key_value = p_data->key.p_key_value;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004493 bta_dm_cb.p_sec_cback(BTA_DM_BLE_KEY_EVT, &sec_event);
4494 break;
4495
4496 case BTM_LE_COMPLT_EVT:
4497 bdcpy(sec_event.auth_cmpl.bd_addr, bda);
Andre Eisenbach91fbc7e2015-05-08 17:42:10 -07004498#if BLE_INCLUDED == TRUE
Chaojing Sune2805532015-04-22 13:40:21 -07004499 BTM_ReadDevInfo(bda, &sec_event.auth_cmpl.dev_type, &sec_event.auth_cmpl.addr_type);
Andre Eisenbach91fbc7e2015-05-08 17:42:10 -07004500#endif
Andre Eisenbach181d0752013-06-11 14:18:21 -07004501 p_name = BTM_SecReadDevName(bda);
4502 if (p_name != NULL)
4503 {
4504 BCM_STRNCPY_S((char*)sec_event.auth_cmpl.bd_name,
4505 sizeof(BD_NAME), p_name, (BD_NAME_LEN));
4506 }
4507 else
4508 {
4509 sec_event.auth_cmpl.bd_name[0] = 0;
4510 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004511 if (p_data->complt.reason != 0)
4512 {
4513 sec_event.auth_cmpl.fail_reason = BTA_DM_AUTH_CONVERT_SMP_CODE(((UINT8)p_data->complt.reason));
4514 /* delete this device entry from Sec Dev DB */
4515 bta_dm_remove_sec_dev_entry (bda);
4516 }
4517 else
4518 {
4519 sec_event.auth_cmpl.success = TRUE;
Andre Eisenbacha2502802015-05-29 14:05:30 -07004520 if (!p_data->complt.smp_over_br)
4521 GATT_ConfigServiceChangeCCC(bda, TRUE, BT_TRANSPORT_LE);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004522 }
Satya Calloji444a8da2015-03-06 10:38:22 -08004523
The Android Open Source Project5738f832012-12-12 16:00:35 -08004524 if (bta_dm_cb.p_sec_cback)
4525 {
4526 //bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
4527 bta_dm_cb.p_sec_cback(BTA_DM_BLE_AUTH_CMPL_EVT, &sec_event);
4528 }
4529
4530 break;
4531
4532 default:
4533 status = BTM_NOT_AUTHORIZED;
4534 break;
4535 }
4536 return status;
4537}
4538#endif /* SMP_INCLUDED == TRUE */
4539
4540/*******************************************************************************
4541**
4542** Function bta_dm_ble_id_key_cback
4543**
4544** Description Callback for BLE local ID keys
4545**
4546**
4547** Returns void
4548**
4549*******************************************************************************/
4550static void bta_dm_ble_id_key_cback (UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key)
4551{
4552 UINT8 evt;
4553 tBTA_DM_SEC dm_key;
4554
4555 switch (key_type)
4556 {
4557 case BTM_BLE_KEY_TYPE_ID:
4558 case BTM_BLE_KEY_TYPE_ER:
4559 if (bta_dm_cb.p_sec_cback)
4560 {
4561 memcpy(&dm_key.ble_id_keys, p_key, sizeof(tBTM_BLE_LOCAL_KEYS));
4562
4563 evt = (key_type == BTM_BLE_KEY_TYPE_ID) ? BTA_DM_BLE_LOCAL_IR_EVT :\
4564 BTA_DM_BLE_LOCAL_ER_EVT;
4565 bta_dm_cb.p_sec_cback(evt, &dm_key);
4566 }
4567 break;
4568
4569 default:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004570 APPL_TRACE_DEBUG("Unknown key type %d", key_type);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004571 break;
4572 }
4573 return;
4574
4575}
4576
4577/*******************************************************************************
4578**
4579** Function bta_dm_add_blekey
4580**
4581** Description This function adds an BLE Key to an security database entry.
4582** This function shall only be called AFTER BTA_DmAddBleDevice has been called.
4583** It is normally called during host startup to restore all required information
4584** stored in the NVRAM.
4585**
4586** Parameters:
4587**
4588*******************************************************************************/
4589void bta_dm_add_blekey (tBTA_DM_MSG *p_data)
4590{
4591 if (!BTM_SecAddBleKey (p_data->add_ble_key.bd_addr,
4592 (tBTM_LE_KEY_VALUE *)&p_data->add_ble_key.blekey,
4593 p_data->add_ble_key.key_type))
4594 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004595 APPL_TRACE_ERROR ("BTA_DM: Error adding BLE Key for device %08x%04x",
The Android Open Source Project5738f832012-12-12 16:00:35 -08004596 (p_data->add_ble_key.bd_addr[0]<<24)+(p_data->add_ble_key.bd_addr[1]<<16)+\
4597 (p_data->add_ble_key.bd_addr[2]<<8)+p_data->add_ble_key.bd_addr[3],
4598 (p_data->add_ble_key.bd_addr[4]<<8)+p_data->add_ble_key.bd_addr[5]);
4599 }
4600}
4601
4602/*******************************************************************************
4603**
4604** Function bta_dm_add_ble_device
4605**
4606** Description This function adds an BLE device to an security database entry.
4607** It is normally called during host startup to restore all required information
4608** stored in the NVRAM.
4609**
4610** Parameters:
4611**
4612*******************************************************************************/
4613void bta_dm_add_ble_device (tBTA_DM_MSG *p_data)
4614{
4615 if (!BTM_SecAddBleDevice (p_data->add_ble_device.bd_addr, NULL,
4616 p_data->add_ble_device.dev_type ,
4617 p_data->add_ble_device.addr_type))
4618 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004619 APPL_TRACE_ERROR ("BTA_DM: Error adding BLE Device for device %08x%04x",
The Android Open Source Project5738f832012-12-12 16:00:35 -08004620 (p_data->add_ble_device.bd_addr[0]<<24)+(p_data->add_ble_device.bd_addr[1]<<16)+ \
4621 (p_data->add_ble_device.bd_addr[2]<<8)+p_data->add_ble_device.bd_addr[3],
4622 (p_data->add_ble_device.bd_addr[4]<<8)+p_data->add_ble_device.bd_addr[5]);
4623 }
4624}
4625
4626/*******************************************************************************
4627**
4628** Function bta_dm_add_ble_device
4629**
4630** Description This function adds an BLE device to an security database entry.
4631** It is normally called during host startup to restore all required information
4632** stored in the NVRAM.
4633**
4634** Parameters:
4635**
4636*******************************************************************************/
4637void bta_dm_ble_passkey_reply (tBTA_DM_MSG *p_data)
4638{
4639 if (p_data->pin_reply.accept)
4640 {
The Android Open Source Project5738f832012-12-12 16:00:35 -08004641 BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_SUCCESS, p_data->ble_passkey_reply.passkey);
4642 }
4643 else
4644 {
4645 BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_NOT_AUTHORIZED, p_data->ble_passkey_reply.passkey);
4646 }
4647
4648}
4649
4650/*******************************************************************************
4651**
Satya Calloji444a8da2015-03-06 10:38:22 -08004652** Function bta_dm_ble_confirm_reply
4653**
4654** Description This is response to SM numeric comparison request submitted
4655** to application.
4656**
4657** Parameters:
4658**
4659*******************************************************************************/
4660void bta_dm_ble_confirm_reply (tBTA_DM_MSG *p_data)
4661{
4662 if (p_data->confirm.accept)
4663 {
4664 BTM_BleConfirmReply(p_data->confirm.bd_addr, BTM_SUCCESS);
4665 }
4666 else
4667 {
4668 BTM_BleConfirmReply(p_data->ble_passkey_reply.bd_addr, BTM_NOT_AUTHORIZED);
4669 }
4670}
4671
4672/*******************************************************************************
4673**
The Android Open Source Project5738f832012-12-12 16:00:35 -08004674** Function bta_dm_security_grant
4675**
4676** Description This function grant SMP security request access.
4677**
4678** Parameters:
4679**
4680*******************************************************************************/
4681void bta_dm_security_grant (tBTA_DM_MSG *p_data)
4682{
4683 BTM_SecurityGrant(p_data->ble_sec_grant.bd_addr, p_data->ble_sec_grant.res);
4684}
4685
4686/*******************************************************************************
4687**
4688** Function bta_dm_ble_set_bg_conn_type
4689**
4690** Description This function set the BLE background connection type
4691**
4692** Parameters:
4693**
4694*******************************************************************************/
4695void bta_dm_ble_set_bg_conn_type (tBTA_DM_MSG *p_data)
4696{
4697 BTM_BleSetBgConnType(p_data->ble_set_bd_conn_type.bg_conn_type,
4698 p_data->ble_set_bd_conn_type.p_select_cback);
4699}
4700
4701/*******************************************************************************
4702**
4703** Function bta_dm_ble_set_conn_params
4704**
4705** Description This function set the preferred connection parameters.
4706**
4707** Parameters:
4708**
4709*******************************************************************************/
4710void bta_dm_ble_set_conn_params (tBTA_DM_MSG *p_data)
4711{
4712 BTM_BleSetPrefConnParams(p_data->ble_set_conn_params.peer_bda,
4713 p_data->ble_set_conn_params.conn_int_min,
4714 p_data->ble_set_conn_params.conn_int_max,
4715 p_data->ble_set_conn_params.slave_latency,
4716 p_data->ble_set_conn_params.supervision_tout);
4717}
4718
4719/*******************************************************************************
4720**
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07004721** Function bta_dm_ble_set_conn_scan_params
The Android Open Source Project5738f832012-12-12 16:00:35 -08004722**
Andre Eisenbach979e3422015-06-10 21:04:38 -07004723** Description This function sets BLE scan parameters.
4724**
4725** Parameters:
4726**
4727*******************************************************************************/
4728void bta_dm_ble_set_scan_params(tBTA_DM_MSG *p_data)
4729{
4730 BTM_BleSetScanParams(p_data->ble_set_scan_params.client_if,
4731 p_data->ble_set_scan_params.scan_int,
4732 p_data->ble_set_scan_params.scan_window,
4733 p_data->ble_set_scan_params.scan_mode,
4734 p_data->ble_set_scan_params.scan_param_setup_cback);
4735}
4736
4737/*******************************************************************************
4738**
4739** Function bta_dm_ble_set_conn_scan_params
4740**
The Android Open Source Project5738f832012-12-12 16:00:35 -08004741** Description This function set the preferred connection scan parameters.
4742**
4743** Parameters:
4744**
4745*******************************************************************************/
Andre Eisenbach979e3422015-06-10 21:04:38 -07004746void bta_dm_ble_set_conn_scan_params (tBTA_DM_MSG *p_data)
The Android Open Source Project5738f832012-12-12 16:00:35 -08004747{
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07004748 BTM_BleSetConnScanParams(p_data->ble_set_conn_scan_params.scan_int,
4749 p_data->ble_set_conn_scan_params.scan_window);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004750}
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004751/*******************************************************************************
4752**
4753** Function bta_dm_ble_update_conn_params
4754**
4755** Description This function update LE connection parameters.
4756**
4757** Parameters:
4758**
4759*******************************************************************************/
4760void bta_dm_ble_update_conn_params (tBTA_DM_MSG *p_data)
4761{
4762 if (!L2CA_UpdateBleConnParams(p_data->ble_update_conn_params.bd_addr,
4763 p_data->ble_update_conn_params.min_int,
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07004764 p_data->ble_update_conn_params.max_int,
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004765 p_data->ble_update_conn_params.latency,
4766 p_data->ble_update_conn_params.timeout))
4767 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004768 APPL_TRACE_ERROR("Update connection parameters failed!");
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004769 }
4770}
The Android Open Source Project5738f832012-12-12 16:00:35 -08004771
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07004772#if BLE_PRIVACY_SPT == TRUE
4773/*******************************************************************************
4774**
4775** Function bta_dm_ble_config_local_privacy
4776**
4777** Description This function set the local device LE privacy settings.
4778**
4779** Parameters:
4780**
4781*******************************************************************************/
4782void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data)
4783{
4784 BTM_BleConfigPrivacy (p_data->ble_local_privacy.privacy_enable);
4785}
4786#endif
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07004787
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004788/*******************************************************************************
4789**
4790** Function bta_dm_ble_observe
4791**
4792** Description This function set the preferred connection scan parameters.
4793**
4794** Parameters:
4795**
4796*******************************************************************************/
4797void bta_dm_ble_observe (tBTA_DM_MSG *p_data)
4798{
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004799 tBTM_STATUS status;
4800 if (p_data->ble_observe.start)
4801 {
4802 /*Save the callback to be called when a scan results are available */
4803 bta_dm_search_cb.p_scan_cback = p_data->ble_observe.p_cback;
4804 if ((status = BTM_BleObserve(TRUE, p_data->ble_observe.duration,
Priti Agherab6b14bb2014-06-06 13:54:08 -07004805 bta_dm_observe_results_cb, bta_dm_observe_cmpl_cb))!= BTM_CMD_STARTED)
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004806 {
4807 tBTA_DM_SEARCH data;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004808 APPL_TRACE_WARNING(" %s BTM_BleObserve failed. status %d",__FUNCTION__,status);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004809 data.inq_cmpl.num_resps = 0;
4810 if (bta_dm_search_cb.p_scan_cback)
4811 {
4812 bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_CMPL_EVT, &data);
4813 }
4814 }
4815 }
4816 else
4817 {
4818 bta_dm_search_cb.p_scan_cback = NULL;
4819 BTM_BleObserve(FALSE, 0, NULL,NULL );
4820 }
4821}
Andre Eisenbach5c44e452013-08-06 18:19:37 -07004822/*******************************************************************************
4823**
Andre Eisenbach979e3422015-06-10 21:04:38 -07004824** Function bta_dm_ble_set_adv_params
Andre Eisenbach5c44e452013-08-06 18:19:37 -07004825**
4826** Description This function set the adv parameters.
4827**
4828** Parameters:
4829**
4830*******************************************************************************/
4831void bta_dm_ble_set_adv_params (tBTA_DM_MSG *p_data)
4832{
4833 BTM_BleSetAdvParams(p_data->ble_set_adv_params.adv_int_min,
4834 p_data->ble_set_adv_params.adv_int_max,
4835 p_data->ble_set_adv_params.p_dir_bda,
4836 BTA_DM_BLE_ADV_CHNL_MAP);
4837}
Andre Eisenbacheeeac992013-11-08 10:23:52 -08004838
Andre Eisenbach5c44e452013-08-06 18:19:37 -07004839/*******************************************************************************
4840**
4841** Function bta_dm_ble_set_adv_config
4842**
4843** Description This function set the customized ADV data configuration
4844**
4845** Parameters:
4846**
4847*******************************************************************************/
4848void bta_dm_ble_set_adv_config (tBTA_DM_MSG *p_data)
4849{
Wei Wanga6ce7752014-05-20 06:30:32 +00004850 tBTA_STATUS status = BTA_FAILURE;
4851
4852 if (BTM_BleWriteAdvData(p_data->ble_set_adv_data.data_mask,
Ian Coolidged4c10362015-08-07 20:36:13 -07004853 (tBTM_BLE_ADV_DATA *)&p_data->ble_set_adv_data.adv_cfg) == BTM_SUCCESS)
Wei Wanga6ce7752014-05-20 06:30:32 +00004854 {
4855 status = BTA_SUCCESS;
4856 }
4857
4858 if (p_data->ble_set_adv_data.p_adv_data_cback)
4859 (*p_data->ble_set_adv_data.p_adv_data_cback)(status);
Andre Eisenbach5c44e452013-08-06 18:19:37 -07004860}
4861
Andre Eisenbacheeeac992013-11-08 10:23:52 -08004862/*******************************************************************************
4863**
4864** Function bta_dm_ble_set_scan_rsp
4865**
4866** Description This function set the customized ADV scan resp. configuration
4867**
4868** Parameters:
4869**
4870*******************************************************************************/
4871void bta_dm_ble_set_scan_rsp (tBTA_DM_MSG *p_data)
4872{
Wei Wanga6ce7752014-05-20 06:30:32 +00004873 tBTA_STATUS status = BTA_FAILURE;
4874
4875 if(BTM_BleWriteScanRsp(p_data->ble_set_adv_data.data_mask,
Ian Coolidged4c10362015-08-07 20:36:13 -07004876 (tBTM_BLE_ADV_DATA *)&p_data->ble_set_adv_data.adv_cfg) == BTM_SUCCESS)
Wei Wanga6ce7752014-05-20 06:30:32 +00004877 {
4878 status = BTA_SUCCESS;
4879 }
4880
4881 if (p_data->ble_set_adv_data.p_adv_data_cback)
4882 (*p_data->ble_set_adv_data.p_adv_data_cback)(status);
Andre Eisenbacheeeac992013-11-08 10:23:52 -08004883}
4884
4885/*******************************************************************************
4886**
Priti Aghera636d6712014-12-18 13:55:48 -08004887** Function bta_dm_ble_set_data_length
4888**
4889** Description This function set the maximum transmission packet size
4890**
4891** Parameters
4892**
4893*******************************************************************************/
4894void bta_dm_ble_set_data_length(tBTA_DM_MSG *p_data)
4895{
4896 if (BTM_SetBleDataLength(p_data->ble_set_data_length.remote_bda,
4897 p_data->ble_set_data_length.tx_data_length) != BTM_SUCCESS)
4898 {
4899 APPL_TRACE_ERROR("%s failed", __FUNCTION__);
4900 }
4901}
4902
4903/*******************************************************************************
4904**
Andre Eisenbacheeeac992013-11-08 10:23:52 -08004905** Function bta_dm_ble_broadcast
4906**
4907** Description Starts or stops LE broadcasts
4908**
4909** Parameters:
4910**
4911*******************************************************************************/
4912void bta_dm_ble_broadcast (tBTA_DM_MSG *p_data)
4913{
4914 BTM_BleBroadcast(p_data->ble_observe.start);
4915}
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004916
Wei Wanga6ce7752014-05-20 06:30:32 +00004917/*******************************************************************************
4918**
4919** Function bta_dm_ble_multi_adv_enb
4920**
4921** Description This function enables a single advertising instance
4922**
4923** Parameters:
4924**
4925*******************************************************************************/
4926void bta_dm_ble_multi_adv_enb(tBTA_DM_MSG *p_data)
4927{
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07004928 tBTM_STATUS btm_status = 0;
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07004929
4930 bta_dm_cb.p_multi_adv_cback = p_data->ble_multi_adv_enb.p_cback;
4931 if(BTM_BleMaxMultiAdvInstanceCount() > 0 && NULL != p_data->ble_multi_adv_enb.p_ref)
4932 {
4933 btm_status = BTM_BleEnableAdvInstance((tBTM_BLE_ADV_PARAMS*)
4934 p_data->ble_multi_adv_enb.p_params,
4935 p_data->ble_multi_adv_enb.p_cback,
4936 p_data->ble_multi_adv_enb.p_ref);
4937 }
4938
4939 if(BTM_CMD_STARTED != btm_status)
4940 {
4941 bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_ENB_EVT, 0xFF,
4942 p_data->ble_multi_adv_enb.p_ref, BTA_FAILURE);
4943 }
Wei Wanga6ce7752014-05-20 06:30:32 +00004944}
4945/*******************************************************************************
4946**
4947** Function bta_dm_ble_multi_adv_param_upd
4948**
4949** Description This function updates multiple advertising instance parameters
4950**
4951** Parameters:
4952**
4953*******************************************************************************/
4954void bta_dm_ble_multi_adv_upd_param(tBTA_DM_MSG *p_data)
4955{
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07004956 tBTM_STATUS btm_status = 0;
4957 void *p_ref = NULL;
4958
4959 if(BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_param.inst_id > 0
4960 && p_data->ble_multi_adv_param.inst_id < BTM_BleMaxMultiAdvInstanceCount())
4961 {
4962 btm_status = BTM_BleUpdateAdvInstParam(p_data->ble_multi_adv_param.inst_id,
4963 (tBTM_BLE_ADV_PARAMS*)p_data->ble_multi_adv_param.p_params);
4964 }
4965
4966 if(BTM_CMD_STARTED != btm_status)
4967 {
4968 p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_param.inst_id);
4969 bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_PARAM_EVT,
4970 p_data->ble_multi_adv_param.inst_id, p_ref, BTA_FAILURE);
4971 }
Wei Wanga6ce7752014-05-20 06:30:32 +00004972}
4973/*******************************************************************************
4974**
4975** Function bta_dm_ble_multi_adv_data
4976**
4977** Description This function write multiple advertising instance adv data
4978** or scan response data
4979**
4980** Parameters:
4981**
4982*******************************************************************************/
4983void bta_dm_ble_multi_adv_data(tBTA_DM_MSG *p_data)
4984{
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07004985 tBTM_STATUS btm_status = 0;
4986 void *p_ref = NULL;
4987
4988 if(BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_data.inst_id > 0
4989 && p_data->ble_multi_adv_data.inst_id < BTM_BleMaxMultiAdvInstanceCount())
4990 {
4991 btm_status = BTM_BleCfgAdvInstData(p_data->ble_multi_adv_data.inst_id,
4992 p_data->ble_multi_adv_data.is_scan_rsp,
4993 p_data->ble_multi_adv_data.data_mask,
Ian Coolidged4c10362015-08-07 20:36:13 -07004994 (tBTM_BLE_ADV_DATA*)&p_data->ble_multi_adv_data.data);
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07004995 }
4996
4997 if(BTM_CMD_STARTED != btm_status)
4998 {
4999 p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_data.inst_id);
5000 bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_DATA_EVT,
5001 p_data->ble_multi_adv_data.inst_id, p_ref, BTA_FAILURE);
5002 }
5003
Wei Wanga6ce7752014-05-20 06:30:32 +00005004}
5005/*******************************************************************************
5006**
5007** Function btm_dm_ble_multi_adv_disable
5008**
5009** Description This function disable a single adv instance
5010**
5011** Parameters:
5012**
5013*******************************************************************************/
5014void btm_dm_ble_multi_adv_disable(tBTA_DM_MSG *p_data)
5015{
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005016 tBTM_STATUS btm_status = 0;
5017 void *p_ref = NULL;
5018
5019 if(BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_disable.inst_id > 0
5020 && p_data->ble_multi_adv_disable.inst_id < BTM_BleMaxMultiAdvInstanceCount())
5021 {
5022 btm_status = BTM_BleDisableAdvInstance(p_data->ble_multi_adv_disable.inst_id);
5023 }
5024
5025 if(BTM_CMD_STARTED != btm_status)
5026 {
5027 p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_disable.inst_id);
5028 bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_DISABLE_EVT,
5029 p_data->ble_multi_adv_disable.inst_id, p_ref, BTA_FAILURE);
5030 }
Wei Wanga6ce7752014-05-20 06:30:32 +00005031}
5032
Satya Callojic4e25962014-05-10 23:46:24 -07005033/*******************************************************************************
5034**
5035** Function bta_dm_ble_setup_storage
5036**
5037** Description This function configures up the storage parameters for ADV batch scanning
5038**
5039** Parameters:
5040**
5041*******************************************************************************/
5042void bta_dm_ble_setup_storage (tBTA_DM_MSG *p_data)
5043{
Satya Callojic4e25962014-05-10 23:46:24 -07005044 tBTM_STATUS btm_status = 0;
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005045 tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
Satya Callojic4e25962014-05-10 23:46:24 -07005046
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005047 BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
5048
5049 if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
5050 {
5051 btm_status = BTM_BleSetStorageConfig(p_data->ble_set_storage.batch_scan_full_max,
5052 p_data->ble_set_storage.batch_scan_trunc_max,
5053 p_data->ble_set_storage.batch_scan_notify_threshold,
5054 p_data->ble_set_storage.p_setup_cback,
5055 p_data->ble_set_storage.p_thres_cback,
5056 p_data->ble_set_storage.p_read_rep_cback,
5057 p_data->ble_set_storage.ref_value);
5058 }
Satya Callojic4e25962014-05-10 23:46:24 -07005059
5060 if(BTM_CMD_STARTED != btm_status)
5061 bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_CFG_STRG_EVT, p_data->ble_set_storage.ref_value,
5062 btm_status);
Satya Callojic4e25962014-05-10 23:46:24 -07005063}
5064
5065/*******************************************************************************
5066**
5067** Function bta_dm_ble_enable_batch_scan
5068**
5069** Description This function sets up the parameters and enables batch scan
5070**
5071** Parameters:
5072**
5073*******************************************************************************/
5074void bta_dm_ble_enable_batch_scan (tBTA_DM_MSG *p_data)
5075{
Satya Callojic4e25962014-05-10 23:46:24 -07005076 tBTM_STATUS btm_status = 0;
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005077 tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
Satya Callojic4e25962014-05-10 23:46:24 -07005078
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005079 BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
5080
5081 if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
5082 {
5083 btm_status = BTM_BleEnableBatchScan(p_data->ble_enable_scan.scan_mode,
5084 p_data->ble_enable_scan.scan_int,
5085 p_data->ble_enable_scan.scan_window,
5086 p_data->ble_enable_scan.discard_rule,
5087 p_data->ble_enable_scan.addr_type,
5088 p_data->ble_enable_scan.ref_value);
5089 }
Satya Callojic4e25962014-05-10 23:46:24 -07005090
5091 if(BTM_CMD_STARTED != btm_status)
5092 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 -07005093 btm_status);
Satya Callojic4e25962014-05-10 23:46:24 -07005094}
5095
5096/*******************************************************************************
5097**
5098** Function bta_dm_ble_disable_batch_scan
5099**
5100** Description This function disables the batch scan
5101**
5102** Parameters:
5103**
5104*******************************************************************************/
5105void bta_dm_ble_disable_batch_scan (tBTA_DM_MSG *p_data)
5106{
5107 UNUSED(p_data);
Satya Callojic4e25962014-05-10 23:46:24 -07005108 tBTM_STATUS btm_status = 0;
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005109 tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
Satya Callojic4e25962014-05-10 23:46:24 -07005110
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005111 BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
5112
5113 if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
5114 {
5115 btm_status = BTM_BleDisableBatchScan(p_data->ble_disable_scan.ref_value);
5116 }
Satya Callojic4e25962014-05-10 23:46:24 -07005117
5118 if(BTM_CMD_STARTED != btm_status)
5119 bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_DISABLE_EVT, p_data->ble_enable_scan.ref_value,
5120 btm_status);
Satya Callojic4e25962014-05-10 23:46:24 -07005121}
5122
5123/*******************************************************************************
5124**
5125** Function bta_dm_ble_read_scan_reports
5126**
5127** Description This function reads the batch scan reports
5128**
5129** Parameters:
5130**
5131*******************************************************************************/
5132void bta_dm_ble_read_scan_reports(tBTA_DM_MSG *p_data)
5133{
Satya Callojic4e25962014-05-10 23:46:24 -07005134 tBTM_STATUS btm_status = 0;
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005135 tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
Satya Callojic4e25962014-05-10 23:46:24 -07005136
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005137 BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
5138
5139 if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
5140 {
5141 btm_status = BTM_BleReadScanReports(p_data->ble_read_reports.scan_type,
5142 p_data->ble_read_reports.ref_value);
5143 }
Satya Callojic4e25962014-05-10 23:46:24 -07005144
5145 if(BTM_CMD_STARTED != btm_status)
5146 bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_READ_REPTS_EVT, p_data->ble_enable_scan.ref_value,
5147 btm_status);
Satya Callojic4e25962014-05-10 23:46:24 -07005148}
5149
5150/*******************************************************************************
5151**
Satya Calloji1acb61c2014-06-14 23:16:18 -07005152** Function bta_dm_ble_track_advertiser
5153**
5154** Description This function tracks the specific advertiser
5155**
5156** Parameters:
5157**
5158*******************************************************************************/
5159void bta_dm_ble_track_advertiser(tBTA_DM_MSG *p_data)
5160{
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005161 tBTM_STATUS btm_status = 0;
5162 BD_ADDR bda;
5163 memset(&bda, 0 , sizeof(BD_ADDR));
5164 tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
Satya Callojif5387072015-02-09 17:40:52 -08005165 tBTA_DM_BLE_TRACK_ADV_DATA track_adv_data;
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005166
5167 BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
5168
5169 if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
5170 {
Satya Callojif5387072015-02-09 17:40:52 -08005171 btm_status = BTM_BleTrackAdvertiser((tBTM_BLE_TRACK_ADV_CBACK *)
5172 p_data->ble_track_advert.p_track_adv_cback,
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005173 p_data->ble_track_advert.ref_value);
5174 }
5175
5176 if(BTM_CMD_STARTED != btm_status)
Satya Callojif5387072015-02-09 17:40:52 -08005177 {
5178 memset(&track_adv_data, 0, sizeof(tBTA_DM_BLE_TRACK_ADV_DATA));
5179 track_adv_data.advertiser_info_present = NO_ADV_INFO_PRESENT; /* Indicates failure */
5180 track_adv_data.client_if = (UINT8)p_data->ble_track_advert.ref_value;
5181 p_data->ble_track_advert.p_track_adv_cback(&track_adv_data);
5182 }
Satya Calloji1acb61c2014-06-14 23:16:18 -07005183}
5184
5185/*******************************************************************************
5186**
Satya Callojic4e25962014-05-10 23:46:24 -07005187** Function bta_ble_scan_setup_cb
5188**
5189** Description Handle the setup callback from BTM layer and forward it to app layer
5190**
5191** Parameters:
5192**
5193*******************************************************************************/
5194void bta_ble_scan_setup_cb(tBTM_BLE_BATCH_SCAN_EVT evt, tBTM_BLE_REF_VALUE ref_value,
5195 tBTM_STATUS status)
5196{
5197 tBTA_BLE_BATCH_SCAN_EVT bta_evt = 0;
5198
Satya Callojif1dba912014-07-15 17:37:13 -07005199 APPL_TRACE_DEBUG("bta_ble_scan_setup_cb : evt: %d, ref_value: %d, status:%d", evt,
5200 ref_value, status);
5201
Satya Callojic4e25962014-05-10 23:46:24 -07005202 switch(evt)
5203 {
5204 case BTM_BLE_BATCH_SCAN_ENABLE_EVT:
5205 bta_evt = BTA_BLE_BATCH_SCAN_ENB_EVT;
5206 break;
5207 case BTM_BLE_BATCH_SCAN_CFG_STRG_EVT:
5208 bta_evt = BTA_BLE_BATCH_SCAN_CFG_STRG_EVT;
5209 break;
5210 case BTM_BLE_BATCH_SCAN_DISABLE_EVT:
5211 bta_evt = BTA_BLE_BATCH_SCAN_DIS_EVT;
5212 break;
5213 case BTM_BLE_BATCH_SCAN_PARAM_EVT:
5214 bta_evt = BTA_BLE_BATCH_SCAN_PARAM_EVT;
5215 break;
5216 default:
5217 break;
5218 }
5219
5220 if(NULL != bta_dm_cb.p_setup_cback)
5221 bta_dm_cb.p_setup_cback(bta_evt, ref_value, status);
5222}
5223
Satya Calloji1a9247a2014-06-05 13:15:15 -07005224
5225#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
5226/*******************************************************************************
5227**
5228** Function bta_ble_scan_pf_cmpl
5229**
5230** Description ADV payload filtering operation complete callback
5231**
5232**
5233** Returns TRUE if handled, otherwise FALSE.
5234**
5235*******************************************************************************/
5236static void bta_ble_scan_cfg_cmpl(tBTM_BLE_PF_ACTION action, tBTM_BLE_SCAN_COND_OP cfg_op,
5237 tBTM_BLE_PF_AVBL_SPACE avbl_space, tBTM_STATUS status,
5238 tBTM_BLE_REF_VALUE ref_value)
5239{
5240 tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS: BTA_FAILURE;
5241
5242 APPL_TRACE_DEBUG("bta_ble_scan_cfg_cmpl: %d, %d, %d, %d", action, cfg_op, avbl_space, status);
5243
5244 if(bta_dm_cb.p_scan_filt_cfg_cback)
5245 bta_dm_cb.p_scan_filt_cfg_cback(action, cfg_op, avbl_space, st, ref_value);
5246}
5247
5248/*******************************************************************************
5249**
Satya Calloji1a9247a2014-06-05 13:15:15 -07005250** Function bta_dm_cfg_filter_cond
5251**
5252** Description This function configure adv payload filtering condition
5253**
5254** Parameters:
5255**
5256*******************************************************************************/
5257void bta_dm_cfg_filter_cond (tBTA_DM_MSG *p_data)
5258{
5259 tBTM_STATUS st = BTM_MODE_UNSUPPORTED;
5260 tBTA_STATUS status = BTA_FAILURE;
5261
5262 tBTM_BLE_VSC_CB cmn_vsc_cb;
5263
5264 APPL_TRACE_DEBUG("bta_dm_cfg_filter_cond");
5265 BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
5266 if(0 != cmn_vsc_cb.filter_support)
5267 {
5268 if ((st = BTM_BleCfgFilterCondition(p_data->ble_cfg_filter_cond.action,
5269 p_data->ble_cfg_filter_cond.cond_type,
5270 (tBTM_BLE_PF_FILT_INDEX)p_data->ble_cfg_filter_cond.filt_index,
5271 (tBTM_BLE_PF_COND_PARAM *)p_data->ble_cfg_filter_cond.p_cond_param,
5272 bta_ble_scan_cfg_cmpl, p_data->ble_cfg_filter_cond.ref_value))
5273 == BTM_CMD_STARTED)
5274 {
5275 bta_dm_cb.p_scan_filt_cfg_cback = p_data->ble_cfg_filter_cond.p_filt_cfg_cback;
5276 return;
5277 }
5278 }
5279
5280 if (p_data->ble_cfg_filter_cond.p_filt_cfg_cback)
5281 p_data->ble_cfg_filter_cond.p_filt_cfg_cback(BTA_DM_BLE_PF_CONFIG_EVT,
5282 p_data->ble_cfg_filter_cond.cond_type, 0, status,
5283 p_data->ble_cfg_filter_cond.ref_value);
5284 return;
5285}
5286
5287/*******************************************************************************
5288**
5289** Function bta_dm_enable_scan_filter
5290**
5291** Description This function enable/disable adv payload filtering condition
5292**
5293** Parameters:
5294**
5295*******************************************************************************/
5296void bta_dm_enable_scan_filter(tBTA_DM_MSG *p_data)
5297{
5298 tBTM_STATUS st = BTM_MODE_UNSUPPORTED;
5299 tBTA_STATUS status = BTA_FAILURE;
5300
5301 tBTM_BLE_VSC_CB cmn_vsc_cb;
5302 APPL_TRACE_DEBUG("bta_dm_enable_scan_filter");
5303 BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
5304
5305 if(0 != cmn_vsc_cb.filter_support)
5306 {
5307 if((st = BTM_BleEnableDisableFilterFeature(p_data->ble_enable_scan_filt.action,
5308 p_data->ble_enable_scan_filt.p_filt_status_cback,
5309 (tBTM_BLE_REF_VALUE)p_data->ble_enable_scan_filt.ref_value)) == BTM_CMD_STARTED)
5310 bta_dm_cb.p_scan_filt_status_cback = p_data->ble_enable_scan_filt.p_filt_status_cback;
5311 return;
5312 }
5313
5314 if (p_data->ble_enable_scan_filt.p_filt_status_cback)
5315 p_data->ble_enable_scan_filt.p_filt_status_cback (BTA_DM_BLE_PF_ENABLE_EVT,
5316 p_data->ble_enable_scan_filt.ref_value, status);
5317
5318}
Satya Callojie5ba8842014-07-03 17:18:02 -07005319
Satya Calloji1a9247a2014-06-05 13:15:15 -07005320/*******************************************************************************
5321**
5322** Function bta_dm_scan_filter_param_setup
5323**
5324** Description This function sets up scan filter params
5325**
5326** Parameters:
5327**
5328*******************************************************************************/
5329void bta_dm_scan_filter_param_setup (tBTA_DM_MSG *p_data)
5330{
5331 tBTM_STATUS st = BTM_MODE_UNSUPPORTED;
5332 tBTA_STATUS status = BTA_FAILURE;
5333
5334 tBTM_BLE_VSC_CB cmn_vsc_cb;
5335
5336 APPL_TRACE_DEBUG("bta_dm_scan_filter_param_setup");
5337 BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
5338 if(0 != cmn_vsc_cb.filter_support)
5339 {
5340 if ((st = BTM_BleAdvFilterParamSetup(p_data->ble_scan_filt_param_setup.action,
5341 p_data->ble_scan_filt_param_setup.filt_index,
Nitin Arora643aea52014-09-11 18:35:55 -07005342 (tBTM_BLE_PF_FILT_PARAMS *)&p_data->ble_scan_filt_param_setup.filt_params,
Satya Calloji1a9247a2014-06-05 13:15:15 -07005343 p_data->ble_scan_filt_param_setup.p_target,
5344 p_data->ble_scan_filt_param_setup.p_filt_param_cback,
5345 p_data->ble_scan_filt_param_setup.ref_value)) == BTM_CMD_STARTED)
5346 {
5347 bta_dm_cb.p_scan_filt_param_cback = p_data->ble_scan_filt_param_setup.p_filt_param_cback;
5348 return;
5349 }
5350 }
5351
5352 if (p_data->ble_scan_filt_param_setup.p_filt_param_cback)
5353 p_data->ble_scan_filt_param_setup.p_filt_param_cback (BTA_DM_BLE_PF_ENABLE_EVT, 0,
5354 p_data->ble_scan_filt_param_setup.ref_value, status);
5355
5356 return;
5357}
5358#endif
5359
Prerepa Viswanadham16fe0822014-08-07 11:38:06 -07005360/*******************************************************************************
5361**
5362** Function bta_ble_enable_scan_cmpl
5363**
5364** Description ADV payload filtering enable / disable complete callback
5365**
5366**
5367** Returns None
5368**
5369*******************************************************************************/
5370static void bta_ble_energy_info_cmpl(tBTM_BLE_TX_TIME_MS tx_time,
5371 tBTM_BLE_RX_TIME_MS rx_time,
5372 tBTM_BLE_IDLE_TIME_MS idle_time,
5373 tBTM_BLE_ENERGY_USED energy_used,
5374 tBTM_STATUS status)
5375{
5376 tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS: BTA_FAILURE;
5377 tBTA_DM_CONTRL_STATE ctrl_state = 0;
5378
5379 if (BTA_SUCCESS == st)
5380 ctrl_state = bta_dm_pm_obtain_controller_state();
5381
5382 if (bta_dm_cb.p_energy_info_cback)
5383 bta_dm_cb.p_energy_info_cback(tx_time, rx_time, idle_time, energy_used, ctrl_state, st);
5384}
5385
5386/*******************************************************************************
5387**
5388** Function bta_dm_ble_get_energy_info
5389**
5390** Description This function obtains the energy info
5391**
5392** Parameters:
5393**
5394*******************************************************************************/
5395void bta_dm_ble_get_energy_info(tBTA_DM_MSG *p_data)
5396{
5397 tBTM_STATUS btm_status = 0;
5398
5399 bta_dm_cb.p_energy_info_cback = p_data->ble_energy_info.p_energy_info_cback;
5400 btm_status = BTM_BleGetEnergyInfo(bta_ble_energy_info_cmpl);
5401 if (BTM_CMD_STARTED != btm_status)
5402 bta_ble_energy_info_cmpl(0, 0, 0, 0, btm_status);
5403}
5404
The Android Open Source Project5738f832012-12-12 16:00:35 -08005405#if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE))
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07005406#ifndef BTA_DM_GATT_CLOSE_DELAY_TOUT
5407#define BTA_DM_GATT_CLOSE_DELAY_TOUT 1000
5408#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08005409
5410/*******************************************************************************
5411**
Andre Eisenbache1202ca2013-05-15 04:55:08 -07005412** Function bta_dm_gattc_register
5413**
5414** Description Register with GATTC in DM if BLE is needed.
5415**
5416**
5417** Returns void
5418**
5419*******************************************************************************/
5420static void bta_dm_gattc_register(void)
5421{
5422 tBT_UUID app_uuid = {LEN_UUID_128,{0}};
5423
5424 if (bta_dm_search_cb.client_if == BTA_GATTS_INVALID_IF)
5425 {
5426 memset (&app_uuid.uu.uuid128, 0x87, LEN_UUID_128);
5427 BTA_GATTC_AppRegister(&app_uuid, bta_dm_gattc_callback);
5428 }
5429}
5430
5431/*******************************************************************************
5432**
The Android Open Source Project5738f832012-12-12 16:00:35 -08005433** Function btm_dm_start_disc_gatt_services
5434**
5435** Description This function starts a GATT service search request.
5436**
5437** Parameters:
5438**
5439*******************************************************************************/
5440static void btm_dm_start_disc_gatt_services (UINT16 conn_id)
5441{
5442 tBT_UUID *p_uuid = bta_dm_search_cb.p_srvc_uuid +
5443 bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search;
5444
5445 p_uuid = bta_dm_search_cb.p_srvc_uuid +
5446 bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search;
5447
5448 /* always search for all services */
5449 BTA_GATTC_ServiceSearchRequest(conn_id, p_uuid);
5450}
5451
5452/*******************************************************************************
5453**
5454** Function bta_dm_gatt_disc_result
5455**
5456** Description This function process the GATT service search result.
5457**
5458** Parameters:
5459**
5460*******************************************************************************/
5461static void bta_dm_gatt_disc_result(tBTA_GATT_ID service_id)
5462{
5463 tBTA_DM_SEARCH result;
5464
5465 /*
5466 * This logic will not work for gatt case. We are checking against the bluetooth profiles here
5467 * just copy the GATTID in raw data field and send it across.
5468 */
5469
5470
5471 if ( bta_dm_search_cb.ble_raw_used + sizeof(tBTA_GATT_ID) < bta_dm_search_cb.ble_raw_size )
5472 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07005473 APPL_TRACE_DEBUG("ADDING BLE SERVICE uuid=0x%x, ble_ptr = 0x%x, ble_raw_used = 0x%x",
5474 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 -08005475
Andre Eisenbachca22ac42013-02-13 17:02:11 +09005476 if(bta_dm_search_cb.p_ble_rawdata)
5477 {
5478 memcpy((bta_dm_search_cb.p_ble_rawdata + bta_dm_search_cb.ble_raw_used), &service_id,
5479 sizeof(service_id) );
The Android Open Source Project5738f832012-12-12 16:00:35 -08005480
Andre Eisenbachca22ac42013-02-13 17:02:11 +09005481 bta_dm_search_cb.ble_raw_used += sizeof(service_id);
5482 }
5483 else
5484 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005485 APPL_TRACE_ERROR("p_ble_rawdata is NULL");
Andre Eisenbachca22ac42013-02-13 17:02:11 +09005486 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08005487
5488 }
5489 else
5490 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005491 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 -08005492 }
5493
Marie Janssendb554582015-06-26 14:53:46 -07005494 LOG_INFO(LOG_TAG, "%s service_id_uuid_len=%d ", __func__, service_id.uuid.len);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005495 if ( bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE)
5496 {
5497
5498 /* send result back to app now, one by one */
5499 bdcpy (result.disc_ble_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
5500 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 -08005501 result.disc_ble_res.bd_name[BD_NAME_LEN] = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08005502 memcpy(&result.disc_ble_res.service, &service_id.uuid, sizeof(tBT_UUID));
5503
5504 bta_dm_search_cb.p_search_cback(BTA_DM_DISC_BLE_RES_EVT, &result);
5505 }
5506}
5507
5508/*******************************************************************************
5509**
5510** Function bta_dm_gatt_disc_complete
5511**
5512** Description This function process the GATT service search complete.
5513**
5514** Parameters:
5515**
5516*******************************************************************************/
5517static void bta_dm_gatt_disc_complete(UINT16 conn_id, tBTA_GATT_STATUS status)
5518{
5519 tBTA_DM_MSG *p_msg;
5520
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005521 APPL_TRACE_DEBUG("bta_dm_gatt_disc_complete conn_id = %d",conn_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005522
5523 if (bta_dm_search_cb.uuid_to_search > 0) bta_dm_search_cb.uuid_to_search --;
5524
5525 if (status == BTA_GATT_OK && bta_dm_search_cb.uuid_to_search > 0)
5526 {
5527 btm_dm_start_disc_gatt_services(conn_id);
5528 }
5529 else
5530 {
5531 bta_dm_search_cb.uuid_to_search = 0;
5532
5533 /* no more services to be discovered */
5534 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
5535 {
5536 p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
5537 p_msg->disc_result.result.disc_res.result = (status == BTA_GATT_OK) ? BTA_SUCCESS :BTA_FAILURE;
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07005538 APPL_TRACE_DEBUG("%s service found: 0x%08x", __FUNCTION__,
5539 bta_dm_search_cb.services_found);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005540 p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08005541 p_msg->disc_result.result.disc_res.num_uuids = 0;
5542 p_msg->disc_result.result.disc_res.p_uuid_list = NULL;
The Android Open Source Project5738f832012-12-12 16:00:35 -08005543 bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
5544 BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
5545 bta_dm_get_remname(), (BD_NAME_LEN-1));
5546
5547 /* make sure the string is terminated */
5548 p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
5549
Chaojing Sune2805532015-04-22 13:40:21 -07005550 p_msg->disc_result.result.disc_res.device_type |= BT_DEVICE_TYPE_BLE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08005551 if ( bta_dm_search_cb.ble_raw_used > 0 )
5552 {
5553 p_msg->disc_result.result.disc_res.p_raw_data = GKI_getbuf(bta_dm_search_cb.ble_raw_used);
5554
5555 memcpy( p_msg->disc_result.result.disc_res.p_raw_data,
5556 bta_dm_search_cb.p_ble_rawdata,
5557 bta_dm_search_cb.ble_raw_used );
5558
5559 p_msg->disc_result.result.disc_res.raw_data_size = bta_dm_search_cb.ble_raw_used;
5560 }
5561 else
5562 {
5563 p_msg->disc_result.result.disc_res.p_raw_data = NULL;
5564 bta_dm_search_cb.p_ble_rawdata = 0;
5565 }
5566
5567 bta_sys_sendmsg(p_msg);
5568 }
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07005569
The Android Open Source Project5738f832012-12-12 16:00:35 -08005570 if (conn_id != BTA_GATT_INVALID_CONN_ID)
5571 {
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07005572 /* start a GATT channel close delay timer */
5573 bta_sys_start_timer(&bta_dm_search_cb.gatt_close_timer, BTA_DM_DISC_CLOSE_TOUT_EVT,
5574 BTA_DM_GATT_CLOSE_DELAY_TOUT);
5575 bdcpy(bta_dm_search_cb.pending_close_bda, bta_dm_search_cb.peer_bdaddr);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005576 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08005577 bta_dm_search_cb.gatt_disc_active = FALSE;
5578 }
5579}
5580
5581/*******************************************************************************
5582**
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07005583** Function bta_dm_close_gatt_conn
5584**
5585** Description This function close the GATT connection after delay timeout.
5586**
5587** Parameters:
5588**
5589*******************************************************************************/
5590void bta_dm_close_gatt_conn(tBTA_DM_MSG *p_data)
5591{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08005592 UNUSED(p_data);
5593
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07005594 if (bta_dm_search_cb.conn_id != BTA_GATT_INVALID_CONN_ID)
5595 BTA_GATTC_Close(bta_dm_search_cb.conn_id);
5596
VenkatRaghavan VijayaRaghavan76356ae2015-04-21 11:32:29 -07005597 memset(bta_dm_search_cb.pending_close_bda, 0, BD_ADDR_LEN);
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07005598 bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID;
5599}
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07005600/*******************************************************************************
5601**
The Android Open Source Project5738f832012-12-12 16:00:35 -08005602** Function btm_dm_start_gatt_discovery
5603**
5604** Description This is GATT initiate the service search by open a GATT connection
5605** first.
5606**
5607** Parameters:
5608**
5609*******************************************************************************/
5610void btm_dm_start_gatt_discovery (BD_ADDR bd_addr)
5611{
5612 bta_dm_search_cb.gatt_disc_active = TRUE;
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07005613
5614 /* connection is already open */
5615 if (bdcmp(bta_dm_search_cb.pending_close_bda, bd_addr) == 0 &&
5616 bta_dm_search_cb.conn_id != BTA_GATT_INVALID_CONN_ID)
5617 {
5618 memset(bta_dm_search_cb.pending_close_bda, 0, BD_ADDR_LEN);
5619 bta_sys_stop_timer(&bta_dm_search_cb.gatt_close_timer);
5620 btm_dm_start_disc_gatt_services(bta_dm_search_cb.conn_id);
5621 }
5622 else
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07005623 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 -08005624}
5625
5626/*******************************************************************************
5627**
5628** Function bta_dm_cancel_gatt_discovery
5629**
5630** Description This is GATT cancel the GATT service search.
5631**
5632** Parameters:
5633**
5634*******************************************************************************/
5635static void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr)
5636{
5637 if (bta_dm_search_cb.conn_id == BTA_GATT_INVALID_CONN_ID)
5638 {
5639 BTA_GATTC_CancelOpen(bta_dm_search_cb.client_if, bd_addr, TRUE);
5640 }
5641
5642 bta_dm_gatt_disc_complete(bta_dm_search_cb.conn_id, (tBTA_GATT_STATUS) BTA_GATT_ERROR);
5643}
5644
5645/*******************************************************************************
5646**
5647** Function bta_dm_proc_open_evt
5648**
5649** Description process BTA_GATTC_OPEN_EVT in DM.
5650**
5651** Parameters:
5652**
5653*******************************************************************************/
5654void bta_dm_proc_open_evt(tBTA_GATTC_OPEN *p_data)
5655{
5656 UINT8 *p1;
5657 UINT8 *p2;
5658
5659 p1 = bta_dm_search_cb.peer_bdaddr;
5660 p2 = p_data->remote_bda;
5661
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005662 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 -08005663 bta_dm_search_cb.state,
5664 ((p1[0])<<24)+((p1[1])<<16)+((p1[2])<<8)+(p1[3]),
5665 ((p1[4])<<8)+ p1[5],
5666 ((p2[0])<<24)+((p2[1])<<16)+((p2[2])<<8)+(p2[3]),
5667 ((p2[4])<<8)+ p2[5]);
5668
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005669 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 -08005670 p_data->conn_id,
5671 p_data->client_if,
5672 p_data->status);
5673
5674 bta_dm_search_cb.conn_id = p_data->conn_id;
5675
5676 if (p_data->status == BTA_GATT_OK)
5677 {
5678 btm_dm_start_disc_gatt_services(p_data->conn_id);
5679 }
5680 else
5681 {
5682 bta_dm_gatt_disc_complete(BTA_GATT_INVALID_CONN_ID, p_data->status);
5683 }
5684}
5685
5686/*******************************************************************************
5687**
5688** Function bta_dm_gattc_callback
5689**
5690** Description This is GATT client callback function used in DM.
5691**
5692** Parameters:
5693**
5694*******************************************************************************/
5695static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data)
5696{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005697 APPL_TRACE_DEBUG("bta_dm_gattc_callback event = %d", event);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005698
5699 switch (event)
5700 {
5701 case BTA_GATTC_REG_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005702 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 -08005703 if (p_data->reg_oper.status == BTA_GATT_OK)
5704 bta_dm_search_cb.client_if = p_data->reg_oper.client_if;
5705 else
5706 bta_dm_search_cb.client_if = BTA_GATTS_INVALID_IF;
5707 break;
5708
5709 case BTA_GATTC_OPEN_EVT:
5710 bta_dm_proc_open_evt(&p_data->open);
5711 break;
5712
5713 case BTA_GATTC_SEARCH_RES_EVT:
5714 bta_dm_gatt_disc_result(p_data->srvc_res.service_uuid.id);
5715 break;
5716
5717 case BTA_GATTC_SEARCH_CMPL_EVT:
5718 if ( bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE)
5719 bta_dm_gatt_disc_complete(p_data->search_cmpl.conn_id, p_data->search_cmpl.status);
5720 break;
5721
5722 case BTA_GATTC_CLOSE_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005723 APPL_TRACE_DEBUG("BTA_GATTC_CLOSE_EVT reason = %d", p_data->close.reason);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005724 /* in case of disconnect before search is completed */
5725 if ( (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) &&
Nitin Arora4e9acf62014-02-18 15:28:59 -08005726 (bta_dm_search_cb.state != BTA_DM_SEARCH_ACTIVE) &&
The Android Open Source Project5738f832012-12-12 16:00:35 -08005727 !memcmp(p_data->close.remote_bda, bta_dm_search_cb.peer_bdaddr, BD_ADDR_LEN))
5728 {
5729 bta_dm_gatt_disc_complete((UINT16)BTA_GATT_INVALID_CONN_ID, (tBTA_GATT_STATUS) BTA_GATT_ERROR);
5730 }
5731 break;
5732
5733 default:
5734 break;
5735 }
5736}
Satya Callojic4e25962014-05-10 23:46:24 -07005737
The Android Open Source Project5738f832012-12-12 16:00:35 -08005738#endif /* BTA_GATT_INCLUDED */
Andre Eisenbachb203d472013-11-20 17:23:06 -08005739
Bernhard Rosenkränzer104e3f22014-11-12 21:53:08 +01005740#if BLE_VND_INCLUDED == TRUE
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -07005741/*******************************************************************************
5742**
5743** Function bta_dm_ctrl_features_rd_cmpl_cback
5744**
5745** Description callback to handle controller feature read complete
5746**
5747** Parameters:
5748**
5749*******************************************************************************/
5750static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result)
5751{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005752 APPL_TRACE_DEBUG("%s status = %d ", __FUNCTION__, result);
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -07005753 if (result == BTM_SUCCESS)
5754 {
5755 if(bta_dm_cb.p_sec_cback)
5756 bta_dm_cb.p_sec_cback(BTA_DM_LE_FEATURES_READ, NULL);
5757 }
5758 else
5759 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005760 APPL_TRACE_ERROR("%s Ctrl BLE feature read failed: status :%d",__FUNCTION__, result);
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -07005761 }
5762
5763}
Bernhard Rosenkränzer104e3f22014-11-12 21:53:08 +01005764#endif /* BLE_VND_INCLUDED */
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -07005765
The Android Open Source Project5738f832012-12-12 16:00:35 -08005766#endif /* BLE_INCLUDED */