blob: 8012dfe428bf94877828151ef4afd84be98e33aa [file] [log] [blame]
The Android Open Source Project5738f832012-12-12 16:00:35 -08001/******************************************************************************
2 *
3 * Copyright (C) 2003-2012 Broadcom Corporation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18
19/******************************************************************************
20 *
21 * This file contains the action functions for device manager state
22 * machine.
23 *
24 ******************************************************************************/
25
Mike J. Chena89616a2014-02-11 16:23:31 -080026#include "bt_target.h"
The Android Open Source Project5738f832012-12-12 16:00:35 -080027#include "bt_types.h"
28#include "gki.h"
29#include "bd.h"
30#include "bta_sys.h"
31#include "bta_api.h"
32#include "bta_dm_int.h"
33#include "bta_dm_co.h"
34#include "btm_api.h"
35#include "btm_int.h"
36#include "btu.h"
37#include "sdp_api.h"
38#include "l2c_api.h"
39#include "wbt_api.h"
40#include "utl.h"
41#include <string.h>
42
Mike J. Chena02a48c2014-01-31 17:49:43 -080043#if (GAP_INCLUDED == TRUE)
44#include "gap_api.h"
45#endif
46
The Android Open Source Project5738f832012-12-12 16:00:35 -080047static void bta_dm_inq_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir);
48static void bta_dm_inq_cmpl_cb (void * p_result);
49static void bta_dm_service_search_remname_cback (BD_ADDR bd_addr, DEV_CLASS dc, BD_NAME bd_name);
50static void bta_dm_remname_cback (tBTM_REMOTE_DEV_NAME *p_remote_name);
51static void bta_dm_find_services ( BD_ADDR bd_addr);
52static void bta_dm_discover_next_device(void);
53static void bta_dm_sdp_callback (UINT16 sdp_status);
54static 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);
55static UINT8 bta_dm_pin_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name);
56static UINT8 bta_dm_link_key_request_cback (BD_ADDR bd_addr, LINK_KEY key);
57static 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);
58static UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,BD_NAME bd_name, int result);
59static void bta_dm_local_name_cback(BD_ADDR bd_addr);
60static BOOLEAN bta_dm_check_av(UINT16 event);
61#if (BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
62static void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data);
63#else
Andre Eisenbach3aa60542013-03-22 18:00:51 -070064static void bta_dm_acl_change_cback (BD_ADDR p_bda, DEV_CLASS p_dc, BD_NAME p_bdn, UINT8 *features, BOOLEAN is_new);
The Android Open Source Project5738f832012-12-12 16:00:35 -080065#endif
66static void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr);
67
68/* Extended Inquiry Response */
69static UINT8 bta_dm_sp_cback (tBTM_SP_EVT event, tBTM_SP_EVT_DATA *p_data);
70
71#if (BTM_EIR_SERVER_INCLUDED == TRUE)
72static void bta_dm_set_eir (char *local_name);
73#endif /* BTM_EIR_SERVER_INCLUDED */
74
75#if (BTM_EIR_CLIENT_INCLUDED == TRUE)
76static void bta_dm_eir_search_services( tBTM_INQ_RESULTS *p_result,
77 tBTA_SERVICE_MASK *p_services_to_search,
78 tBTA_SERVICE_MASK *p_services_found);
79#endif /* BTM_EIR_CLIENT_INCLUDED */
80
81static void bta_dm_rssi_cback (tBTM_RSSI_RESULTS *p_result);
82static void bta_dm_signal_strength_timer_cback (TIMER_LIST_ENT *p_tle);
83static void bta_dm_link_quality_cback (tBTM_LINK_QUALITY_RESULTS *p_result);
84static void bta_dm_search_timer_cback (TIMER_LIST_ENT *p_tle);
85static void bta_dm_disable_timer_cback (TIMER_LIST_ENT *p_tle);
86static void bta_dm_disable_conn_down_timer_cback (TIMER_LIST_ENT *p_tle);
87static void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr);
88static void bta_dm_adjust_roles(BOOLEAN delay_role_switch);
89static char *bta_dm_get_remname(void);
90static void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result);
91
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -070092static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr,tBT_TRANSPORT transport);
The Android Open Source Project5738f832012-12-12 16:00:35 -080093static void bta_dm_discover_device(BD_ADDR remote_bd_addr);
94
95static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status );
96
97static BOOLEAN bta_dm_dev_blacklisted_for_switch (BD_ADDR remote_bd_addr);
98static void bta_dm_delay_role_switch_cback (TIMER_LIST_ENT *p_tle);
99
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800100static void bta_dm_disable_search_and_disc(void);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800101#if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
102 #if ((defined SMP_INCLUDED) && (SMP_INCLUDED == TRUE))
103static UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_DATA *p_data);
104 #endif
105static void bta_dm_ble_id_key_cback (UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key);
106 #if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE))
Andre Eisenbache1202ca2013-05-15 04:55:08 -0700107static void bta_dm_gattc_register(void);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800108static void btm_dm_start_gatt_discovery ( BD_ADDR bd_addr);
109static void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr);
110static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data);
111 #endif
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800112static void bta_dm_observe_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir);
113static void bta_dm_observe_cmpl_cb (void * p_result);
Ganesh Ganapathi Batta9546abf2014-05-30 16:28:00 -0700114static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800115
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800116#ifndef BTA_DM_BLE_ADV_CHNL_MAP
117#define BTA_DM_BLE_ADV_CHNL_MAP (BTM_BLE_ADV_CHNL_37|BTM_BLE_ADV_CHNL_38|BTM_BLE_ADV_CHNL_39)
118#endif
119#endif
Matthew Xief751b012013-08-13 20:05:34 -0700120static void bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr);
121
The Android Open Source Project5738f832012-12-12 16:00:35 -0800122extern void sdpu_uuid16_to_uuid128(UINT16 uuid16, UINT8* p_uuid128);
123
124const UINT16 bta_service_id_to_uuid_lkup_tbl [BTA_MAX_SERVICE_ID] =
125{
126 UUID_SERVCLASS_PNP_INFORMATION, /* Reserved */
127 UUID_SERVCLASS_SERIAL_PORT, /* BTA_SPP_SERVICE_ID */
128 UUID_SERVCLASS_DIALUP_NETWORKING, /* BTA_DUN_SERVICE_ID */
129 UUID_SERVCLASS_AUDIO_SOURCE, /* BTA_A2DP_SOURCE_SERVICE_ID */
130 UUID_SERVCLASS_LAN_ACCESS_USING_PPP, /* BTA_LAP_SERVICE_ID */
131 UUID_SERVCLASS_HEADSET, /* BTA_HSP_HS_SERVICE_ID */
132 UUID_SERVCLASS_HF_HANDSFREE, /* BTA_HFP_HS_SERVICE_ID */
133 UUID_SERVCLASS_OBEX_OBJECT_PUSH, /* BTA_OPP_SERVICE_ID */
134 UUID_SERVCLASS_OBEX_FILE_TRANSFER, /* BTA_FTP_SERVICE_ID */
135 UUID_SERVCLASS_CORDLESS_TELEPHONY, /* BTA_CTP_SERVICE_ID */
136 UUID_SERVCLASS_INTERCOM, /* BTA_ICP_SERVICE_ID */
137 UUID_SERVCLASS_IRMC_SYNC, /* BTA_SYNC_SERVICE_ID */
138 UUID_SERVCLASS_DIRECT_PRINTING, /* BTA_BPP_SERVICE_ID */
139 UUID_SERVCLASS_IMAGING_RESPONDER, /* BTA_BIP_SERVICE_ID */
140 UUID_SERVCLASS_PANU, /* BTA_PANU_SERVICE_ID */
141 UUID_SERVCLASS_NAP, /* BTA_NAP_SERVICE_ID */
142 UUID_SERVCLASS_GN, /* BTA_GN_SERVICE_ID */
143 UUID_SERVCLASS_SAP, /* BTA_SAP_SERVICE_ID */
144 UUID_SERVCLASS_AUDIO_SINK, /* BTA_A2DP_SERVICE_ID */
145 UUID_SERVCLASS_AV_REMOTE_CONTROL, /* BTA_AVRCP_SERVICE_ID */
146 UUID_SERVCLASS_HUMAN_INTERFACE, /* BTA_HID_SERVICE_ID */
147 UUID_SERVCLASS_VIDEO_SINK, /* BTA_VDP_SERVICE_ID */
148 UUID_SERVCLASS_PBAP_PSE, /* BTA_PBAP_SERVICE_ID */
149 UUID_SERVCLASS_HEADSET_AUDIO_GATEWAY, /* BTA_HSP_SERVICE_ID */
150 UUID_SERVCLASS_AG_HANDSFREE, /* BTA_HFP_SERVICE_ID */
151 UUID_SERVCLASS_MESSAGE_ACCESS, /* BTA_MAP_SERVICE_ID */
152 UUID_SERVCLASS_MESSAGE_NOTIFICATION, /* BTA_MN_SERVICE_ID */
153 UUID_SERVCLASS_HDP_PROFILE, /* BTA_HDP_SERVICE_ID */
154 UUID_SERVCLASS_PBAP_PCE /* BTA_PCE_SERVICE_ID */
155#if BLE_INCLUDED && BTA_GATT_INCLUDED
156 ,UUID_PROTOCOL_ATT /* BTA_GATT_SERVICE_ID */
157#endif
158};
159
160/*
161 * NOTE : The number of element in bta_service_id_to_btm_srv_id_lkup_tbl should be matching with
162 * the value BTA_MAX_SERVICE_ID in bta_api.h
163 *
164 * i.e., If you add new Service ID for BTA, the correct security ID of the new service
165 * from Security service definitions (btm_api.h) should be added to this lookup table.
166 */
167const UINT32 bta_service_id_to_btm_srv_id_lkup_tbl [BTA_MAX_SERVICE_ID] =
168{
169 0, /* Reserved */
170 BTM_SEC_SERVICE_SERIAL_PORT, /* BTA_SPP_SERVICE_ID */
171 BTM_SEC_SERVICE_DUN, /* BTA_DUN_SERVICE_ID */
172 BTM_SEC_SERVICE_AVDTP, /* BTA_AUDIO_SOURCE_SERVICE_ID */
173 BTM_SEC_SERVICE_LAN_ACCESS, /* BTA_LAP_SERVICE_ID */
174 BTM_SEC_SERVICE_HEADSET_AG, /* BTA_HSP_SERVICE_ID */
175 BTM_SEC_SERVICE_AG_HANDSFREE, /* BTA_HFP_SERVICE_ID */
176 BTM_SEC_SERVICE_OBEX, /* BTA_OPP_SERVICE_ID */
177 BTM_SEC_SERVICE_OBEX_FTP, /* BTA_FTP_SERVICE_ID */
178 BTM_SEC_SERVICE_CORDLESS, /* BTA_CTP_SERVICE_ID */
179 BTM_SEC_SERVICE_INTERCOM, /* BTA_ICP_SERVICE_ID */
180 BTM_SEC_SERVICE_IRMC_SYNC, /* BTA_SYNC_SERVICE_ID */
181 BTM_SEC_SERVICE_BPP_JOB, /* BTA_BPP_SERVICE_ID */
182 BTM_SEC_SERVICE_BIP, /* BTA_BIP_SERVICE_ID */
183 BTM_SEC_SERVICE_BNEP_PANU, /* BTA_PANU_SERVICE_ID */
184 BTM_SEC_SERVICE_BNEP_NAP, /* BTA_NAP_SERVICE_ID */
185 BTM_SEC_SERVICE_BNEP_GN, /* BTA_GN_SERVICE_ID */
186 BTM_SEC_SERVICE_SAP, /* BTA_SAP_SERVICE_ID */
187 BTM_SEC_SERVICE_AVDTP, /* BTA_A2DP_SERVICE_ID */
188 BTM_SEC_SERVICE_AVCTP, /* BTA_AVRCP_SERVICE_ID */
Andre Eisenbach2e7fa682013-08-08 15:42:48 -0700189 BTM_SEC_SERVICE_HIDH_SEC_CTRL, /* BTA_HID_SERVICE_ID */
The Android Open Source Project5738f832012-12-12 16:00:35 -0800190 BTM_SEC_SERVICE_AVDTP, /* BTA_VDP_SERVICE_ID */
191 BTM_SEC_SERVICE_PBAP, /* BTA_PBAP_SERVICE_ID */
192 BTM_SEC_SERVICE_HEADSET, /* BTA_HSP_HS_SERVICE_ID */
193 BTM_SEC_SERVICE_HF_HANDSFREE, /* BTA_HFP_HS_SERVICE_ID */
194 BTM_SEC_SERVICE_MAP, /* BTA_MAP_SERVICE_ID */
195 BTM_SEC_SERVICE_MAP, /* BTA_MN_SERVICE_ID */
196 BTM_SEC_SERVICE_HDP_SNK, /* BTA_HDP_SERVICE_ID */
197 BTM_SEC_SERVICE_PBAP /* BTA_PCE_SERVICE_ID */
198#if BLE_INCLUDED && BTA_GATT_INCLUDED
199 ,BTM_SEC_SERVICE_ATT /* BTA_GATT_SERVICE_ID */
200#endif
Andre Eisenbach6975b4d2013-08-05 16:55:38 -0700201
The Android Open Source Project5738f832012-12-12 16:00:35 -0800202};
203
204/* bta security callback */
205const tBTM_APPL_INFO bta_security =
206{
207 &bta_dm_authorize_cback,
208 &bta_dm_pin_cback,
209 &bta_dm_new_link_key_cback,
210 &bta_dm_link_key_request_cback,
211 &bta_dm_authentication_complete_cback,
212 NULL,
213 &bta_dm_bond_cancel_complete_cback,
214#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
215 &bta_dm_sp_cback
216#else
217 NULL
218#endif
219#if BLE_INCLUDED == TRUE
220#if SMP_INCLUDED == TRUE
221 ,&bta_dm_ble_smp_cback
222#endif
223 ,&bta_dm_ble_id_key_cback
224#endif
225
226};
227
228/* TBD... To be moved to some conf file..? */
229#define BTA_DM_MAX_ROLE_SWITCH_BLACKLIST_COUNT 5
230const tBTA_DM_LMP_VER_INFO bta_role_switch_blacklist[BTA_DM_MAX_ROLE_SWITCH_BLACKLIST_COUNT] =
231{
232 {0x000F,0x2000,0x04},
233 {0x00,0x00,0x00},
234 {0x00,0x00,0x00},
235 {0x00,0x00,0x00},
236 {0x00,0x00,0x00}
237};
238
239#define MAX_DISC_RAW_DATA_BUF (4096)
240UINT8 g_disc_raw_data_buf[MAX_DISC_RAW_DATA_BUF];
241
242/*******************************************************************************
243**
The Android Open Source Project5738f832012-12-12 16:00:35 -0800244** Function bta_dm_enable
245**
246** Description Initialises the BT device manager
247**
248**
249** Returns void
250**
251*******************************************************************************/
252void bta_dm_enable(tBTA_DM_MSG *p_data)
253{
254 tBTA_SYS_HW_MSG *sys_enable_event;
255 tBTA_DM_SEC sec_event;
256
The Android Open Source Project5738f832012-12-12 16:00:35 -0800257 /* if already in use, return an error */
258 if( bta_dm_cb.is_bta_dm_active == TRUE )
259 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700260 APPL_TRACE_WARNING("bta_dm_enable - device already started by another application");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800261 memset(&sec_event.enable, 0, sizeof ( tBTA_DM_ENABLE ));
262 sec_event.enable.status = BTA_FAILURE;
263 if( p_data->enable.p_sec_cback != NULL )
264 p_data->enable.p_sec_cback (BTA_DM_ENABLE_EVT, &sec_event);
265 return;
266 }
267
The Android Open Source Project5738f832012-12-12 16:00:35 -0800268 /* first, register our callback to SYS HW manager */
269 bta_sys_hw_register( BTA_SYS_HW_BLUETOOTH, bta_dm_sys_hw_cback );
270
271 /* make sure security callback is saved - if no callback, do not erase the previous one,
272 it could be an error recovery mechanism */
273 if( p_data->enable.p_sec_cback != NULL )
274 bta_dm_cb.p_sec_cback = p_data->enable.p_sec_cback;
275 /* notify BTA DM is now active */
276 bta_dm_cb.is_bta_dm_active = TRUE;
277
278 /* send a message to BTA SYS */
279 if ((sys_enable_event = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL)
280 {
281 sys_enable_event->hdr.event = BTA_SYS_API_ENABLE_EVT;
282 sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH;
283
284 bta_sys_sendmsg(sys_enable_event);
285
286 }
287
288
289
290}
291
292
293
294/*******************************************************************************
295**
296** Function bta_dm_sys_hw_cback
297**
298** Description callback register to SYS to get HW status updates
299**
300**
301** Returns void
302**
303*******************************************************************************/
304static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status )
305{
306 DEV_CLASS dev_class;
307 tBTA_DM_SEC_CBACK *temp_cback;
308#if BLE_INCLUDED == TRUE
309 UINT8 key_mask = 0;
310 BT_OCTET16 er;
311 tBTA_BLE_LOCAL_ID_KEYS id_key;
312 tBT_UUID app_uuid = {LEN_UUID_128,{0}};
313#endif
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700314 APPL_TRACE_DEBUG(" bta_dm_sys_hw_cback with event: %i" , status );
The Android Open Source Project5738f832012-12-12 16:00:35 -0800315
316 /* On H/W error evt, report to the registered DM application callback */
317 if (status == BTA_SYS_HW_ERROR_EVT) {
318 if( bta_dm_cb.p_sec_cback != NULL )
319 bta_dm_cb.p_sec_cback(BTA_DM_HW_ERROR_EVT, NULL);
320 return;
321 }
322 if( status == BTA_SYS_HW_OFF_EVT )
323 {
324 if( bta_dm_cb.p_sec_cback != NULL )
325 bta_dm_cb.p_sec_cback(BTA_DM_DISABLE_EVT, NULL);
326
327 /* reinitialize the control block */
328 memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));
329
330 /* unregister from SYS */
331 bta_sys_hw_unregister( BTA_SYS_HW_BLUETOOTH );
332 /* notify BTA DM is now unactive */
333 bta_dm_cb.is_bta_dm_active = FALSE;
334 }
335 else
336 if( status == BTA_SYS_HW_ON_EVT )
337 {
338 /* FIXME: We should not unregister as the SYS shall invoke this callback on a H/W error.
339 * We need to revisit when this platform has more than one BLuetooth H/W chip */
340 //bta_sys_hw_unregister( BTA_SYS_HW_BLUETOOTH);
341
342 /* save security callback */
343 temp_cback = bta_dm_cb.p_sec_cback;
344 /* make sure the control block is properly initialized */
345 memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));
346 /* and retrieve the callback */
347 bta_dm_cb.p_sec_cback=temp_cback;
348 bta_dm_cb.is_bta_dm_active = TRUE;
349
350 /* hw is ready, go on with BTA DM initialization */
351 memset(&bta_dm_search_cb, 0x00, sizeof(bta_dm_search_cb));
352 memset(&bta_dm_conn_srvcs, 0x00, sizeof(bta_dm_conn_srvcs));
353 memset(&bta_dm_di_cb, 0, sizeof(tBTA_DM_DI_CB));
354
355 memcpy(dev_class, bta_dm_cfg.dev_class, sizeof(dev_class));
356 BTM_SetDeviceClass (dev_class);
357
358#if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
359 /* load BLE local information: ID keys, ER if available */
360 bta_dm_co_ble_load_local_keys(&key_mask, er, &id_key);
361
362 if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ER)
363 {
364 BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ER, (tBTM_BLE_LOCAL_KEYS *)&er);
365 }
366 if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ID)
367 {
368 BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ID, (tBTM_BLE_LOCAL_KEYS *)&id_key);
369 }
Mike J. Chena89616a2014-02-11 16:23:31 -0800370#if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE))
Andre Eisenbach6975b4d2013-08-05 16:55:38 -0700371 bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800372#endif
Mike J. Chena89616a2014-02-11 16:23:31 -0800373#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -0800374
375 BTM_SecRegister((tBTM_APPL_INFO*)&bta_security);
376 BTM_SetDefaultLinkSuperTout(bta_dm_cfg.link_timeout);
377 BTM_WritePageTimeout(bta_dm_cfg.page_timeout);
378 bta_dm_cb.cur_policy = bta_dm_cfg.policy_settings;
379 BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
380#if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
381 BTM_RegBusyLevelNotif (bta_dm_bl_change_cback, NULL, BTM_BL_UPDATE_MASK|BTM_BL_ROLE_CHG_MASK);
382#else
383 BTM_AclRegisterForChanges(bta_dm_acl_change_cback);
384#endif
385 /* Earlier, we used to invoke BTM_ReadLocalAddr which was just copying the bd_addr
386 from the control block and invoking the callback which was sending the DM_ENABLE_EVT.
387 But then we have a few HCI commands being invoked above which were still in progress
388 when the ENABLE_EVT was sent. So modified this to fetch the local name which forces
389 the DM_ENABLE_EVT to be sent only after all the init steps are complete */
390 BTM_ReadLocalDeviceNameFromController((tBTM_CMPL_CB *)bta_dm_local_name_cback);
391
392 bta_sys_rm_register((tBTA_SYS_CONN_CBACK*)bta_dm_rm_cback);
393
394 /* initialize bluetooth low power manager */
395 bta_dm_init_pm();
396
397 bta_sys_policy_register((tBTA_SYS_CONN_CBACK*)bta_dm_policy_cback);
398
Andre Eisenbache1202ca2013-05-15 04:55:08 -0700399#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
400 memset (&app_uuid.uu.uuid128, 0x87, LEN_UUID_128);
401 bta_dm_gattc_register();
402#endif
403
The Android Open Source Project5738f832012-12-12 16:00:35 -0800404 }
405 else
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700406 APPL_TRACE_DEBUG(" --- ignored event");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800407
408}
409
410
411/*******************************************************************************
412**
413** Function bta_dm_disable
414**
415** Description Disables the BT device manager
416**
417**
418** Returns void
419**
420*******************************************************************************/
421void bta_dm_disable (tBTA_DM_MSG *p_data)
422{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -0800423 UNUSED(p_data);
424
The Android Open Source Project5738f832012-12-12 16:00:35 -0800425 /* Set l2cap idle timeout to 0 (so BTE immediately disconnects ACL link after last channel is closed) */
426 L2CA_SetIdleTimeoutByBdAddr((UINT8 *)BT_BD_ANY, 0);
427
428 /* disable all active subsystems */
429 bta_sys_disable(BTA_SYS_HW_BLUETOOTH);
430
431 BTM_SetDiscoverability(BTM_NON_DISCOVERABLE, 0, 0);
432 BTM_SetConnectability(BTM_NON_CONNECTABLE, 0, 0);
433
434 bta_dm_disable_pm();
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800435 bta_dm_disable_search_and_disc();
The Android Open Source Project5738f832012-12-12 16:00:35 -0800436 bta_dm_cb.disabling = TRUE;
437
Nitin Arora021e17a2014-01-29 19:18:39 -0800438#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
439 BTM_BleClearBgConnDev();
440#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -0800441
442 if(BTM_GetNumAclLinks()==0)
443 {
444#if (defined(BTA_DISABLE_DELAY) && BTA_DISABLE_DELAY > 0)
445 /* If BTA_DISABLE_DELAY is defined and greater than zero, then delay the shutdown by
446 * BTA_DISABLE_DELAY milliseconds
447 */
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700448 APPL_TRACE_WARNING("%s BTA_DISABLE_DELAY set to %d ms",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800449 __FUNCTION__, BTA_DISABLE_DELAY);
450 bta_sys_stop_timer(&bta_dm_cb.disable_timer);
451 bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_conn_down_timer_cback;
452 bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, BTA_DISABLE_DELAY);
453#else
454 bta_dm_disable_conn_down_timer_cback(NULL);
455#endif
456 }
457 else
458 {
459 bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_timer_cback;
460 bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 5000);
461 }
462
463}
464
465/*******************************************************************************
466**
467** Function bta_dm_disable_timer_cback
468**
469** Description Called if the disable timer expires
470** Used to close ACL connections which are still active
471**
472**
473**
474** Returns void
475**
476*******************************************************************************/
477static void bta_dm_disable_timer_cback (TIMER_LIST_ENT *p_tle)
478{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -0800479 UNUSED(p_tle);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800480 UINT8 i;
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -0700481 tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
482
The Android Open Source Project5738f832012-12-12 16:00:35 -0800483
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700484 APPL_TRACE_EVENT(" bta_dm_disable_timer_cback ");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800485
486 if(BTM_GetNumAclLinks())
487 {
488 for(i=0; i<bta_dm_cb.device_list.count; i++)
489 {
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -0700490#if (BLE_INCLUDED == TRUE)
491 transport = bta_dm_cb.device_list.peer_device[i].transport;
492#endif
493 btm_remove_acl(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, transport);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800494 }
495
496 }
497 else
498 {
499 bta_dm_cb.disabling = FALSE;
500
501 bta_sys_remove_uuid(UUID_SERVCLASS_PNP_INFORMATION);
502 bta_dm_cb.p_sec_cback(BTA_DM_DISABLE_EVT, NULL);
503 }
504}
505
506
507
508
509/*******************************************************************************
510**
511** Function bta_dm_set_dev_name
512**
513** Description Sets local device name
514**
515**
516** Returns void
517**
518*******************************************************************************/
519void bta_dm_set_dev_name (tBTA_DM_MSG *p_data)
520{
521
522 BTM_SetLocalDeviceName((char*)p_data->set_name.name);
523#if (BTM_EIR_SERVER_INCLUDED == TRUE)
524 bta_dm_set_eir ((char*)p_data->set_name.name);
525#endif
526}
527
528/*******************************************************************************
529**
530** Function bta_dm_set_visibility
531**
532** Description Sets discoverability, connectability and pairability
533**
534**
535** Returns void
536**
537*******************************************************************************/
538void bta_dm_set_visibility (tBTA_DM_MSG *p_data)
539{
540
541
542 /* set modes for Discoverability and connectability if not ignore */
543 if (p_data->set_visibility.disc_mode != BTA_DM_IGNORE)
544 BTM_SetDiscoverability((UINT8)p_data->set_visibility.disc_mode,
545 bta_dm_cb.inquiry_scan_window,
546 bta_dm_cb.inquiry_scan_interval);
547
548 if (p_data->set_visibility.conn_mode != BTA_DM_IGNORE)
549 BTM_SetConnectability((UINT8)p_data->set_visibility.conn_mode,
550 bta_dm_cb.page_scan_window,
551 bta_dm_cb.page_scan_interval);
552
553 /* Send False or True if not ignore */
554 if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE )
555 {
556
557 if (p_data->set_visibility.pair_mode == BTA_DM_NON_PAIRABLE)
558 bta_dm_cb.disable_pair_mode = TRUE;
559 else
560 bta_dm_cb.disable_pair_mode = FALSE;
561
562 }
563
564 /* Send False or True if not ignore */
565 if (p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE)
566 {
567
568 if (p_data->set_visibility.conn_paired_only == BTA_DM_CONN_ALL)
569 bta_dm_cb.conn_paired_only = FALSE;
570 else
571 bta_dm_cb.conn_paired_only = TRUE;
572
573 }
574
575 /* Change mode if either mode is not ignore */
576 if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE || p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE)
577 BTM_SetPairableMode((BOOLEAN)(!(bta_dm_cb.disable_pair_mode)),bta_dm_cb.conn_paired_only);
578
579}
580
581
582/*******************************************************************************
583**
584** Function bta_dm_set_afhchannels
585**
586** Description This function sets the AFH first and
587** last disable channel, so channels within
588** that range are disabled.
589**
590**
591** Returns void
592**
593*******************************************************************************/
594void bta_dm_set_afhchannels (tBTA_DM_MSG *p_data)
595{
596 BTM_SetAfhChannels(p_data->set_afhchannels.first,p_data->set_afhchannels.last);
597
598}
599
600
601/*******************************************************************************
602**
603** Function bta_dm_vendor_spec_command
604**
605** Description Send a vendor specific command to the controller
606**
607**
608** Returns void
609**
610*******************************************************************************/
611void bta_dm_vendor_spec_command (tBTA_DM_MSG *p_data)
612{
613 tBTM_STATUS status;
614
615 status = BTM_VendorSpecificCommand(p_data->vendor_command.opcode,p_data->vendor_command.param_len,p_data->vendor_command.p_param_buf, p_data->vendor_command.p_cback);
616
617}
618
619
620/*******************************************************************************
621**
622** Function bta_dm_tx_inqpower
623**
624** Description write inquiry tx power.
625**
626**
627** Returns void
628**
629*******************************************************************************/
630void bta_dm_tx_inqpower(tBTA_DM_MSG *p_data)
631{
632 if (BTM_WriteInquiryTxPower (p_data->tx_inq_pwr.tx_power) == BTM_ILLEGAL_VALUE)
633 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700634 APPL_TRACE_ERROR("Invalid Inquiry Tx Power: %d", p_data->tx_inq_pwr.tx_power);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800635 }
636 return;
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 int i;
650 tBTA_DM_SEC sec_event;
651
Zhihai Xubd68d682013-11-15 17:55:46 -0800652#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
653 /* need to remove all pending background connection before unpair */
654 BTA_GATTC_CancelOpen(0, p_dev->bd_addr, FALSE);
655#endif
656
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -0700657 if ( BTM_IsAclConnectionUp(p_dev->bd_addr, BT_TRANSPORT_LE) ||
658 BTM_IsAclConnectionUp(p_dev->bd_addr, BT_TRANSPORT_BR_EDR))
The Android Open Source Project5738f832012-12-12 16:00:35 -0800659 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700660 APPL_TRACE_DEBUG("%s: ACL Up count %d", __FUNCTION__,bta_dm_cb.device_list.count);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800661 /* Take the link down first, and mark the device for removal when disconnected */
The Android Open Source Project5738f832012-12-12 16:00:35 -0800662
663 for(i=0; i<bta_dm_cb.device_list.count; i++)
664 {
665 if(!bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_dev->bd_addr))
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -0700666 {
667 bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_UNPAIRING;
668 btm_remove_acl( p_dev->bd_addr,bta_dm_cb.device_list.peer_device[i].transport);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700669 APPL_TRACE_DEBUG("%s:transport = %d", __FUNCTION__,
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -0700670 bta_dm_cb.device_list.peer_device[i].transport);
671 break;
672 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800673 }
674 }
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -0700675
The Android Open Source Project5738f832012-12-12 16:00:35 -0800676 else /* Ok to remove the device in application layer */
677 {
678 BTM_SecDeleteDevice(p_dev->bd_addr);
Zhihai Xubd68d682013-11-15 17:55:46 -0800679#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
680 /* remove all cached GATT information */
681 BTA_GATTC_Refresh(p_dev->bd_addr);
682#endif
683
The Android Open Source Project5738f832012-12-12 16:00:35 -0800684 if( bta_dm_cb.p_sec_cback )
685 {
686 bdcpy(sec_event.link_down.bd_addr, p_dev->bd_addr);
687 /* No connection, set status to success (acl disc code not valid) */
688 sec_event.link_down.status = HCI_SUCCESS;
689 bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &sec_event);
690 }
691 }
692}
693
694/*******************************************************************************
695**
696** Function bta_dm_add_device
697**
698** Description This function adds a Link Key to an security database entry.
699** It is normally called during host startup to restore all required information
700** stored in the NVRAM.
701****
702*******************************************************************************/
703void bta_dm_add_device (tBTA_DM_MSG *p_data)
704{
705 tBTA_DM_API_ADD_DEVICE *p_dev = &p_data->add_dev;
706 UINT8 *p_dc = NULL;
707 UINT8 *p_lc = NULL;
708 UINT32 trusted_services_mask[BTM_SEC_SERVICE_ARRAY_SIZE];
709 UINT8 index = 0;
710 UINT8 btm_mask_index = 0;
711
712 memset (trusted_services_mask, 0, sizeof(trusted_services_mask));
713
714 /* If not all zeros, the device class has been specified */
715 if (p_dev->dc_known)
716 p_dc = (UINT8 *)p_dev->dc;
717
718 if (p_dev->link_key_known)
719 p_lc = (UINT8 *)p_dev->link_key;
720
721 if (p_dev->is_trusted)
722 {
723 /* covert BTA service mask to BTM mask */
724 while (p_dev->tm && (index < BTA_MAX_SERVICE_ID))
725 {
726 if (p_dev->tm & (UINT32)(1<<index))
727 {
728
729 btm_mask_index = bta_service_id_to_btm_srv_id_lkup_tbl[index] / BTM_SEC_ARRAY_BITS;
730 trusted_services_mask[btm_mask_index] |= (UINT32)(1 << (bta_service_id_to_btm_srv_id_lkup_tbl[index] - (UINT32)(btm_mask_index * 32)));
731
732 p_dev->tm &= (UINT32)(~(1<<index));
733
734 }
735 index++;
736 }
737 }
738
739 if (!BTM_SecAddDevice (p_dev->bd_addr, p_dc, p_dev->bd_name, p_dev->features,
740 trusted_services_mask, p_lc, p_dev->key_type, p_dev->io_cap))
741 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700742 APPL_TRACE_ERROR ("BTA_DM: Error adding device %08x%04x",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800743 (p_dev->bd_addr[0]<<24)+(p_dev->bd_addr[1]<<16)+(p_dev->bd_addr[2]<<8)+p_dev->bd_addr[3],
744 (p_dev->bd_addr[4]<<8)+p_dev->bd_addr[5]);
745 }
746}
747
748/*******************************************************************************
749**
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800750** Function bta_dm_close_acl
751**
752** Description This function forces to close the connection to a remote device
753** and optionaly remove the device from security database if
754** required.
755****
756*******************************************************************************/
757void bta_dm_close_acl(tBTA_DM_MSG *p_data)
758{
759 tBTA_DM_API_REMOVE_ACL *p_remove_acl = &p_data->remove_acl;
760 UINT8 index;
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -0700761 tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800762
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700763 APPL_TRACE_DEBUG("bta_dm_close_acl");
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800764
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -0700765 if ( BTM_IsAclConnectionUp(p_remove_acl->bd_addr, BT_TRANSPORT_LE) ||
766 BTM_IsAclConnectionUp(p_remove_acl->bd_addr, BT_TRANSPORT_BR_EDR))
767
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800768 {
769 for (index = 0; index < bta_dm_cb.device_list.count; index ++)
770 {
771 if (!bdcmp( bta_dm_cb.device_list.peer_device[index].peer_bdaddr, p_remove_acl->bd_addr))
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -0700772 {
773#if defined (BLE_INCLUDED) && (BLE_INCLUDED == TRUE)
774 transport = bta_dm_cb.device_list.peer_device[index].transport;
775#endif
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800776 break;
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -0700777 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800778 }
779 if (index != bta_dm_cb.device_list.count)
780 {
781 if (p_remove_acl->remove_dev)
782 bta_dm_cb.device_list.peer_device[index].remove_dev_pending = TRUE;
783 }
784 else
785 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700786 APPL_TRACE_ERROR("unknown device, remove ACL failed");
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800787 }
788 /* Disconnect the ACL link */
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -0700789 btm_remove_acl(p_remove_acl->bd_addr, transport);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800790 }
791 /* if to remove the device from security database ? do it now */
792 else if (p_remove_acl->remove_dev)
793 {
794 if (!BTM_SecDeleteDevice(p_remove_acl->bd_addr))
795 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700796 APPL_TRACE_ERROR("delete device from security database failed.");
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800797 }
798#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
799 /* need to remove all pending background connection if any */
800 BTA_GATTC_CancelOpen(0, p_remove_acl->bd_addr, FALSE);
801 /* remove all cached GATT information */
802 BTA_GATTC_Refresh(p_remove_acl->bd_addr);
803#endif
804 }
805 /* otherwise, no action needed */
806
807}
808/*******************************************************************************
809**
The Android Open Source Project5738f832012-12-12 16:00:35 -0800810** Function bta_dm_bond
811**
812** Description Bonds with peer device
813**
814**
815** Returns void
816**
817*******************************************************************************/
818void bta_dm_bond (tBTA_DM_MSG *p_data)
819{
820 tBTM_STATUS status;
821 tBTA_DM_SEC sec_event;
822 char *p_name;
823
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -0700824 if (p_data->bond.transport == BTA_TRANSPORT_UNKNOWN)
825 status = BTM_SecBond ( p_data->bond.bd_addr, 0, NULL, 0 );
826 else
827 status = BTM_SecBondByTransport ( p_data->bond.bd_addr, p_data->bond.transport, 0, NULL, 0 );
828
The Android Open Source Project5738f832012-12-12 16:00:35 -0800829
830 if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED))
831 {
832
The Android Open Source Project5738f832012-12-12 16:00:35 -0800833 memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
834 bdcpy(sec_event.auth_cmpl.bd_addr, p_data->bond.bd_addr);
Kim Schulz2a2701c2013-09-16 15:59:33 +0200835 p_name = BTM_SecReadDevName(p_data->bond.bd_addr);
836 if (p_name != NULL)
837 {
838 memcpy(sec_event.auth_cmpl.bd_name, p_name, (BD_NAME_LEN-1));
839 sec_event.auth_cmpl.bd_name[BD_NAME_LEN-1] = 0;
840 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800841
842/* taken care of by memset [above]
843 sec_event.auth_cmpl.key_present = FALSE;
844 sec_event.auth_cmpl.success = FALSE;
845*/
846 sec_event.auth_cmpl.fail_reason = HCI_ERR_ILLEGAL_COMMAND;
847 if (status == BTM_SUCCESS)
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800848 {
The Android Open Source Project5738f832012-12-12 16:00:35 -0800849 sec_event.auth_cmpl.success = TRUE;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800850 }
851 else
852 {
853 /* delete this device entry from Sec Dev DB */
854 bta_dm_remove_sec_dev_entry(p_data->bond.bd_addr);
855 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800856 bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
857 }
858
859}
860
861/*******************************************************************************
862**
863** Function bta_dm_bond_cancel
864**
865** Description Cancels bonding with a peer device
866**
867**
868** Returns void
869**
870*******************************************************************************/
871void bta_dm_bond_cancel (tBTA_DM_MSG *p_data)
872{
873 tBTM_STATUS status;
874 tBTA_DM_SEC sec_event;
875
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700876 APPL_TRACE_EVENT(" bta_dm_bond_cancel ");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800877 status = BTM_SecBondCancel ( p_data->bond_cancel.bd_addr );
878
879 if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED && status != BTM_SUCCESS))
880 {
881 sec_event.bond_cancel_cmpl.result = BTA_FAILURE;
882
883 bta_dm_cb.p_sec_cback(BTA_DM_BOND_CANCEL_CMPL_EVT, &sec_event);
884 }
885
886}
887
888/*******************************************************************************
889**
890** Function bta_dm_pin_reply
891**
892** Description Send the pin_reply to a request from BTM
893**
894**
895** Returns void
896**
897*******************************************************************************/
898void bta_dm_pin_reply (tBTA_DM_MSG *p_data)
899{
900 UINT32 trusted_mask[BTM_SEC_SERVICE_ARRAY_SIZE];
901 UINT32 * current_trusted_mask;
902
903 current_trusted_mask = BTM_ReadTrustedMask(p_data->pin_reply.bd_addr);
904
905 if(current_trusted_mask)
906 {
907 memcpy(trusted_mask, current_trusted_mask, sizeof(trusted_mask));
908 }
909 else
910 {
911 memset(trusted_mask, 0, sizeof(trusted_mask));
912 }
913
914 if(p_data->pin_reply.accept)
915 {
916
917 BTM_PINCodeReply(p_data->pin_reply.bd_addr, BTM_SUCCESS, p_data->pin_reply.pin_len, p_data->pin_reply.p_pin, trusted_mask );
918 }
919 else
920 {
921 BTM_PINCodeReply(p_data->pin_reply.bd_addr, BTM_NOT_AUTHORIZED, 0, NULL, trusted_mask );
922 }
923
924}
925
926/*******************************************************************************
927**
928** Function bta_dm_link_policy
929**
930** Description remove/set link policy mask.
931** wake the link, is sniff/park is removed
932**
933** Returns void
934**
935*******************************************************************************/
936void bta_dm_link_policy (tBTA_DM_MSG *p_data)
937{
938 tBTA_DM_PEER_DEVICE *p_dev;
939
940 p_dev = bta_dm_find_peer_device(p_data->link_policy.bd_addr);
941 if(!p_dev)
942 return;
943
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700944 APPL_TRACE_DEBUG(" bta_dm_link_policy set:%d, policy:0x%x",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800945 p_data->link_policy.set, p_data->link_policy.policy_mask);
946 if(p_data->link_policy.set)
947 {
948 /* restore the default link policy */
949 p_dev->link_policy |= p_data->link_policy.policy_mask;
950 BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
951 }
952 else
953 {
954 /* clear the policy from the default link policy */
955 p_dev->link_policy &= (~p_data->link_policy.policy_mask);
956 BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
957
958 if(p_data->link_policy.policy_mask & (HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_PARK_MODE))
959 {
960 /* if clearing sniff/park, wake the link */
961 bta_dm_pm_active(p_dev->peer_bdaddr);
962 }
963 }
964}
965
966/*******************************************************************************
967**
968** Function bta_dm_policy_cback
969**
970** Description process the link policy changes
971**
972** Returns void
973**
974*******************************************************************************/
975static void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
976{
977 tBTA_DM_PEER_DEVICE *p_dev = NULL;
978 UINT16 policy = app_id;
979 UINT32 mask = (UINT32)(1 << id);
980
981 if(peer_addr)
982 p_dev = bta_dm_find_peer_device(peer_addr);
983
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700984 APPL_TRACE_DEBUG(" bta_dm_policy_cback cmd:%d, policy:0x%x",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800985 status, policy);
986 switch(status)
987 {
988 case BTA_SYS_PLCY_SET:
989 if(!p_dev)
990 return;
991 /* restore the default link policy */
992 p_dev->link_policy |= policy;
993 BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
994 break;
995
996 case BTA_SYS_PLCY_CLR:
997 if(!p_dev)
998 return;
999 /* clear the policy from the default link policy */
1000 p_dev->link_policy &= (~policy);
1001 BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
1002
1003 if(policy & (HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_PARK_MODE))
1004 {
1005 /* if clearing sniff/park, wake the link */
1006 bta_dm_pm_active(p_dev->peer_bdaddr);
1007 }
1008 break;
1009
1010 case BTA_SYS_PLCY_DEF_SET:
1011 /* want to restore/set the role switch policy */
1012 bta_dm_cb.role_policy_mask &= ~mask;
1013 if(0 == bta_dm_cb.role_policy_mask)
1014 {
1015 /* if nobody wants to insist on the role */
1016 bta_dm_cb.cur_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH;
1017 BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
1018 }
1019 break;
1020
1021 case BTA_SYS_PLCY_DEF_CLR:
1022 /* want to remove the role switch policy */
1023 bta_dm_cb.role_policy_mask |= mask;
1024 bta_dm_cb.cur_policy &= ~HCI_ENABLE_MASTER_SLAVE_SWITCH;
1025 BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
1026 break;
1027 }
1028}
1029
1030
1031/*******************************************************************************
1032**
1033** Function bta_dm_auth_reply
1034**
1035** Description Send the authorization reply to a request from BTM
1036**
1037**
1038** Returns void
1039**
1040*******************************************************************************/
1041void bta_dm_auth_reply (tBTA_DM_MSG *p_data)
1042{
1043
1044 UINT32 trusted_mask[BTM_SEC_SERVICE_ARRAY_SIZE];
1045 UINT8 btm_mask_index = 0;
1046 UINT32 * current_trusted_mask;
1047
1048 current_trusted_mask = BTM_ReadTrustedMask(p_data->auth_reply.bd_addr);
1049
1050 if(current_trusted_mask)
1051 {
1052 memcpy(trusted_mask, current_trusted_mask, sizeof(trusted_mask));
1053 }
1054 else
1055 {
1056 memset(trusted_mask, 0, sizeof(trusted_mask));
1057 }
1058
1059 if(p_data->auth_reply.response != BTA_DM_NOT_AUTH)
1060 {
1061 if(p_data->auth_reply.response == BTA_DM_AUTH_PERM)
1062 {
1063 if(p_data->auth_reply.service < BTA_MAX_SERVICE_ID)
1064 {
1065 /* convert BTA service id to BTM mask */
1066 btm_mask_index = bta_service_id_to_btm_srv_id_lkup_tbl[p_data->auth_reply.service] / 32;
1067 trusted_mask[btm_mask_index] |= (UINT32)(1 << (bta_service_id_to_btm_srv_id_lkup_tbl[p_data->auth_reply.service] - (UINT32)(btm_mask_index * 32)));
1068
1069 }
1070 }
1071 BTM_DeviceAuthorized (p_data->auth_reply.bd_addr, BTM_SUCCESS,trusted_mask);
1072 }
1073 else
1074 {
1075 BTM_DeviceAuthorized (p_data->auth_reply.bd_addr, BTM_NOT_AUTHORIZED,trusted_mask);
1076 }
1077
1078}
1079
1080/*******************************************************************************
1081**
1082** Function bta_dm_confirm
1083**
1084** Description Send the user confirm request reply in response to a
1085** request from BTM
1086**
1087** Returns void
1088**
1089*******************************************************************************/
1090void bta_dm_confirm(tBTA_DM_MSG *p_data)
1091{
1092 tBTM_STATUS res = BTM_NOT_AUTHORIZED;
1093
1094 if(p_data->confirm.accept == TRUE)
1095 res = BTM_SUCCESS;
1096 BTM_ConfirmReqReply(res, p_data->confirm.bd_addr);
1097}
1098
1099/*******************************************************************************
1100**
1101** Function bta_dm_passkey_cancel
1102**
1103** Description Send the passkey cancel from SP initiator by sending a negative
1104** passkey request replyreply.
1105** Returns void
1106**
1107*******************************************************************************/
1108#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
1109void bta_dm_passkey_cancel(tBTA_DM_MSG *p_data)
1110{
1111 BTM_PasskeyReqReply(BTM_NOT_AUTHORIZED, p_data->passkey_cancel.bd_addr, 0);
1112}
1113#endif
1114
1115/*******************************************************************************
1116**
1117** Function bta_dm_loc_oob
1118**
1119** Description Retrieve the OOB data from the local LM
1120**
1121** Returns void
1122**
1123*******************************************************************************/
1124#if (BTM_OOB_INCLUDED == TRUE)
1125void bta_dm_loc_oob(tBTA_DM_MSG *p_data)
1126{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08001127 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001128 BTM_ReadLocalOobData();
1129}
1130
1131/*******************************************************************************
1132**
1133** Function bta_dm_ci_io_req_act
1134**
1135** Description respond to the IO capabilities request from BTM
1136**
1137** Returns void
1138**
1139*******************************************************************************/
1140void bta_dm_ci_io_req_act(tBTA_DM_MSG *p_data)
1141{
1142 tBTM_AUTH_REQ auth_req = BTM_AUTH_AP_NO;
1143 if(p_data->ci_io_req.auth_req)
1144 auth_req = BTM_AUTH_AP_YES;
1145 BTM_IoCapRsp(p_data->ci_io_req.bd_addr, p_data->ci_io_req.io_cap,
1146 p_data->ci_io_req.oob_data, auth_req);
1147}
1148
1149/*******************************************************************************
1150**
1151** Function bta_dm_ci_rmt_oob_act
1152**
1153** Description respond to the OOB data request for the remote device from BTM
1154**
1155**
1156** Returns void
1157**
1158*******************************************************************************/
1159void bta_dm_ci_rmt_oob_act(tBTA_DM_MSG *p_data)
1160{
1161 tBTM_STATUS res = BTM_NOT_AUTHORIZED;
1162
1163 if(p_data->ci_rmt_oob.accept == TRUE)
1164 res = BTM_SUCCESS;
1165 BTM_RemoteOobDataReply(res, p_data->ci_rmt_oob.bd_addr,
1166 p_data->ci_rmt_oob.c, p_data->ci_rmt_oob.r );
1167}
1168#endif /* BTM_OOB_INCLUDED */
1169
1170/*******************************************************************************
1171**
1172** Function bta_dm_search_start
1173**
1174** Description Starts an inquiry
1175**
1176**
1177** Returns void
1178**
1179*******************************************************************************/
1180void bta_dm_search_start (tBTA_DM_MSG *p_data)
1181{
1182 tBTM_INQUIRY_CMPL result;
1183
Andre Eisenbache1202ca2013-05-15 04:55:08 -07001184#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001185 UINT16 len = (UINT16)(sizeof(tBT_UUID) * p_data->search.num_uuid);
1186#endif
1187
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001188 APPL_TRACE_DEBUG("bta_dm_search_start avoid_scatter=%d", bta_dm_cfg.avoid_scatter);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001189 if (bta_dm_cfg.avoid_scatter &&
1190 (p_data->search.rs_res == BTA_DM_RS_NONE) && bta_dm_check_av(BTA_DM_API_SEARCH_EVT))
1191 {
1192 memcpy(&bta_dm_cb.search_msg, &p_data->search, sizeof(tBTA_DM_API_SEARCH));
1193 return;
1194 }
1195
1196 BTM_ClearInqDb(NULL);
1197 /* save search params */
1198 bta_dm_search_cb.p_search_cback = p_data->search.p_cback;
1199 bta_dm_search_cb.services = p_data->search.services;
1200
1201#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
1202 utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
1203
1204 if ((bta_dm_search_cb.num_uuid = p_data->search.num_uuid) != 0 &&
1205 p_data->search.p_uuid != NULL)
1206 {
1207 if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len)) == NULL)
1208 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001209 APPL_TRACE_ERROR("bta_dm_search_start no resources");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001210
1211 result.status = BTA_FAILURE;
1212 result.num_resp = 0;
1213 bta_dm_inq_cmpl_cb ((void *)&result);
1214 return;
1215 }
1216// bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len);
1217 memcpy(bta_dm_search_cb.p_srvc_uuid, p_data->search.p_uuid, len);
1218 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001219#endif
1220 result.status = BTM_StartInquiry( (tBTM_INQ_PARMS*)&p_data->search.inq_params,
1221 bta_dm_inq_results_cb,
1222 (tBTM_CMPL_CB*) bta_dm_inq_cmpl_cb);
1223
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001224 APPL_TRACE_EVENT("bta_dm_search_start status=%d", result.status);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001225 if (result.status != BTM_CMD_STARTED)
1226 {
1227 result.num_resp = 0;
1228 bta_dm_inq_cmpl_cb ((void *)&result);
1229 }
1230
1231}
1232
1233/*******************************************************************************
1234**
1235** Function bta_dm_search_cancel
1236**
1237** Description Cancels an ongoing search for devices
1238**
1239**
1240** Returns void
1241**
1242*******************************************************************************/
1243void bta_dm_search_cancel (tBTA_DM_MSG *p_data)
1244{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08001245 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001246 tBTA_DM_MSG * p_msg;
1247
1248 if(BTM_IsInquiryActive())
1249 {
1250 BTM_CancelInquiry();
1251 bta_dm_search_cancel_notify(NULL);
1252
1253 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1254 {
1255 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1256 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1257 bta_sys_sendmsg(p_msg);
1258
1259 }
1260 }
1261 /* If no Service Search going on then issue cancel remote name in case it is active */
1262 else if (!bta_dm_search_cb.name_discover_done)
1263 {
1264 BTM_CancelRemoteDeviceName();
1265 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001266#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
The Android Open Source Project5738f832012-12-12 16:00:35 -08001267 if (bta_dm_search_cb.gatt_disc_active)
1268 {
1269 bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
1270 }
1271#endif
1272}
1273
1274/*******************************************************************************
1275**
1276** Function bta_dm_discover
1277**
1278** Description Discovers services on a remote device
1279**
1280**
1281** Returns void
1282**
1283*******************************************************************************/
1284void bta_dm_discover (tBTA_DM_MSG *p_data)
1285{
1286#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
1287 UINT16 len = (UINT16)(sizeof(tBT_UUID) * p_data->discover.num_uuid);
1288#endif
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001289 APPL_TRACE_EVENT("bta_dm_discover services_to_search=0x%04X, sdp_search=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001290 p_data->discover.services, p_data->discover.sdp_search);
1291
1292 /* save the search condition */
1293 bta_dm_search_cb.services = p_data->discover.services;
1294
1295#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
1296 utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
1297 if ((bta_dm_search_cb.num_uuid = p_data->discover.num_uuid) != 0 &&
1298 p_data->discover.p_uuid != NULL)
1299 {
1300 if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len)) == NULL)
1301 {
1302 p_data->discover.p_cback(BTA_DM_DISC_CMPL_EVT, NULL);
1303 return;
1304 }
1305 memcpy(bta_dm_search_cb.p_srvc_uuid, p_data->discover.p_uuid, len);
1306 }
1307 bta_dm_search_cb.uuid_to_search = bta_dm_search_cb.num_uuid;
1308#endif
1309
1310 bta_dm_search_cb.p_search_cback = p_data->discover.p_cback;
1311 bta_dm_search_cb.sdp_search = p_data->discover.sdp_search;
1312 bta_dm_search_cb.services_to_search = bta_dm_search_cb.services;
1313 bta_dm_search_cb.service_index = 0;
1314 bta_dm_search_cb.services_found = 0;
1315 bta_dm_search_cb.peer_name[0] = 0;
1316 bta_dm_search_cb.sdp_search = p_data->discover.sdp_search;
1317 bta_dm_search_cb.p_btm_inq_info = BTM_InqDbRead (p_data->discover.bd_addr);
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07001318 bta_dm_search_cb.transport = p_data->discover.transport;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001319
1320 bta_dm_search_cb.name_discover_done = FALSE;
1321 memcpy(&bta_dm_search_cb.uuid, &p_data->discover.uuid, sizeof(tSDP_UUID));
1322 bta_dm_discover_device(p_data->discover.bd_addr);
1323}
1324
1325/*******************************************************************************
1326**
1327** Function bta_dm_di_disc_cmpl
1328**
1329** Description Sends event to application when DI discovery complete
1330**
1331** Returns void
1332**
1333*******************************************************************************/
1334void bta_dm_di_disc_cmpl(tBTA_DM_MSG *p_data)
1335{
1336 tBTA_DM_DI_DISC_CMPL di_disc;
1337
1338 memset(&di_disc, 0, sizeof(tBTA_DM_DI_DISC_CMPL));
1339 bdcpy(di_disc.bd_addr, bta_dm_search_cb.peer_bdaddr);
1340
1341 if((p_data->hdr.offset == SDP_SUCCESS)
1342 || (p_data->hdr.offset == SDP_DB_FULL))
1343 {
1344 di_disc.num_record = SDP_GetNumDiRecords(bta_dm_di_cb.p_di_db);
1345 }
1346 else
1347 di_disc.result = BTA_FAILURE;
1348
1349 bta_dm_di_cb.p_di_db = NULL;
1350 bta_dm_search_cb.p_search_cback(BTA_DM_DI_DISC_CMPL_EVT, (tBTA_DM_SEARCH *) &di_disc);
1351}
1352
1353/*******************************************************************************
1354**
1355** Function bta_dm_di_disc_callback
1356**
1357** Description This function queries a remote device for DI information.
1358**
1359**
1360** Returns void
1361**
1362*******************************************************************************/
1363static void bta_dm_di_disc_callback(UINT16 result)
1364{
1365 tBTA_DM_MSG * p_msg;
1366
1367 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1368 {
1369 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1370 p_msg->hdr.layer_specific = BTA_DM_API_DI_DISCOVER_EVT;
1371 p_msg->hdr.offset = result;
1372 bta_sys_sendmsg(p_msg);
1373 }
1374}
1375
1376/*******************************************************************************
1377**
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001378** Function bta_dm_disable_search_and_disc
1379**
1380** Description Cancels an ongoing search or discovery for devices in case of
1381** a Bluetooth disable
1382**
1383**
1384** Returns void
1385**
1386*******************************************************************************/
1387static void bta_dm_disable_search_and_disc (void)
1388{
1389 tBTA_DM_DI_DISC_CMPL di_disc;
1390 tBTA_DM_MSG * p_msg;
1391
1392 if(BTM_IsInquiryActive()||(bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE))
1393 {
1394 BTM_CancelInquiry();
1395 bta_dm_search_cancel_notify(NULL);
1396
1397 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1398 {
1399 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1400 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1401 bta_sys_sendmsg(p_msg);
1402
1403 }
1404 }
1405 /* If no Service Search going on then issue cancel remote name in case it is active */
1406 else if (!bta_dm_search_cb.name_discover_done)
1407 {
1408 BTM_CancelRemoteDeviceName();
1409
1410 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1411 {
1412 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1413 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1414 bta_sys_sendmsg(p_msg);
1415 }
1416 }
1417 else if(bta_dm_di_cb.p_di_db != NULL)
1418 {
1419 memset(&di_disc, 0, sizeof(tBTA_DM_DI_DISC_CMPL));
1420 bdcpy(di_disc.bd_addr, bta_dm_search_cb.peer_bdaddr);
1421 di_disc.result = BTA_FAILURE;
1422
1423 bta_dm_di_cb.p_di_db = NULL;
1424 bta_dm_search_cb.p_search_cback(BTA_DM_DI_DISC_CMPL_EVT, NULL);
1425 }
1426
1427#if (BLE_INCLUDED == TRUE) && (BTA_GATT_INCLUDED == TRUE)
1428 if (bta_dm_search_cb.gatt_disc_active)
1429 {
1430 bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
1431 }
1432#endif
1433}
1434
1435/*******************************************************************************
1436**
The Android Open Source Project5738f832012-12-12 16:00:35 -08001437** Function bta_dm_di_disc
1438**
1439** Description This function queries a remote device for DI information.
1440**
1441**
1442** Returns void
1443**
1444*******************************************************************************/
1445void bta_dm_di_disc (tBTA_DM_MSG *p_data)
1446{
1447 UINT16 result = BTA_FAILURE;
1448 tBTA_DM_MSG *p_msg;
1449
1450 bta_dm_search_cb.p_search_cback = p_data->di_disc.p_cback;
1451 bdcpy(bta_dm_search_cb.peer_bdaddr, p_data->di_disc.bd_addr);
1452 bta_dm_di_cb.p_di_db = p_data->di_disc.p_sdp_db;
1453
1454 if((bta_dm_search_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)GKI_getbuf(BTA_DM_SDP_DB_SIZE)) != NULL)
1455 {
1456 if ( SDP_DiDiscover(bta_dm_search_cb.peer_bdaddr, p_data->di_disc.p_sdp_db,
1457 p_data->di_disc.len, bta_dm_di_disc_callback) == SDP_SUCCESS)
1458 {
1459 result = BTA_SUCCESS;
1460 }
1461 }
1462 else
1463 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001464 APPL_TRACE_ERROR("No buffer to start DI discovery");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001465 }
1466
1467 if ( result == BTA_FAILURE &&
1468 (p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1469 {
1470 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1471 p_msg->hdr.layer_specific = BTA_DM_API_DI_DISCOVER_EVT;
1472 p_data->hdr.offset = result;
1473 bta_sys_sendmsg(p_msg);
1474 }
1475}
1476
1477/*******************************************************************************
1478**
1479** Function bta_dm_read_remote_device_name
1480**
1481** Description Initiate to get remote device name
1482**
1483** Returns TRUE if started to get remote name
1484**
1485*******************************************************************************/
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07001486static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr,tBT_TRANSPORT transport)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001487{
1488 tBTM_STATUS btm_status;
1489
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001490 APPL_TRACE_DEBUG("bta_dm_read_remote_device_name");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001491
1492 bdcpy(bta_dm_search_cb.peer_bdaddr, bd_addr);
1493 bta_dm_search_cb.peer_name[0] = 0;
1494
1495 btm_status = BTM_ReadRemoteDeviceName (bta_dm_search_cb.peer_bdaddr,
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07001496 (tBTM_CMPL_CB *) bta_dm_remname_cback,
1497 transport);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001498
1499 if ( btm_status == BTM_CMD_STARTED )
1500 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001501 APPL_TRACE_DEBUG("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is started");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001502
1503 return (TRUE);
1504 }
1505 else if ( btm_status == BTM_BUSY )
1506 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001507 APPL_TRACE_DEBUG("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is busy");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001508
1509 /* Remote name discovery is on going now so BTM cannot notify through "bta_dm_remname_cback" */
1510 /* adding callback to get notified that current reading remore name done */
1511 BTM_SecAddRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
1512
1513 return (TRUE);
1514 }
1515 else
1516 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001517 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 -08001518
1519 return (FALSE);
1520 }
1521}
1522
1523/*******************************************************************************
1524**
1525** Function bta_dm_inq_cmpl
1526**
1527** Description Process the inquiry complete event from BTM
1528**
1529** Returns void
1530**
1531*******************************************************************************/
1532void bta_dm_inq_cmpl (tBTA_DM_MSG *p_data)
1533{
1534 tBTA_DM_MSG * p_msg;
1535 tBTA_DM_SEARCH data;
1536
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001537 APPL_TRACE_DEBUG("bta_dm_inq_cmpl");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001538
1539 data.inq_cmpl.num_resps = p_data->inq_cmpl.num;
1540 bta_dm_search_cb.p_search_cback(BTA_DM_INQ_CMPL_EVT, &data);
1541
1542 if((bta_dm_search_cb.p_btm_inq_info = BTM_InqDbFirst()) != NULL)
1543 {
1544 /* start name and service discovery from the first device on inquiry result */
1545 bta_dm_search_cb.name_discover_done = FALSE;
1546 bta_dm_search_cb.peer_name[0] = 0;
1547 bta_dm_discover_device(bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr);
1548 }
1549 else
1550 {
1551 /* no devices, search complete */
1552 bta_dm_search_cb.services = 0;
1553
1554 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1555 {
1556 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1557 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1558 bta_sys_sendmsg(p_msg);
1559 }
1560 }
1561 }
1562
1563/*******************************************************************************
1564**
1565** Function bta_dm_rmt_name
1566**
1567** Description Process the remote name result from BTM
1568**
1569** Returns void
1570**
1571*******************************************************************************/
1572void bta_dm_rmt_name (tBTA_DM_MSG *p_data)
1573{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001574 APPL_TRACE_DEBUG("bta_dm_rmt_name");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001575
1576 if( p_data->rem_name.result.disc_res.bd_name[0] && bta_dm_search_cb.p_btm_inq_info)
1577 {
1578 bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name = TRUE;
1579 }
1580
1581 bta_dm_discover_device(bta_dm_search_cb.peer_bdaddr);
1582}
1583
1584/*******************************************************************************
1585**
1586** Function bta_dm_disc_rmt_name
1587**
1588** Description Process the remote name result from BTM when application
1589** wants to find the name for a bdaddr
1590**
1591** Returns void
1592**
1593*******************************************************************************/
1594void bta_dm_disc_rmt_name (tBTA_DM_MSG *p_data)
1595{
1596 tBTM_INQ_INFO *p_btm_inq_info;
1597
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001598 APPL_TRACE_DEBUG("bta_dm_disc_rmt_name");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001599
1600 p_btm_inq_info = BTM_InqDbRead (p_data->rem_name.result.disc_res.bd_addr);
1601 if( p_btm_inq_info )
1602 {
1603 if( p_data->rem_name.result.disc_res.bd_name[0] )
1604 {
1605 p_btm_inq_info->appl_knows_rem_name = TRUE;
1606 }
1607 }
1608
1609 bta_dm_discover_device(p_data->rem_name.result.disc_res.bd_addr);
1610}
1611
1612/*******************************************************************************
1613**
1614** Function bta_dm_sdp_result
1615**
1616** Description Process the discovery result from sdp
1617**
1618** Returns void
1619**
1620*******************************************************************************/
1621void bta_dm_sdp_result (tBTA_DM_MSG *p_data)
1622{
1623
1624 tSDP_DISC_REC *p_sdp_rec = NULL;
1625 tBTA_DM_MSG *p_msg;
1626 BOOLEAN service_found = FALSE;
1627 BOOLEAN scn_found = FALSE;
1628 UINT16 service = 0xFFFF;
1629 tSDP_PROTOCOL_ELEM pe;
1630
1631#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
1632 tBT_UUID *p_uuid = bta_dm_search_cb.p_srvc_uuid;
1633 tBTA_DM_SEARCH result;
1634 tBT_UUID service_uuid;
1635#endif
1636
1637 UINT32 num_uuids = 0;
1638 UINT8 uuid_list[32][MAX_UUID_SIZE]; // assuming a max of 32 services
1639
1640 if((p_data->sdp_event.sdp_result == SDP_SUCCESS)
1641 || (p_data->sdp_event.sdp_result == SDP_NO_RECS_MATCH)
1642 || (p_data->sdp_event.sdp_result == SDP_DB_FULL))
1643 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001644 APPL_TRACE_DEBUG("sdp_result::0x%x", p_data->sdp_event.sdp_result);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001645 do
1646 {
1647
1648 service_found = FALSE;
1649 p_sdp_rec = NULL;
1650 if( bta_dm_search_cb.service_index == (BTA_USER_SERVICE_ID+1) )
1651 {
1652 p_sdp_rec = SDP_FindServiceUUIDInDb(bta_dm_search_cb.p_sdp_db, &bta_dm_search_cb.uuid, p_sdp_rec);
1653
1654 if (p_sdp_rec && SDP_FindProtocolListElemInRec(p_sdp_rec, UUID_PROTOCOL_RFCOMM, &pe))
1655 {
1656 bta_dm_search_cb.peer_scn = (UINT8) pe.params[0];
1657 scn_found = TRUE;
1658 }
1659 }
1660 else
1661 {
1662 service = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index-1];
1663 p_sdp_rec = SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db, service, p_sdp_rec);
1664 }
1665#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
1666 /* finished with BR/EDR services, now we check the result for GATT based service UUID */
1667 if (bta_dm_search_cb.service_index == BTA_MAX_SERVICE_ID)
1668 {
1669 if (bta_dm_search_cb.uuid_to_search != 0 && p_uuid != NULL)
1670 {
1671 p_uuid += (bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search);
1672 /* only support 16 bits UUID for now */
1673 service = p_uuid->uu.uuid16;
1674
1675 }
1676 /* all GATT based services */
1677 do
1678 {
1679 /* find a service record, report it */
1680 p_sdp_rec = SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db,
1681 0, p_sdp_rec);
1682 if (p_sdp_rec)
1683 {
1684 if (SDP_FindServiceUUIDInRec(p_sdp_rec, &service_uuid))
1685 {
1686 /* send result back to app now, one by one */
1687 bdcpy (result.disc_ble_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001688 BCM_STRNCPY_S((char*)result.disc_ble_res.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN));
1689 result.disc_ble_res.bd_name[BD_NAME_LEN] = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001690 result.disc_ble_res.service.len = service_uuid.len;
1691 result.disc_ble_res.service.uu.uuid16 = service_uuid.uu.uuid16;
1692
1693 bta_dm_search_cb.p_search_cback(BTA_DM_DISC_BLE_RES_EVT, &result);
1694 }
1695 }
1696
1697 if (bta_dm_search_cb.uuid_to_search > 0)
1698 break;
1699
1700 } while (p_sdp_rec);
1701 }
1702 else
1703#endif
1704 {
1705 /* SDP_DB_FULL means some records with the
1706 required attributes were received */
1707 if(((p_data->sdp_event.sdp_result == SDP_DB_FULL) &&
1708 bta_dm_search_cb.services != BTA_ALL_SERVICE_MASK) ||
1709 (p_sdp_rec != NULL))
1710 {
1711 /* If Plug and Play service record, check to see if Broadcom stack */
1712 if (service == UUID_SERVCLASS_PNP_INFORMATION)
1713 {
1714 if (p_sdp_rec)
1715 {
1716 if (SDP_FindAttributeInRec (p_sdp_rec, ATTR_ID_EXT_BRCM_VERSION))
1717 {
1718 service_found = TRUE;
1719 }
1720 }
1721 }
1722 else
1723 {
1724 service_found = TRUE;
1725 }
1726
1727 if (service_found)
1728 {
1729 UINT16 tmp_svc = 0xFFFF;
1730 bta_dm_search_cb.services_found |=
1731 (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index-1));
1732 tmp_svc = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index-1];
1733 /* Add to the list of UUIDs */
1734 sdpu_uuid16_to_uuid128(tmp_svc, uuid_list[num_uuids]);
1735 num_uuids++;
1736 }
1737 }
1738 }
1739
1740 if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK &&
1741 bta_dm_search_cb.services_to_search == 0)
1742 {
1743#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
1744 if ( bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID &&
1745 bta_dm_search_cb.uuid_to_search > 0)
1746 bta_dm_search_cb.uuid_to_search --;
1747
1748 if (bta_dm_search_cb.uuid_to_search == 0 ||
1749 bta_dm_search_cb.service_index != BTA_BLE_SERVICE_ID)
1750#endif
1751 bta_dm_search_cb.service_index++;
1752 }
1753 else /* regular one service per search or PNP search */
1754 break;
1755
1756 }
1757 while(bta_dm_search_cb.service_index <= BTA_MAX_SERVICE_ID);
1758
1759// GKI_freebuf(bta_dm_search_cb.p_sdp_db);
1760// bta_dm_search_cb.p_sdp_db = NULL;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001761 APPL_TRACE_DEBUG("bta_dm_sdp_result services_found = %04x", bta_dm_search_cb.services_found);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001762
1763 /* Collect the 128-bit services here and put them into the list */
1764 if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK)
1765 {
1766 p_sdp_rec = NULL;
1767 do
1768 {
1769 tBT_UUID temp_uuid;
1770 /* find a service record, report it */
1771 p_sdp_rec = SDP_FindServiceInDb_128bit(bta_dm_search_cb.p_sdp_db, p_sdp_rec);
1772 if (p_sdp_rec)
1773 {
1774 if (SDP_FindServiceUUIDInRec_128bit(p_sdp_rec, &temp_uuid))
1775 {
1776 memcpy(uuid_list[num_uuids], temp_uuid.uu.uuid128, MAX_UUID_SIZE);
1777 num_uuids++;
1778 }
1779 }
1780 } while (p_sdp_rec);
1781 }
1782 /* if there are more services to search for */
1783 if(bta_dm_search_cb.services_to_search)
1784 {
1785 /* Free up the p_sdp_db before checking the next one */
1786 bta_dm_free_sdp_db(NULL);
1787 bta_dm_find_services(bta_dm_search_cb.peer_bdaddr);
1788 }
1789 else
1790 {
1791 /* callbacks */
1792 /* start next bd_addr if necessary */
1793
1794 BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
1795
1796
1797 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1798 {
1799 p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
1800 p_msg->disc_result.result.disc_res.result = BTA_SUCCESS;
1801 p_msg->disc_result.result.disc_res.p_raw_data = NULL;
1802 p_msg->disc_result.result.disc_res.raw_data_size = 0;
1803 p_msg->disc_result.result.disc_res.num_uuids = num_uuids;
1804 p_msg->disc_result.result.disc_res.p_uuid_list = NULL;
1805 if (num_uuids > 0) {
1806 p_msg->disc_result.result.disc_res.p_uuid_list = (UINT8*)GKI_getbuf(num_uuids*MAX_UUID_SIZE);
1807 if (p_msg->disc_result.result.disc_res.p_uuid_list) {
1808 memcpy(p_msg->disc_result.result.disc_res.p_uuid_list, uuid_list,
1809 num_uuids*MAX_UUID_SIZE);
1810 } else {
1811 p_msg->disc_result.result.disc_res.num_uuids = 0;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001812 APPL_TRACE_ERROR("%s: Unable to allocate memory for uuid_list", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001813 }
1814 }
1815 //copy the raw_data to the discovery result structure
1816 //
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001817 APPL_TRACE_DEBUG("bta_dm_sdp_result (raw_data used = 0x%x raw_data_ptr = 0x%x)\r\n",bta_dm_search_cb.p_sdp_db->raw_used, bta_dm_search_cb.p_sdp_db->raw_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001818
1819 if ( bta_dm_search_cb.p_sdp_db != NULL && bta_dm_search_cb.p_sdp_db->raw_used != 0 &&
1820 bta_dm_search_cb.p_sdp_db->raw_data != NULL) {
1821
1822 p_msg->disc_result.result.disc_res.p_raw_data = GKI_getbuf(bta_dm_search_cb.p_sdp_db->raw_used);
1823 if ( NULL != p_msg->disc_result.result.disc_res.p_raw_data ) {
1824 memcpy( p_msg->disc_result.result.disc_res.p_raw_data,
1825 bta_dm_search_cb.p_sdp_db->raw_data,
1826 bta_dm_search_cb.p_sdp_db->raw_used );
1827
1828 p_msg->disc_result.result.disc_res.raw_data_size =
1829 bta_dm_search_cb.p_sdp_db->raw_used;
1830
1831 } else {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001832 APPL_TRACE_DEBUG("bta_dm_sdp_result GKI Alloc failed to allocate %d bytes !!\r\n",bta_dm_search_cb.p_sdp_db->raw_used);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001833 }
1834
1835 bta_dm_search_cb.p_sdp_db->raw_data = NULL; //no need to free this - it is a global assigned.
1836 bta_dm_search_cb.p_sdp_db->raw_used = 0;
1837 bta_dm_search_cb.p_sdp_db->raw_size = 0;
1838 }
1839 else {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001840 APPL_TRACE_DEBUG("bta_dm_sdp_result raw data size is 0 or raw_data is null!!\r\n");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001841 }
1842 /* Done with p_sdp_db. Free it */
1843 bta_dm_free_sdp_db(NULL);
1844 p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
1845
1846 //Piggy back the SCN over result field
1847 if( scn_found )
1848 {
1849 p_msg->disc_result.result.disc_res.result = (3 + bta_dm_search_cb.peer_scn);
1850 p_msg->disc_result.result.disc_res.services |= BTA_USER_SERVICE_MASK;
1851
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001852 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 -08001853
1854 }
1855 bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
1856 BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
1857 bta_dm_get_remname(), (BD_NAME_LEN-1));
1858
1859 /* make sure the string is null terminated */
1860 p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
1861
1862 bta_sys_sendmsg(p_msg);
1863 }
1864
1865 }
1866
1867 }
1868 else
1869 {
1870 /* conn failed. No need for timer */
1871 if(p_data->sdp_event.sdp_result == SDP_CONN_FAILED || p_data->sdp_event.sdp_result == SDP_CONN_REJECTED
1872 || p_data->sdp_event.sdp_result == SDP_SECURITY_ERR)
1873 bta_dm_search_cb.wait_disc = FALSE;
1874
1875 /* not able to connect go to next device */
1876 GKI_freebuf(bta_dm_search_cb.p_sdp_db);
1877 bta_dm_search_cb.p_sdp_db = NULL;
1878
1879 BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
1880
1881 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1882 {
1883 p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
1884 p_msg->disc_result.result.disc_res.result = BTA_FAILURE;
1885 p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
1886 bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
1887 BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
1888 bta_dm_get_remname(), (BD_NAME_LEN-1));
1889
1890 /* make sure the string is null terminated */
1891 p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
1892
1893 bta_sys_sendmsg(p_msg);
1894 }
1895 }
1896}
1897
1898/*******************************************************************************
1899**
1900** Function bta_dm_search_cmpl
1901**
1902** Description Sends event to application
1903**
1904** Returns void
1905**
1906*******************************************************************************/
1907void bta_dm_search_cmpl (tBTA_DM_MSG *p_data)
1908{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001909 APPL_TRACE_DEBUG("bta_dm_search_cmpl");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001910
1911#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
1912 utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
1913#endif
1914
1915 if (p_data->hdr.layer_specific == BTA_DM_API_DI_DISCOVER_EVT)
1916 bta_dm_di_disc_cmpl(p_data);
1917 else
1918 bta_dm_search_cb.p_search_cback(BTA_DM_DISC_CMPL_EVT, NULL);
1919}
1920
1921/*******************************************************************************
1922**
1923** Function bta_dm_disc_result
1924**
1925** Description Service discovery result when discovering services on a device
1926**
1927** Returns void
1928**
1929*******************************************************************************/
1930void bta_dm_disc_result (tBTA_DM_MSG *p_data)
1931{
1932 tBTA_DM_MSG * p_msg;
1933
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001934 APPL_TRACE_DEBUG("bta_dm_disc_result");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001935
1936#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
1937 /* if any BR/EDR service discovery has been done, report the event */
1938 if ((bta_dm_search_cb.services & ((BTA_ALL_SERVICE_MASK | BTA_USER_SERVICE_MASK ) & ~BTA_BLE_SERVICE_MASK)))
1939#endif
1940 bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, &p_data->disc_result.result);
1941
1942 /* send a message to change state */
1943 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
1944 {
1945 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1946 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1947 bta_sys_sendmsg(p_msg);
1948 }
1949}
1950
1951/*******************************************************************************
1952**
1953** Function bta_dm_search_result
1954**
1955** Description Service discovery result while searching for devices
1956**
1957** Returns void
1958**
1959*******************************************************************************/
1960void bta_dm_search_result (tBTA_DM_MSG *p_data)
1961{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001962 APPL_TRACE_DEBUG("bta_dm_search_result searching:0x%04x, result:0x%04x",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001963 bta_dm_search_cb.services,
1964 p_data->disc_result.result.disc_res.services);
1965
1966 /* call back if application wants name discovery or found services that application is searching */
1967 if (( !bta_dm_search_cb.services )
1968 ||(( bta_dm_search_cb.services ) && ( p_data->disc_result.result.disc_res.services )))
1969 {
1970 bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, &p_data->disc_result.result);
1971 }
1972
1973 /* if searching did not initiate to create link */
1974 if(!bta_dm_search_cb.wait_disc )
1975 {
1976#if ( BTM_EIR_CLIENT_INCLUDED == TRUE )
1977 /* if service searching is done with EIR, don't search next device */
1978 if( bta_dm_search_cb.p_btm_inq_info )
1979#endif
1980 bta_dm_discover_next_device();
1981 }
1982 else
1983 {
1984 /* wait until link is disconnected or timeout */
1985 bta_dm_search_cb.sdp_results = TRUE;
1986 bta_dm_search_cb.search_timer.p_cback = (TIMER_CBACK*)&bta_dm_search_timer_cback;
1987 bta_sys_start_timer(&bta_dm_search_cb.search_timer, 0, 1000*(L2CAP_LINK_INACTIVITY_TOUT+1) );
1988 }
1989
1990}
1991
1992/*******************************************************************************
1993**
1994** Function bta_dm_search_timer_cback
1995**
1996** Description Called when ACL disconnect time is over
1997**
1998**
1999** Returns void
2000**
2001*******************************************************************************/
2002static void bta_dm_search_timer_cback (TIMER_LIST_ENT *p_tle)
2003{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002004 UNUSED(p_tle);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002005
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002006 APPL_TRACE_EVENT(" bta_dm_search_timer_cback ");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002007 bta_dm_search_cb.wait_disc = FALSE;
2008
2009 /* proceed with next device */
2010 bta_dm_discover_next_device();
2011
2012}
2013
2014
2015/*******************************************************************************
2016**
2017** Function bta_dm_free_sdp_db
2018**
2019** Description Frees SDP data base
2020**
2021** Returns void
2022**
2023*******************************************************************************/
2024void bta_dm_free_sdp_db (tBTA_DM_MSG *p_data)
2025{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002026 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002027 if(bta_dm_search_cb.p_sdp_db)
2028 {
2029 GKI_freebuf(bta_dm_search_cb.p_sdp_db);
2030 bta_dm_search_cb.p_sdp_db = NULL;
2031 }
2032
2033}
2034
2035/*******************************************************************************
2036**
2037** Function bta_dm_queue_search
2038**
2039** Description Queues search command while search is being cancelled
2040**
2041** Returns void
2042**
2043*******************************************************************************/
2044void bta_dm_queue_search (tBTA_DM_MSG *p_data)
2045{
Zhihai Xub69a1752013-11-06 19:23:13 -08002046 if(bta_dm_search_cb.p_search_queue)
2047 {
2048 GKI_freebuf(bta_dm_search_cb.p_search_queue);
2049 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002050
2051 bta_dm_search_cb.p_search_queue = (tBTA_DM_MSG *)GKI_getbuf(sizeof(tBTA_DM_API_SEARCH));
2052 memcpy(bta_dm_search_cb.p_search_queue, p_data, sizeof(tBTA_DM_API_SEARCH));
2053
2054}
2055
2056/*******************************************************************************
2057**
2058** Function bta_dm_queue_disc
2059**
2060** Description Queues discovery command while search is being cancelled
2061**
2062** Returns void
2063**
2064*******************************************************************************/
2065void bta_dm_queue_disc (tBTA_DM_MSG *p_data)
2066{
Zhihai Xub69a1752013-11-06 19:23:13 -08002067 if(bta_dm_search_cb.p_search_queue)
2068 {
2069 GKI_freebuf(bta_dm_search_cb.p_search_queue);
2070 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002071
2072 bta_dm_search_cb.p_search_queue = (tBTA_DM_MSG *)GKI_getbuf(sizeof(tBTA_DM_API_DISCOVER));
2073 memcpy(bta_dm_search_cb.p_search_queue, p_data, sizeof(tBTA_DM_API_DISCOVER));
2074
2075}
2076
2077/*******************************************************************************
2078**
2079** Function bta_dm_search_clear_queue
2080**
2081** Description Clears the queue if API search cancel is called
2082**
2083** Returns void
2084**
2085*******************************************************************************/
2086void bta_dm_search_clear_queue (tBTA_DM_MSG *p_data)
2087{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002088 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002089 if(bta_dm_search_cb.p_search_queue)
2090 {
2091 GKI_freebuf(bta_dm_search_cb.p_search_queue);
2092 bta_dm_search_cb.p_search_queue = NULL;
2093 }
2094
2095
2096}
2097
2098/*******************************************************************************
2099**
2100** Function bta_dm_search_cancel_cmpl
2101**
2102** Description Search cancel is complete
2103**
2104** Returns void
2105**
2106*******************************************************************************/
2107void bta_dm_search_cancel_cmpl (tBTA_DM_MSG *p_data)
2108{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002109 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002110 if(bta_dm_search_cb.p_search_queue)
2111 {
2112 bta_sys_sendmsg(bta_dm_search_cb.p_search_queue);
2113 bta_dm_search_cb.p_search_queue = NULL;
2114 }
2115
2116}
2117
2118/*******************************************************************************
2119**
2120** Function bta_dm_search_cancel_transac_cmpl
2121**
2122** Description Current Service Discovery or remote name procedure is
2123** completed after search cancellation
2124**
2125** Returns void
2126**
2127*******************************************************************************/
2128void bta_dm_search_cancel_transac_cmpl(tBTA_DM_MSG *p_data)
2129{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002130 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002131 if(bta_dm_search_cb.p_sdp_db)
2132 {
2133 GKI_freebuf(bta_dm_search_cb.p_sdp_db);
2134 bta_dm_search_cb.p_sdp_db = NULL;
2135 }
2136
2137 bta_dm_search_cancel_notify(NULL);
2138}
2139
2140
2141/*******************************************************************************
2142**
2143** Function bta_dm_search_cancel_notify
2144**
2145** Description Notify application that search has been cancelled
2146**
2147** Returns void
2148**
2149*******************************************************************************/
2150void bta_dm_search_cancel_notify (tBTA_DM_MSG *p_data)
2151{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002152 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002153 if (bta_dm_search_cb.p_search_cback)
2154 {
2155 bta_dm_search_cb.p_search_cback(BTA_DM_SEARCH_CANCEL_CMPL_EVT, NULL);
2156 }
2157 if (!bta_dm_search_cb.name_discover_done)
2158 {
2159 BTM_CancelRemoteDeviceName();
2160 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002161#if (BLE_INCLUDED == TRUE) && (BTA_GATT_INCLUDED == TRUE)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002162 if (bta_dm_search_cb.gatt_disc_active)
2163 {
2164 bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
2165 }
2166#endif
2167
2168}
2169
2170/*******************************************************************************
2171**
2172** Function bta_dm_find_services
2173**
2174** Description Starts discovery on a device
2175**
2176** Returns void
2177**
2178*******************************************************************************/
2179static void bta_dm_find_services ( BD_ADDR bd_addr)
2180{
2181
2182 tSDP_UUID uuid;
2183 UINT16 attr_list[] = {ATTR_ID_SERVICE_CLASS_ID_LIST, ATTR_ID_EXT_BRCM_VERSION};
2184 UINT16 num_attrs = 1;
2185 tBTA_DM_MSG *p_msg;
2186
2187 memset (&uuid, 0, sizeof(tSDP_UUID));
2188
2189 while(bta_dm_search_cb.service_index < BTA_MAX_SERVICE_ID)
2190 {
2191 if( bta_dm_search_cb.services_to_search
2192 & (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index)))
2193 {
2194 if((bta_dm_search_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)GKI_getbuf(BTA_DM_SDP_DB_SIZE)) != NULL)
2195 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002196 APPL_TRACE_DEBUG("bta_dm_search_cb.services = %04x***********", bta_dm_search_cb.services);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002197 /* try to search all services by search based on L2CAP UUID */
2198 if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK )
2199 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002200 APPL_TRACE_ERROR("services_to_search = %08x",bta_dm_search_cb.services_to_search);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002201 if (bta_dm_search_cb.services_to_search & BTA_RES_SERVICE_MASK)
2202 {
2203 uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[0];
2204 bta_dm_search_cb.services_to_search &= ~BTA_RES_SERVICE_MASK;
2205 }
2206 else
2207 {
2208 uuid.uu.uuid16 = UUID_PROTOCOL_L2CAP;
2209 bta_dm_search_cb.services_to_search = 0;
2210 }
2211 }
2212 else
2213 {
2214#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
2215 /* for LE only profile */
2216 if (bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID)
2217 {
2218 if (bta_dm_search_cb.uuid_to_search > 0 && bta_dm_search_cb.p_srvc_uuid)
2219 {
2220 memcpy(&uuid,
2221 (const void *)(bta_dm_search_cb.p_srvc_uuid + \
2222 bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search),
2223 sizeof(tBT_UUID));
2224
2225 bta_dm_search_cb.uuid_to_search -- ;
2226 }
2227 else
2228 uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index];
2229
2230 /* last one? clear the BLE service bit if all discovery has been done */
2231 if (bta_dm_search_cb.uuid_to_search == 0)
2232 bta_dm_search_cb.services_to_search &=
2233 (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index)));
2234
2235 }
2236 else
2237#endif
2238 {
2239 /* remove the service from services to be searched */
2240 bta_dm_search_cb.services_to_search &=
2241 (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index)));
2242 uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index];
2243 }
2244 }
2245
2246 if (uuid.len == 0)
2247 uuid.len = LEN_UUID_16;
2248
2249#if 0
2250 if (uuid.uu.uuid16 == UUID_SERVCLASS_PNP_INFORMATION)
2251 {
2252 num_attrs = 2;
2253 }
2254#endif
2255
2256 if (bta_dm_search_cb.service_index == BTA_USER_SERVICE_ID)
2257 {
2258 memcpy(&uuid, &bta_dm_search_cb.uuid, sizeof(tSDP_UUID));
2259 }
2260
2261
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002262 APPL_TRACE_ERROR("****************search UUID = %04x***********", uuid.uu.uuid16);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002263 //SDP_InitDiscoveryDb (bta_dm_search_cb.p_sdp_db, BTA_DM_SDP_DB_SIZE, 1, &uuid, num_attrs, attr_list);
2264 SDP_InitDiscoveryDb (bta_dm_search_cb.p_sdp_db, BTA_DM_SDP_DB_SIZE, 1, &uuid, 0, NULL);
2265
2266
2267 memset(g_disc_raw_data_buf, 0, sizeof(g_disc_raw_data_buf));
2268 bta_dm_search_cb.p_sdp_db->raw_data = g_disc_raw_data_buf;
2269
2270 bta_dm_search_cb.p_sdp_db->raw_size = MAX_DISC_RAW_DATA_BUF;
2271
2272 if (!SDP_ServiceSearchAttributeRequest (bd_addr, bta_dm_search_cb.p_sdp_db, &bta_dm_sdp_callback))
2273 {
2274 /* if discovery not successful with this device
2275 proceed to next one */
2276 GKI_freebuf(bta_dm_search_cb.p_sdp_db);
2277 bta_dm_search_cb.p_sdp_db = NULL;
2278 bta_dm_search_cb.service_index = BTA_MAX_SERVICE_ID;
2279
2280 }
2281 else
2282 {
2283#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
2284 if ((bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID &&
2285 bta_dm_search_cb.uuid_to_search == 0) ||
2286 bta_dm_search_cb.service_index != BTA_BLE_SERVICE_ID)
2287#endif
2288 bta_dm_search_cb.service_index++;
2289 return;
2290 }
2291 }
2292 else
2293 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002294 APPL_TRACE_ERROR("#### Failed to allocate SDP DB buffer! ####");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002295 }
2296 }
2297
2298 bta_dm_search_cb.service_index++;
2299 }
2300
2301 /* no more services to be discovered */
2302 if(bta_dm_search_cb.service_index >= BTA_MAX_SERVICE_ID)
2303 {
2304 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
2305 {
2306 p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
2307 p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
2308 bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
2309 BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
2310 bta_dm_get_remname(), (BD_NAME_LEN-1));
2311
2312 /* make sure the string is terminated */
2313 p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
2314
2315 bta_sys_sendmsg(p_msg);
2316 }
2317 }
2318}
2319
2320/*******************************************************************************
2321**
2322** Function bta_dm_discover_next_device
2323**
2324** Description Starts discovery on the next device in Inquiry data base
2325**
2326** Returns void
2327**
2328*******************************************************************************/
2329static void bta_dm_discover_next_device(void)
2330{
2331
2332 tBTA_DM_MSG * p_msg;
2333
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002334 APPL_TRACE_DEBUG("bta_dm_discover_next_device");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002335
2336 /* searching next device on inquiry result */
2337 if((bta_dm_search_cb.p_btm_inq_info = BTM_InqDbNext(bta_dm_search_cb.p_btm_inq_info)) != NULL)
2338 {
2339 bta_dm_search_cb.name_discover_done = FALSE;
2340 bta_dm_search_cb.peer_name[0] = 0;
2341 bta_dm_discover_device(bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr);
2342 }
2343 else
2344 {
2345 /* no devices, search complete */
2346 bta_dm_search_cb.services = 0;
2347
2348 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
2349 {
2350 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
2351 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
2352 bta_sys_sendmsg(p_msg);
2353 }
2354 }
2355}
2356
2357/*******************************************************************************
2358**
2359** Function bta_dm_discover_device
2360**
2361** Description Starts name and service discovery on the device
2362**
2363** Returns void
2364**
2365*******************************************************************************/
2366static void bta_dm_discover_device(BD_ADDR remote_bd_addr)
2367{
2368 tBTA_DM_MSG * p_msg;
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07002369 tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
2370#if BLE_INCLUDED == TRUE
2371 tBT_DEVICE_TYPE dev_type;
2372 tBLE_ADDR_TYPE addr_type;
2373
2374 if (bta_dm_search_cb.transport == BTA_TRANSPORT_UNKNOWN)
2375 {
2376 BTM_ReadDevInfo(remote_bd_addr, &dev_type, &addr_type);
2377 if (dev_type == BT_DEVICE_TYPE_BLE || addr_type == BLE_ADDR_RANDOM )
2378 transport = BT_TRANSPORT_LE;
2379 }
2380 else
2381 transport = bta_dm_search_cb.transport;
2382#endif
2383
The Android Open Source Project5738f832012-12-12 16:00:35 -08002384
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002385 APPL_TRACE_DEBUG("bta_dm_discover_device, BDA:0x%02X%02X%02X%02X%02X%02X",
The Android Open Source Project5738f832012-12-12 16:00:35 -08002386 remote_bd_addr[0],remote_bd_addr[1],
2387 remote_bd_addr[2],remote_bd_addr[3],
2388 remote_bd_addr[4],remote_bd_addr[5]);
2389
2390 bdcpy(bta_dm_search_cb.peer_bdaddr, remote_bd_addr);
2391
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002392 APPL_TRACE_DEBUG("bta_dm_discover_device name_discover_done = %d p_btm_inq_info 0x%x ",
The Android Open Source Project5738f832012-12-12 16:00:35 -08002393 bta_dm_search_cb.name_discover_done,
2394 bta_dm_search_cb.p_btm_inq_info
2395 );
2396 if ( bta_dm_search_cb.p_btm_inq_info ) {
2397
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002398 APPL_TRACE_DEBUG("bta_dm_discover_device appl_knows_rem_name %d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08002399 bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name
2400 );
2401 }
2402
2403 /* if name discovery is not done and application needs remote name */
2404 if ((!bta_dm_search_cb.name_discover_done)
2405 && (( bta_dm_search_cb.p_btm_inq_info == NULL )
2406 ||(bta_dm_search_cb.p_btm_inq_info && (!bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name))))
2407 {
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07002408 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 -08002409 {
2410 return;
2411 }
2412 else
2413 {
2414 /* starting name discovery failed */
2415 bta_dm_search_cb.name_discover_done = TRUE;
2416 }
2417 }
2418
2419 /* if application wants to discover service */
2420 if ( bta_dm_search_cb.services )
2421 {
2422 /* initialize variables */
2423 bta_dm_search_cb.service_index = 0;
2424 bta_dm_search_cb.services_found = 0;
2425 bta_dm_search_cb.services_to_search = bta_dm_search_cb.services;
2426#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
2427 bta_dm_search_cb.uuid_to_search = bta_dm_search_cb.num_uuid;
2428#endif
2429#if ( BTM_EIR_CLIENT_INCLUDED == TRUE )
2430 if ((bta_dm_search_cb.p_btm_inq_info != NULL) &&
2431 bta_dm_search_cb.services != BTA_USER_SERVICE_MASK
2432 &&(bta_dm_search_cb.sdp_search == FALSE))
2433 {
2434 /* check if EIR provides the information of supported services */
2435 bta_dm_eir_search_services( &bta_dm_search_cb.p_btm_inq_info->results,
2436 &bta_dm_search_cb.services_to_search,
2437 &bta_dm_search_cb.services_found );
2438 }
2439
2440 /* if seaching with EIR is not completed */
2441 if(bta_dm_search_cb.services_to_search)
2442#endif
2443 {
2444 /* check whether connection already exists to the device
2445 if connection exists, we don't have to wait for ACL
2446 link to go down to start search on next device */
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07002447 if (BTM_IsAclConnectionUp(bta_dm_search_cb.peer_bdaddr, BT_TRANSPORT_BR_EDR))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002448 bta_dm_search_cb.wait_disc = FALSE;
2449 else
2450 bta_dm_search_cb.wait_disc = TRUE;
2451
2452#if (BLE_INCLUDED == TRUE && (defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE))
2453 if ( bta_dm_search_cb.p_btm_inq_info )
2454 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002455 APPL_TRACE_DEBUG("bta_dm_discover_device p_btm_inq_info 0x%x results.device_type 0x%x services_to_search 0x%x",
The Android Open Source Project5738f832012-12-12 16:00:35 -08002456 bta_dm_search_cb.p_btm_inq_info,
2457 bta_dm_search_cb.p_btm_inq_info->results.device_type,
2458 bta_dm_search_cb.services_to_search
2459 );
2460 }
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07002461 if (transport == BT_TRANSPORT_LE) /*
The Android Open Source Project5738f832012-12-12 16:00:35 -08002462 if ( bta_dm_search_cb.p_btm_inq_info != NULL &&
2463 bta_dm_search_cb.p_btm_inq_info->results.device_type == BT_DEVICE_TYPE_BLE &&
2464 (bta_dm_search_cb.services_to_search & BTA_BLE_SERVICE_MASK))*/
2465 {
2466 if (bta_dm_search_cb.services_to_search & BTA_BLE_SERVICE_MASK)
2467 {
2468 //set the raw data buffer here
2469 memset(g_disc_raw_data_buf, 0, sizeof(g_disc_raw_data_buf));
2470 bta_dm_search_cb.p_ble_rawdata = g_disc_raw_data_buf;
2471
2472 bta_dm_search_cb.ble_raw_size = MAX_DISC_RAW_DATA_BUF;
2473 bta_dm_search_cb.ble_raw_used = 0;
2474
2475 /* start GATT for service discovery */
2476 btm_dm_start_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
2477 return;
2478 }
2479 }
2480 else
2481#endif
2482 {
2483 bta_dm_search_cb.sdp_results = FALSE;
2484 bta_dm_find_services(bta_dm_search_cb.peer_bdaddr);
2485
2486 return;
2487 }
2488 }
2489 }
2490
2491 /* name discovery and service discovery are done for this device */
2492 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
2493 {
2494 p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
2495 /* initialize the data structure - includes p_raw_data and raw_data_size */
2496 memset(&(p_msg->disc_result.result), 0, sizeof(tBTA_DM_DISC_RES));
2497 p_msg->disc_result.result.disc_res.result = BTA_SUCCESS;
2498 p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
2499 bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
2500 BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
2501 (char*)bta_dm_search_cb.peer_name, (BD_NAME_LEN-1));
2502
2503 /* make sure the string is terminated */
2504 p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
2505
2506 bta_sys_sendmsg(p_msg);
2507 }
2508}
2509
2510/*******************************************************************************
2511**
2512** Function bta_dm_sdp_callback
2513**
2514** Description Callback from sdp with discovery status
2515**
2516** Returns void
2517**
2518*******************************************************************************/
2519static void bta_dm_sdp_callback (UINT16 sdp_status)
2520{
2521
2522 tBTA_DM_SDP_RESULT * p_msg;
2523
2524 if ((p_msg = (tBTA_DM_SDP_RESULT *) GKI_getbuf(sizeof(tBTA_DM_SDP_RESULT))) != NULL)
2525 {
2526 p_msg->hdr.event = BTA_DM_SDP_RESULT_EVT;
2527 p_msg->sdp_result = sdp_status;
2528 bta_sys_sendmsg(p_msg);
2529
2530 }
2531}
2532
2533/*******************************************************************************
2534**
2535** Function bta_dm_inq_results_cb
2536**
2537** Description Inquiry results callback from BTM
2538**
2539** Returns void
2540**
2541*******************************************************************************/
2542static void bta_dm_inq_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir)
2543{
2544
2545 tBTA_DM_SEARCH result;
2546 tBTM_INQ_INFO *p_inq_info;
2547 UINT16 service_class;
2548
2549 bdcpy(result.inq_res.bd_addr, p_inq->remote_bd_addr);
2550 memcpy(result.inq_res.dev_class, p_inq->dev_class, DEV_CLASS_LEN);
2551 BTM_COD_SERVICE_CLASS(service_class, p_inq->dev_class);
2552 result.inq_res.is_limited = (service_class & BTM_COD_SERVICE_LMTD_DISCOVER)?TRUE:FALSE;
2553 result.inq_res.rssi = p_inq->rssi;
2554
2555#if (BLE_INCLUDED == TRUE)
2556 result.inq_res.ble_addr_type = p_inq->ble_addr_type;
2557 result.inq_res.inq_result_type = p_inq->inq_result_type;
2558 result.inq_res.device_type = p_inq->device_type;
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07002559 result.inq_res.flag = p_inq->flag;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002560#endif
2561
2562 /* application will parse EIR to find out remote device name */
2563 result.inq_res.p_eir = p_eir;
2564
2565 if((p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr)) != NULL)
2566 {
2567 /* initialize remt_name_not_required to FALSE so that we get the name by default */
2568 result.inq_res.remt_name_not_required = FALSE;
2569
2570 }
2571
2572 if(bta_dm_search_cb.p_search_cback)
2573 bta_dm_search_cb.p_search_cback(BTA_DM_INQ_RES_EVT, &result);
2574
2575 if(p_inq_info)
2576 {
2577 /* application indicates if it knows the remote name, inside the callback
2578 copy that to the inquiry data base*/
2579 if(result.inq_res.remt_name_not_required)
2580 p_inq_info->appl_knows_rem_name = TRUE;
2581
2582 }
2583
2584
2585}
2586
2587
2588/*******************************************************************************
2589**
2590** Function bta_dm_inq_cmpl_cb
2591**
2592** Description Inquiry complete callback from BTM
2593**
2594** Returns void
2595**
2596*******************************************************************************/
2597static void bta_dm_inq_cmpl_cb (void * p_result)
2598{
2599
2600 tBTA_DM_MSG * p_msg;
2601
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002602 APPL_TRACE_DEBUG("bta_dm_inq_cmpl_cb");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002603 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
2604 {
2605 p_msg->inq_cmpl.hdr.event = BTA_DM_INQUIRY_CMPL_EVT;
2606 p_msg->inq_cmpl.num = ((tBTM_INQUIRY_CMPL *)p_result)->num_resp;
2607 bta_sys_sendmsg(p_msg);
2608
2609 }
2610
2611
2612}
2613
2614/*******************************************************************************
2615**
2616** Function bta_dm_service_search_remname_cback
2617**
2618** Description Remote name call back from BTM during service discovery
2619**
2620** Returns void
2621**
2622*******************************************************************************/
2623static void bta_dm_service_search_remname_cback (BD_ADDR bd_addr, DEV_CLASS dc, BD_NAME bd_name)
2624{
2625 tBTM_REMOTE_DEV_NAME rem_name;
2626 tBTM_STATUS btm_status;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002627 UNUSED(dc);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002628
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002629 APPL_TRACE_DEBUG("bta_dm_service_search_remname_cback name=<%s>", bd_name);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002630
2631 /* if this is what we are looking for */
2632 if (!bdcmp( bta_dm_search_cb.peer_bdaddr, bd_addr))
2633 {
2634 rem_name.length = strlen((char*)bd_name);
2635 if (rem_name.length > (BD_NAME_LEN-1))
2636 {
2637 rem_name.length = (BD_NAME_LEN-1);
2638 rem_name.remote_bd_name[(BD_NAME_LEN-1)] = 0;
2639 }
2640 BCM_STRNCPY_S((char*)rem_name.remote_bd_name, sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1));
2641 rem_name.status = BTM_SUCCESS;
2642
2643 bta_dm_remname_cback(&rem_name);
2644 }
2645 else
2646 {
2647 /* get name of device */
2648 btm_status = BTM_ReadRemoteDeviceName (bta_dm_search_cb.peer_bdaddr,
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07002649 (tBTM_CMPL_CB *) bta_dm_remname_cback,
2650 BT_TRANSPORT_BR_EDR);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002651 if ( btm_status == BTM_BUSY )
2652 {
2653 /* wait for next chance(notification of remote name discovery done) */
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002654 APPL_TRACE_DEBUG("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName is busy");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002655 }
2656 else if ( btm_status != BTM_CMD_STARTED )
2657 {
2658 /* if failed to start getting remote name then continue */
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002659 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 -08002660
2661 rem_name.length = 0;
2662 rem_name.remote_bd_name[0] = 0;
2663 rem_name.status = btm_status;
2664 bta_dm_remname_cback(&rem_name);
2665 }
2666 }
2667}
2668
2669
2670/*******************************************************************************
2671**
2672** Function bta_dm_remname_cback
2673**
2674** Description Remote name complete call back from BTM
2675**
2676** Returns void
2677**
2678*******************************************************************************/
2679static void bta_dm_remname_cback (tBTM_REMOTE_DEV_NAME *p_remote_name)
2680{
2681 tBTA_DM_REM_NAME * p_msg;
2682
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002683 APPL_TRACE_DEBUG("bta_dm_remname_cback len = %d name=<%s>", p_remote_name->length,
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002684 p_remote_name->remote_bd_name);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002685
2686 /* remote name discovery is done but it could be failed */
2687 bta_dm_search_cb.name_discover_done = TRUE;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002688 BCM_STRNCPY_S((char*)bta_dm_search_cb.peer_name, sizeof(BD_NAME), (char*)p_remote_name->remote_bd_name, (BD_NAME_LEN));
2689 bta_dm_search_cb.peer_name[BD_NAME_LEN]=0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002690
2691 BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07002692
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002693#if BLE_INCLUDED == TRUE
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07002694 if (bta_dm_search_cb.transport == BT_TRANSPORT_LE )
2695 {
2696 GAP_BleReadPeerPrefConnParams (bta_dm_search_cb.peer_bdaddr);
2697 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002698#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08002699 if ((p_msg = (tBTA_DM_REM_NAME *) GKI_getbuf(sizeof(tBTA_DM_REM_NAME))) != NULL)
2700 {
2701 bdcpy (p_msg->result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002702 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 -08002703
2704 /* make sure the string is null terminated */
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002705 p_msg->result.disc_res.bd_name[BD_NAME_LEN] = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002706
2707 p_msg->hdr.event = BTA_DM_REMT_NAME_EVT;
2708 bta_sys_sendmsg(p_msg);
2709
2710 }
2711}
2712
2713/*******************************************************************************
2714**
2715** Function bta_dm_authorize_cback
2716**
2717** Description cback requesting authorization
2718**
2719** Returns void
2720**
2721*******************************************************************************/
2722static UINT8 bta_dm_authorize_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name,
2723 UINT8 *service_name, UINT8 service_id, BOOLEAN is_originator)
2724{
2725 tBTA_DM_SEC sec_event;
2726 UINT8 index = 1;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002727 UNUSED(service_name);
2728 UNUSED(is_originator);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002729
2730 bdcpy(sec_event.authorize.bd_addr, bd_addr);
2731 memcpy(sec_event.authorize.dev_class, dev_class, DEV_CLASS_LEN);
2732
2733 BCM_STRNCPY_S((char*)sec_event.authorize.bd_name, sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1));
2734
2735 /* make sure the string is null terminated */
2736 sec_event.authorize.bd_name[BD_NAME_LEN-1] = 0;
2737
2738#if ( defined(BTA_JV_INCLUDED) && BTA_JV_INCLUDED == TRUE )
2739 sec_event.authorize.service = service_id;
2740#endif
2741
2742 while(index < BTA_MAX_SERVICE_ID)
2743 {
2744 /* get the BTA service id corresponding to BTM id */
2745 if(bta_service_id_to_btm_srv_id_lkup_tbl[index] == service_id)
2746 {
2747 sec_event.authorize.service = index;
2748 break;
2749 }
2750 index++;
2751 }
2752
2753
2754 /* if supported service callback otherwise not authorized */
2755 if(bta_dm_cb.p_sec_cback && (index < BTA_MAX_SERVICE_ID
2756#if ( defined(BTA_JV_INCLUDED) && BTA_JV_INCLUDED == TRUE )
2757 /* pass through JV service ID */
2758 || (service_id >= BTA_FIRST_JV_SERVICE_ID && service_id <= BTA_LAST_JV_SERVICE_ID)
2759#endif
2760 ))
2761 {
2762 bta_dm_cb.p_sec_cback(BTA_DM_AUTHORIZE_EVT, &sec_event);
2763 return BTM_CMD_STARTED;
2764 }
2765 else
2766 {
2767 return BTM_NOT_AUTHORIZED;
2768 }
2769}
2770
2771
2772
2773
2774
2775/*******************************************************************************
2776**
2777** Function bta_dm_pinname_cback
2778**
2779** Description Callback requesting pin_key
2780**
2781** Returns void
2782**
2783*******************************************************************************/
2784static void bta_dm_pinname_cback (void *p_data)
2785{
2786 tBTM_REMOTE_DEV_NAME *p_result = (tBTM_REMOTE_DEV_NAME *)p_data;
2787 tBTA_DM_SEC sec_event;
2788 UINT32 bytes_to_copy;
2789 tBTA_DM_SEC_EVT event = bta_dm_cb.pin_evt;
2790
2791 if (BTA_DM_SP_CFM_REQ_EVT == event)
2792 {
Andre Eisenbach181d0752013-06-11 14:18:21 -07002793 /* Retrieved saved device class and bd_addr */
2794 bdcpy(sec_event.cfm_req.bd_addr, bta_dm_cb.pin_bd_addr);
2795 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 -08002796
Andre Eisenbach181d0752013-06-11 14:18:21 -07002797 if (p_result && p_result->status == BTM_SUCCESS)
2798 {
2799 bytes_to_copy = (p_result->length < (BD_NAME_LEN-1))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002800 ? p_result->length : (BD_NAME_LEN-1);
Andre Eisenbach181d0752013-06-11 14:18:21 -07002801 memcpy(sec_event.cfm_req.bd_name, p_result->remote_bd_name, bytes_to_copy);
2802 sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0;
2803 }
2804 else /* No name found */
2805 sec_event.cfm_req.bd_name[0] = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002806
Andre Eisenbach181d0752013-06-11 14:18:21 -07002807 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 -08002808
2809 /* 1 additional event data fields for this event */
2810 sec_event.cfm_req.just_works = bta_dm_cb.just_works;
2811 }
2812 else
2813 {
Andre Eisenbach181d0752013-06-11 14:18:21 -07002814 /* Retrieved saved device class and bd_addr */
2815 bdcpy(sec_event.pin_req.bd_addr, bta_dm_cb.pin_bd_addr);
2816 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 -08002817
Andre Eisenbach181d0752013-06-11 14:18:21 -07002818 if (p_result && p_result->status == BTM_SUCCESS)
2819 {
2820 bytes_to_copy = (p_result->length < (BD_NAME_LEN-1))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002821 ? p_result->length : (BD_NAME_LEN-1);
Andre Eisenbach181d0752013-06-11 14:18:21 -07002822 memcpy(sec_event.pin_req.bd_name, p_result->remote_bd_name, bytes_to_copy);
2823 sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0;
2824 }
2825 else /* No name found */
2826 sec_event.pin_req.bd_name[0] = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002827
Andre Eisenbach181d0752013-06-11 14:18:21 -07002828 event = bta_dm_cb.pin_evt;
2829 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 -08002830 }
2831
2832 if( bta_dm_cb.p_sec_cback )
2833 bta_dm_cb.p_sec_cback(event, &sec_event);
2834}
2835
2836
2837
2838/*******************************************************************************
2839**
2840** Function bta_dm_pin_cback
2841**
2842** Description Callback requesting pin_key
2843**
2844** Returns void
2845**
2846*******************************************************************************/
2847static UINT8 bta_dm_pin_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name)
2848{
2849 tBTA_DM_SEC sec_event;
2850
2851 if (!bta_dm_cb.p_sec_cback)
2852 return BTM_NOT_AUTHORIZED;
2853
2854 /* If the device name is not known, save bdaddr and devclass and initiate a name request */
2855 if (bd_name[0] == 0)
2856 {
2857 bta_dm_cb.pin_evt = BTA_DM_PIN_REQ_EVT;
2858 bdcpy(bta_dm_cb.pin_bd_addr, bd_addr);
2859 BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, dev_class);
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07002860 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 -08002861 return BTM_CMD_STARTED;
2862
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002863 APPL_TRACE_WARNING(" bta_dm_pin_cback() -> Failed to start Remote Name Request ");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002864 }
2865
2866 bdcpy(sec_event.pin_req.bd_addr, bd_addr);
2867 BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, dev_class);
2868 BCM_STRNCPY_S((char*)sec_event.pin_req.bd_name, sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1));
2869 sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0;
2870
2871 bta_dm_cb.p_sec_cback(BTA_DM_PIN_REQ_EVT, &sec_event);
2872 return BTM_CMD_STARTED;
2873}
2874
2875
2876
2877/*******************************************************************************
2878**
2879** Function bta_dm_link_key_request_cback
2880**
2881** Description Callback requesting linkkey
2882**
2883** Returns void
2884**
2885*******************************************************************************/
2886static UINT8 bta_dm_link_key_request_cback (BD_ADDR bd_addr, LINK_KEY key)
2887{
2888 /* Application passes all link key to
2889 BTM during initialization using add_device
2890 API. If BTM doesn't have the link key in it's
2891 data base, that's because application doesn't
2892 it */
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002893 UNUSED(bd_addr);
2894 UNUSED(key);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002895
2896 return BTM_NOT_AUTHORIZED;
2897}
2898
2899
2900
2901
2902
2903/*******************************************************************************
2904**
2905** Function bta_dm_new_link_key_cback
2906**
2907** Description Callback from BTM to notify new link key
2908**
2909** Returns void
2910**
2911*******************************************************************************/
2912static UINT8 bta_dm_new_link_key_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,
2913 BD_NAME bd_name, LINK_KEY key, UINT8 key_type)
2914{
2915 tBTA_DM_SEC sec_event;
2916 tBTA_DM_AUTH_CMPL *p_auth_cmpl;
2917 UINT8 event;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002918 UNUSED(dev_class);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002919
2920 memset (&sec_event, 0, sizeof(tBTA_DM_SEC));
2921
2922 /* Not AMP Key type */
2923 if (key_type != HCI_LKEY_TYPE_AMP_WIFI && key_type != HCI_LKEY_TYPE_AMP_UWB)
2924 {
2925 event = BTA_DM_AUTH_CMPL_EVT;
2926 p_auth_cmpl = &sec_event.auth_cmpl;
2927
2928 bdcpy(p_auth_cmpl->bd_addr, bd_addr);
2929
2930 memcpy(p_auth_cmpl->bd_name, bd_name, (BD_NAME_LEN-1));
2931 p_auth_cmpl->bd_name[BD_NAME_LEN-1] = 0;
2932
2933 p_auth_cmpl->key_present = TRUE;
2934 p_auth_cmpl->key_type = key_type;
2935 p_auth_cmpl->success = TRUE;
2936
2937 memcpy(p_auth_cmpl->key, key, LINK_KEY_LEN);
2938 sec_event.auth_cmpl.fail_reason = HCI_SUCCESS;
2939
2940 if(bta_dm_cb.p_sec_cback)
2941 {
2942 bta_dm_cb.p_sec_cback(event, &sec_event);
2943 }
2944 }
2945 else
2946 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002947 APPL_TRACE_WARNING(" bta_dm_new_link_key_cback() Received AMP Key?? ");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002948 }
2949
2950 return BTM_CMD_STARTED;
2951}
2952
2953
2954/*******************************************************************************
2955**
2956** Function bta_dm_authentication_complete_cback
2957**
2958** Description Authentication complete callback from BTM
2959**
2960** Returns void
2961**
2962*******************************************************************************/
2963static UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,BD_NAME bd_name, int result)
2964{
The Android Open Source Project5738f832012-12-12 16:00:35 -08002965 tBTA_DM_SEC sec_event;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002966 UNUSED(dev_class);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002967
2968 if(result != BTM_SUCCESS)
2969 {
2970 memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
2971 bdcpy(sec_event.auth_cmpl.bd_addr, bd_addr);
2972
2973 memcpy(sec_event.auth_cmpl.bd_name, bd_name, (BD_NAME_LEN-1));
2974 sec_event.auth_cmpl.bd_name[BD_NAME_LEN-1] = 0;
2975
2976/* taken care of by memset [above]
2977 sec_event.auth_cmpl.key_present = FALSE;
2978 sec_event.auth_cmpl.success = FALSE;
2979*/
2980 sec_event.auth_cmpl.fail_reason = (UINT8)result;
2981 if(bta_dm_cb.p_sec_cback)
2982 {
2983 bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
2984 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002985 /* delete this device entry from Sec Dev DB */
2986 bta_dm_remove_sec_dev_entry(bd_addr);
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07002987
The Android Open Source Project5738f832012-12-12 16:00:35 -08002988 }
2989
2990 return BTM_SUCCESS;
2991}
2992
2993/*******************************************************************************
2994**
2995** Function bta_dm_sp_cback
2996**
2997** Description simple pairing callback from BTM
2998**
2999** Returns void
3000**
3001*******************************************************************************/
3002static UINT8 bta_dm_sp_cback (tBTM_SP_EVT event, tBTM_SP_EVT_DATA *p_data)
3003{
3004 tBTM_STATUS status = BTM_CMD_STARTED;
3005 tBTA_DM_SEC sec_event;
3006 tBTA_DM_SEC_EVT pin_evt = BTA_DM_SP_KEY_NOTIF_EVT;
3007
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003008 APPL_TRACE_EVENT("bta_dm_sp_cback: %d", event);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003009 if (!bta_dm_cb.p_sec_cback)
3010 return BTM_NOT_AUTHORIZED;
3011
3012 /* TODO_SP */
3013 switch(event)
3014 {
3015 case BTM_SP_IO_REQ_EVT:
3016#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
3017 /* translate auth_req */
3018 bta_dm_co_io_req(p_data->io_req.bd_addr, &p_data->io_req.io_cap,
3019 &p_data->io_req.oob_data, &p_data->io_req.auth_req, p_data->io_req.is_orig);
3020#endif
3021#if BTM_OOB_INCLUDED == FALSE
3022 status = BTM_SUCCESS;
3023#endif
3024
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003025 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 -08003026 break;
3027 case BTM_SP_IO_RSP_EVT:
3028#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
3029 bta_dm_co_io_rsp(p_data->io_rsp.bd_addr, p_data->io_rsp.io_cap,
3030 p_data->io_rsp.oob_data, p_data->io_rsp.auth_req );
3031#endif
3032 break;
3033
3034 case BTM_SP_CFM_REQ_EVT:
3035 pin_evt = BTA_DM_SP_CFM_REQ_EVT;
3036 bta_dm_cb.just_works = sec_event.cfm_req.just_works = p_data->cfm_req.just_works;
3037 sec_event.cfm_req.loc_auth_req = p_data->cfm_req.loc_auth_req;
3038 sec_event.cfm_req.rmt_auth_req = p_data->cfm_req.rmt_auth_req;
3039 sec_event.cfm_req.loc_io_caps = p_data->cfm_req.loc_io_caps;
3040 sec_event.cfm_req.rmt_io_caps = p_data->cfm_req.rmt_io_caps;
3041 /* continue to next case */
3042#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
3043 /* Passkey entry mode, mobile device with output capability is very
3044 unlikely to receive key request, so skip this event */
3045 /*case BTM_SP_KEY_REQ_EVT: */
3046 case BTM_SP_KEY_NOTIF_EVT:
3047#endif
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003048 if(BTM_SP_CFM_REQ_EVT == event)
The Android Open Source Project5738f832012-12-12 16:00:35 -08003049 {
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003050 /* Due to the switch case falling through below to BTM_SP_KEY_NOTIF_EVT,
3051 call remote name request using values from cfm_req */
3052 if(p_data->cfm_req.bd_name[0] == 0)
3053 {
3054 bta_dm_cb.pin_evt = pin_evt;
3055 bdcpy(bta_dm_cb.pin_bd_addr, p_data->cfm_req.bd_addr);
3056 BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->cfm_req.dev_class);
3057 if ((BTM_ReadRemoteDeviceName(p_data->cfm_req.bd_addr, bta_dm_pinname_cback,
3058 BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
3059 return BTM_CMD_STARTED;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003060 APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request ");
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003061 }
3062 else
3063 {
3064 /* Due to the switch case falling through below to BTM_SP_KEY_NOTIF_EVT,
3065 copy these values into key_notif from cfm_req */
3066 bdcpy(sec_event.key_notif.bd_addr, p_data->cfm_req.bd_addr);
3067 BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->cfm_req.dev_class);
3068 BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME),
3069 (char*)p_data->cfm_req.bd_name, (BD_NAME_LEN-1));
3070 sec_event.key_notif.bd_name[BD_NAME_LEN-1] = 0;
3071 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003072 }
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003073
3074 bta_dm_cb.num_val = sec_event.key_notif.passkey = p_data->key_notif.passkey;
3075 if (BTM_SP_KEY_NOTIF_EVT == event)
3076 {
3077 /* If the device name is not known, save bdaddr and devclass
3078 and initiate a name request with values from key_notif */
3079 if(p_data->key_notif.bd_name[0] == 0)
3080 {
3081 bta_dm_cb.pin_evt = pin_evt;
3082 bdcpy(bta_dm_cb.pin_bd_addr, p_data->key_notif.bd_addr);
3083 BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->key_notif.dev_class);
3084 if ((BTM_ReadRemoteDeviceName(p_data->key_notif.bd_addr, bta_dm_pinname_cback,
3085 BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
3086 return BTM_CMD_STARTED;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003087 APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request ");
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003088 }
3089 else
3090 {
3091 bdcpy(sec_event.key_notif.bd_addr, p_data->key_notif.bd_addr);
3092 BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->key_notif.dev_class);
3093 BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME),
3094 (char*)p_data->key_notif.bd_name, (BD_NAME_LEN-1));
3095 sec_event.key_notif.bd_name[BD_NAME_LEN-1] = 0;
3096 }
3097 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003098
3099 bta_dm_cb.p_sec_cback(pin_evt, &sec_event);
3100
3101 break;
3102
3103#if BTM_OOB_INCLUDED == TRUE
3104 case BTM_SP_LOC_OOB_EVT:
3105 bta_dm_co_loc_oob((BOOLEAN)(p_data->loc_oob.status == BTM_SUCCESS),
3106 p_data->loc_oob.c, p_data->loc_oob.r);
3107 break;
3108
3109 case BTM_SP_RMT_OOB_EVT:
3110 /* If the device name is not known, save bdaddr and devclass and initiate a name request */
3111 if (p_data->rmt_oob.bd_name[0] == 0)
3112 {
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003113 bta_dm_cb.pin_evt = BTA_DM_SP_RMT_OOB_EVT;
3114 bdcpy(bta_dm_cb.pin_bd_addr, p_data->rmt_oob.bd_addr);
3115 BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->rmt_oob.dev_class);
3116 if ((BTM_ReadRemoteDeviceName(p_data->rmt_oob.bd_addr, bta_dm_pinname_cback,
3117 BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
3118 return BTM_CMD_STARTED;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003119 APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request ");
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003120 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003121
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003122 bdcpy(sec_event.rmt_oob.bd_addr, p_data->rmt_oob.bd_addr);
3123 BTA_COPY_DEVICE_CLASS(sec_event.rmt_oob.dev_class, p_data->rmt_oob.dev_class);
3124 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 -08003125 sec_event.rmt_oob.bd_name[BD_NAME_LEN-1] = 0;
3126
3127 bta_dm_cb.p_sec_cback(BTA_DM_SP_RMT_OOB_EVT, &sec_event);
3128
3129 bta_dm_co_rmt_oob(p_data->rmt_oob.bd_addr);
3130 break;
3131#endif
3132 case BTM_SP_COMPLT_EVT:
3133 /* do not report this event - handled by link_key_callback or auth_complete_callback */
3134 break;
3135
3136 case BTM_SP_KEYPRESS_EVT:
3137 memcpy(&sec_event.key_press, &p_data->key_press, sizeof(tBTM_SP_KEYPRESS));
3138 bta_dm_cb.p_sec_cback(BTA_DM_SP_KEYPRESS_EVT, &sec_event);
3139 break;
3140
3141 case BTM_SP_UPGRADE_EVT:
3142 bta_dm_co_lk_upgrade(p_data->upgrade.bd_addr, &p_data->upgrade.upgrade );
3143 break;
3144
3145 default:
3146 status = BTM_NOT_AUTHORIZED;
3147 break;
3148 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003149 APPL_TRACE_EVENT("dm status: %d", status);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003150 return status;
3151}
3152
3153/*******************************************************************************
3154**
3155** Function bta_dm_local_name_cback
3156**
3157** Description Callback from btm after local name is read
3158**
3159**
3160** Returns void
3161**
3162*******************************************************************************/
3163static void bta_dm_local_name_cback(UINT8 *p_name)
3164{
3165 tBTA_DM_SEC sec_event;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08003166 UNUSED(p_name);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003167
3168 BTM_GetLocalDeviceAddr(sec_event.enable.bd_addr);
3169 sec_event.enable.status = BTA_SUCCESS;
3170
3171 if(bta_dm_cb.p_sec_cback)
3172 bta_dm_cb.p_sec_cback(BTA_DM_ENABLE_EVT, &sec_event);
Ganesh Ganapathi Batta9546abf2014-05-30 16:28:00 -07003173
3174#if ( BLE_INCLUDED == TRUE)
3175 BTM_BleReadControllerFeatures (bta_dm_ctrl_features_rd_cmpl_cback);
3176#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08003177}
3178
3179/*******************************************************************************
3180**
3181** Function bta_dm_signal_strength
3182**
3183** Description Callback from btm after local bdaddr is read
3184**
3185**
3186** Returns void
3187**
3188*******************************************************************************/
3189void bta_dm_signal_strength(tBTA_DM_MSG *p_data)
3190{
3191
3192 if(p_data->sig_strength.start)
3193 {
3194 bta_dm_cb.signal_strength_mask = p_data->sig_strength.mask;
3195 bta_dm_cb.signal_strength_period = p_data->sig_strength.period;
3196 bta_dm_signal_strength_timer_cback(NULL);
3197 }
3198 else
3199 {
3200 bta_sys_stop_timer(&bta_dm_cb.signal_strength_timer);
3201 }
3202
3203}
3204/*******************************************************************************
3205**
3206** Function bta_dm_signal_strength_timer_cback
3207**
3208** Description Periodic timer callback to read signal strength
3209**
3210**
3211** Returns void
3212**
3213*******************************************************************************/
3214static void bta_dm_signal_strength_timer_cback (TIMER_LIST_ENT *p_tle)
3215{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08003216 UNUSED(p_tle);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003217 UINT8 i;
3218
3219 if(bta_dm_cb.signal_strength_mask & BTA_SIG_STRENGTH_RSSI_MASK)
3220 {
3221 for(i=0; i<bta_dm_cb.device_list.count; i++)
3222 {
3223 BTM_ReadRSSI (bta_dm_cb.device_list.peer_device[i].peer_bdaddr, (tBTM_CMPL_CB *)bta_dm_rssi_cback);
3224
3225 }
3226 }
3227 if(bta_dm_cb.signal_strength_mask & BTA_SIG_STRENGTH_LINK_QUALITY_MASK)
3228 {
3229
3230 for(i=0; i<bta_dm_cb.device_list.count; i++)
3231 {
3232 BTM_ReadLinkQuality (bta_dm_cb.device_list.peer_device[i].peer_bdaddr, (tBTM_CMPL_CB *)bta_dm_link_quality_cback);
3233 }
3234
3235 }
3236
3237 if(bta_dm_cb.signal_strength_period)
3238 {
3239 bta_dm_cb.signal_strength_timer.p_cback = (TIMER_CBACK*)&bta_dm_signal_strength_timer_cback;
3240 bta_sys_start_timer(&bta_dm_cb.signal_strength_timer, 0, (UINT32)1000*bta_dm_cb.signal_strength_period);
3241 }
3242}
3243
3244
3245#if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
3246/*******************************************************************************
3247**
3248** Function bta_dm_bl_change_cback
3249**
3250** Description Callback from btm when acl connection goes up or down
3251**
3252**
3253** Returns void
3254**
3255*******************************************************************************/
3256static void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data)
3257{
The Android Open Source Project5738f832012-12-12 16:00:35 -08003258 tBTA_DM_ACL_CHANGE * p_msg;
3259
3260 if ((p_msg = (tBTA_DM_ACL_CHANGE *) GKI_getbuf(sizeof(tBTA_DM_ACL_CHANGE))) != NULL)
3261 {
3262 p_msg->event = p_data->event;
3263 p_msg->is_new = FALSE;
3264
3265 switch(p_msg->event)
3266 {
3267 case BTM_BL_CONN_EVT:
3268 p_msg->is_new = TRUE;
3269 bdcpy(p_msg->bd_addr, p_data->conn.p_bda);
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003270#if BLE_INCLUDED == TRUE
3271 p_msg->transport = p_data->conn.transport;
3272 p_msg->handle = p_data->conn.handle;
3273#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08003274 break;
3275 case BTM_BL_DISCN_EVT:
3276 bdcpy(p_msg->bd_addr, p_data->discn.p_bda);
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003277#if BLE_INCLUDED == TRUE
3278 p_msg->transport = p_data->discn.transport;
3279 p_msg->handle = p_data->discn.handle;
3280#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08003281 break;
3282 case BTM_BL_UPDATE_EVT:
3283 p_msg->busy_level = p_data->update.busy_level;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003284 p_msg->busy_level_flags = p_data->update.busy_level_flags;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003285 break;
3286 case BTM_BL_ROLE_CHG_EVT:
3287 p_msg->new_role = p_data->role_chg.new_role;
3288 p_msg->hci_status = p_data->role_chg.hci_status;
3289 bdcpy(p_msg->bd_addr, p_data->role_chg.p_bda);
3290 break;
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003291 case BTM_BL_COLLISION_EVT:
3292 bdcpy(p_msg->bd_addr, p_data->conn.p_bda);
3293 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003294 }
3295
3296 p_msg->hdr.event = BTA_DM_ACL_CHANGE_EVT;
3297 bta_sys_sendmsg(p_msg);
3298
3299 }
3300
3301}
3302#else
3303
3304/*******************************************************************************
3305**
3306** Function bta_dm_acl_change_cback
3307**
3308** Description Callback from btm when acl connection goes up or down
3309**
3310**
3311** Returns void
3312**
3313*******************************************************************************/
3314static void bta_dm_acl_change_cback (BD_ADDR p_bda, DEV_CLASS p_dc, BD_NAME p_bdn,
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003315 UINT8 *features, BOOLEAN is_new,UINT16 handle,
3316 tBT_TRANSPORT transport)
The Android Open Source Project5738f832012-12-12 16:00:35 -08003317{
3318
3319 tBTA_DM_ACL_CHANGE * p_msg;
3320
3321 if ((p_msg = (tBTA_DM_ACL_CHANGE *) GKI_getbuf(sizeof(tBTA_DM_ACL_CHANGE))) != NULL)
3322 {
3323 bdcpy (p_msg->bd_addr, p_bda);
3324 p_msg->is_new = is_new;
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003325#if BLE_INCLUDED == TRUE
3326 p_msg->handle = handle;
3327 p_msg->transport = transport;
3328#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08003329 /* This is collision case */
3330 if (features != NULL)
3331 {
3332 if ((features[0] == 0xFF) && !is_new)
3333 p_msg->event = BTM_BL_COLLISION_EVT;
3334 }
3335
3336 p_msg->hdr.event = BTA_DM_ACL_CHANGE_EVT;
3337 bta_sys_sendmsg(p_msg);
3338
3339 }
3340
3341}
3342#endif
3343/*******************************************************************************
3344**
3345** Function bta_dm_rs_cback
3346**
3347** Description Receives the role switch complete event
3348**
3349** Returns
3350**
3351*******************************************************************************/
3352static void bta_dm_rs_cback (tBTM_ROLE_SWITCH_CMPL *p1)
3353{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08003354 UNUSED(p1);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003355 APPL_TRACE_WARNING("bta_dm_rs_cback:%d", bta_dm_cb.rs_event);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003356 if(bta_dm_cb.rs_event == BTA_DM_API_SEARCH_EVT)
3357 {
3358 bta_dm_cb.search_msg.rs_res = BTA_DM_RS_OK; /* do not care about the result for now */
3359 bta_dm_cb.rs_event = 0;
3360 bta_dm_search_start((tBTA_DM_MSG *)&bta_dm_cb.search_msg);
3361 }
3362}
3363
3364/*******************************************************************************
3365**
3366** Function bta_dm_check_av
3367**
3368** Description This function checks if AV is active
3369** if yes, make sure the AV link is master
3370**
3371** Returns BOOLEAN - TRUE, if switch is in progress
3372**
3373*******************************************************************************/
3374static BOOLEAN bta_dm_check_av(UINT16 event)
3375{
Mattias Agren9647e912013-04-08 12:23:42 +02003376 BOOLEAN avoid_roleswitch = FALSE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003377 BOOLEAN switching = FALSE;
3378 UINT8 i;
3379 tBTA_DM_PEER_DEVICE *p_dev;
3380
Mattias Agren9647e912013-04-08 12:23:42 +02003381#if defined(BTA_DM_AVOID_A2DP_ROLESWITCH_ON_INQUIRY) && (BTA_DM_AVOID_A2DP_ROLESWITCH_ON_INQUIRY == TRUE)
3382
3383 /* avoid role switch upon inquiry if a2dp is actively streaming as it
3384 introduces an audioglitch due to FW scheduling delays (unavoidable) */
3385 if (event == BTA_DM_API_SEARCH_EVT)
3386 {
3387 avoid_roleswitch = TRUE;
3388 }
3389#endif
3390
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003391 APPL_TRACE_WARNING("bta_dm_check_av:%d", bta_dm_cb.cur_av_count);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003392 if(bta_dm_cb.cur_av_count)
3393 {
3394 for(i=0; i<bta_dm_cb.device_list.count; i++)
3395 {
3396 p_dev = &bta_dm_cb.device_list.peer_device[i];
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003397 APPL_TRACE_WARNING("[%d]: state:%d, info:x%x, avoid_rs %d",
Mattias Agren9647e912013-04-08 12:23:42 +02003398 i, p_dev->conn_state, p_dev->info, avoid_roleswitch);
3399 if((p_dev->conn_state == BTA_DM_CONNECTED) && (p_dev->info & BTA_DM_DI_AV_ACTIVE) &&
3400 (avoid_roleswitch == FALSE))
The Android Open Source Project5738f832012-12-12 16:00:35 -08003401 {
3402 /* make master and take away the role switch policy */
3403 if(BTM_CMD_STARTED == BTM_SwitchRole (p_dev->peer_bdaddr, HCI_ROLE_MASTER, (tBTM_CMPL_CB *)bta_dm_rs_cback))
3404 {
3405 /* the role switch command is actually sent */
3406 bta_dm_cb.rs_event = event;
3407 switching = TRUE;
3408 }
3409 /* else either already master or can not switch for some reasons */
3410 bta_dm_policy_cback(BTA_SYS_PLCY_CLR, 0, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_dev->peer_bdaddr);
3411 break;
3412 }
3413 }
3414 }
3415 return switching;
3416}
3417
3418/*******************************************************************************
3419**
3420** Function bta_dm_acl_change
3421**
3422** Description Process BTA_DM_ACL_CHANGE_EVT
3423**
3424**
3425** Returns void
3426**
3427*******************************************************************************/
3428void bta_dm_acl_change(tBTA_DM_MSG *p_data)
3429{
3430
3431 UINT8 i;
3432 UINT8 *p;
3433 tBTA_DM_SEC conn;
3434 BOOLEAN is_new = p_data->acl_change.is_new;
3435 BD_ADDR_PTR p_bda = p_data->acl_change.bd_addr;
3436 BOOLEAN need_policy_change = FALSE;
3437 BOOLEAN issue_unpair_cb = FALSE;
3438
3439#if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
3440 tBTA_DM_PEER_DEVICE *p_dev;
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003441 memset(&conn, 0, sizeof(tBTA_DM_SEC));
The Android Open Source Project5738f832012-12-12 16:00:35 -08003442
3443 switch(p_data->acl_change.event)
3444 {
3445 case BTM_BL_UPDATE_EVT: /* busy level update */
3446 if( bta_dm_cb.p_sec_cback )
3447 {
3448 conn.busy_level.level = p_data->acl_change.busy_level;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003449 conn.busy_level.level_flags = p_data->acl_change.busy_level_flags;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003450 bta_dm_cb.p_sec_cback(BTA_DM_BUSY_LEVEL_EVT, &conn);
3451 }
3452 return;
3453
3454 case BTM_BL_ROLE_CHG_EVT: /* role change event */
3455 p_dev = bta_dm_find_peer_device(p_bda);
3456 if(p_dev)
3457 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003458 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 -08003459 p_dev->info, p_data->acl_change.new_role, bta_dm_cb.device_list.count);
3460 if(p_dev->info & BTA_DM_DI_AV_ACTIVE)
3461 {
3462 /* there's AV activity on this link */
3463 if(p_data->acl_change.new_role == HCI_ROLE_SLAVE && bta_dm_cb.device_list.count > 1
3464 && p_data->acl_change.hci_status == HCI_SUCCESS)
3465 {
3466 /* more than one connections and the AV connection is role switched to slave
3467 * switch it back to master and remove the switch policy */
3468 BTM_SwitchRole(p_bda, BTM_ROLE_MASTER, NULL);
3469 need_policy_change = TRUE;
3470 }
3471 else if (bta_dm_cfg.avoid_scatter && (p_data->acl_change.new_role == HCI_ROLE_MASTER))
3472 {
3473 /* if the link updated to be master include AV activities, remove the switch policy */
3474 need_policy_change = TRUE;
3475 }
3476
3477 if(need_policy_change)
3478 {
3479 bta_dm_policy_cback(BTA_SYS_PLCY_CLR, 0, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_dev->peer_bdaddr);
3480 }
3481 }
3482 else
3483 {
3484 /* there's AV no activity on this link and role switch happened
3485 * check if AV is active
3486 * if so, make sure the AV link is master */
3487 bta_dm_check_av(0);
3488 }
3489 bta_sys_notify_role_chg(p_data->acl_change.bd_addr, p_data->acl_change.new_role, p_data->acl_change.hci_status);
3490 bdcpy(conn.role_chg.bd_addr, p_bda);
3491 conn.role_chg.new_role = (UINT8) p_data->acl_change.new_role;
3492 if( bta_dm_cb.p_sec_cback )
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003493 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 -08003494 }
3495 return;
3496 }
3497#endif
3498
3499 /* Collision report from Stack: Notify profiles */
3500 if (p_data->acl_change.event == BTM_BL_COLLISION_EVT)
3501 {
3502 bta_sys_notify_collision (p_bda);
3503 return;
3504 }
3505
3506 if(is_new)
3507 {
3508 for(i=0; i<bta_dm_cb.device_list.count; i++)
3509 {
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003510 if (!bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda)
3511#if BLE_INCLUDED == TRUE
3512 && bta_dm_cb.device_list.peer_device[i].conn_handle == p_data->acl_change.handle
3513#endif
3514 )
The Android Open Source Project5738f832012-12-12 16:00:35 -08003515 break;
3516
3517 }
3518
3519 if(i == bta_dm_cb.device_list.count)
3520 {
3521 bdcpy(bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].peer_bdaddr, p_bda);
3522 bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].link_policy = bta_dm_cb.cur_policy;
3523 bta_dm_cb.device_list.count++;
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003524#if BLE_INCLUDED == TRUE
3525 bta_dm_cb.device_list.peer_device[i].conn_handle = p_data->acl_change.handle;
3526 if (p_data->acl_change.transport == BT_TRANSPORT_LE)
3527 bta_dm_cb.device_list.le_count++;
3528#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08003529 }
3530
3531 bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_CONNECTED;
3532 bta_dm_cb.device_list.peer_device[i].pref_role = BTA_ANY_ROLE;
3533 bdcpy(conn.link_up.bd_addr, p_bda);
3534 bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_NONE;
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003535#if BLE_INCLUDED == TRUE
3536 conn.link_up.link_type = p_data->acl_change.transport;
3537 bta_dm_cb.device_list.peer_device[i].transport = p_data->acl_change.transport;
3538#endif
3539
3540 if (((NULL != (p = BTM_ReadLocalFeatures ())) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) &&
3541 ((NULL != (p = BTM_ReadRemoteFeatures (p_bda))) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)))
The Android Open Source Project5738f832012-12-12 16:00:35 -08003542 {
3543 /* both local and remote devices support SSR */
3544 bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_USE_SSR;
3545 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003546 APPL_TRACE_WARNING("info:x%x", bta_dm_cb.device_list.peer_device[i].info);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003547 if( bta_dm_cb.p_sec_cback )
3548 bta_dm_cb.p_sec_cback(BTA_DM_LINK_UP_EVT, &conn);
3549
3550 }
3551 else
3552 {
3553 for(i=0; i<bta_dm_cb.device_list.count; i++)
3554 {
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003555 if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda)
3556#if BLE_INCLUDED == TRUE
3557 ||bta_dm_cb.device_list.peer_device[i].transport != p_data->acl_change.transport
3558#endif
3559 )
The Android Open Source Project5738f832012-12-12 16:00:35 -08003560 continue;
3561
3562 if( bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_UNPAIRING )
3563 {
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003564 if (BTM_SecDeleteDevice(bta_dm_cb.device_list.peer_device[i].peer_bdaddr))
3565 {
Zhihai Xubd68d682013-11-15 17:55:46 -08003566#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003567 /* remove all cached GATT information */
3568 BTA_GATTC_Refresh(p_bda);
Zhihai Xubd68d682013-11-15 17:55:46 -08003569#endif
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003570 issue_unpair_cb = TRUE;
3571 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003572 }
3573
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003574 conn.link_down.is_removed = bta_dm_cb.device_list.peer_device[i].remove_dev_pending;
3575
The Android Open Source Project5738f832012-12-12 16:00:35 -08003576 for(; i<bta_dm_cb.device_list.count ; i++)
3577 {
3578 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]));
3579 }
3580 break;
3581 }
3582 if(bta_dm_cb.device_list.count)
3583 bta_dm_cb.device_list.count--;
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003584#if BLE_INCLUDED == TRUE
3585 if ((p_data->acl_change.transport == BT_TRANSPORT_LE) &&
3586 (bta_dm_cb.device_list.le_count))
3587 bta_dm_cb.device_list.le_count--;
3588 conn.link_down.link_type = p_data->acl_change.transport;
3589#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08003590
3591 if(bta_dm_search_cb.wait_disc && !bdcmp(bta_dm_search_cb.peer_bdaddr, p_bda))
3592 {
3593 bta_dm_search_cb.wait_disc = FALSE;
3594
3595 if(bta_dm_search_cb.sdp_results)
3596 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003597 APPL_TRACE_EVENT(" timer stopped ");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003598 bta_sys_stop_timer(&bta_dm_search_cb.search_timer);
3599 bta_dm_discover_next_device();
3600 }
3601
3602 }
3603
3604 if(bta_dm_cb.disabling)
3605 {
3606 if(!BTM_GetNumAclLinks())
3607 {
3608 bta_sys_stop_timer(&bta_dm_cb.disable_timer);
3609 bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_conn_down_timer_cback;
3610 /* start a timer to make sure that the profiles get the disconnect event */
3611 bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 1000);
3612 }
3613 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003614 if (conn.link_down.is_removed)
3615 {
3616 BTM_SecDeleteDevice(p_bda);
3617#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
3618 /* need to remove all pending background connection */
3619 BTA_GATTC_CancelOpen(0, p_bda, FALSE);
3620 /* remove all cached GATT information */
3621 BTA_GATTC_Refresh(p_bda);
3622#endif
3623 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003624
3625 bdcpy(conn.link_down.bd_addr, p_bda);
3626 conn.link_down.status = (UINT8) btm_get_acl_disc_reason_code();
3627 if( bta_dm_cb.p_sec_cback )
3628 {
3629 bta_dm_cb.p_sec_cback(BTA_DM_LINK_DOWN_EVT, &conn);
3630 if( issue_unpair_cb )
3631 bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &conn);
3632 }
3633 }
3634
3635 bta_dm_adjust_roles(TRUE);
3636}
3637
3638/*******************************************************************************
3639**
3640** Function bta_dm_disable_conn_down_timer_cback
3641**
3642** Description Sends disable event to application
3643**
3644**
3645** Returns void
3646**
3647*******************************************************************************/
3648static void bta_dm_disable_conn_down_timer_cback (TIMER_LIST_ENT *p_tle)
3649{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08003650 UNUSED(p_tle);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003651 tBTA_SYS_HW_MSG *sys_enable_event;
3652
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003653 /* disable the power managment module */
3654 bta_dm_disable_pm();
3655
The Android Open Source Project5738f832012-12-12 16:00:35 -08003656 /* register our callback to SYS HW manager */
3657 bta_sys_hw_register( BTA_SYS_HW_BLUETOOTH, bta_dm_sys_hw_cback );
3658
3659 /* send a message to BTA SYS */
3660 if ((sys_enable_event = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL)
3661 {
3662 sys_enable_event->hdr.event = BTA_SYS_API_DISABLE_EVT;
3663 sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH;
3664 bta_sys_sendmsg(sys_enable_event);
3665 }
3666
3667 bta_dm_cb.disabling = FALSE;
3668
3669}
3670
3671/*******************************************************************************
3672**
3673** Function bta_dm_rssi_cback
3674**
3675** Description Callback from btm with rssi values
3676**
3677**
3678** Returns void
3679**
3680*******************************************************************************/
3681static void bta_dm_rssi_cback (tBTM_RSSI_RESULTS *p_result)
3682{
3683 tBTA_DM_SEC sec_event;
3684
3685 if(p_result->status == BTM_SUCCESS)
3686 {
3687
3688 bdcpy(sec_event.sig_strength.bd_addr, p_result->rem_bda);
3689 sec_event.sig_strength.mask = BTA_SIG_STRENGTH_RSSI_MASK;
3690 sec_event.sig_strength.rssi_value = p_result->rssi;
3691 if( bta_dm_cb.p_sec_cback!= NULL )
3692 bta_dm_cb.p_sec_cback(BTA_DM_SIG_STRENGTH_EVT, &sec_event);
3693
3694 }
3695}
3696
3697/*******************************************************************************
3698**
3699** Function bta_dm_link_quality_cback
3700**
3701** Description Callback from btm with link quality value
3702**
3703**
3704** Returns void
3705**
3706*******************************************************************************/
3707static void bta_dm_link_quality_cback (tBTM_LINK_QUALITY_RESULTS *p_result)
3708{
3709
3710 tBTA_DM_SEC sec_event;
3711
3712 if(p_result->status == BTM_SUCCESS)
3713 {
3714
3715 bdcpy(sec_event.sig_strength.bd_addr, p_result->rem_bda);
3716 sec_event.sig_strength.mask = BTA_SIG_STRENGTH_LINK_QUALITY_MASK;
3717 sec_event.sig_strength.link_quality_value = p_result->link_quality;
3718 if( bta_dm_cb.p_sec_cback!= NULL )
3719 bta_dm_cb.p_sec_cback(BTA_DM_SIG_STRENGTH_EVT, &sec_event);
3720
3721 }
3722}
3723
3724/*******************************************************************************
3725**
3726** Function bta_dm_rm_cback
3727**
3728** Description Role management callback from sys
3729**
3730**
3731** Returns void
3732**
3733*******************************************************************************/
3734static void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
3735{
3736
3737 UINT8 j;
3738 tBTA_PREF_ROLES role;
3739 tBTA_DM_PEER_DEVICE *p_dev;
3740
3741 p_dev = bta_dm_find_peer_device(peer_addr);
3742 if( status == BTA_SYS_CONN_OPEN)
3743 {
3744 if(p_dev)
3745 {
3746 /* Do not set to connected if we are in the middle of unpairing. When AV stream is
3747 * started it fakes out a SYS_CONN_OPEN to potentially trigger a role switch command.
3748 * But this should not be done if we are in the middle of unpairing.
3749 */
3750 if (p_dev->conn_state != BTA_DM_UNPAIRING)
3751 p_dev->conn_state = BTA_DM_CONNECTED;
3752
3753 for(j=1; j<= p_bta_dm_rm_cfg[0].app_id; j++)
3754 {
3755 if(((p_bta_dm_rm_cfg[j].app_id == app_id) || (p_bta_dm_rm_cfg[j].app_id == BTA_ALL_APP_ID))
3756 && (p_bta_dm_rm_cfg[j].id == id))
3757 {
3758 role = p_bta_dm_rm_cfg[j].cfg;
3759
3760 if(role > p_dev->pref_role )
3761 p_dev->pref_role = role;
3762 break;
3763 }
3764 }
3765
3766 }
3767
3768 }
3769
3770 if((BTA_ID_AV == id)||(BTA_ID_AVK ==id))
3771 {
3772 if( status == BTA_SYS_CONN_BUSY)
3773 {
3774 if(p_dev)
3775 p_dev->info |= BTA_DM_DI_AV_ACTIVE;
3776 /* AV calls bta_sys_conn_open with the A2DP stream count as app_id */
3777 if(BTA_ID_AV == id)
3778 bta_dm_cb.cur_av_count = app_id;
3779 }
3780 else if( status == BTA_SYS_CONN_IDLE)
3781 {
3782 if(p_dev)
3783 p_dev->info &= ~BTA_DM_DI_AV_ACTIVE;
3784 /* AV calls bta_sys_conn_open with the A2DP stream count as app_id */
3785 if(BTA_ID_AV == id)
3786 bta_dm_cb.cur_av_count = app_id;
3787 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003788 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 -08003789 }
Ganesh Ganapathi Battaed049d72013-04-12 11:57:50 -07003790 else if ((status == BTA_SYS_CONN_BUSY) || (status == BTA_SYS_CONN_IDLE))
3791 {
3792 /* Do not do role switch management for non-AV profiles when data flow starts/stops */
3793 return;
3794 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003795
3796 bta_dm_adjust_roles(FALSE);
3797
3798}
3799
3800/*******************************************************************************
3801**
3802** Function bta_dm_dev_blacklisted_for_switch
3803**
3804** Description Checks if the device is blacklisted for immediate role switch after connection.
3805**
3806** Returns TRUE if dev is blacklisted else FALSE
3807**
3808*******************************************************************************/
3809static BOOLEAN bta_dm_dev_blacklisted_for_switch (BD_ADDR remote_bd_addr)
3810{
3811 UINT16 manufacturer = 0;
3812 UINT16 lmp_sub_version = 0;
3813 UINT8 lmp_version = 0;
3814 UINT8 i = 0;
3815
3816 if (BTM_ReadRemoteVersion(remote_bd_addr, &lmp_version,
3817 &manufacturer, &lmp_sub_version) == BTM_SUCCESS)
3818 {
3819 /* Check if this device version info matches with is
3820 blacklisted versions for role switch */
3821 for (i = 0; i < BTA_DM_MAX_ROLE_SWITCH_BLACKLIST_COUNT; i++)
3822 {
3823 if ((bta_role_switch_blacklist[i].lmp_version == lmp_version) &&
3824 (bta_role_switch_blacklist[i].manufacturer == manufacturer)&&
3825 ((bta_role_switch_blacklist[i].lmp_sub_version & lmp_sub_version) ==
3826 bta_role_switch_blacklist[i].lmp_sub_version))
3827 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003828 APPL_TRACE_EVENT("Black list F/W version matches.. Delay Role Switch...");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003829 return TRUE;
3830 }
3831
3832 }
3833 }
3834 return FALSE;
3835}
3836
3837/*******************************************************************************
3838**
3839** Function bta_dm_delay_role_switch_cback
3840**
3841** Description Callback from btm to delay a role switch
3842**
3843** Returns void
3844**
3845*******************************************************************************/
3846static void bta_dm_delay_role_switch_cback(TIMER_LIST_ENT *p_tle)
3847{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08003848 UNUSED(p_tle);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003849 APPL_TRACE_EVENT("bta_dm_delay_role_switch_cback: initiating Delayed RS");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003850 bta_dm_adjust_roles (FALSE);
3851}
3852
3853/*******************************************************************************
3854**
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003855** Function bta_dm_remove_sec_dev_entry
3856**
3857** Description Removes device entry from Security device DB if ACL connection with
3858** remtoe device does not exist, else schedule for dev entry removal upon
3859 ACL close
3860**
3861** Returns void
3862**
3863*******************************************************************************/
3864static void bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr)
3865{
3866 UINT16 index = 0;
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003867 if ( BTM_IsAclConnectionUp(remote_bd_addr, BT_TRANSPORT_LE) ||
3868 BTM_IsAclConnectionUp(remote_bd_addr, BT_TRANSPORT_BR_EDR))
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003869 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003870 APPL_TRACE_DEBUG("%s ACL is not down. Schedule for Dev Removal when ACL closes",
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003871 __FUNCTION__);
3872 for (index = 0; index < bta_dm_cb.device_list.count; index ++)
3873 {
3874 if (!bdcmp( bta_dm_cb.device_list.peer_device[index].peer_bdaddr, remote_bd_addr))
3875 break;
3876 }
3877 if (index != bta_dm_cb.device_list.count)
3878 {
3879 bta_dm_cb.device_list.peer_device[index].remove_dev_pending = TRUE;
3880 }
3881 else
3882 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003883 APPL_TRACE_ERROR(" %s Device does not exist in DB", __FUNCTION__);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003884 }
3885 }
3886 else
3887 {
3888 BTM_SecDeleteDevice (remote_bd_addr);
Zhihai Xubd68d682013-11-15 17:55:46 -08003889#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
3890 /* need to remove all pending background connection */
3891 BTA_GATTC_CancelOpen(0, remote_bd_addr, FALSE);
3892 /* remove all cached GATT information */
3893 BTA_GATTC_Refresh(remote_bd_addr);
3894#endif
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003895 }
3896}
3897
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07003898
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003899/*******************************************************************************
3900**
The Android Open Source Project5738f832012-12-12 16:00:35 -08003901** Function bta_dm_adjust_roles
3902**
3903** Description Adjust roles
3904**
3905**
3906** Returns void
3907**
3908*******************************************************************************/
3909static void bta_dm_adjust_roles(BOOLEAN delay_role_switch)
3910{
3911
3912 UINT8 i;
3913 BOOLEAN set_master_role = FALSE;
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003914#if BLE_INCLUDED == TRUE
3915 UINT8 br_count = bta_dm_cb.device_list.count - bta_dm_cb.device_list.le_count;
3916#else
3917 UINT8 br_count = bta_dm_cb.device_list.count;
3918#endif
3919 if (br_count)
The Android Open Source Project5738f832012-12-12 16:00:35 -08003920 {
3921
3922 /* the configuration is no scatternet
3923 * or AV connection exists and there are more than one ACL link */
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003924 if ( (p_bta_dm_rm_cfg[0].cfg == BTA_DM_NO_SCATTERNET) ||
3925 (bta_dm_cb.cur_av_count && br_count > 1) )
The Android Open Source Project5738f832012-12-12 16:00:35 -08003926 {
3927
3928 L2CA_SetDesireRole (HCI_ROLE_MASTER);
3929 set_master_role = TRUE;
3930
3931 }
3932
3933 for(i=0; i<bta_dm_cb.device_list.count; i++)
3934 {
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003935 if (bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED
3936#if BLE_INCLUDED == TRUE
3937 && bta_dm_cb.device_list.peer_device[i].transport == BT_TRANSPORT_BR_EDR
3938#endif
3939 )
The Android Open Source Project5738f832012-12-12 16:00:35 -08003940 {
3941 if(!set_master_role && (bta_dm_cb.device_list.peer_device[i].pref_role != BTA_ANY_ROLE)
3942 && (p_bta_dm_rm_cfg[0].cfg == BTA_DM_PARTIAL_SCATTERNET))
3943 {
3944 L2CA_SetDesireRole (HCI_ROLE_MASTER);
3945 set_master_role = TRUE;
3946 }
3947
3948 if((bta_dm_cb.device_list.peer_device[i].pref_role == BTA_MASTER_ROLE_ONLY)
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07003949 || (br_count > 1))
The Android Open Source Project5738f832012-12-12 16:00:35 -08003950 {
3951
3952 /* Initiating immediate role switch with certain remote devices
3953 has caused issues due to role switch colliding with link encryption setup and
3954 causing encryption (and in turn the link) to fail . These device . Firmware
3955 versions are stored in a blacklist and role switch with these devices are
3956 delayed to avoid the collision with link encryption setup */
3957
3958 if ((delay_role_switch == FALSE) ||
3959 (bta_dm_dev_blacklisted_for_switch(
3960 bta_dm_cb.device_list.peer_device[i].peer_bdaddr) == FALSE))
3961 {
3962 BTM_SwitchRole (bta_dm_cb.device_list.peer_device[i].peer_bdaddr,
3963 HCI_ROLE_MASTER, NULL);
3964 }
3965 else
3966 {
3967 bta_dm_cb.switch_delay_timer.p_cback =
3968 (TIMER_CBACK*)&bta_dm_delay_role_switch_cback;
3969 bta_sys_start_timer(&bta_dm_cb.switch_delay_timer, 0, 500);
3970 }
3971 }
3972
3973 }
3974 }
3975
3976
3977 if(!set_master_role)
3978 {
3979
3980 L2CA_SetDesireRole (L2CAP_DESIRED_LINK_ROLE);
3981
3982 }
3983
3984 }
3985 else
3986 {
3987 L2CA_SetDesireRole (L2CAP_DESIRED_LINK_ROLE);
3988 }
3989
3990
3991}
3992
3993/*******************************************************************************
3994**
3995** Function bta_dm_get_remname
3996**
3997** Description Returns a pointer to the remote name stored in the DM control
3998** block if it exists, or from the BTM memory.
3999**
4000** Returns char * - Pointer to the remote device name
4001*******************************************************************************/
4002static char *bta_dm_get_remname(void)
4003{
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004004 char *p_name = (char *)bta_dm_search_cb.peer_name;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004005 char *p_temp;
4006
4007 /* If the name isn't already stored, try retrieving from BTM */
4008 if (*p_name == '\0')
4009 if ((p_temp = BTM_SecReadDevName(bta_dm_search_cb.peer_bdaddr)) != NULL)
4010 p_name = p_temp;
4011
4012 return p_name;
4013}
4014
4015/*******************************************************************************
4016**
4017** Function bta_dm_bond_cancel_complete_cback
4018**
4019** Description Authentication complete callback from BTM
4020**
4021** Returns void
4022**
4023*******************************************************************************/
4024static void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result)
4025{
4026
4027 tBTA_DM_SEC sec_event;
4028
4029 if (result == BTM_SUCCESS)
4030 sec_event.bond_cancel_cmpl.result = BTA_SUCCESS;
4031 else
4032 sec_event.bond_cancel_cmpl.result = BTA_FAILURE;
4033
4034 if(bta_dm_cb.p_sec_cback)
4035 {
4036 bta_dm_cb.p_sec_cback(BTA_DM_BOND_CANCEL_CMPL_EVT, &sec_event);
4037 }
4038}
4039
4040#if ( BTM_EIR_SERVER_INCLUDED == TRUE )
4041 #if ( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
4042/*******************************************************************************
4043**
4044** Function bta_dm_update_eir_uuid
4045**
4046** Description
4047**
4048**
4049*******************************************************************************/
4050void bta_dm_update_eir_uuid (tBTA_DM_MSG *p_data)
4051{
4052 tBTA_DM_API_UPDATE_EIR_UUID *p_msg = (tBTA_DM_API_UPDATE_EIR_UUID *)p_data;
4053 UINT8 xx;
4054 UINT8 empty_slot = BTA_EIR_SERVER_NUM_CUSTOM_UUID;
4055 UINT8 match_slot = BTA_EIR_SERVER_NUM_CUSTOM_UUID;
4056
4057 for (xx = 0; xx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; xx++)
4058 {
4059 if (bta_dm_cb.custom_uuid[xx].len == 0)
4060 {
4061 if (empty_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID)
4062 empty_slot = xx;
4063 }
4064 else if (match_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID)
4065 {
4066 if (!memcmp (bta_dm_cb.custom_uuid[xx].uu.uuid128, p_msg->uuid.uu.uuid128, p_msg->uuid.len))
4067 {
4068 match_slot = xx;;
4069 }
4070 }
4071 }
4072
4073 if (p_msg->is_add)
4074 {
4075 if (match_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID)
4076 {
4077 if (empty_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID)
4078 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004079 APPL_TRACE_ERROR("No space to add UUID for EIR");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004080 return;
4081 }
4082 else
4083 {
4084 memcpy (&(bta_dm_cb.custom_uuid[empty_slot]), &(p_msg->uuid), sizeof(tBT_UUID));
4085 }
4086 }
4087 else
4088 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004089 APPL_TRACE_ERROR("UUID is already added for EIR");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004090 return;
4091 }
4092 }
4093 else
4094 {
4095 if (match_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID)
4096 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004097 APPL_TRACE_ERROR("UUID is not found for EIR");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004098 return;
4099 }
4100 else
4101 {
4102 memset (&(bta_dm_cb.custom_uuid[match_slot]), 0, sizeof(tBT_UUID));
4103 }
4104 }
4105
4106 bta_dm_set_eir (NULL);
4107}
4108 #endif
4109
4110/*******************************************************************************
4111**
4112** Function bta_dm_set_eir_config
4113**
4114** Description
4115**
4116**
4117*******************************************************************************/
4118void bta_dm_set_eir_config (tBTA_DM_MSG *p_data)
4119{
4120 if (p_data->set_eir_cfg.p_eir_cfg)
4121 {
4122 /* User defined config */
4123 p_bta_dm_eir_cfg = p_data->set_eir_cfg.p_eir_cfg;
4124 }
4125 else
4126 {
4127 /* Back to default config */
4128 p_bta_dm_eir_cfg = (tBTA_DM_EIR_CONF*)&bta_dm_eir_cfg;
4129 }
4130
4131 bta_dm_set_eir (NULL);
4132}
4133
4134/*******************************************************************************
4135**
4136** Function bta_dm_set_eir
4137**
4138** Description This function creates EIR tagged data and writes it to controller.
4139**
4140** Returns None
4141**
4142*******************************************************************************/
4143static void bta_dm_set_eir (char *local_name)
4144{
4145 BT_HDR *p_buf;
4146 UINT8 *p;
4147 UINT8 *p_length;
4148#if (BTA_EIR_CANNED_UUID_LIST != TRUE)
4149 UINT8 *p_type;
4150 UINT8 max_num_uuid;
4151#if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
4152 UINT8 custom_uuid_idx;
4153#endif
4154#endif
4155#if (BTM_EIR_DEFAULT_FEC_REQUIRED == FALSE)
4156 UINT8 free_eir_length = HCI_EXT_INQ_RESPONSE_LEN;
4157#else
4158 UINT8 free_eir_length = HCI_DM5_PACKET_SIZE;
4159#endif
4160 UINT8 num_uuid;
4161 UINT8 data_type;
4162 UINT8 local_name_len;
4163
4164 /* wait until complete to disable */
4165 if (bta_dm_cb.disable_timer.in_use)
4166 return;
4167
4168#if ( BTA_EIR_CANNED_UUID_LIST != TRUE )
4169 /* wait until App is ready */
4170 if (bta_dm_cb.app_ready_timer.in_use)
4171 return;
4172
4173 /* if local name is not provided, get it from controller */
4174 if( local_name == NULL )
4175 {
4176 if( BTM_ReadLocalDeviceName( &local_name ) != BTM_SUCCESS )
4177 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004178 APPL_TRACE_ERROR("Fail to read local device name for EIR");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004179 }
4180 }
4181#endif
4182
4183 /* Allocate a buffer to hold HCI command */
4184 if ((p_buf = (BT_HDR *)GKI_getpoolbuf(BTM_CMD_POOL_ID)) == NULL)
4185 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004186 APPL_TRACE_ERROR("bta_dm_set_eir couldn't allocate buffer");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004187 return;
4188 }
4189 p = (UINT8 *)p_buf + BTM_HCI_EIR_OFFSET;
4190
4191 memset(p, 0x00, HCI_EXT_INQ_RESPONSE_LEN );
4192
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004193 APPL_TRACE_DEBUG("BTA is generating EIR");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004194
4195 if( local_name )
4196 local_name_len = strlen( local_name );
4197 else
4198 local_name_len = 0;
4199
4200 data_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE;
4201 /* if local name is longer than minimum length of shortened name */
4202 /* check whether it needs to be shortened or not */
4203 if( local_name_len > p_bta_dm_eir_cfg->bta_dm_eir_min_name_len )
4204 {
4205 /* get number of UUID 16-bit list */
4206#if (BTA_EIR_CANNED_UUID_LIST == TRUE)
4207 num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len/LEN_UUID_16;
4208#else
4209 max_num_uuid = (free_eir_length - 2)/LEN_UUID_16;
4210 data_type = BTM_GetEirSupportedServices( bta_dm_cb.eir_uuid, &p,
4211 max_num_uuid, &num_uuid );
4212 p = (UINT8 *)p_buf + BTM_HCI_EIR_OFFSET; /* reset p */
4213#endif
4214
4215 /* if UUID doesn't fit remaing space, shorten local name */
4216 if ( local_name_len > (free_eir_length - 4 - num_uuid*LEN_UUID_16))
4217 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004218 APPL_TRACE_WARNING("BTA EIR: local name is shortened");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004219 local_name_len = p_bta_dm_eir_cfg->bta_dm_eir_min_name_len;
4220 data_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE;
4221 }
4222 else
4223 data_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE;
4224 }
4225
4226 UINT8_TO_STREAM(p, local_name_len + 1);
4227 UINT8_TO_STREAM(p, data_type);
Andre Eisenbach3aa60542013-03-22 18:00:51 -07004228
4229 if (local_name != NULL)
4230 {
4231 memcpy(p, local_name, local_name_len);
4232 p += local_name_len;
4233 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08004234 free_eir_length -= local_name_len + 2;
4235
4236#if (BTA_EIR_CANNED_UUID_LIST == TRUE)
4237 /* if UUID list is provided as static data in configuration */
4238 if(( p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len > 0 )
4239 &&(p_bta_dm_eir_cfg->bta_dm_eir_uuid16))
4240 {
4241 if( free_eir_length > LEN_UUID_16 + 2)
4242 {
4243 free_eir_length -= 2;
4244
4245 if( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len)
4246 {
4247 num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len / LEN_UUID_16;
4248 data_type = BTM_EIR_COMPLETE_16BITS_UUID_TYPE;
4249 }
4250 else /* not enough room for all UUIDs */
4251 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004252 APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004253 num_uuid = free_eir_length / LEN_UUID_16;
4254 data_type = BTM_EIR_MORE_16BITS_UUID_TYPE;
4255 }
4256 UINT8_TO_STREAM(p, num_uuid * LEN_UUID_16 + 1);
4257 UINT8_TO_STREAM(p, data_type);
4258 memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_uuid16, num_uuid * LEN_UUID_16 );
4259 p += num_uuid * LEN_UUID_16;
4260 free_eir_length -= num_uuid * LEN_UUID_16;
4261 }
4262 }
4263#else /* (BTA_EIR_CANNED_UUID_LIST == TRUE) */
4264 /* if UUID list is dynamic */
4265 if ( free_eir_length >= 2)
4266 {
4267 p_length = p++;
4268 p_type = p++;
4269 num_uuid = 0;
4270
4271 max_num_uuid = (free_eir_length - 2)/LEN_UUID_16;
4272 data_type = BTM_GetEirSupportedServices( bta_dm_cb.eir_uuid, &p, max_num_uuid, &num_uuid );
4273
4274 if( data_type == BTM_EIR_MORE_16BITS_UUID_TYPE )
4275 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004276 APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004277 }
4278#if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
4279 else
4280 {
4281 for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++)
4282 {
4283 if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_16)
4284 {
4285 if ( num_uuid < max_num_uuid )
4286 {
4287 UINT16_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid16);
4288 num_uuid++;
4289 }
4290 else
4291 {
4292 data_type = BTM_EIR_MORE_16BITS_UUID_TYPE;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004293 APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004294 break;
4295 }
4296 }
4297 }
4298 }
4299#endif /* (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) */
4300
4301 UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_16 + 1);
4302 UINT8_TO_STREAM(p_type, data_type);
4303 free_eir_length -= num_uuid * LEN_UUID_16 + 2;
4304 }
4305#endif /* (BTA_EIR_CANNED_UUID_LIST == TRUE) */
4306
4307#if ( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
4308 /* Adding 32-bit UUID list */
4309 if ( free_eir_length >= 2)
4310 {
4311 p_length = p++;
4312 p_type = p++;
4313 num_uuid = 0;
4314 data_type = BTM_EIR_COMPLETE_32BITS_UUID_TYPE;
4315
4316 max_num_uuid = (free_eir_length - 2)/LEN_UUID_32;
4317
4318 for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++)
4319 {
4320 if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_32)
4321 {
4322 if ( num_uuid < max_num_uuid )
4323 {
4324 UINT32_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid32);
4325 num_uuid++;
4326 }
4327 else
4328 {
4329 data_type = BTM_EIR_MORE_32BITS_UUID_TYPE;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004330 APPL_TRACE_WARNING("BTA EIR: UUID 32-bit list is truncated");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004331 break;
4332 }
4333 }
4334 }
4335
4336 UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_32 + 1);
4337 UINT8_TO_STREAM(p_type, data_type);
4338 free_eir_length -= num_uuid * LEN_UUID_32 + 2;
4339 }
4340
4341 /* Adding 128-bit UUID list */
4342 if ( free_eir_length >= 2)
4343 {
4344 p_length = p++;
4345 p_type = p++;
4346 num_uuid = 0;
4347 data_type = BTM_EIR_COMPLETE_128BITS_UUID_TYPE;
4348
4349 max_num_uuid = (free_eir_length - 2)/LEN_UUID_128;
4350
4351 for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++)
4352 {
4353 if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_128)
4354 {
4355 if ( num_uuid < max_num_uuid )
4356 {
4357 ARRAY16_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid128);
4358 num_uuid++;
4359 }
4360 else
4361 {
4362 data_type = BTM_EIR_MORE_128BITS_UUID_TYPE;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004363 APPL_TRACE_WARNING("BTA EIR: UUID 128-bit list is truncated");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004364 break;
4365 }
4366 }
4367 }
4368
4369 UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_128 + 1);
4370 UINT8_TO_STREAM(p_type, data_type);
4371 free_eir_length -= num_uuid * LEN_UUID_128 + 2;
4372 }
4373#endif /* ( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) */
4374
4375 /* if Flags are provided in configuration */
4376 if(( p_bta_dm_eir_cfg->bta_dm_eir_flag_len > 0 )
4377 &&( p_bta_dm_eir_cfg->bta_dm_eir_flags )
4378 &&( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 2 ))
4379 {
4380 UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 1);
4381 UINT8_TO_STREAM(p, BTM_EIR_FLAGS_TYPE);
4382 memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_flags,
4383 p_bta_dm_eir_cfg->bta_dm_eir_flag_len);
4384 p += p_bta_dm_eir_cfg->bta_dm_eir_flag_len;
4385 free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 2;
4386 }
4387
The Android Open Source Project5738f832012-12-12 16:00:35 -08004388 /* if Manufacturer Specific are provided in configuration */
4389 if(( p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len > 0 )
4390 &&( p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec )
4391 &&( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2 ))
4392 {
4393 p_length = p;
4394
4395 UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 1);
4396 UINT8_TO_STREAM(p, BTM_EIR_MANUFACTURER_SPECIFIC_TYPE);
4397 memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec,
4398 p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len);
4399 p += p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len;
4400 free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2;
4401
4402 }
4403 else
4404 {
4405 p_length = NULL;
4406 }
4407
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004408 /* if Inquiry Tx Resp Power compiled */
4409 if ((p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power) &&
4410 (free_eir_length >= 3))
4411 {
4412 UINT8_TO_STREAM(p, 2); /* Length field */
4413 UINT8_TO_STREAM(p, BTM_EIR_TX_POWER_LEVEL_TYPE);
4414 UINT8_TO_STREAM(p, *(p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power));
4415 free_eir_length -= 3;
4416 }
4417
The Android Open Source Project5738f832012-12-12 16:00:35 -08004418 if( free_eir_length )
4419 UINT8_TO_STREAM(p, 0); /* terminator of significant part */
4420
4421 BTM_WriteEIR( p_buf );
4422
4423}
4424#endif
4425
4426#if ( BTM_EIR_CLIENT_INCLUDED == TRUE )
4427/*******************************************************************************
4428**
4429** Function bta_dm_eir_search_services
4430**
4431** Description This function searches services in received EIR
4432**
4433** Returns None
4434**
4435*******************************************************************************/
4436static void bta_dm_eir_search_services( tBTM_INQ_RESULTS *p_result,
4437 tBTA_SERVICE_MASK *p_services_to_search,
4438 tBTA_SERVICE_MASK *p_services_found)
4439{
4440 tBTA_SERVICE_MASK service_index = 0;
4441 tBTM_EIR_SEARCH_RESULT result;
4442
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004443 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 -08004444 p_result->remote_bd_addr[0],p_result->remote_bd_addr[1],
4445 p_result->remote_bd_addr[2],p_result->remote_bd_addr[3],
4446 p_result->remote_bd_addr[4],p_result->remote_bd_addr[5]);
4447
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004448 APPL_TRACE_DEBUG(" with services_to_search=0x%08X", *p_services_to_search);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004449
4450#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
4451 /* always do GATT based service discovery by SDP instead of from EIR */
4452 /* if GATT based service is also to be put in EIR, need to modify this */
4453 while (service_index < (BTA_MAX_SERVICE_ID - 1))
4454#else
4455 while(service_index < BTA_MAX_SERVICE_ID)
4456#endif
4457 {
4458 if( *p_services_to_search
4459 & (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)))
4460 {
4461 result = BTM_HasInquiryEirService( p_result,
4462 bta_service_id_to_uuid_lkup_tbl[service_index] );
4463
4464 /* Searching for HSP v1.2 only device */
4465 if ((result != BTM_EIR_FOUND) &&
4466 (bta_service_id_to_uuid_lkup_tbl[service_index] == UUID_SERVCLASS_HEADSET))
4467 {
4468 result = BTM_HasInquiryEirService (p_result, UUID_SERVCLASS_HEADSET_HS);
4469 }
4470
4471 if( result == BTM_EIR_FOUND )
4472 {
4473 /* If Plug and Play service record, need to check to see if Broadcom stack */
4474 /* However, EIR data doesn't have EXT_BRCM_VERSION so just skip it */
4475 if( bta_service_id_to_uuid_lkup_tbl[service_index]
4476 != UUID_SERVCLASS_PNP_INFORMATION )
4477 {
4478
4479 *p_services_found |=
4480 (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index));
4481 /* remove the service from services to be searched */
4482 *p_services_to_search &=
4483 (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)));
4484 }
4485 }
4486 else if( result == BTM_EIR_NOT_FOUND )
4487 {
4488 /* remove the service from services to be searched */
4489 *p_services_to_search &=
4490 (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)));
4491 }
4492 }
4493
4494 service_index++;
4495 }
4496
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004497 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 -08004498 *p_services_to_search, *p_services_found);
4499}
4500#endif
4501
4502#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&(BTA_EIR_CANNED_UUID_LIST != TRUE)
4503/*******************************************************************************
4504**
4505** Function bta_dm_eir_update_uuid
4506**
4507** Description This function adds or removes service UUID in EIR database.
4508**
4509** Returns None
4510**
4511*******************************************************************************/
4512void bta_dm_eir_update_uuid(UINT16 uuid16, BOOLEAN adding)
4513{
4514 /* if this UUID is not advertised in EIR */
4515 if( !BTM_HasEirService( p_bta_dm_eir_cfg->uuid_mask, uuid16 ))
4516 return;
4517
4518 if( adding )
4519 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004520 APPL_TRACE_EVENT("Adding UUID=0x%04X into EIR", uuid16);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004521
4522 BTM_AddEirService( bta_dm_cb.eir_uuid, uuid16 );
4523 }
4524 else
4525 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004526 APPL_TRACE_EVENT("Removing UUID=0x%04X from EIR", uuid16);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004527
4528 BTM_RemoveEirService( bta_dm_cb.eir_uuid, uuid16 );
4529 }
4530
4531 bta_dm_set_eir (NULL);
4532
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004533 APPL_TRACE_EVENT("bta_dm_eir_update_uuid UUID bit mask=0x%08X %08X",
The Android Open Source Project5738f832012-12-12 16:00:35 -08004534 bta_dm_cb.eir_uuid[1], bta_dm_cb.eir_uuid[0] );
4535}
4536#endif
4537
4538/*******************************************************************************
4539**
4540** Function bta_dm_enable_test_mode
4541**
4542** Description enable test mode
4543**
4544**
4545** Returns void
4546**
4547*******************************************************************************/
4548void bta_dm_enable_test_mode(tBTA_DM_MSG *p_data)
4549{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08004550 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004551 BTM_EnableTestMode();
4552}
4553
4554/*******************************************************************************
4555**
4556** Function bta_dm_disable_test_mode
4557**
4558** Description disable test mode
4559**
4560**
4561** Returns void
4562**
4563*******************************************************************************/
4564void bta_dm_disable_test_mode(tBTA_DM_MSG *p_data)
4565{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08004566 UNUSED(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004567 BTM_DeviceReset(NULL);
4568}
4569
4570/*******************************************************************************
4571**
4572** Function bta_dm_execute_callback
4573**
4574** Description Just execute a generic call back in the context of the BTU/BTA tack
4575**
4576**
4577** Returns void
4578**
4579*******************************************************************************/
4580void bta_dm_execute_callback(tBTA_DM_MSG *p_data)
4581{
4582 /* sanity check */
4583 if(p_data->exec_cback.p_exec_cback == NULL)
4584 {
4585 return;
4586 }
4587
4588 p_data->exec_cback.p_exec_cback(p_data->exec_cback.p_param);
4589}
4590/*******************************************************************************
4591**
4592** Function bta_dm_encrypt_cback
4593**
4594** Description link encryption complete callback.
4595**
4596** Returns None
4597**
4598*******************************************************************************/
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07004599void 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 -08004600{
4601 tBTA_STATUS bta_status = BTA_SUCCESS;
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07004602 tBTA_DM_ENCRYPT_CBACK *p_callback = NULL;
4603 UINT8 i ;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08004604 UNUSED(p_ref_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004605
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07004606 for (i=0; i<bta_dm_cb.device_list.count; i++)
4607 {
4608 if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, bd_addr) == 0 &&
4609 bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED)
4610 break;
4611 }
4612
4613 if (i < bta_dm_cb.device_list.count)
4614 {
4615 p_callback = bta_dm_cb.device_list.peer_device[i].p_encrypt_cback;
4616 bta_dm_cb.device_list.peer_device[i].p_encrypt_cback = NULL;
4617 }
4618
The Android Open Source Project5738f832012-12-12 16:00:35 -08004619 switch (result)
4620 {
4621 case BTM_SUCCESS:
4622 break;
4623 case BTM_WRONG_MODE:
4624 bta_status = BTA_WRONG_MODE;
4625 break;
4626 case BTM_NO_RESOURCES:
4627 bta_status = BTA_NO_RESOURCES;
4628 break;
4629 case BTM_BUSY:
4630 bta_status = BTA_BUSY;
4631 break;
4632 default:
4633 bta_status = BTA_FAILURE;
4634 break;
4635 }
4636
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004637 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 -08004638
4639 if (p_callback)
4640 {
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07004641 (*p_callback)(bd_addr, transport, bta_status);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004642 }
4643}
4644/*******************************************************************************
4645**
4646** Function bta_dm_set_encryption
4647**
4648** Description This function to encrypt the link
4649**
4650** Returns None
4651**
4652*******************************************************************************/
4653void bta_dm_set_encryption (tBTA_DM_MSG *p_data)
4654{
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07004655 UINT8 i ;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004656
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004657 APPL_TRACE_DEBUG("bta_dm_set_encryption"); //todo
The Android Open Source Project5738f832012-12-12 16:00:35 -08004658 if (!p_data->set_encryption.p_callback)
4659 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004660 APPL_TRACE_ERROR("bta_dm_set_encryption callback is not provided");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004661 return;
4662 }
4663
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07004664 for (i=0; i<bta_dm_cb.device_list.count; i++)
The Android Open Source Project5738f832012-12-12 16:00:35 -08004665 {
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07004666 if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_data->set_encryption.bd_addr) == 0 &&
4667 bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED)
4668 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004669 }
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07004670 if (i < bta_dm_cb.device_list.count)
4671 {
4672 if (bta_dm_cb.device_list.peer_device[i].p_encrypt_cback)
4673 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004674 APPL_TRACE_ERROR("earlier enc was not done for same device");
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07004675 (*p_data->set_encryption.p_callback)(p_data->set_encryption.bd_addr,
4676 p_data->set_encryption.transport, BTA_BUSY);
4677 return;
4678 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08004679
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07004680 if (BTM_SetEncryption(p_data->set_encryption.bd_addr,
4681 p_data->set_encryption.transport,
4682 bta_dm_encrypt_cback,
4683 &p_data->set_encryption.sec_act)
4684 == BTM_CMD_STARTED)
4685 {
4686 bta_dm_cb.device_list.peer_device[i].p_encrypt_cback = p_data->set_encryption.p_callback;
4687 }
4688 }
4689 else
4690 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004691 APPL_TRACE_ERROR(" %s Device not found/not connected", __FUNCTION__);
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07004692 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08004693}
4694
4695/*******************************************************************************
4696**
4697** Function bta_dm_set_afh_channels
4698**
4699** Description set afh channels
4700**
4701**
4702** Returns void
4703**
4704*******************************************************************************/
4705void bta_dm_set_afh_channels(tBTA_DM_MSG * p_data)
4706{
4707
4708 BTM_SetAfhChannels(p_data->set_afhchannels.first,p_data->set_afhchannels.last);
4709}
4710
4711/*******************************************************************************
4712**
4713** Function bta_dm_set_afh_channel_assesment
4714**
4715** Description set afh channel assesment
4716**
4717**
4718** Returns void
4719**
4720*******************************************************************************/
4721
4722void bta_dm_set_afh_channel_assesment (tBTA_DM_MSG * p_data)
4723{
4724 BTM_SetAfhChannelAssessment(p_data->set_afh_channel_assessment.enable_or_disable);
4725}
4726
4727#if (BLE_INCLUDED == TRUE)
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004728/*******************************************************************************
4729**
4730** Function bta_dm_observe_results_cb
4731**
4732** Description Callback for BLE Observe result
4733**
4734**
4735** Returns void
4736**
4737*******************************************************************************/
4738static void bta_dm_observe_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir)
4739{
4740;
4741 tBTA_DM_SEARCH result;
4742 tBTM_INQ_INFO *p_inq_info;
4743 UINT16 service_class;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004744 APPL_TRACE_DEBUG("bta_dm_observe_results_cb")
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004745
4746 bdcpy(result.inq_res.bd_addr, p_inq->remote_bd_addr);
4747 result.inq_res.rssi = p_inq->rssi;
4748 result.inq_res.ble_addr_type = p_inq->ble_addr_type;
4749 result.inq_res.inq_result_type = p_inq->inq_result_type;
4750 result.inq_res.device_type = p_inq->device_type;
4751
4752 /* application will parse EIR to find out remote device name */
4753 result.inq_res.p_eir = p_eir;
4754
4755 if((p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr)) != NULL)
4756 {
4757 /* initialize remt_name_not_required to FALSE so that we get the name by default */
4758 result.inq_res.remt_name_not_required = FALSE;
4759 }
4760
4761 if(bta_dm_search_cb.p_scan_cback)
4762 bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_RES_EVT, &result);
4763
4764 if(p_inq_info)
4765 {
4766 /* application indicates if it knows the remote name, inside the callback
4767 copy that to the inquiry data base*/
4768 if(result.inq_res.remt_name_not_required)
4769 p_inq_info->appl_knows_rem_name = TRUE;
4770 }
4771}
4772
4773/*******************************************************************************
4774**
4775** Function bta_dm_observe_cmpl_cb
4776**
4777** Description Callback for BLE Observe complete
4778**
4779**
4780** Returns void
4781**
4782*******************************************************************************/
4783static void bta_dm_observe_cmpl_cb (void * p_result)
4784{
4785 tBTA_DM_SEARCH data;
4786
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004787 APPL_TRACE_DEBUG("bta_dm_observe_cmpl_cb");
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004788
4789 data.inq_cmpl.num_resps = ((tBTM_INQUIRY_CMPL *)p_result)->num_resp;
4790 if (bta_dm_search_cb.p_scan_cback)
4791 {
4792 bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_CMPL_EVT, &data);
4793 }
4794}
4795
The Android Open Source Project5738f832012-12-12 16:00:35 -08004796#if (SMP_INCLUDED == TRUE)
4797/*******************************************************************************
4798**
4799** Function bta_dm_ble_smp_cback
4800**
4801** Description Callback for BLE SMP
4802**
4803**
4804** Returns void
4805**
4806*******************************************************************************/
4807static UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_DATA *p_data)
4808{
4809 tBTM_STATUS status = BTM_SUCCESS;
4810 tBTA_DM_SEC sec_event;
Andre Eisenbach181d0752013-06-11 14:18:21 -07004811 char* p_name = NULL;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004812 UINT8 i;
4813
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004814 APPL_TRACE_DEBUG("bta_dm_ble_smp_cback");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004815
4816 if (!bta_dm_cb.p_sec_cback)
4817 return BTM_NOT_AUTHORIZED;
4818
4819 memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
4820 switch (event)
4821 {
4822 case BTM_LE_IO_REQ_EVT:
4823#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
4824
4825 bta_dm_co_ble_io_req(bda,
4826 &p_data->io_req.io_cap,
4827 &p_data->io_req.oob_data,
4828 &p_data->io_req.auth_req,
4829 &p_data->io_req.max_key_size,
4830 &p_data->io_req.init_keys,
4831 &p_data->io_req.resp_keys);
4832#endif
4833#if BTM_OOB_INCLUDED == FALSE
4834 status = BTM_SUCCESS;
4835#endif
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004836 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 -08004837
4838 break;
4839
4840 case BTM_LE_SEC_REQUEST_EVT:
4841 bdcpy(sec_event.ble_req.bd_addr, bda);
Andre Eisenbach181d0752013-06-11 14:18:21 -07004842 p_name = BTM_SecReadDevName(bda);
4843 if (p_name != NULL)
4844 {
4845 BCM_STRNCPY_S((char*)sec_event.ble_req.bd_name,
4846 sizeof(BD_NAME), p_name, (BD_NAME_LEN));
4847 }
4848 else
4849 {
4850 sec_event.ble_req.bd_name[0] = 0;
4851 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08004852 bta_dm_cb.p_sec_cback(BTA_DM_BLE_SEC_REQ_EVT, &sec_event);
4853 break;
4854
4855 case BTM_LE_KEY_NOTIF_EVT:
4856 bdcpy(sec_event.key_notif.bd_addr, bda);
Andre Eisenbach181d0752013-06-11 14:18:21 -07004857 p_name = BTM_SecReadDevName(bda);
4858 if (p_name != NULL)
4859 {
4860 BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name,
4861 sizeof(BD_NAME), p_name, (BD_NAME_LEN));
4862 }
4863 else
4864 {
4865 sec_event.key_notif.bd_name[0] = 0;
4866 }
4867 sec_event.key_notif.passkey = p_data->key_notif;
4868 bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_NOTIF_EVT, &sec_event);
4869 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004870
4871 case BTM_LE_KEY_REQ_EVT:
4872 bdcpy(sec_event.ble_req.bd_addr, bda);
4873 bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_REQ_EVT, &sec_event);
4874 break;
4875
4876 case BTM_LE_OOB_REQ_EVT:
4877 bdcpy(sec_event.ble_req.bd_addr, bda);
4878 bta_dm_cb.p_sec_cback(BTA_DM_BLE_OOB_REQ_EVT, &sec_event);
4879 break;
4880
4881 case BTM_LE_KEY_EVT:
4882 bdcpy(sec_event.ble_key.bd_addr, bda);
4883 sec_event.ble_key.key_type = p_data->key.key_type;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004884
4885 if (p_data->key.key_type == BTM_LE_KEY_PID)
4886 {
4887 for (i=0; i<BT_OCTET16_LEN; i++ )
4888 {
4889 sec_event.ble_key.key_value.pid_key.irk[i] = p_data->key.p_key_value->pid_key.irk[i];
4890 }
4891 sec_event.ble_key.key_value.pid_key.addr_type = p_data->key.p_key_value->pid_key.addr_type;
4892 memcpy( &(sec_event.ble_key.key_value.pid_key.static_addr),
4893 &(p_data->key.p_key_value->pid_key.static_addr),
4894 sizeof (BD_ADDR));
4895 }
4896 else
4897 {
4898 memcpy(&sec_event.ble_key.key_value, p_data->key.p_key_value, sizeof(tBTM_LE_KEY_VALUE));
4899 }
4900 // memcpy(&sec_event.ble_key.key_value, p_data->key.p_key_value, sizeof(tBTM_LE_KEY_VALUE)); todo will crash
The Android Open Source Project5738f832012-12-12 16:00:35 -08004901 bta_dm_cb.p_sec_cback(BTA_DM_BLE_KEY_EVT, &sec_event);
4902 break;
4903
4904 case BTM_LE_COMPLT_EVT:
4905 bdcpy(sec_event.auth_cmpl.bd_addr, bda);
Andre Eisenbach181d0752013-06-11 14:18:21 -07004906 p_name = BTM_SecReadDevName(bda);
4907 if (p_name != NULL)
4908 {
4909 BCM_STRNCPY_S((char*)sec_event.auth_cmpl.bd_name,
4910 sizeof(BD_NAME), p_name, (BD_NAME_LEN));
4911 }
4912 else
4913 {
4914 sec_event.auth_cmpl.bd_name[0] = 0;
4915 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08004916 if (p_data->complt.reason != 0)
4917 {
4918 sec_event.auth_cmpl.fail_reason = BTA_DM_AUTH_CONVERT_SMP_CODE(((UINT8)p_data->complt.reason));
4919 /* delete this device entry from Sec Dev DB */
4920 bta_dm_remove_sec_dev_entry (bda);
4921 }
4922 else
4923 {
4924 sec_event.auth_cmpl.success = TRUE;
4925 }
4926 sec_event.auth_cmpl.privacy_enabled = p_data->complt.privacy_supported;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004927 if (bta_dm_cb.p_sec_cback)
4928 {
4929 //bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
4930 bta_dm_cb.p_sec_cback(BTA_DM_BLE_AUTH_CMPL_EVT, &sec_event);
4931 }
4932
4933 break;
4934
4935 default:
4936 status = BTM_NOT_AUTHORIZED;
4937 break;
4938 }
4939 return status;
4940}
4941#endif /* SMP_INCLUDED == TRUE */
4942
4943/*******************************************************************************
4944**
4945** Function bta_dm_ble_id_key_cback
4946**
4947** Description Callback for BLE local ID keys
4948**
4949**
4950** Returns void
4951**
4952*******************************************************************************/
4953static void bta_dm_ble_id_key_cback (UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key)
4954{
4955 UINT8 evt;
4956 tBTA_DM_SEC dm_key;
4957
4958 switch (key_type)
4959 {
4960 case BTM_BLE_KEY_TYPE_ID:
4961 case BTM_BLE_KEY_TYPE_ER:
4962 if (bta_dm_cb.p_sec_cback)
4963 {
4964 memcpy(&dm_key.ble_id_keys, p_key, sizeof(tBTM_BLE_LOCAL_KEYS));
4965
4966 evt = (key_type == BTM_BLE_KEY_TYPE_ID) ? BTA_DM_BLE_LOCAL_IR_EVT :\
4967 BTA_DM_BLE_LOCAL_ER_EVT;
4968 bta_dm_cb.p_sec_cback(evt, &dm_key);
4969 }
4970 break;
4971
4972 default:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004973 APPL_TRACE_DEBUG("Unknown key type %d", key_type);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004974 break;
4975 }
4976 return;
4977
4978}
4979
4980/*******************************************************************************
4981**
4982** Function bta_dm_add_blekey
4983**
4984** Description This function adds an BLE Key to an security database entry.
4985** This function shall only be called AFTER BTA_DmAddBleDevice has been called.
4986** It is normally called during host startup to restore all required information
4987** stored in the NVRAM.
4988**
4989** Parameters:
4990**
4991*******************************************************************************/
4992void bta_dm_add_blekey (tBTA_DM_MSG *p_data)
4993{
4994 if (!BTM_SecAddBleKey (p_data->add_ble_key.bd_addr,
4995 (tBTM_LE_KEY_VALUE *)&p_data->add_ble_key.blekey,
4996 p_data->add_ble_key.key_type))
4997 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004998 APPL_TRACE_ERROR ("BTA_DM: Error adding BLE Key for device %08x%04x",
The Android Open Source Project5738f832012-12-12 16:00:35 -08004999 (p_data->add_ble_key.bd_addr[0]<<24)+(p_data->add_ble_key.bd_addr[1]<<16)+\
5000 (p_data->add_ble_key.bd_addr[2]<<8)+p_data->add_ble_key.bd_addr[3],
5001 (p_data->add_ble_key.bd_addr[4]<<8)+p_data->add_ble_key.bd_addr[5]);
5002 }
5003}
5004
5005/*******************************************************************************
5006**
5007** Function bta_dm_add_ble_device
5008**
5009** Description This function adds an BLE device to an security database entry.
5010** It is normally called during host startup to restore all required information
5011** stored in the NVRAM.
5012**
5013** Parameters:
5014**
5015*******************************************************************************/
5016void bta_dm_add_ble_device (tBTA_DM_MSG *p_data)
5017{
5018 if (!BTM_SecAddBleDevice (p_data->add_ble_device.bd_addr, NULL,
5019 p_data->add_ble_device.dev_type ,
5020 p_data->add_ble_device.addr_type))
5021 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005022 APPL_TRACE_ERROR ("BTA_DM: Error adding BLE Device for device %08x%04x",
The Android Open Source Project5738f832012-12-12 16:00:35 -08005023 (p_data->add_ble_device.bd_addr[0]<<24)+(p_data->add_ble_device.bd_addr[1]<<16)+ \
5024 (p_data->add_ble_device.bd_addr[2]<<8)+p_data->add_ble_device.bd_addr[3],
5025 (p_data->add_ble_device.bd_addr[4]<<8)+p_data->add_ble_device.bd_addr[5]);
5026 }
5027}
5028
5029/*******************************************************************************
5030**
5031** Function bta_dm_add_ble_device
5032**
5033** Description This function adds an BLE device to an security database entry.
5034** It is normally called during host startup to restore all required information
5035** stored in the NVRAM.
5036**
5037** Parameters:
5038**
5039*******************************************************************************/
5040void bta_dm_ble_passkey_reply (tBTA_DM_MSG *p_data)
5041{
5042 if (p_data->pin_reply.accept)
5043 {
5044
5045 BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_SUCCESS, p_data->ble_passkey_reply.passkey);
5046 }
5047 else
5048 {
5049 BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_NOT_AUTHORIZED, p_data->ble_passkey_reply.passkey);
5050 }
5051
5052}
5053
5054/*******************************************************************************
5055**
5056** Function bta_dm_security_grant
5057**
5058** Description This function grant SMP security request access.
5059**
5060** Parameters:
5061**
5062*******************************************************************************/
5063void bta_dm_security_grant (tBTA_DM_MSG *p_data)
5064{
5065 BTM_SecurityGrant(p_data->ble_sec_grant.bd_addr, p_data->ble_sec_grant.res);
5066}
5067
5068/*******************************************************************************
5069**
5070** Function bta_dm_ble_set_bg_conn_type
5071**
5072** Description This function set the BLE background connection type
5073**
5074** Parameters:
5075**
5076*******************************************************************************/
5077void bta_dm_ble_set_bg_conn_type (tBTA_DM_MSG *p_data)
5078{
5079 BTM_BleSetBgConnType(p_data->ble_set_bd_conn_type.bg_conn_type,
5080 p_data->ble_set_bd_conn_type.p_select_cback);
5081}
5082
5083/*******************************************************************************
5084**
5085** Function bta_dm_ble_set_conn_params
5086**
5087** Description This function set the preferred connection parameters.
5088**
5089** Parameters:
5090**
5091*******************************************************************************/
5092void bta_dm_ble_set_conn_params (tBTA_DM_MSG *p_data)
5093{
5094 BTM_BleSetPrefConnParams(p_data->ble_set_conn_params.peer_bda,
5095 p_data->ble_set_conn_params.conn_int_min,
5096 p_data->ble_set_conn_params.conn_int_max,
5097 p_data->ble_set_conn_params.slave_latency,
5098 p_data->ble_set_conn_params.supervision_tout);
5099}
5100
5101/*******************************************************************************
5102**
5103** Function bta_dm_ble_set_scan_params
5104**
5105** Description This function set the preferred connection scan parameters.
5106**
5107** Parameters:
5108**
5109*******************************************************************************/
5110void bta_dm_ble_set_scan_params (tBTA_DM_MSG *p_data)
5111{
5112 BTM_BleSetConnScanParams(p_data->ble_set_scan_params.scan_int,
5113 p_data->ble_set_scan_params.scan_window);
5114}
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07005115/*******************************************************************************
5116**
5117** Function bta_dm_ble_update_conn_params
5118**
5119** Description This function update LE connection parameters.
5120**
5121** Parameters:
5122**
5123*******************************************************************************/
5124void bta_dm_ble_update_conn_params (tBTA_DM_MSG *p_data)
5125{
5126 if (!L2CA_UpdateBleConnParams(p_data->ble_update_conn_params.bd_addr,
5127 p_data->ble_update_conn_params.min_int,
5128 p_data-> ble_update_conn_params.max_int,
5129 p_data->ble_update_conn_params.latency,
5130 p_data->ble_update_conn_params.timeout))
5131 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005132 APPL_TRACE_ERROR("Update connection parameters failed!");
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07005133 }
5134}
The Android Open Source Project5738f832012-12-12 16:00:35 -08005135
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07005136#if BLE_PRIVACY_SPT == TRUE
5137/*******************************************************************************
5138**
5139** Function bta_dm_ble_config_local_privacy
5140**
5141** Description This function set the local device LE privacy settings.
5142**
5143** Parameters:
5144**
5145*******************************************************************************/
5146void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data)
5147{
5148 BTM_BleConfigPrivacy (p_data->ble_local_privacy.privacy_enable);
5149}
5150#endif
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08005151
5152/*******************************************************************************
5153**
5154** Function bta_dm_ble_observe
5155**
5156** Description This function set the preferred connection scan parameters.
5157**
5158** Parameters:
5159**
5160*******************************************************************************/
5161void bta_dm_ble_observe (tBTA_DM_MSG *p_data)
5162{
5163
5164 tBTM_STATUS status;
5165 if (p_data->ble_observe.start)
5166 {
5167 /*Save the callback to be called when a scan results are available */
5168 bta_dm_search_cb.p_scan_cback = p_data->ble_observe.p_cback;
5169 if ((status = BTM_BleObserve(TRUE, p_data->ble_observe.duration,
Priti Aghera100bbca2014-06-06 13:54:08 -07005170 bta_dm_observe_results_cb, bta_dm_observe_cmpl_cb))!= BTM_CMD_STARTED)
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08005171 {
5172 tBTA_DM_SEARCH data;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005173 APPL_TRACE_WARNING(" %s BTM_BleObserve failed. status %d",__FUNCTION__,status);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08005174 data.inq_cmpl.num_resps = 0;
5175 if (bta_dm_search_cb.p_scan_cback)
5176 {
5177 bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_CMPL_EVT, &data);
5178 }
5179 }
5180 }
5181 else
5182 {
5183 bta_dm_search_cb.p_scan_cback = NULL;
5184 BTM_BleObserve(FALSE, 0, NULL,NULL );
5185 }
5186}
Andre Eisenbach5c44e452013-08-06 18:19:37 -07005187/*******************************************************************************
5188**
5189** Function bta_dm_ble_set_scan_params
5190**
5191** Description This function set the adv parameters.
5192**
5193** Parameters:
5194**
5195*******************************************************************************/
5196void bta_dm_ble_set_adv_params (tBTA_DM_MSG *p_data)
5197{
5198 BTM_BleSetAdvParams(p_data->ble_set_adv_params.adv_int_min,
5199 p_data->ble_set_adv_params.adv_int_max,
5200 p_data->ble_set_adv_params.p_dir_bda,
5201 BTA_DM_BLE_ADV_CHNL_MAP);
5202}
Andre Eisenbacheeeac992013-11-08 10:23:52 -08005203
Andre Eisenbach5c44e452013-08-06 18:19:37 -07005204/*******************************************************************************
5205**
5206** Function bta_dm_ble_set_adv_config
5207**
5208** Description This function set the customized ADV data configuration
5209**
5210** Parameters:
5211**
5212*******************************************************************************/
5213void bta_dm_ble_set_adv_config (tBTA_DM_MSG *p_data)
5214{
Satya Callojiffb39602014-04-30 15:55:39 -07005215 tBTA_STATUS status = BTA_FAILURE;
5216
5217 if (BTM_BleWriteAdvData(p_data->ble_set_adv_data.data_mask,
5218 (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg) == BTM_SUCCESS)
5219 {
5220 status = BTA_SUCCESS;
5221 }
5222
5223 if (p_data->ble_set_adv_data.p_adv_data_cback)
5224 (*p_data->ble_set_adv_data.p_adv_data_cback)(status);
Andre Eisenbach5c44e452013-08-06 18:19:37 -07005225}
5226
Andre Eisenbacheeeac992013-11-08 10:23:52 -08005227/*******************************************************************************
5228**
5229** Function bta_dm_ble_set_scan_rsp
5230**
5231** Description This function set the customized ADV scan resp. configuration
5232**
5233** Parameters:
5234**
5235*******************************************************************************/
5236void bta_dm_ble_set_scan_rsp (tBTA_DM_MSG *p_data)
5237{
Satya Callojiffb39602014-04-30 15:55:39 -07005238 tBTA_STATUS status = BTA_FAILURE;
5239
5240 if(BTM_BleWriteScanRsp(p_data->ble_set_adv_data.data_mask,
5241 (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg) == BTM_SUCCESS)
5242 {
5243 status = BTA_SUCCESS;
5244 }
5245
5246 if (p_data->ble_set_adv_data.p_adv_data_cback)
5247 (*p_data->ble_set_adv_data.p_adv_data_cback)(status);
Andre Eisenbacheeeac992013-11-08 10:23:52 -08005248}
5249
5250/*******************************************************************************
5251**
5252** Function bta_dm_ble_broadcast
5253**
5254** Description Starts or stops LE broadcasts
5255**
5256** Parameters:
5257**
5258*******************************************************************************/
5259void bta_dm_ble_broadcast (tBTA_DM_MSG *p_data)
5260{
5261 BTM_BleBroadcast(p_data->ble_observe.start);
5262}
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08005263
Satya Callojiffb39602014-04-30 15:55:39 -07005264/*******************************************************************************
5265**
5266** Function bta_dm_ble_multi_adv_enb
5267**
5268** Description This function enables a single advertising instance
5269**
5270** Parameters:
5271**
5272*******************************************************************************/
5273void bta_dm_ble_multi_adv_enb(tBTA_DM_MSG *p_data)
5274{
5275#if BLE_MULTI_ADV_INCLUDED == TRUE
5276 BTM_BleEnableAdvInstance((tBTM_BLE_ADV_PARAMS*)p_data->ble_multi_adv_enb.p_params,
5277 p_data->ble_multi_adv_enb.p_cback,p_data->ble_multi_adv_enb.p_ref);
5278#endif
5279}
5280/*******************************************************************************
5281**
5282** Function bta_dm_ble_multi_adv_param_upd
5283**
5284** Description This function updates multiple advertising instance parameters
5285**
5286** Parameters:
5287**
5288*******************************************************************************/
5289void bta_dm_ble_multi_adv_upd_param(tBTA_DM_MSG *p_data)
5290{
5291#if BLE_MULTI_ADV_INCLUDED == TRUE
5292 BTM_BleUpdateAdvInstParam(p_data->ble_multi_adv_param.inst_id,
5293 (tBTM_BLE_ADV_PARAMS*)p_data->ble_multi_adv_param.p_params);
5294#endif
5295}
5296/*******************************************************************************
5297**
5298** Function bta_dm_ble_multi_adv_data
5299**
5300** Description This function write multiple advertising instance adv data
5301** or scan response data
5302**
5303** Parameters:
5304**
5305*******************************************************************************/
5306void bta_dm_ble_multi_adv_data(tBTA_DM_MSG *p_data)
5307{
5308#if BLE_MULTI_ADV_INCLUDED == TRUE
5309 BTM_BleCfgAdvInstData(p_data->ble_multi_adv_data.inst_id,p_data->ble_multi_adv_data.is_scan_rsp,
5310 p_data->ble_multi_adv_data.data_mask,(tBTM_BLE_ADV_DATA*)p_data->ble_multi_adv_data.p_data);
5311#endif
5312}
5313/*******************************************************************************
5314**
5315** Function btm_dm_ble_multi_adv_disable
5316**
5317** Description This function disable a single adv instance
5318**
5319** Parameters:
5320**
5321*******************************************************************************/
5322void btm_dm_ble_multi_adv_disable(tBTA_DM_MSG *p_data)
5323{
5324#if BLE_MULTI_ADV_INCLUDED == TRUE
5325 BTM_BleDisableAdvInstance(p_data->ble_multi_adv_disable.inst_id);
5326#endif
5327}
5328
The Android Open Source Project5738f832012-12-12 16:00:35 -08005329#if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE))
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07005330#ifndef BTA_DM_GATT_CLOSE_DELAY_TOUT
5331#define BTA_DM_GATT_CLOSE_DELAY_TOUT 1000
5332#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08005333
5334/*******************************************************************************
5335**
Andre Eisenbache1202ca2013-05-15 04:55:08 -07005336** Function bta_dm_gattc_register
5337**
5338** Description Register with GATTC in DM if BLE is needed.
5339**
5340**
5341** Returns void
5342**
5343*******************************************************************************/
5344static void bta_dm_gattc_register(void)
5345{
5346 tBT_UUID app_uuid = {LEN_UUID_128,{0}};
5347
5348 if (bta_dm_search_cb.client_if == BTA_GATTS_INVALID_IF)
5349 {
5350 memset (&app_uuid.uu.uuid128, 0x87, LEN_UUID_128);
5351 BTA_GATTC_AppRegister(&app_uuid, bta_dm_gattc_callback);
5352 }
5353}
5354
5355/*******************************************************************************
5356**
The Android Open Source Project5738f832012-12-12 16:00:35 -08005357** Function btm_dm_start_disc_gatt_services
5358**
5359** Description This function starts a GATT service search request.
5360**
5361** Parameters:
5362**
5363*******************************************************************************/
5364static void btm_dm_start_disc_gatt_services (UINT16 conn_id)
5365{
5366 tBT_UUID *p_uuid = bta_dm_search_cb.p_srvc_uuid +
5367 bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search;
5368
5369 p_uuid = bta_dm_search_cb.p_srvc_uuid +
5370 bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search;
5371
5372 /* always search for all services */
5373 BTA_GATTC_ServiceSearchRequest(conn_id, p_uuid);
5374}
5375
5376/*******************************************************************************
5377**
5378** Function bta_dm_gatt_disc_result
5379**
5380** Description This function process the GATT service search result.
5381**
5382** Parameters:
5383**
5384*******************************************************************************/
5385static void bta_dm_gatt_disc_result(tBTA_GATT_ID service_id)
5386{
5387 tBTA_DM_SEARCH result;
5388
5389 /*
5390 * This logic will not work for gatt case. We are checking against the bluetooth profiles here
5391 * just copy the GATTID in raw data field and send it across.
5392 */
5393
5394
5395 if ( bta_dm_search_cb.ble_raw_used + sizeof(tBTA_GATT_ID) < bta_dm_search_cb.ble_raw_size )
5396 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005397 APPL_TRACE_DEBUG("ADDING BLE SERVICE uuid=0x%x, ble_ptr = 0x%x, ble_raw_used = 0x%x", service_id.uuid.uu.uuid16,bta_dm_search_cb.p_ble_rawdata,bta_dm_search_cb.ble_raw_used);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005398
Andre Eisenbachca22ac42013-02-13 17:02:11 +09005399 if(bta_dm_search_cb.p_ble_rawdata)
5400 {
5401 memcpy((bta_dm_search_cb.p_ble_rawdata + bta_dm_search_cb.ble_raw_used), &service_id,
5402 sizeof(service_id) );
The Android Open Source Project5738f832012-12-12 16:00:35 -08005403
Andre Eisenbachca22ac42013-02-13 17:02:11 +09005404 bta_dm_search_cb.ble_raw_used += sizeof(service_id);
5405 }
5406 else
5407 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005408 APPL_TRACE_ERROR("p_ble_rawdata is NULL");
Andre Eisenbachca22ac42013-02-13 17:02:11 +09005409 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08005410
5411 }
5412 else
5413 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005414 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 -08005415 }
5416
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005417 APPL_TRACE_ERROR("bta_dm_gatt_disc_result serivce_id len=%d ", service_id.uuid.len);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005418 if ( bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE)
5419 {
5420
5421 /* send result back to app now, one by one */
5422 bdcpy (result.disc_ble_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
5423 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 -08005424 result.disc_ble_res.bd_name[BD_NAME_LEN] = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08005425 memcpy(&result.disc_ble_res.service, &service_id.uuid, sizeof(tBT_UUID));
5426
5427 bta_dm_search_cb.p_search_cback(BTA_DM_DISC_BLE_RES_EVT, &result);
5428 }
5429}
5430
5431/*******************************************************************************
5432**
5433** Function bta_dm_gatt_disc_complete
5434**
5435** Description This function process the GATT service search complete.
5436**
5437** Parameters:
5438**
5439*******************************************************************************/
5440static void bta_dm_gatt_disc_complete(UINT16 conn_id, tBTA_GATT_STATUS status)
5441{
5442 tBTA_DM_MSG *p_msg;
5443
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005444 APPL_TRACE_DEBUG("bta_dm_gatt_disc_complete conn_id = %d",conn_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005445
5446 if (bta_dm_search_cb.uuid_to_search > 0) bta_dm_search_cb.uuid_to_search --;
5447
5448 if (status == BTA_GATT_OK && bta_dm_search_cb.uuid_to_search > 0)
5449 {
5450 btm_dm_start_disc_gatt_services(conn_id);
5451 }
5452 else
5453 {
5454 bta_dm_search_cb.uuid_to_search = 0;
5455
5456 /* no more services to be discovered */
5457 if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
5458 {
5459 p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
5460 p_msg->disc_result.result.disc_res.result = (status == BTA_GATT_OK) ? BTA_SUCCESS :BTA_FAILURE;
5461 p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08005462 p_msg->disc_result.result.disc_res.num_uuids = 0;
5463 p_msg->disc_result.result.disc_res.p_uuid_list = NULL;
The Android Open Source Project5738f832012-12-12 16:00:35 -08005464 bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
5465 BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
5466 bta_dm_get_remname(), (BD_NAME_LEN-1));
5467
5468 /* make sure the string is terminated */
5469 p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
5470
5471 p_msg->disc_result.result.disc_res.device_type = BT_DEVICE_TYPE_BLE;
5472 if ( bta_dm_search_cb.ble_raw_used > 0 )
5473 {
5474 p_msg->disc_result.result.disc_res.p_raw_data = GKI_getbuf(bta_dm_search_cb.ble_raw_used);
5475
5476 memcpy( p_msg->disc_result.result.disc_res.p_raw_data,
5477 bta_dm_search_cb.p_ble_rawdata,
5478 bta_dm_search_cb.ble_raw_used );
5479
5480 p_msg->disc_result.result.disc_res.raw_data_size = bta_dm_search_cb.ble_raw_used;
5481 }
5482 else
5483 {
5484 p_msg->disc_result.result.disc_res.p_raw_data = NULL;
5485 bta_dm_search_cb.p_ble_rawdata = 0;
5486 }
5487
5488 bta_sys_sendmsg(p_msg);
5489 }
5490 if (conn_id != BTA_GATT_INVALID_CONN_ID)
5491 {
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07005492 if (BTA_DM_GATT_CLOSE_DELAY_TOUT != 0)
5493 {
5494 bta_sys_start_timer(&bta_dm_search_cb.gatt_close_timer, BTA_DM_DISC_CLOSE_TOUT_EVT,
5495 BTA_DM_GATT_CLOSE_DELAY_TOUT);
5496 }
5497 else
5498 {
5499 BTA_GATTC_Close(conn_id);
5500 bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID;
5501 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08005502 }
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07005503
The Android Open Source Project5738f832012-12-12 16:00:35 -08005504 bta_dm_search_cb.gatt_disc_active = FALSE;
5505 }
5506}
5507
5508/*******************************************************************************
5509**
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07005510** Function bta_dm_close_gatt_conn
5511**
5512** Description This function close the GATT connection after delay timeout.
5513**
5514** Parameters:
5515**
5516*******************************************************************************/
5517void bta_dm_close_gatt_conn(tBTA_DM_MSG *p_data)
5518{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08005519 UNUSED(p_data);
5520
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07005521 if (bta_dm_search_cb.conn_id != BTA_GATT_INVALID_CONN_ID)
5522 BTA_GATTC_Close(bta_dm_search_cb.conn_id);
5523
5524 bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID;
5525}
5526
5527/*******************************************************************************
5528**
The Android Open Source Project5738f832012-12-12 16:00:35 -08005529** Function btm_dm_start_gatt_discovery
5530**
5531** Description This is GATT initiate the service search by open a GATT connection
5532** first.
5533**
5534** Parameters:
5535**
5536*******************************************************************************/
5537void btm_dm_start_gatt_discovery (BD_ADDR bd_addr)
5538{
5539 bta_dm_search_cb.gatt_disc_active = TRUE;
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07005540
5541 /* connection is already open */
5542 if (bdcmp(bta_dm_search_cb.pending_close_bda, bd_addr) == 0 &&
5543 bta_dm_search_cb.conn_id != BTA_GATT_INVALID_CONN_ID)
5544 {
5545 memset(bta_dm_search_cb.pending_close_bda, 0, BD_ADDR_LEN);
5546 bta_sys_stop_timer(&bta_dm_search_cb.gatt_close_timer);
5547 btm_dm_start_disc_gatt_services(bta_dm_search_cb.conn_id);
5548 }
5549 else
Ganesh Ganapathi Batta8fe58872014-04-16 16:50:09 -07005550 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 -08005551}
5552
5553/*******************************************************************************
5554**
5555** Function bta_dm_cancel_gatt_discovery
5556**
5557** Description This is GATT cancel the GATT service search.
5558**
5559** Parameters:
5560**
5561*******************************************************************************/
5562static void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr)
5563{
5564 if (bta_dm_search_cb.conn_id == BTA_GATT_INVALID_CONN_ID)
5565 {
5566 BTA_GATTC_CancelOpen(bta_dm_search_cb.client_if, bd_addr, TRUE);
5567 }
5568
5569 bta_dm_gatt_disc_complete(bta_dm_search_cb.conn_id, (tBTA_GATT_STATUS) BTA_GATT_ERROR);
5570}
5571
5572/*******************************************************************************
5573**
5574** Function bta_dm_proc_open_evt
5575**
5576** Description process BTA_GATTC_OPEN_EVT in DM.
5577**
5578** Parameters:
5579**
5580*******************************************************************************/
5581void bta_dm_proc_open_evt(tBTA_GATTC_OPEN *p_data)
5582{
5583 UINT8 *p1;
5584 UINT8 *p2;
5585
5586 p1 = bta_dm_search_cb.peer_bdaddr;
5587 p2 = p_data->remote_bda;
5588
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005589 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 -08005590 bta_dm_search_cb.state,
5591 ((p1[0])<<24)+((p1[1])<<16)+((p1[2])<<8)+(p1[3]),
5592 ((p1[4])<<8)+ p1[5],
5593 ((p2[0])<<24)+((p2[1])<<16)+((p2[2])<<8)+(p2[3]),
5594 ((p2[4])<<8)+ p2[5]);
5595
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005596 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 -08005597 p_data->conn_id,
5598 p_data->client_if,
5599 p_data->status);
5600
5601 bta_dm_search_cb.conn_id = p_data->conn_id;
5602
5603 if (p_data->status == BTA_GATT_OK)
5604 {
5605 btm_dm_start_disc_gatt_services(p_data->conn_id);
5606 }
5607 else
5608 {
5609 bta_dm_gatt_disc_complete(BTA_GATT_INVALID_CONN_ID, p_data->status);
5610 }
5611}
5612
5613/*******************************************************************************
5614**
5615** Function bta_dm_gattc_callback
5616**
5617** Description This is GATT client callback function used in DM.
5618**
5619** Parameters:
5620**
5621*******************************************************************************/
5622static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data)
5623{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005624 APPL_TRACE_DEBUG("bta_dm_gattc_callback event = %d", event);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005625
5626 switch (event)
5627 {
5628 case BTA_GATTC_REG_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005629 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 -08005630 if (p_data->reg_oper.status == BTA_GATT_OK)
5631 bta_dm_search_cb.client_if = p_data->reg_oper.client_if;
5632 else
5633 bta_dm_search_cb.client_if = BTA_GATTS_INVALID_IF;
5634 break;
5635
5636 case BTA_GATTC_OPEN_EVT:
5637 bta_dm_proc_open_evt(&p_data->open);
5638 break;
5639
5640 case BTA_GATTC_SEARCH_RES_EVT:
5641 bta_dm_gatt_disc_result(p_data->srvc_res.service_uuid.id);
5642 break;
5643
5644 case BTA_GATTC_SEARCH_CMPL_EVT:
5645 if ( bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE)
5646 bta_dm_gatt_disc_complete(p_data->search_cmpl.conn_id, p_data->search_cmpl.status);
5647 break;
5648
5649 case BTA_GATTC_CLOSE_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005650 APPL_TRACE_DEBUG("BTA_GATTC_CLOSE_EVT reason = %d", p_data->close.reason);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005651 /* in case of disconnect before search is completed */
5652 if ( (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) &&
5653 !memcmp(p_data->close.remote_bda, bta_dm_search_cb.peer_bdaddr, BD_ADDR_LEN))
5654 {
5655 bta_dm_gatt_disc_complete((UINT16)BTA_GATT_INVALID_CONN_ID, (tBTA_GATT_STATUS) BTA_GATT_ERROR);
5656 }
5657 break;
5658
5659 default:
5660 break;
5661 }
5662}
The Android Open Source Project5738f832012-12-12 16:00:35 -08005663#endif /* BTA_GATT_INCLUDED */
Andre Eisenbach2d754412013-11-20 17:23:06 -08005664
5665#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
5666/*******************************************************************************
5667**
5668** Function bta_dm_enable_scan_filter
5669**
5670** Description This function enable/disable adv payload filtering condition
5671**
5672** Parameters:
5673**
5674*******************************************************************************/
5675void bta_dm_enable_scan_filter (tBTA_DM_MSG *p_data)
5676{
5677 tBTA_SYS_VS_BLE_SCAN_PF_ENABLE param;
5678
5679 param.enable = p_data->ble_enable_scan_filter.enable;
5680 param.p_target = p_data->ble_enable_scan_filter.p_target;
5681 param.p_cmpl_cback = p_data->ble_enable_scan_filter.p_cmpl_cback;
5682
5683 bta_sys_vs_hdl(BTA_VS_BLE_SCAN_PF_ENABLE_EVT, (void *)&param);
5684}
5685
5686/*******************************************************************************
5687**
5688** Function bta_dm_cfg_filter_cond
5689**
5690** Description This function configure adv payload filtering condition
5691**
5692** Parameters:
5693**
5694*******************************************************************************/
5695void bta_dm_cfg_filter_cond (tBTA_DM_MSG *p_data)
5696{
5697 tBTA_SYS_VS_BLE_SCAN_PF_COND param;
5698
5699 param.action = p_data->ble_cfg_filter_cond.action;
5700 param.cond_type = p_data->ble_cfg_filter_cond.cond_type;
5701 param.p_cond = (void *)p_data->ble_cfg_filter_cond.p_cond_param;
5702 param.p_cmpl_cback = p_data->ble_cfg_filter_cond.p_cmpl_cback;
5703
5704 bta_sys_vs_hdl(BTA_VS_BLE_SCAN_PF_COND_EVT, (void *)&param);
5705}
5706#endif /* BLE_ANDROID_CONTROLLER_SCAN_FILTER */
Ganesh Ganapathi Batta9546abf2014-05-30 16:28:00 -07005707
5708/*******************************************************************************
5709**
5710** Function bta_dm_ctrl_features_rd_cmpl_cback
5711**
5712** Description callback to handle controller feature read complete
5713**
5714** Parameters:
5715**
5716*******************************************************************************/
5717static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result)
5718{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005719 APPL_TRACE_DEBUG("%s status = %d ", __FUNCTION__, result);
Ganesh Ganapathi Batta9546abf2014-05-30 16:28:00 -07005720 if (result == BTM_SUCCESS)
5721 {
5722 if(bta_dm_cb.p_sec_cback)
5723 bta_dm_cb.p_sec_cback(BTA_DM_LE_FEATURES_READ, NULL);
5724 }
5725 else
5726 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005727 APPL_TRACE_ERROR("%s Ctrl BLE feature read failed: status :%d",__FUNCTION__, result);
Ganesh Ganapathi Batta9546abf2014-05-30 16:28:00 -07005728 }
5729
5730}
5731
5732
The Android Open Source Project5738f832012-12-12 16:00:35 -08005733#endif /* BLE_INCLUDED */