1 /******************************************************************************
2 *
3 * Copyright (C) 2003-2014 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
26 #include "common/bt_target.h"
27 #include "stack/bt_types.h"
28 #include "bta/bta_sys.h"
29 #include "bta/bta_api.h"
30 #include "bta_dm_int.h"
31 #include "bta/bta_dm_co.h"
32 #include "bta/bta_gattc_co.h"
33 #include "stack/btm_api.h"
34 #include "btm_int.h"
35 #include "stack/btu.h"
36 #include "stack/sdp_api.h"
37 #include "stack/l2c_api.h"
38 #include "bta/utl.h"
39 #include "stack/gap_api.h" /* For GAP_BleReadPeerPrefConnParams */
40 #include <string.h>
41 #include "device/controller.h"
42
43 #define LOG_TAG "bt_bta_dm"
44 // #include "osi/include/log.h"
45
46 #if (GAP_INCLUDED == TRUE)
47 #include "stack/gap_api.h"
48 #endif
49
50 static void bta_dm_inq_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir);
51 static void bta_dm_inq_cmpl_cb (void *p_result);
52 static void bta_dm_service_search_remname_cback (BD_ADDR bd_addr, DEV_CLASS dc, BD_NAME bd_name);
53 static void bta_dm_remname_cback (tBTM_REMOTE_DEV_NAME *p_remote_name);
54 #if (SDP_INCLUDED == TRUE)
55 static void bta_dm_find_services ( BD_ADDR bd_addr);
56 #endif ///SDP_INCLUDED == TRUE
57 static void bta_dm_discover_next_device(void);
58 #if (SDP_INCLUDED == TRUE)
59 static void bta_dm_sdp_callback (UINT16 sdp_status);
60 #endif ///SDP_INCLUDED == TRUE
61 #if (SMP_INCLUDED == TRUE)
62 static 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);
63 #if (CLASSIC_BT_INCLUDED == TRUE)
64 static UINT8 bta_dm_pin_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, BOOLEAN min_16_digit);
65 #endif /// CLASSIC_BT_INCLUDED == TRUE
66 static 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, BOOLEAN sc_support);
67 static UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, int result);
68 #endif ///SMP_INCLUDED == TRUE
69 static void bta_dm_local_name_cback(const BD_ADDR bd_addr);
70 static BOOLEAN bta_dm_check_av(UINT16 event);
71 static void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data);
72
73
74 static void bta_dm_acl_link_stat_cback(tBTM_ACL_LINK_STAT_EVENT_DATA *p_data);
75 static void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr);
76
77 /* Extended Inquiry Response */
78 #if (BT_SSP_INCLUDED == TRUE && SMP_INCLUDED == TRUE)
79 static UINT8 bta_dm_sp_cback (tBTM_SP_EVT event, tBTM_SP_EVT_DATA *p_data);
80 #endif /* (BT_SSP_INCLUDED == TRUE) */
81 #if (CLASSIC_BT_INCLUDED == TRUE)
82 static void bta_dm_set_eir (char *local_name);
83 #endif
84 #if (SDP_INCLUDED == TRUE)
85 static void bta_dm_eir_search_services( tBTM_INQ_RESULTS *p_result,
86 tBTA_SERVICE_MASK *p_services_to_search,
87 tBTA_SERVICE_MASK *p_services_found);
88 #endif ///SDP_INCLUDED == TRUE
89 static void bta_dm_search_timer_cback (TIMER_LIST_ENT *p_tle);
90 static void bta_dm_disable_conn_down_timer_cback (TIMER_LIST_ENT *p_tle);
91 static void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr);
92 static void bta_dm_adjust_roles(BOOLEAN delay_role_switch);
93 #if (SDP_INCLUDED == TRUE || SMP_INCLUDED == TRUE)
94 static char *bta_dm_get_remname(void);
95 #endif ///SDP_INCLUDED == TRUE || SMP_INCLUDED == TRUE
96 #if (SMP_INCLUDED == TRUE)
97 static void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result);
98 #endif ///SMP_INCLUDED == TRUE
99 #if (SDP_INCLUDED == TRUE)
100 static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr, tBT_TRANSPORT transport);
101 static void bta_dm_discover_device(BD_ADDR remote_bd_addr);
102 #endif ///SDP_INCLUDED == TRUE
103 static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status );
104 static void bta_dm_disable_search_and_disc(void);
105
106 #if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
107 #if ((defined SMP_INCLUDED) && (SMP_INCLUDED == TRUE))
108 static UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_DATA *p_data);
109 static void bta_dm_ble_id_key_cback (UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key);
110 #endif ///SMP_INCLUDED == TRUE
111 #if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE) && SDP_INCLUDED == TRUE)
112 #if (GATTC_INCLUDED == TRUE)
113 static void bta_dm_gattc_register(void);
114 static void btm_dm_start_gatt_discovery(BD_ADDR bd_addr);
115 static void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr);
116 static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data);
117 #endif // (GATTC_INCLUDED == TRUE)
118 extern tBTA_DM_CONTRL_STATE bta_dm_pm_obtain_controller_state(void);
119 #endif
120
121 #if BLE_VND_INCLUDED == TRUE
122 static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result);
123 #endif
124
125 #ifndef BTA_DM_BLE_ADV_CHNL_MAP
126 #define BTA_DM_BLE_ADV_CHNL_MAP (BTM_BLE_ADV_CHNL_37|BTM_BLE_ADV_CHNL_38|BTM_BLE_ADV_CHNL_39)
127 #endif
128 #endif
129 #if (SMP_INCLUDED == TRUE)
130 static BOOLEAN bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr);
131 #endif ///SMP_INCLUDED == TRUE
132 #if (BLE_INCLUDED == TRUE)
133 static void bta_dm_observe_results_cb(tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir);
134 static void bta_dm_observe_cmpl_cb(void *p_result);
135 static void bta_dm_observe_discard_cb (uint32_t num_dis);
136 #endif ///BLE_INCLUDED == TRUE
137
138 static void bta_dm_delay_role_switch_cback(TIMER_LIST_ENT *p_tle);
139 extern void sdpu_uuid16_to_uuid128(UINT16 uuid16, UINT8 *p_uuid128);
140 static void bta_dm_disable_timer_cback(TIMER_LIST_ENT *p_tle);
141 extern int bredr_txpwr_get(int *min_power_level, int *max_power_level);
142
143 const UINT16 bta_service_id_to_uuid_lkup_tbl [BTA_MAX_SERVICE_ID] = {
144 UUID_SERVCLASS_PNP_INFORMATION, /* Reserved */
145 UUID_SERVCLASS_SERIAL_PORT, /* BTA_SPP_SERVICE_ID */
146 UUID_SERVCLASS_DIALUP_NETWORKING, /* BTA_DUN_SERVICE_ID */
147 UUID_SERVCLASS_AUDIO_SOURCE, /* BTA_A2DP_SOURCE_SERVICE_ID */
148 UUID_SERVCLASS_LAN_ACCESS_USING_PPP, /* BTA_LAP_SERVICE_ID */
149 UUID_SERVCLASS_HEADSET, /* BTA_HSP_HS_SERVICE_ID */
150 UUID_SERVCLASS_HF_HANDSFREE, /* BTA_HFP_HS_SERVICE_ID */
151 UUID_SERVCLASS_OBEX_OBJECT_PUSH, /* BTA_OPP_SERVICE_ID */
152 UUID_SERVCLASS_OBEX_FILE_TRANSFER, /* BTA_FTP_SERVICE_ID */
153 UUID_SERVCLASS_CORDLESS_TELEPHONY, /* BTA_CTP_SERVICE_ID */
154 UUID_SERVCLASS_INTERCOM, /* BTA_ICP_SERVICE_ID */
155 UUID_SERVCLASS_IRMC_SYNC, /* BTA_SYNC_SERVICE_ID */
156 UUID_SERVCLASS_DIRECT_PRINTING, /* BTA_BPP_SERVICE_ID */
157 UUID_SERVCLASS_IMAGING_RESPONDER, /* BTA_BIP_SERVICE_ID */
158 UUID_SERVCLASS_PANU, /* BTA_PANU_SERVICE_ID */
159 UUID_SERVCLASS_NAP, /* BTA_NAP_SERVICE_ID */
160 UUID_SERVCLASS_GN, /* BTA_GN_SERVICE_ID */
161 UUID_SERVCLASS_SAP, /* BTA_SAP_SERVICE_ID */
162 UUID_SERVCLASS_AUDIO_SINK, /* BTA_A2DP_SERVICE_ID */
163 UUID_SERVCLASS_AV_REMOTE_CONTROL, /* BTA_AVRCP_SERVICE_ID */
164 UUID_SERVCLASS_HUMAN_INTERFACE, /* BTA_HID_SERVICE_ID */
165 UUID_SERVCLASS_VIDEO_SINK, /* BTA_VDP_SERVICE_ID */
166 UUID_SERVCLASS_PBAP_PSE, /* BTA_PBAP_SERVICE_ID */
167 UUID_SERVCLASS_HEADSET_AUDIO_GATEWAY, /* BTA_HSP_SERVICE_ID */
168 UUID_SERVCLASS_AG_HANDSFREE, /* BTA_HFP_SERVICE_ID */
169 UUID_SERVCLASS_MESSAGE_ACCESS, /* BTA_MAP_SERVICE_ID */
170 UUID_SERVCLASS_MESSAGE_NOTIFICATION, /* BTA_MN_SERVICE_ID */
171 UUID_SERVCLASS_HDP_PROFILE, /* BTA_HDP_SERVICE_ID */
172 UUID_SERVCLASS_PBAP_PCE /* BTA_PCE_SERVICE_ID */
173 #if BLE_INCLUDED && BTA_GATT_INCLUDED
174 , UUID_PROTOCOL_ATT /* BTA_GATT_SERVICE_ID */
175 #endif
176 };
177
178 /*
179 * NOTE : The number of element in bta_service_id_to_btm_srv_id_lkup_tbl should be matching with
180 * the value BTA_MAX_SERVICE_ID in bta/bta_api.h
181 *
182 * i.e., If you add new Service ID for BTA, the correct security ID of the new service
183 * from Security service definitions (stack/btm_api.h) should be added to this lookup table.
184 */
185 const UINT32 bta_service_id_to_btm_srv_id_lkup_tbl [BTA_MAX_SERVICE_ID] = {
186 0, /* Reserved */
187 BTM_SEC_SERVICE_SERIAL_PORT, /* BTA_SPP_SERVICE_ID */
188 BTM_SEC_SERVICE_DUN, /* BTA_DUN_SERVICE_ID */
189 BTM_SEC_SERVICE_AVDTP, /* BTA_AUDIO_SOURCE_SERVICE_ID */
190 BTM_SEC_SERVICE_LAN_ACCESS, /* BTA_LAP_SERVICE_ID */
191 BTM_SEC_SERVICE_HEADSET_AG, /* BTA_HSP_SERVICE_ID */
192 BTM_SEC_SERVICE_AG_HANDSFREE, /* BTA_HFP_SERVICE_ID */
193 BTM_SEC_SERVICE_OBEX, /* BTA_OPP_SERVICE_ID */
194 BTM_SEC_SERVICE_OBEX_FTP, /* BTA_FTP_SERVICE_ID */
195 BTM_SEC_SERVICE_CORDLESS, /* BTA_CTP_SERVICE_ID */
196 BTM_SEC_SERVICE_INTERCOM, /* BTA_ICP_SERVICE_ID */
197 BTM_SEC_SERVICE_IRMC_SYNC, /* BTA_SYNC_SERVICE_ID */
198 BTM_SEC_SERVICE_BPP_JOB, /* BTA_BPP_SERVICE_ID */
199 BTM_SEC_SERVICE_BIP, /* BTA_BIP_SERVICE_ID */
200 BTM_SEC_SERVICE_BNEP_PANU, /* BTA_PANU_SERVICE_ID */
201 BTM_SEC_SERVICE_BNEP_NAP, /* BTA_NAP_SERVICE_ID */
202 BTM_SEC_SERVICE_BNEP_GN, /* BTA_GN_SERVICE_ID */
203 BTM_SEC_SERVICE_SAP, /* BTA_SAP_SERVICE_ID */
204 BTM_SEC_SERVICE_AVDTP, /* BTA_A2DP_SERVICE_ID */
205 BTM_SEC_SERVICE_AVCTP, /* BTA_AVRCP_SERVICE_ID */
206 BTM_SEC_SERVICE_HIDH_SEC_CTRL, /* BTA_HID_SERVICE_ID */
207 BTM_SEC_SERVICE_AVDTP, /* BTA_VDP_SERVICE_ID */
208 BTM_SEC_SERVICE_PBAP, /* BTA_PBAP_SERVICE_ID */
209 BTM_SEC_SERVICE_HEADSET, /* BTA_HSP_HS_SERVICE_ID */
210 BTM_SEC_SERVICE_HF_HANDSFREE, /* BTA_HFP_HS_SERVICE_ID */
211 BTM_SEC_SERVICE_MAP, /* BTA_MAP_SERVICE_ID */
212 BTM_SEC_SERVICE_MAP, /* BTA_MN_SERVICE_ID */
213 BTM_SEC_SERVICE_HDP_SNK, /* BTA_HDP_SERVICE_ID */
214 BTM_SEC_SERVICE_PBAP /* BTA_PCE_SERVICE_ID */
215 #if BLE_INCLUDED && BTA_GATT_INCLUDED
216 , BTM_SEC_SERVICE_ATT /* BTA_GATT_SERVICE_ID */
217 #endif
218
219 };
220
221 /* bta security callback */
222 #if (SMP_INCLUDED == TRUE)
223 const tBTM_APPL_INFO bta_security = {
224 &bta_dm_authorize_cback,
225 #if (CLASSIC_BT_INCLUDED == TRUE)
226 &bta_dm_pin_cback,
227 #else
228 NULL,
229 #endif
230 &bta_dm_new_link_key_cback,
231 &bta_dm_authentication_complete_cback,
232 &bta_dm_bond_cancel_complete_cback,
233 #if (BT_SSP_INCLUDED == TRUE)
234 &bta_dm_sp_cback,
235 #else
236 NULL,
237 #endif
238 #if BLE_INCLUDED == TRUE
239 &bta_dm_ble_smp_cback,
240 &bta_dm_ble_id_key_cback,
241 #endif ///BLE_INCLUDED == TRUE
242
243 };
244 #endif ///SMP_INCLUDED == TRUE
245
246 #if (SDP_INCLUDED == TRUE)
247 #if BTA_DYNAMIC_MEMORY == FALSE
248 UINT8 g_disc_raw_data_buf[MAX_DISC_RAW_DATA_BUF];
249 #else
250 UINT8 *g_disc_raw_data_buf;
251 #endif
252 #endif ///SDP_INCLUDED == TRUE
253
254 /*******************************************************************************
255 **
256 ** Function bta_dm_enable
257 **
258 ** Description Initialises the BT device manager
259 **
260 **
261 ** Returns void
262 **
263 *******************************************************************************/
bta_dm_enable(tBTA_DM_MSG * p_data)264 void bta_dm_enable(tBTA_DM_MSG *p_data)
265 {
266 tBTA_SYS_HW_MSG *sys_enable_event;
267 tBTA_DM_ENABLE enable_event;
268
269 /* if already in use, return an error */
270 if ( bta_dm_cb.is_bta_dm_active == TRUE ) {
271 APPL_TRACE_WARNING("%s Device already started by another application", __func__);
272 memset(&enable_event, 0, sizeof(tBTA_DM_ENABLE));
273 enable_event.status = BTA_FAILURE;
274 if (p_data->enable.p_sec_cback != NULL) {
275 p_data->enable.p_sec_cback(BTA_DM_ENABLE_EVT, (tBTA_DM_SEC *)&enable_event);
276 }
277 return;
278 }
279
280 /* first, register our callback to SYS HW manager */
281 bta_sys_hw_register( BTA_SYS_HW_BLUETOOTH, bta_dm_sys_hw_cback );
282
283 /* make sure security callback is saved - if no callback, do not erase the previous one,
284 it could be an error recovery mechanism */
285 if ( p_data->enable.p_sec_cback != NULL ) {
286 bta_dm_cb.p_sec_cback = p_data->enable.p_sec_cback;
287 }
288 /* notify BTA DM is now active */
289 bta_dm_cb.is_bta_dm_active = TRUE;
290
291 /* send a message to BTA SYS */
292 if ((sys_enable_event = (tBTA_SYS_HW_MSG *) osi_malloc(sizeof(tBTA_SYS_HW_MSG))) != NULL) {
293 sys_enable_event->hdr.event = BTA_SYS_API_ENABLE_EVT;
294 sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH;
295
296 bta_sys_sendmsg(sys_enable_event);
297 }
298 }
299
300 /*******************************************************************************
301 *
302 * Function bta_dm_init_cb
303 *
304 * Description Initializes the bta_dm_cb control block
305 *
306 *
307 * Returns void
308 *
309 ******************************************************************************/
bta_dm_init_cb(void)310 void bta_dm_init_cb(void)
311 {
312 memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));
313 }
314
315 /*******************************************************************************
316 *
317 * Function bta_dm_deinit_cb
318 *
319 * Description De-initializes the bta_dm_cb control block
320 *
321 *
322 * Returns void
323 *
324 ******************************************************************************/
bta_dm_deinit_cb(void)325 void bta_dm_deinit_cb(void)
326 {
327 bta_sys_free_timer(&bta_dm_cb.disable_timer);
328 #if ( BTA_EIR_CANNED_UUID_LIST != TRUE )
329 bta_sys_free_timer(&bta_dm_cb.app_ready_timer);
330 #endif
331 #if BTM_SSR_INCLUDED == TRUE
332 for (size_t i = 0; i < BTA_DM_NUM_PM_TIMER; i++) {
333 for (size_t j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++) {
334 bta_sys_free_timer(&bta_dm_cb.pm_timer[i].timer[j]);
335 }
336 }
337 #endif
338 memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));
339 #if BTA_DYNAMIC_MEMORY
340 xSemaphoreGive(deinit_semaphore);
341 #endif /* #if BTA_DYNAMIC_MEMORY */
342 }
343
344 /*******************************************************************************
345 *
346 * Function bta_dm_eir_cfg_init
347 *
348 * Description Initializes the p_bta_dm_eir_cfg
349 *
350 *
351 * Returns void
352 *
353 ******************************************************************************/
bta_dm_eir_cfg_init(void)354 static void bta_dm_eir_cfg_init(void)
355 {
356 p_bta_dm_eir_cfg->bta_dm_eir_fec_required = BTM_EIR_DEFAULT_FEC_REQUIRED;
357 p_bta_dm_eir_cfg->bta_dm_eir_min_name_len = 50;
358
359 p_bta_dm_eir_cfg->bta_dm_eir_included_uuid = TRUE;
360 p_bta_dm_eir_cfg->bta_dm_eir_included_tx_power = FALSE;
361 p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power = 3;
362 p_bta_dm_eir_cfg->bta_dm_eir_flags = 0;
363
364 p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len = 0;
365 p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec = NULL;
366
367 p_bta_dm_eir_cfg->bta_dm_eir_url_len = 0;
368 p_bta_dm_eir_cfg->bta_dm_eir_url = NULL;
369 }
370
371 /*******************************************************************************
372 *
373 * Function bta_dm_eir_cfg_deinit
374 *
375 * Description De-initializes the p_bta_dm_eir_cfg
376 *
377 *
378 * Returns void
379 *
380 ******************************************************************************/
bta_dm_eir_cfg_deinit(void)381 static void bta_dm_eir_cfg_deinit(void)
382 {
383 p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len = 0;
384 if (p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec) {
385 osi_free(p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec);
386 p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec = NULL;
387 }
388
389 p_bta_dm_eir_cfg->bta_dm_eir_url_len = 0;
390 if (p_bta_dm_eir_cfg->bta_dm_eir_url) {
391 osi_free(p_bta_dm_eir_cfg->bta_dm_eir_url);
392 p_bta_dm_eir_cfg->bta_dm_eir_url = NULL;
393 }
394 }
395
396 /*******************************************************************************
397 **
398 ** Function bta_dm_sys_hw_cback
399 **
400 ** Description callback register to SYS to get HW status updates
401 **
402 **
403 ** Returns void
404 **
405 *******************************************************************************/
bta_dm_sys_hw_cback(tBTA_SYS_HW_EVT status)406 static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status )
407 {
408 DEV_CLASS dev_class;
409 tBTA_DM_SEC_CBACK *temp_cback;
410 #if BLE_INCLUDED == TRUE
411 UINT8 key_mask = 0;
412 BT_OCTET16 er;
413 tBTA_BLE_LOCAL_ID_KEYS id_key;
414 #endif
415
416 APPL_TRACE_DEBUG("%s with event: %i", __func__, status);
417
418 /* On H/W error evt, report to the registered DM application callback */
419 if (status == BTA_SYS_HW_ERROR_EVT) {
420 if ( bta_dm_cb.p_sec_cback != NULL ) {
421 bta_dm_cb.p_sec_cback(BTA_DM_HW_ERROR_EVT, NULL);
422 }
423 return;
424 }
425
426 if ( status == BTA_SYS_HW_OFF_EVT ) {
427 if ( bta_dm_cb.p_sec_cback != NULL ) {
428 bta_dm_cb.p_sec_cback(BTA_DM_DISABLE_EVT, NULL);
429 }
430
431 /* reinitialize the control block */
432 bta_dm_deinit_cb();
433
434 /* reinitialize the Extended Inquiry Response */
435 bta_dm_eir_cfg_deinit();
436
437 bta_sys_free_timer(&bta_dm_search_cb.search_timer);
438 #if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
439 #if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE) && SDP_INCLUDED == TRUE)
440 bta_sys_free_timer(&bta_dm_search_cb.gatt_close_timer);
441 #endif
442 #endif
443 memset(&bta_dm_search_cb, 0x00, sizeof(bta_dm_search_cb));
444
445 /* unregister from SYS */
446 bta_sys_hw_unregister( BTA_SYS_HW_BLUETOOTH );
447 /* notify BTA DM is now unactive */
448 bta_dm_cb.is_bta_dm_active = FALSE;
449 #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
450 #if (GATTC_INCLUDED == TRUE && GATTC_CACHE_NVS == TRUE)
451 /* clear the gattc cache address list */
452 bta_gattc_co_cache_addr_deinit();
453 #endif
454 #endif
455 } else if ( status == BTA_SYS_HW_ON_EVT ) {
456 /* FIXME: We should not unregister as the SYS shall invoke this callback on a H/W error.
457 * We need to revisit when this platform has more than one BLuetooth H/W chip */
458 //bta_sys_hw_unregister( BTA_SYS_HW_BLUETOOTH);
459
460 /* save security callback */
461 temp_cback = bta_dm_cb.p_sec_cback;
462 /* make sure the control block is properly initialized */
463 bta_dm_init_cb();
464
465 /* make sure the Extended Inquiry Response is properly initialized */
466 bta_dm_eir_cfg_init();
467
468 /* and retrieve the callback */
469 bta_dm_cb.p_sec_cback = temp_cback;
470 bta_dm_cb.is_bta_dm_active = TRUE;
471
472 bta_sys_free_timer(&bta_dm_search_cb.search_timer);
473 #if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
474 #if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE) && SDP_INCLUDED == TRUE)
475 bta_sys_free_timer(&bta_dm_search_cb.gatt_close_timer);
476 #endif
477 #endif
478 /* hw is ready, go on with BTA DM initialization */
479 memset(&bta_dm_search_cb, 0x00, sizeof(bta_dm_search_cb));
480 memset(&bta_dm_conn_srvcs, 0x00, sizeof(bta_dm_conn_srvcs));
481 memset(&bta_dm_di_cb, 0, sizeof(tBTA_DM_DI_CB));
482 memcpy(dev_class, p_bta_dm_cfg->dev_class, sizeof(dev_class));
483 #if CLASSIC_BT_INCLUDED
484 BTM_SetDeviceClass (dev_class);
485 #endif
486
487 #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
488 #if (GATTC_INCLUDED == TRUE && GATTC_CACHE_NVS == TRUE)
489 // load the gattc cache address list
490 bta_gattc_co_cache_addr_init();
491 #endif /* #if (GATTC_INCLUDED = TRUE) */
492 /* load BLE local information: ID keys, ER if available */
493 bta_dm_co_ble_load_local_keys(&key_mask, er, &id_key);
494
495 if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ER) {
496 BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ER, (tBTM_BLE_LOCAL_KEYS *)&er);
497 }
498 if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ID) {
499 BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ID, (tBTM_BLE_LOCAL_KEYS *)&id_key);
500 }
501 #if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE) && SDP_INCLUDED == TRUE)
502 bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID;
503 #endif
504 #endif
505 #if (SMP_INCLUDED == TRUE)
506 BTM_SecRegister((tBTM_APPL_INFO *)&bta_security);
507 #endif ///SMP_INCLUDED == TRUE
508 BTM_SetDefaultLinkSuperTout(p_bta_dm_cfg->link_timeout);
509 #if CLASSIC_BT_INCLUDED
510 BTM_WritePageTimeout(p_bta_dm_cfg->page_timeout);
511 bta_dm_cb.cur_policy = p_bta_dm_cfg->policy_settings;
512 BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
513 #endif
514 BTM_RegBusyLevelNotif (bta_dm_bl_change_cback, NULL, BTM_BL_UPDATE_MASK | BTM_BL_ROLE_CHG_MASK);
515 BTM_RegAclLinkStatNotif (bta_dm_acl_link_stat_cback);
516
517 #if BLE_VND_INCLUDED == TRUE
518 BTM_BleReadControllerFeatures (bta_dm_ctrl_features_rd_cmpl_cback);
519 #endif
520
521 /* Earlier, we used to invoke BTM_ReadLocalAddr which was just copying the bd_addr
522 from the control block and invoking the callback which was sending the DM_ENABLE_EVT.
523 But then we have a few HCI commands being invoked above which were still in progress
524 when the ENABLE_EVT was sent. So modified this to fetch the local name which forces
525 the DM_ENABLE_EVT to be sent only after all the init steps are complete */
526 BTM_ReadLocalDeviceNameFromController((tBTM_CMPL_CB *)bta_dm_local_name_cback);
527
528 bta_sys_rm_register((tBTA_SYS_CONN_CBACK *)bta_dm_rm_cback);
529
530 #if (BTA_DM_PM_INCLUDED == TRUE)
531 /* initialize bluetooth low power manager */
532 bta_dm_init_pm();
533 #endif /* #if (BTA_DM_PM_INCLUDED == TRUE) */
534
535 bta_sys_policy_register((tBTA_SYS_CONN_CBACK *)bta_dm_policy_cback);
536
537 #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE && SDP_INCLUDED == TRUE) && (GATTC_INCLUDED == TRUE)
538 bta_dm_gattc_register();
539 #endif
540
541 } else {
542 APPL_TRACE_DEBUG(" --- ignored event");
543 }
544
545 }
546
547
548 /*******************************************************************************
549 **
550 ** Function bta_dm_disable
551 **
552 ** Description Disables the BT device manager
553 **
554 **
555 ** Returns void
556 **
557 *******************************************************************************/
bta_dm_disable(tBTA_DM_MSG * p_data)558 void bta_dm_disable (tBTA_DM_MSG *p_data)
559 {
560 UNUSED(p_data);
561
562 /* Set l2cap idle timeout to 0 (so BTE immediately disconnects ACL link after last channel is closed) */
563 L2CA_SetIdleTimeoutByBdAddr((UINT8 *)BT_BD_ANY, 0, BT_TRANSPORT_BR_EDR);
564 L2CA_SetIdleTimeoutByBdAddr((UINT8 *)BT_BD_ANY, 0, BT_TRANSPORT_LE);
565
566 /* disable all active subsystems */
567 bta_sys_disable(BTA_SYS_HW_BLUETOOTH);
568 #if CLASSIC_BT_INCLUDED
569 BTM_SetDiscoverability(BTM_NON_DISCOVERABLE, 0, 0);
570 BTM_SetConnectability(BTM_NON_CONNECTABLE, 0, 0);
571 #endif // #if CLASSIC_BT_INCLUDED
572
573 #if (BTA_DM_PM_INCLUDED == TRUE)
574 bta_dm_disable_pm();
575 #endif /* #if (BTA_DM_PM_INCLUDED == TRUE) */
576
577 bta_dm_disable_search_and_disc();
578 bta_dm_cb.disabling = TRUE;
579
580 #if BLE_INCLUDED == TRUE
581 /* reset scan activity status*/
582 btm_cb.ble_ctr_cb.scan_activity = 0;
583
584 /* reset advertising activity status*/
585 btm_cb.ble_ctr_cb.inq_var.state = 0;
586 #endif
587
588 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
589 BTM_BleClearBgConnDev();
590 #endif
591
592 if (BTM_GetNumAclLinks() == 0) {
593 #if (defined(BTA_DISABLE_DELAY) && BTA_DISABLE_DELAY > 0)
594 /* If BTA_DISABLE_DELAY is defined and greater than zero, then delay the shutdown by
595 * BTA_DISABLE_DELAY milliseconds
596 */
597 APPL_TRACE_WARNING("%s BTA_DISABLE_DELAY set to %d ms",
598 __FUNCTION__, BTA_DISABLE_DELAY);
599 bta_sys_stop_timer(&bta_dm_cb.disable_timer);
600 bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK *)&bta_dm_disable_conn_down_timer_cback;
601 bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, BTA_DISABLE_DELAY);
602 #else
603 bta_dm_disable_conn_down_timer_cback(NULL);
604 #endif
605 } else {
606 bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK *)&bta_dm_disable_timer_cback;
607 bta_dm_cb.disable_timer.param = 0;
608 bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 5000);
609 }
610
611 #if BLE_INCLUDED == TRUE && BLE_PRIVACY_SPT == TRUE
612 btm_ble_resolving_list_cleanup (); //by TH, because cmn_ble_vsc_cb.max_filter has something mistake as btm_ble_adv_filter_cleanup
613 #endif
614
615 #if BLE_INCLUDED == TRUE
616 // btm_ble_multi_adv_init is called when the host is enabled, so btm_ble_multi_adv_cleanup is called when the host is disabled.
617 btm_ble_multi_adv_cleanup();
618 #endif
619
620 }
621
622 /*******************************************************************************
623 **
624 ** Function bta_dm_disable_timer_cback
625 **
626 ** Description Called if the disable timer expires
627 ** Used to close ACL connections which are still active
628 **
629 **
630 **
631 ** Returns void
632 **
633 *******************************************************************************/
bta_dm_disable_timer_cback(TIMER_LIST_ENT * p_tle)634 static void bta_dm_disable_timer_cback (TIMER_LIST_ENT *p_tle)
635 {
636 UNUSED(p_tle);
637 UINT8 i;
638 tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
639 BOOLEAN trigger_disc = FALSE;
640
641
642 APPL_TRACE_EVENT(" bta_dm_disable_timer_cback trial %d ", p_tle->param);
643
644 if (BTM_GetNumAclLinks() && p_tle->param == 0) {
645 for (i = 0; i < bta_dm_cb.device_list.count; i++) {
646 #if (BLE_INCLUDED == TRUE)
647 transport = bta_dm_cb.device_list.peer_device[i].transport;
648 #endif
649 btm_remove_acl(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, transport);
650 trigger_disc = TRUE;
651 }
652
653 /* Retrigger disable timer in case ACL disconnect failed, DISABLE_EVT still need
654 to be sent out to avoid the layer disable timeout */
655 if (trigger_disc) {
656 bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK *)&bta_dm_disable_timer_cback;
657 bta_dm_cb.disable_timer.param = 1;
658 bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 1500);
659 }
660 } else {
661 bta_dm_cb.disabling = FALSE;
662
663 bta_sys_remove_uuid(UUID_SERVCLASS_PNP_INFORMATION);
664 bta_dm_cb.p_sec_cback(BTA_DM_DISABLE_EVT, NULL);
665 }
666 }
667
668
669
670
671 /*******************************************************************************
672 **
673 ** Function bta_dm_set_dev_name
674 **
675 ** Description Sets local device name
676 **
677 **
678 ** Returns void
679 **
680 *******************************************************************************/
bta_dm_set_dev_name(tBTA_DM_MSG * p_data)681 void bta_dm_set_dev_name (tBTA_DM_MSG *p_data)
682 {
683 BTM_SetLocalDeviceName((char *)p_data->set_name.name);
684 #if CLASSIC_BT_INCLUDED
685 bta_dm_set_eir ((char *)p_data->set_name.name);
686 #endif /// CLASSIC_BT_INCLUDED
687 }
688
689 /*******************************************************************************
690 **
691 ** Function bta_dm_get_dev_name
692 **
693 ** Description Gets local device name
694 **
695 **
696 ** Returns void
697 **
698 *******************************************************************************/
bta_dm_get_dev_name(tBTA_DM_MSG * p_data)699 void bta_dm_get_dev_name (tBTA_DM_MSG *p_data)
700 {
701 tBTM_STATUS status;
702 char *name = NULL;
703
704 status = BTM_ReadLocalDeviceName(&name);
705 if (p_data->get_name.p_cback) {
706 (*p_data->get_name.p_cback)(status, name);
707 }
708 }
709
bta_dm_send_vendor_hci(tBTA_DM_MSG * p_data)710 void bta_dm_send_vendor_hci(tBTA_DM_MSG *p_data)
711 {
712 BTM_VendorSpecificCommand(p_data->vendor_hci_cmd.opcode,
713 p_data->vendor_hci_cmd.param_len,
714 p_data->vendor_hci_cmd.p_param_buf,
715 p_data->vendor_hci_cmd.vendor_hci_cb);
716 }
717
718 /*******************************************************************************
719 **
720 ** Function bta_dm_set_afh_channels
721 **
722 ** Description Sets AFH channels
723 **
724 **
725 ** Returns void
726 **
727 *******************************************************************************/
bta_dm_set_afh_channels(tBTA_DM_MSG * p_data)728 void bta_dm_set_afh_channels (tBTA_DM_MSG *p_data)
729 {
730 #if CLASSIC_BT_INCLUDED
731 BTM_SetAfhChannels (p_data->set_afh_channels.channels, p_data->set_afh_channels.set_afh_cb);
732 #endif /// CLASSIC_BT_INCLUDED
733 }
734
735 #if (SDP_INCLUDED == TRUE)
736 /*******************************************************************************
737 **
738 ** Function bta_dm_read_remote_device_name
739 **
740 ** Description Initiate to get remote device name
741 **
742 ** Returns TRUE if started to get remote name
743 **
744 *******************************************************************************/
bta_dm_read_remote_device_name(BD_ADDR bd_addr,tBT_TRANSPORT transport)745 static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr, tBT_TRANSPORT transport)
746 {
747 tBTM_STATUS btm_status;
748
749 APPL_TRACE_DEBUG("bta_dm_read_remote_device_name");
750
751 bdcpy(bta_dm_search_cb.peer_bdaddr, bd_addr);
752 bta_dm_search_cb.peer_name[0] = '\0';
753
754 btm_status = BTM_ReadRemoteDeviceName (bta_dm_search_cb.peer_bdaddr,
755 (tBTM_CMPL_CB *) bta_dm_remname_cback,
756 transport);
757
758 if ( btm_status == BTM_CMD_STARTED ) {
759 APPL_TRACE_DEBUG("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is started");
760
761 return (TRUE);
762 } else if ( btm_status == BTM_BUSY ) {
763 APPL_TRACE_DEBUG("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is busy");
764
765 /* Remote name discovery is on going now so BTM cannot notify through "bta_dm_remname_cback" */
766 /* adding callback to get notified that current reading remote name done */
767 BTM_SecAddRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
768
769 return (TRUE);
770 } else {
771 APPL_TRACE_WARNING("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName returns 0x%02X", btm_status);
772
773 return (FALSE);
774 }
775 }
776
777 /*******************************************************************************
778 **
779 ** Function bta_dm_read_rmt_name
780 **
781 ** Description Initiate to get remote device name
782 **
783 ** Returns TRUE if started to get remote name
784 **
785 *******************************************************************************/
bta_dm_read_rmt_name(tBTA_DM_MSG * p_data)786 void bta_dm_read_rmt_name(tBTA_DM_MSG *p_data)
787 {
788 APPL_TRACE_DEBUG("%s",__func__);
789 bdcpy(bta_dm_search_cb.peer_bdaddr, p_data->get_rmt_name.rmt_addr);
790 bta_dm_search_cb.peer_name[0] = '\0';
791
792 tBTM_STATUS btm_status = BTM_ReadRemoteDeviceName(bta_dm_search_cb.peer_bdaddr,
793 (tBTM_CMPL_CB *) p_data->get_rmt_name.rmt_name_cb,
794 bta_dm_search_cb.transport);
795
796 if (btm_status == BTM_CMD_STARTED) {
797 BTM_TRACE_DEBUG("%s: BTM_ReadRemoteDeviceName is started",__func__);
798 } else if (btm_status == BTM_BUSY) {
799 BTM_TRACE_DEBUG("%s: BTM_ReadRemoteDeviceName is busy",__func__);
800 } else {
801 BTM_TRACE_WARNING("%s: BTM_ReadRemoteDeviceName returns 0x%02X",__func__, btm_status);
802 }
803 }
804 #endif ///SDP_INCLUDED == TRUE
805
806 #if (CLASSIC_BT_INCLUDED == TRUE)
bta_dm_config_eir(tBTA_DM_MSG * p_data)807 void bta_dm_config_eir (tBTA_DM_MSG *p_data)
808 {
809 tBTA_DM_API_CONFIG_EIR *config_eir = &p_data->config_eir;
810
811 p_bta_dm_eir_cfg->bta_dm_eir_fec_required = config_eir->eir_fec_required;
812 p_bta_dm_eir_cfg->bta_dm_eir_included_name = config_eir->eir_included_name;
813 p_bta_dm_eir_cfg->bta_dm_eir_included_uuid = config_eir->eir_included_uuid;
814 p_bta_dm_eir_cfg->bta_dm_eir_included_tx_power = config_eir->eir_included_tx_power;
815 p_bta_dm_eir_cfg->bta_dm_eir_flags = config_eir->eir_flags;
816 p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len = config_eir->eir_manufac_spec_len;
817 p_bta_dm_eir_cfg->bta_dm_eir_url_len = config_eir->eir_url_len;
818
819 if (p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec) {
820 osi_free(p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec);
821 p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec = NULL;
822 }
823 if (config_eir->eir_manufac_spec_len > 0) {
824 p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec = osi_malloc(config_eir->eir_manufac_spec_len);
825 if (p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec) {
826 memcpy(p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec, config_eir->eir_manufac_spec, config_eir->eir_manufac_spec_len);
827 } else {
828 APPL_TRACE_ERROR("%s, malloc failed.", __func__);
829 p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len = 0;
830 }
831 }
832
833 if (p_bta_dm_eir_cfg->bta_dm_eir_url) {
834 osi_free(p_bta_dm_eir_cfg->bta_dm_eir_url);
835 p_bta_dm_eir_cfg->bta_dm_eir_url = NULL;
836 }
837 if (config_eir->eir_url_len > 0) {
838 p_bta_dm_eir_cfg->bta_dm_eir_url = osi_malloc(config_eir->eir_url_len);
839 if (p_bta_dm_eir_cfg->bta_dm_eir_url) {
840 memcpy(p_bta_dm_eir_cfg->bta_dm_eir_url, config_eir->eir_url, config_eir->eir_url_len);
841 } else {
842 APPL_TRACE_ERROR("%s, malloc failed.", __func__);
843 p_bta_dm_eir_cfg->bta_dm_eir_url_len = 0;
844 }
845 }
846
847 bta_dm_set_eir(NULL);
848 }
849
850 /*******************************************************************************
851 **
852 ** Function bta_dm_set_acl_pkt_types
853 **
854 ** Description Sets ACL packet types
855 **
856 **
857 ** Returns void
858 **
859 *******************************************************************************/
bta_dm_set_acl_pkt_types(tBTA_DM_MSG * p_data)860 void bta_dm_set_acl_pkt_types (tBTA_DM_MSG *p_data)
861 {
862 if (p_data->set_acl_pkt_types.set_acl_pkt_types_cb != NULL) {
863 BTM_SetAclPktTypes(p_data->set_acl_pkt_types.rmt_addr,
864 p_data->set_acl_pkt_types.pkt_types,
865 p_data->set_acl_pkt_types.set_acl_pkt_types_cb);
866 } else {
867 APPL_TRACE_ERROR("%s(), the callback function can't be NULL.", __func__);
868 }
869 }
870
871 #endif
872 /*******************************************************************************
873 **
874 ** Function bta_dm_ble_set_channels
875 **
876 ** Description Sets AFH channels
877 **
878 **
879 ** Returns void
880 **
881 *******************************************************************************/
bta_dm_ble_set_channels(tBTA_DM_MSG * p_data)882 void bta_dm_ble_set_channels (tBTA_DM_MSG *p_data)
883 {
884 #if (BLE_INCLUDED == TRUE)
885 BTM_BleSetChannels (p_data->ble_set_channels.channels, p_data->ble_set_channels.set_channels_cb);
886 #endif /// BLE_INCLUDED == TRUE
887 }
888
bta_dm_update_white_list(tBTA_DM_MSG * p_data)889 void bta_dm_update_white_list(tBTA_DM_MSG *p_data)
890 {
891 #if (BLE_INCLUDED == TRUE)
892 BTM_BleUpdateAdvWhitelist(p_data->white_list.add_remove, p_data->white_list.remote_addr, p_data->white_list.addr_type, p_data->white_list.update_wl_cb);
893 #endif ///BLE_INCLUDED == TRUE
894 }
895
bta_dm_clear_white_list(tBTA_DM_MSG * p_data)896 void bta_dm_clear_white_list(tBTA_DM_MSG *p_data)
897 {
898 #if (BLE_INCLUDED == TRUE)
899 BTM_BleClearWhitelist(p_data->white_list.update_wl_cb);
900 #endif
901 }
902
bta_dm_ble_read_adv_tx_power(tBTA_DM_MSG * p_data)903 void bta_dm_ble_read_adv_tx_power(tBTA_DM_MSG *p_data)
904 {
905 #if (BLE_INCLUDED == TRUE)
906 if (p_data->read_tx_power.read_tx_power_cb != NULL) {
907 BTM_BleReadAdvTxPower(p_data->read_tx_power.read_tx_power_cb);
908 } else {
909 APPL_TRACE_ERROR("%s(), the callback function can't be NULL.", __func__);
910 }
911 #endif ///BLE_INCLUDED == TRUE
912 }
913
bta_dm_read_rssi(tBTA_DM_MSG * p_data)914 void bta_dm_read_rssi(tBTA_DM_MSG *p_data)
915 {
916 if (p_data->rssi.read_rssi_cb != NULL) {
917 BTM_ReadRSSI(p_data->rssi.remote_addr, p_data->rssi.transport, p_data->rssi.read_rssi_cb);
918 } else {
919 APPL_TRACE_ERROR("%s(), the callback function can't be NULL.", __func__);
920 }
921 }
922
923 /*******************************************************************************
924 **
925 ** Function bta_dm_set_visibility
926 **
927 ** Description Sets discoverability, connectability and pairability
928 **
929 **
930 ** Returns void
931 **
932 *******************************************************************************/
bta_dm_set_visibility(tBTA_DM_MSG * p_data)933 void bta_dm_set_visibility(tBTA_DM_MSG *p_data)
934 {
935 UINT16 window, interval;
936 UINT16 disc_mode = BTM_ReadDiscoverability(&window, &interval);
937 UINT16 conn_mode = BTM_ReadConnectability(&window, &interval);
938 #if (BLE_INCLUDED == TRUE)
939 UINT16 le_disc_mode = BTM_BleReadDiscoverability();
940 UINT16 le_conn_mode = BTM_BleReadConnectability();
941 #endif ///BLE_INCLUDED == TRUE
942
943 /* set modes for Discoverability and connectability if not ignore */
944 if (p_data->set_visibility.disc_mode != (BTA_DM_IGNORE | BTA_DM_LE_IGNORE)) {
945 #if (BLE_INCLUDED == TRUE)
946 if ((p_data->set_visibility.disc_mode & BTA_DM_LE_IGNORE) == BTA_DM_LE_IGNORE) {
947 p_data->set_visibility.disc_mode =
948 ((p_data->set_visibility.disc_mode & ~BTA_DM_LE_IGNORE) | le_disc_mode);
949 }
950 #endif ///BLE_INCLUDED == TRUE
951
952 if ((p_data->set_visibility.disc_mode & BTA_DM_IGNORE) == BTA_DM_IGNORE) {
953 p_data->set_visibility.disc_mode =
954 ((p_data->set_visibility.disc_mode & ~BTA_DM_IGNORE) | disc_mode);
955 }
956
957 #if (CLASSIC_BT_INCLUDED == TRUE)
958 BTM_SetDiscoverability(p_data->set_visibility.disc_mode,
959 bta_dm_cb.inquiry_scan_window,
960 bta_dm_cb.inquiry_scan_interval);
961 #endif
962 }
963
964 if (p_data->set_visibility.conn_mode != (BTA_DM_IGNORE | BTA_DM_LE_IGNORE)) {
965 #if (BLE_INCLUDED == TRUE)
966 if ((p_data->set_visibility.conn_mode & BTA_DM_LE_IGNORE) == BTA_DM_LE_IGNORE) {
967 p_data->set_visibility.conn_mode =
968 ((p_data->set_visibility.conn_mode & ~BTA_DM_LE_IGNORE) | le_conn_mode);
969 }
970 #endif ///BLE_INCLUDED == TRUE
971
972 if ((p_data->set_visibility.conn_mode & BTA_DM_IGNORE) == BTA_DM_IGNORE) {
973 p_data->set_visibility.conn_mode =
974 ((p_data->set_visibility.conn_mode & ~BTA_DM_IGNORE) | conn_mode);
975 }
976
977 #if (CLASSIC_BT_INCLUDED == TRUE)
978 BTM_SetConnectability(p_data->set_visibility.conn_mode,
979 bta_dm_cb.page_scan_window,
980 bta_dm_cb.page_scan_interval);
981 #endif
982 }
983
984 /* Send False or True if not ignore */
985 if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE ) {
986
987 if (p_data->set_visibility.pair_mode == BTA_DM_NON_PAIRABLE) {
988 bta_dm_cb.disable_pair_mode = TRUE;
989 } else {
990 bta_dm_cb.disable_pair_mode = FALSE;
991 }
992
993 }
994
995 /* Send False or True if not ignore */
996 if (p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE) {
997
998 if (p_data->set_visibility.conn_paired_only == BTA_DM_CONN_ALL) {
999 bta_dm_cb.conn_paired_only = FALSE;
1000 } else {
1001 bta_dm_cb.conn_paired_only = TRUE;
1002 }
1003
1004 }
1005
1006 /* Change mode if either mode is not ignore */
1007 if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE || p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE) {
1008 BTM_SetPairableMode((BOOLEAN)(!(bta_dm_cb.disable_pair_mode)), bta_dm_cb.conn_paired_only);
1009 }
1010
1011 }
1012
1013 /*******************************************************************************
1014 **
1015 ** Function bta_dm_process_remove_device
1016 **
1017 ** Description Removes device, Disconnects ACL link if required.
1018 ****
1019 *******************************************************************************/
bta_dm_process_remove_device(BD_ADDR bd_addr,tBT_TRANSPORT transport)1020 static void bta_dm_process_remove_device(BD_ADDR bd_addr, tBT_TRANSPORT transport)
1021 {
1022 #if (BLE_INCLUDED == TRUE && GATTC_INCLUDED == TRUE)
1023 /* need to remove all pending background connection before unpair */
1024 BTA_GATTC_CancelOpen(0, bd_addr, FALSE);
1025 #endif
1026
1027 BTM_SecDeleteDevice(bd_addr, transport);
1028
1029 if (bta_dm_cb.p_sec_cback) {
1030 tBTA_DM_SEC sec_event;
1031 bdcpy(sec_event.link_down.bd_addr, bd_addr);
1032 sec_event.link_down.status = HCI_SUCCESS;
1033 if (transport == BT_TRANSPORT_LE){
1034 bta_dm_cb.p_sec_cback(BTA_DM_BLE_DEV_UNPAIRED_EVT, &sec_event);
1035 } else {
1036 bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &sec_event);
1037 }
1038
1039 }
1040 }
1041
1042 /*******************************************************************************
1043 **
1044 ** Function bta_dm_remove_device
1045 **
1046 ** Description Removes device, disconnects ACL link if required.
1047 ****
1048 *******************************************************************************/
bta_dm_remove_device(tBTA_DM_MSG * p_data)1049 void bta_dm_remove_device(tBTA_DM_MSG *p_data)
1050 {
1051 tBTA_DM_API_REMOVE_DEVICE *p_dev = &p_data->remove_dev;
1052 if (p_dev == NULL) {
1053 return;
1054 }
1055
1056 /* If ACL exists for the device in the remove_bond message*/
1057 BOOLEAN continue_delete_dev = FALSE;
1058 UINT8 transport = p_dev->transport;
1059
1060 if (BTM_IsAclConnectionUp(p_dev->bd_addr, transport)) {
1061 APPL_TRACE_DEBUG("%s: ACL Up count %d", __func__, bta_dm_cb.device_list.count);
1062 continue_delete_dev = FALSE;
1063
1064 /* Take the link down first, and mark the device for removal when disconnected */
1065 for (int i = 0; i < bta_dm_cb.device_list.count; i++) {
1066 if (!bdcmp(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_dev->bd_addr)
1067 #if BLE_INCLUDED == TRUE
1068 && bta_dm_cb.device_list.peer_device[i].transport == transport
1069 #endif
1070 ) {
1071
1072 bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_UNPAIRING;
1073 btm_remove_acl( p_dev->bd_addr, transport);
1074 APPL_TRACE_DEBUG("%s:transport = %d", __func__, transport);
1075 break;
1076 }
1077 }
1078 } else {
1079 continue_delete_dev = TRUE;
1080 }
1081
1082 /* Delete the device mentioned in the msg */
1083 if (continue_delete_dev) {
1084 bta_dm_process_remove_device(p_dev->bd_addr, transport);
1085 }
1086
1087 BTM_ClearInqDb (p_dev->bd_addr);
1088 }
1089
1090 /*******************************************************************************
1091 **
1092 ** Function bta_dm_add_device
1093 **
1094 ** Description This function adds a Link Key to an security database entry.
1095 ** It is normally called during host startup to restore all required information
1096 ** stored in the NVRAM.
1097 ****
1098 *******************************************************************************/
bta_dm_add_device(tBTA_DM_MSG * p_data)1099 void bta_dm_add_device (tBTA_DM_MSG *p_data)
1100 {
1101 tBTA_DM_API_ADD_DEVICE *p_dev = &p_data->add_dev;
1102 UINT8 *p_dc = NULL;
1103 UINT8 *p_lc = NULL;
1104 UINT32 trusted_services_mask[BTM_SEC_SERVICE_ARRAY_SIZE];
1105 UINT8 index = 0;
1106 UINT8 btm_mask_index = 0;
1107
1108 memset (trusted_services_mask, 0, sizeof(trusted_services_mask));
1109
1110 /* If not all zeros, the device class has been specified */
1111 if (p_dev->dc_known) {
1112 p_dc = (UINT8 *)p_dev->dc;
1113 }
1114
1115 if (p_dev->link_key_known) {
1116 p_lc = (UINT8 *)p_dev->link_key;
1117 }
1118
1119 if (p_dev->is_trusted) {
1120 /* convert BTA service mask to BTM mask */
1121 while (p_dev->tm && (index < BTA_MAX_SERVICE_ID)) {
1122 if (p_dev->tm & (UINT32)(1 << index)) {
1123
1124 btm_mask_index = bta_service_id_to_btm_srv_id_lkup_tbl[index] / BTM_SEC_ARRAY_BITS;
1125 trusted_services_mask[btm_mask_index] |= (UINT32)(1 << (bta_service_id_to_btm_srv_id_lkup_tbl[index] - (UINT32)(btm_mask_index * 32)));
1126
1127 p_dev->tm &= (UINT32)(~(1 << index));
1128
1129 }
1130 index++;
1131 }
1132 }
1133
1134 if (!BTM_SecAddDevice (p_dev->bd_addr, p_dc, p_dev->bd_name, p_dev->features,
1135 trusted_services_mask, p_lc, p_dev->key_type, p_dev->io_cap,
1136 p_dev->pin_length, p_dev->sc_support)) {
1137 APPL_TRACE_ERROR ("BTA_DM: Error adding device %08x%04x",
1138 (p_dev->bd_addr[0] << 24) + (p_dev->bd_addr[1] << 16) + (p_dev->bd_addr[2] << 8) + p_dev->bd_addr[3],
1139 (p_dev->bd_addr[4] << 8) + p_dev->bd_addr[5]);
1140 }
1141 }
1142
1143 /*******************************************************************************
1144 **
1145 ** Function bta_dm_close_acl
1146 **
1147 ** Description This function forces to close the connection to a remote device
1148 ** and optionally remove the device from security database if
1149 ** required.
1150 ****
1151 *******************************************************************************/
bta_dm_close_acl(tBTA_DM_MSG * p_data)1152 void bta_dm_close_acl(tBTA_DM_MSG *p_data)
1153 {
1154 tBTA_DM_API_REMOVE_ACL *p_remove_acl = &p_data->remove_acl;
1155 UINT8 index;
1156
1157 APPL_TRACE_DEBUG("bta_dm_close_acl");
1158
1159 if (BTM_IsAclConnectionUp(p_remove_acl->bd_addr, p_remove_acl->transport)) {
1160 for (index = 0; index < bta_dm_cb.device_list.count; index ++) {
1161 if (!bdcmp( bta_dm_cb.device_list.peer_device[index].peer_bdaddr, p_remove_acl->bd_addr)) {
1162 break;
1163 }
1164 }
1165 if (index != bta_dm_cb.device_list.count) {
1166 if (p_remove_acl->remove_dev) {
1167 bta_dm_cb.device_list.peer_device[index].remove_dev_pending = TRUE;
1168 }
1169 } else {
1170 APPL_TRACE_ERROR("unknown device, remove ACL failed");
1171 }
1172 /* Disconnect the ACL link */
1173 btm_remove_acl(p_remove_acl->bd_addr, p_remove_acl->transport);
1174 }
1175 /* if to remove the device from security database ? do it now */
1176 else if (p_remove_acl->remove_dev) {
1177 if (!BTM_SecDeleteDevice(p_remove_acl->bd_addr, p_remove_acl->transport)) {
1178 APPL_TRACE_ERROR("delete device from security database failed.");
1179 }
1180 #if (BLE_INCLUDED == TRUE && GATTC_INCLUDED == TRUE)
1181 /* need to remove all pending background connection if any */
1182 BTA_GATTC_CancelOpen(0, p_remove_acl->bd_addr, FALSE);
1183 #endif
1184 }
1185 /* otherwise, no action needed */
1186
1187 }
1188
1189 /*******************************************************************************
1190 **
1191 ** Function bta_dm_remove_all_acl
1192 **
1193 ** Description This function forces to close all the ACL links specified by link type
1194 ****
1195 *******************************************************************************/
bta_dm_remove_all_acl(tBTA_DM_MSG * p_data)1196 void bta_dm_remove_all_acl(tBTA_DM_MSG *p_data)
1197 {
1198 const tBTA_DM_LINK_TYPE link_type = p_data->remove_all_acl.link_type;
1199 tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
1200
1201 APPL_TRACE_DEBUG("%s link type = %d", __func__, link_type);
1202
1203 for (UINT8 i = 0; i < bta_dm_cb.device_list.count; i++) {
1204 BD_ADDR addr = {0};
1205 bdcpy(addr, bta_dm_cb.device_list.peer_device[i].peer_bdaddr);
1206 #if defined (BLE_INCLUDED) && (BLE_INCLUDED == TRUE)
1207 transport = bta_dm_cb.device_list.peer_device[i].transport;
1208 #endif
1209 if ((link_type == BTA_DM_LINK_TYPE_ALL) ||
1210 ((link_type == BTA_DM_LINK_TYPE_LE) && (transport == BT_TRANSPORT_LE)) ||
1211 ((link_type == BTA_DM_LINK_TYPE_BR_EDR) && (transport == BT_TRANSPORT_BR_EDR))) {
1212 /* Disconnect the ACL link */
1213 btm_remove_acl(addr, transport);
1214 }
1215 }
1216 }
1217
1218
1219 /*******************************************************************************
1220 **
1221 ** Function bta_dm_bond
1222 **
1223 ** Description Bonds with peer device
1224 **
1225 **
1226 ** Returns void
1227 **
1228 *******************************************************************************/
1229 #if (SMP_INCLUDED == TRUE)
bta_dm_bond(tBTA_DM_MSG * p_data)1230 void bta_dm_bond (tBTA_DM_MSG *p_data)
1231 {
1232 tBTM_STATUS status;
1233 tBTA_DM_SEC sec_event;
1234 char *p_name;
1235
1236 if (p_data->bond.transport == BTA_TRANSPORT_UNKNOWN) {
1237 status = BTM_SecBond ( p_data->bond.bd_addr, 0, NULL, 0 );
1238 } else {
1239 status = BTM_SecBondByTransport ( p_data->bond.bd_addr, p_data->bond.transport, 0, NULL, 0 );
1240 }
1241
1242
1243 if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED)) {
1244
1245 memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
1246 bdcpy(sec_event.auth_cmpl.bd_addr, p_data->bond.bd_addr);
1247 p_name = BTM_SecReadDevName(p_data->bond.bd_addr);
1248 if (p_name != NULL) {
1249 memcpy(sec_event.auth_cmpl.bd_name, p_name, (BD_NAME_LEN - 1));
1250 sec_event.auth_cmpl.bd_name[BD_NAME_LEN - 1] = 0;
1251 }
1252
1253 /* taken care of by memset [above]
1254 sec_event.auth_cmpl.key_present = FALSE;
1255 sec_event.auth_cmpl.success = FALSE;
1256 */
1257 sec_event.auth_cmpl.fail_reason = HCI_ERR_ILLEGAL_COMMAND;
1258 if (status == BTM_SUCCESS) {
1259 sec_event.auth_cmpl.success = TRUE;
1260 } else {
1261 /* delete this device entry from Sec Dev DB */
1262 bta_dm_remove_sec_dev_entry(p_data->bond.bd_addr);
1263 }
1264 bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
1265 }
1266
1267 }
1268
1269 /*******************************************************************************
1270 **
1271 ** Function bta_dm_bond_cancel
1272 **
1273 ** Description Cancels bonding with a peer device
1274 **
1275 **
1276 ** Returns void
1277 **
1278 *******************************************************************************/
bta_dm_bond_cancel(tBTA_DM_MSG * p_data)1279 void bta_dm_bond_cancel (tBTA_DM_MSG *p_data)
1280 {
1281 tBTM_STATUS status;
1282 tBTA_DM_SEC sec_event;
1283
1284 APPL_TRACE_EVENT(" bta_dm_bond_cancel ");
1285 status = BTM_SecBondCancel ( p_data->bond_cancel.bd_addr );
1286
1287 if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED && status != BTM_SUCCESS)) {
1288 sec_event.bond_cancel_cmpl.result = BTA_FAILURE;
1289
1290 bta_dm_cb.p_sec_cback(BTA_DM_BOND_CANCEL_CMPL_EVT, &sec_event);
1291 }
1292
1293 }
1294
1295 /*******************************************************************************
1296 **
1297 ** Function bta_dm_set_pin_type
1298 **
1299 ** Description Set the pin type and fixed pin
1300 **
1301 **
1302 ** Returns void
1303 **
1304 *******************************************************************************/
bta_dm_set_pin_type(tBTA_DM_MSG * p_data)1305 void bta_dm_set_pin_type (tBTA_DM_MSG *p_data)
1306 {
1307 #if (CLASSIC_BT_INCLUDED == TRUE)
1308 BTM_SetPinType (p_data->set_pin_type.pin_type, p_data->set_pin_type.p_pin, p_data->set_pin_type.pin_len);
1309 #endif ///CLASSIC_BT_INCLUDED == TRUE
1310 }
1311
1312 /*******************************************************************************
1313 **
1314 ** Function bta_dm_pin_reply
1315 **
1316 ** Description Send the pin_reply to a request from BTM
1317 **
1318 **
1319 ** Returns void
1320 **
1321 *******************************************************************************/
bta_dm_pin_reply(tBTA_DM_MSG * p_data)1322 void bta_dm_pin_reply (tBTA_DM_MSG *p_data)
1323 {
1324 #if (CLASSIC_BT_INCLUDED == TRUE)
1325 UINT32 trusted_mask[BTM_SEC_SERVICE_ARRAY_SIZE];
1326 UINT32 *current_trusted_mask;
1327
1328 current_trusted_mask = BTM_ReadTrustedMask(p_data->pin_reply.bd_addr);
1329
1330 if (current_trusted_mask) {
1331 memcpy(trusted_mask, current_trusted_mask, sizeof(trusted_mask));
1332 } else {
1333 memset(trusted_mask, 0, sizeof(trusted_mask));
1334 }
1335
1336 if (p_data->pin_reply.accept) {
1337
1338 BTM_PINCodeReply(p_data->pin_reply.bd_addr, BTM_SUCCESS, p_data->pin_reply.pin_len, p_data->pin_reply.p_pin, trusted_mask );
1339 } else {
1340 BTM_PINCodeReply(p_data->pin_reply.bd_addr, BTM_NOT_AUTHORIZED, 0, NULL, trusted_mask );
1341 }
1342 #endif ///CLASSIC_BT_INCLUDED == TRUE
1343 }
1344 #endif ///SMP_INCLUDED == TRUE
1345
1346 /*******************************************************************************
1347 **
1348 ** Function bta_dm_policy_cback
1349 **
1350 ** Description process the link policy changes
1351 **
1352 ** Returns void
1353 **
1354 *******************************************************************************/
bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status,UINT8 id,UINT8 app_id,BD_ADDR peer_addr)1355 static void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
1356 {
1357 tBTA_DM_PEER_DEVICE *p_dev = NULL;
1358 UINT16 policy = app_id;
1359 UINT32 mask = (UINT32)(1 << id);
1360
1361 if (peer_addr) {
1362 p_dev = bta_dm_find_peer_device(peer_addr);
1363 }
1364
1365 APPL_TRACE_DEBUG(" bta_dm_policy_cback cmd:%d, policy:0x%x",
1366 status, policy);
1367 switch (status) {
1368 case BTA_SYS_PLCY_SET:
1369 if (!p_dev) {
1370 return;
1371 }
1372 /* restore the default link policy */
1373 p_dev->link_policy |= policy;
1374 BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
1375 break;
1376
1377 case BTA_SYS_PLCY_CLR:
1378 if (!p_dev) {
1379 return;
1380 }
1381 /* clear the policy from the default link policy */
1382 p_dev->link_policy &= (~policy);
1383 BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
1384
1385 #if (BTA_DM_PM_INCLUDED == TRUE)
1386 if (policy & (HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_PARK_MODE)) {
1387 /* if clearing sniff/park, wake the link */
1388 bta_dm_pm_active(p_dev->peer_bdaddr);
1389 }
1390 #endif /* #if (BTA_DM_PM_INCLUDED == TRUE) */
1391 break;
1392
1393 case BTA_SYS_PLCY_DEF_SET:
1394 /* want to restore/set the role switch policy */
1395 bta_dm_cb.role_policy_mask &= ~mask;
1396 if (0 == bta_dm_cb.role_policy_mask) {
1397 /* if nobody wants to insist on the role */
1398 bta_dm_cb.cur_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH;
1399 BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
1400 }
1401 break;
1402
1403 case BTA_SYS_PLCY_DEF_CLR:
1404 /* want to remove the role switch policy */
1405 bta_dm_cb.role_policy_mask |= mask;
1406 bta_dm_cb.cur_policy &= ~HCI_ENABLE_MASTER_SLAVE_SWITCH;
1407 BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
1408 break;
1409 }
1410 }
1411
1412 /*******************************************************************************
1413 **
1414 ** Function bta_dm_confirm
1415 **
1416 ** Description Send the user confirm request reply in response to a
1417 ** request from BTM
1418 **
1419 ** Returns void
1420 **
1421 *******************************************************************************/
1422 #if (SMP_INCLUDED == TRUE)
bta_dm_confirm(tBTA_DM_MSG * p_data)1423 void bta_dm_confirm(tBTA_DM_MSG *p_data)
1424 {
1425 tBTM_STATUS res = BTM_NOT_AUTHORIZED;
1426
1427 if (p_data->confirm.accept == TRUE) {
1428 res = BTM_SUCCESS;
1429 }
1430 BTM_ConfirmReqReply(res, p_data->confirm.bd_addr);
1431 }
1432 #endif ///SMP_INCLUDED == TRUE
1433
1434 /*******************************************************************************
1435 **
1436 ** Function bta_dm_key_req
1437 **
1438 ** Description Send the user passkey request reply in response to a
1439 ** request from BTM
1440 **
1441 ** Returns void
1442 **
1443 *******************************************************************************/
1444 #if (SMP_INCLUDED == TRUE && BT_SSP_INCLUDED)
bta_dm_key_req(tBTA_DM_MSG * p_data)1445 void bta_dm_key_req(tBTA_DM_MSG *p_data)
1446 {
1447 tBTM_STATUS res = BTM_NOT_AUTHORIZED;
1448
1449 if (p_data->key_req.accept == TRUE) {
1450 res = BTM_SUCCESS;
1451 }
1452 BTM_PasskeyReqReply(res, p_data->key_req.bd_addr, p_data->key_req.passkey);
1453 }
1454 #endif ///SMP_INCLUDED == TRUE && BT_SSP_INCLUDED
1455
1456 /*******************************************************************************
1457 **
1458 ** Function bta_dm_loc_oob
1459 **
1460 ** Description Retrieve the OOB data from the local LM
1461 **
1462 ** Returns void
1463 **
1464 *******************************************************************************/
1465 #if (BTM_OOB_INCLUDED == TRUE && SMP_INCLUDED == TRUE)
bta_dm_loc_oob(tBTA_DM_MSG * p_data)1466 void bta_dm_loc_oob(tBTA_DM_MSG *p_data)
1467 {
1468 UNUSED(p_data);
1469 BTM_ReadLocalOobData();
1470 }
1471
1472 /*******************************************************************************
1473 **
1474 ** Function bta_dm_oob_reply
1475 **
1476 ** Description This function is called to provide the OOB data for
1477 ** SMP in response to BLE OOB request.
1478 **
1479 ** Returns void
1480 **
1481 *******************************************************************************/
bta_dm_oob_reply(tBTA_DM_MSG * p_data)1482 void bta_dm_oob_reply(tBTA_DM_MSG *p_data)
1483 {
1484 #if (BLE_INCLUDED)
1485 BTM_BleOobDataReply(p_data->oob_reply.bd_addr, BTM_SUCCESS, p_data->oob_reply.len, p_data->oob_reply.value);
1486 #endif
1487 }
1488
1489 /*******************************************************************************
1490 **
1491 ** Function bta_dm_sc_oob_reply
1492 **
1493 ** Description This function is called to provide the OOB data for
1494 ** SMP in response to BLE secure connection OOB request.
1495 **
1496 ** Returns void
1497 **
1498 *******************************************************************************/
bta_dm_sc_oob_reply(tBTA_DM_MSG * p_data)1499 void bta_dm_sc_oob_reply(tBTA_DM_MSG *p_data)
1500 {
1501 #if (BLE_INCLUDED)
1502 BTM_BleSecureConnectionOobDataReply(p_data->sc_oob_reply.bd_addr, p_data->sc_oob_reply.c, p_data->sc_oob_reply.r);
1503 #endif
1504 }
1505
1506 /*******************************************************************************
1507 **
1508 ** Function bta_dm_sc_create_oob_data
1509 **
1510 ** Description This function is called to create the OOB data for
1511 ** SMP when secure connection.
1512 **
1513 ** Returns void
1514 **
1515 *******************************************************************************/
bta_dm_sc_create_oob_data(tBTA_DM_MSG * p_data)1516 void bta_dm_sc_create_oob_data(tBTA_DM_MSG *p_data)
1517 {
1518 #if (BLE_INCLUDED)
1519 BTM_BleSecureConnectionCreateOobData();
1520 #endif
1521 }
1522
1523 /*******************************************************************************
1524 **
1525 ** Function bta_dm_ci_io_req_act
1526 **
1527 ** Description respond to the IO capabilities request from BTM
1528 **
1529 ** Returns void
1530 **
1531 *******************************************************************************/
bta_dm_ci_io_req_act(tBTA_DM_MSG * p_data)1532 void bta_dm_ci_io_req_act(tBTA_DM_MSG *p_data)
1533 {
1534 tBTM_AUTH_REQ auth_req = BTM_AUTH_AP_NO;
1535 if (p_data->ci_io_req.auth_req) {
1536 auth_req = BTM_AUTH_AP_YES;
1537 }
1538 BTM_IoCapRsp(p_data->ci_io_req.bd_addr, p_data->ci_io_req.io_cap,
1539 p_data->ci_io_req.oob_data, auth_req);
1540 }
1541
1542 /*******************************************************************************
1543 **
1544 ** Function bta_dm_ci_rmt_oob_act
1545 **
1546 ** Description respond to the OOB data request for the remote device from BTM
1547 **
1548 **
1549 ** Returns void
1550 **
1551 *******************************************************************************/
bta_dm_ci_rmt_oob_act(tBTA_DM_MSG * p_data)1552 void bta_dm_ci_rmt_oob_act(tBTA_DM_MSG *p_data)
1553 {
1554 tBTM_STATUS res = BTM_NOT_AUTHORIZED;
1555
1556 if (p_data->ci_rmt_oob.accept == TRUE) {
1557 res = BTM_SUCCESS;
1558 }
1559 BTM_RemoteOobDataReply(res, p_data->ci_rmt_oob.bd_addr,
1560 p_data->ci_rmt_oob.c, p_data->ci_rmt_oob.r );
1561 }
1562 #endif /* BTM_OOB_INCLUDED == TRUE && SMP_INCLUDED == TRUE */
1563
1564 /*******************************************************************************
1565 **
1566 ** Function bta_dm_search_start
1567 **
1568 ** Description Starts an inquiry
1569 **
1570 **
1571 ** Returns void
1572 **
1573 *******************************************************************************/
bta_dm_search_start(tBTA_DM_MSG * p_data)1574 void bta_dm_search_start (tBTA_DM_MSG *p_data)
1575 {
1576 tBTM_INQUIRY_CMPL result;
1577
1578 #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE && SDP_INCLUDED == TRUE) && (GATTC_INCLUDED == TRUE)
1579 UINT16 len = (UINT16)(sizeof(tBT_UUID) * p_data->search.num_uuid);
1580 bta_dm_gattc_register();
1581 #endif
1582
1583 APPL_TRACE_DEBUG("%s avoid_scatter=%d", __func__, p_bta_dm_cfg->avoid_scatter);
1584
1585 if (p_bta_dm_cfg->avoid_scatter &&
1586 (p_data->search.rs_res == BTA_DM_RS_NONE) && bta_dm_check_av(BTA_DM_API_SEARCH_EVT)) {
1587 memcpy(&bta_dm_cb.search_msg, &p_data->search, sizeof(tBTA_DM_API_SEARCH));
1588 return;
1589 }
1590
1591 BTM_ClearInqDb(NULL);
1592 /* save search params */
1593 bta_dm_search_cb.p_search_cback = p_data->search.p_cback;
1594 bta_dm_search_cb.services = p_data->search.services;
1595
1596 #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE && SDP_INCLUDED == TRUE) && (GATTC_INCLUDED == TRUE)
1597 utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
1598
1599 if ((bta_dm_search_cb.num_uuid = p_data->search.num_uuid) != 0 &&
1600 p_data->search.p_uuid != NULL) {
1601 if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)osi_malloc(len)) == NULL) {
1602 APPL_TRACE_ERROR("%s no resources", __func__);
1603
1604 result.status = BTA_FAILURE;
1605 result.num_resp = 0;
1606 bta_dm_inq_cmpl_cb ((void *)&result);
1607 return;
1608 }
1609
1610 memcpy(bta_dm_search_cb.p_srvc_uuid, p_data->search.p_uuid, len);
1611 }
1612 #endif
1613 result.status = BTM_StartInquiry( (tBTM_INQ_PARMS *)&p_data->search.inq_params,
1614 bta_dm_inq_results_cb,
1615 (tBTM_CMPL_CB *) bta_dm_inq_cmpl_cb);
1616
1617 APPL_TRACE_EVENT("%s status=%d", __func__, result.status);
1618 if (result.status != BTM_CMD_STARTED) {
1619 result.num_resp = 0;
1620 bta_dm_inq_cmpl_cb ((void *)&result);
1621 }
1622 }
1623
1624 /*******************************************************************************
1625 **
1626 ** Function bta_dm_search_cancel
1627 **
1628 ** Description Cancels an ongoing search for devices
1629 **
1630 **
1631 ** Returns void
1632 **
1633 *******************************************************************************/
bta_dm_search_cancel(tBTA_DM_MSG * p_data)1634 void bta_dm_search_cancel (tBTA_DM_MSG *p_data)
1635 {
1636 UNUSED(p_data);
1637 tBTA_DM_MSG *p_msg;
1638
1639 if (BTM_IsInquiryActive()) {
1640 if (BTM_CancelInquiry() != BTM_CMD_STARTED) {
1641 bta_dm_search_cancel_notify(NULL);
1642 p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG));
1643 if (p_msg != NULL) {
1644 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1645 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1646 bta_sys_sendmsg(p_msg);
1647 }
1648 } else {
1649 /* flag a search cancel is pending */
1650 bta_dm_search_cb.cancel_pending = TRUE;
1651 }
1652 }
1653 /* If no Service Search going on then issue cancel remote name in case it is active */
1654 else if (!bta_dm_search_cb.name_discover_done) {
1655 BTM_CancelRemoteDeviceName();
1656
1657 if ((p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG))) != NULL) {
1658 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1659 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1660 bta_sys_sendmsg(p_msg);
1661 }
1662
1663 } else {
1664 if ((p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG))) != NULL) {
1665 p_msg->hdr.event = BTA_DM_INQUIRY_CMPL_EVT;
1666 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1667 bta_sys_sendmsg(p_msg);
1668 }
1669 }
1670
1671 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE && SDP_INCLUDED == TRUE && GATTC_INCLUDED == TRUE
1672 if (bta_dm_search_cb.gatt_disc_active) {
1673 bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
1674 }
1675 #endif
1676 }
1677
1678 /*******************************************************************************
1679 **
1680 ** Function bta_dm_discover
1681 **
1682 ** Description Discovers services on a remote device
1683 **
1684 **
1685 ** Returns void
1686 **
1687 *******************************************************************************/
1688 #if (SDP_INCLUDED == TRUE)
bta_dm_discover(tBTA_DM_MSG * p_data)1689 void bta_dm_discover (tBTA_DM_MSG *p_data)
1690 {
1691 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE && GATTC_INCLUDED == TRUE
1692 UINT16 len = (UINT16)(sizeof(tBT_UUID) * p_data->discover.num_uuid);
1693 #endif
1694 APPL_TRACE_EVENT("%s services_to_search=0x%04X, sdp_search=%d", __func__,
1695 p_data->discover.services, p_data->discover.sdp_search);
1696
1697 /* save the search condition */
1698 bta_dm_search_cb.services = p_data->discover.services;
1699
1700 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE && GATTC_INCLUDED == TRUE
1701 bta_dm_gattc_register();
1702 utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
1703 if ((bta_dm_search_cb.num_uuid = p_data->discover.num_uuid) != 0 &&
1704 p_data->discover.p_uuid != NULL) {
1705 if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)osi_malloc(len)) == NULL) {
1706 p_data->discover.p_cback(BTA_DM_DISC_CMPL_EVT, NULL);
1707 return;
1708 }
1709 memcpy(bta_dm_search_cb.p_srvc_uuid, p_data->discover.p_uuid, len);
1710 }
1711 bta_dm_search_cb.uuid_to_search = bta_dm_search_cb.num_uuid;
1712 #endif
1713
1714 bta_dm_search_cb.p_search_cback = p_data->discover.p_cback;
1715 bta_dm_search_cb.sdp_search = p_data->discover.sdp_search;
1716 bta_dm_search_cb.services_to_search = bta_dm_search_cb.services;
1717 bta_dm_search_cb.service_index = 0;
1718 bta_dm_search_cb.services_found = 0;
1719 bta_dm_search_cb.peer_name[0] = '\0';
1720 bta_dm_search_cb.sdp_search = p_data->discover.sdp_search;
1721 bta_dm_search_cb.p_btm_inq_info = BTM_InqDbRead (p_data->discover.bd_addr);
1722 bta_dm_search_cb.transport = p_data->discover.transport;
1723
1724 bta_dm_search_cb.name_discover_done = FALSE;
1725 memcpy(&bta_dm_search_cb.uuid, &p_data->discover.uuid, sizeof(tSDP_UUID));
1726 bta_dm_discover_device(p_data->discover.bd_addr);
1727 }
1728
1729 /*******************************************************************************
1730 **
1731 ** Function bta_dm_di_disc_cmpl
1732 **
1733 ** Description Sends event to application when DI discovery complete
1734 **
1735 ** Returns void
1736 **
1737 *******************************************************************************/
bta_dm_di_disc_cmpl(tBTA_DM_MSG * p_data)1738 void bta_dm_di_disc_cmpl(tBTA_DM_MSG *p_data)
1739 {
1740 tBTA_DM_DI_DISC_CMPL di_disc;
1741
1742 memset(&di_disc, 0, sizeof(tBTA_DM_DI_DISC_CMPL));
1743 bdcpy(di_disc.bd_addr, bta_dm_search_cb.peer_bdaddr);
1744
1745 if ((p_data->hdr.offset == SDP_SUCCESS)
1746 || (p_data->hdr.offset == SDP_DB_FULL)) {
1747 di_disc.num_record = SDP_GetNumDiRecords(bta_dm_di_cb.p_di_db);
1748 } else {
1749 di_disc.result = BTA_FAILURE;
1750 }
1751
1752 bta_dm_di_cb.p_di_db = NULL;
1753 bta_dm_search_cb.p_search_cback(BTA_DM_DI_DISC_CMPL_EVT, (tBTA_DM_SEARCH *) &di_disc);
1754 }
1755
1756 /*******************************************************************************
1757 **
1758 ** Function bta_dm_di_disc_callback
1759 **
1760 ** Description This function queries a remote device for DI information.
1761 **
1762 **
1763 ** Returns void
1764 **
1765 *******************************************************************************/
bta_dm_di_disc_callback(UINT16 result)1766 static void bta_dm_di_disc_callback(UINT16 result)
1767 {
1768 tBTA_DM_MSG *p_msg;
1769
1770 if ((p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG))) != NULL) {
1771 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1772 p_msg->hdr.layer_specific = BTA_DM_API_DI_DISCOVER_EVT;
1773 p_msg->hdr.offset = result;
1774 bta_sys_sendmsg(p_msg);
1775 }
1776 }
1777 #endif ///SDP_INCLUDED == TRUE
1778 /*******************************************************************************
1779 **
1780 ** Function bta_dm_disable_search_and_disc
1781 **
1782 ** Description Cancels an ongoing search or discovery for devices in case of
1783 ** a Bluetooth disable
1784 **
1785 **
1786 ** Returns void
1787 **
1788 *******************************************************************************/
bta_dm_disable_search_and_disc(void)1789 static void bta_dm_disable_search_and_disc (void)
1790 {
1791 #if (SDP_INCLUDED == TRUE)
1792 tBTA_DM_DI_DISC_CMPL di_disc;
1793 #endif ///SDP_INCLUDED == TRUE
1794 if (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) {
1795 bta_dm_search_cancel(NULL);
1796 }
1797 #if (SDP_INCLUDED == TRUE)
1798 if (bta_dm_di_cb.p_di_db != NULL) {
1799 memset(&di_disc, 0, sizeof(tBTA_DM_DI_DISC_CMPL));
1800 bdcpy(di_disc.bd_addr, bta_dm_search_cb.peer_bdaddr);
1801 di_disc.result = BTA_FAILURE;
1802
1803 bta_dm_di_cb.p_di_db = NULL;
1804 bta_dm_search_cb.p_search_cback(BTA_DM_DI_DISC_CMPL_EVT, NULL);
1805 }
1806 #endif ///SDP_INCLUDED == TRUE
1807 }
1808
1809 /*******************************************************************************
1810 **
1811 ** Function bta_dm_di_disc
1812 **
1813 ** Description This function queries a remote device for DI information.
1814 **
1815 **
1816 ** Returns void
1817 **
1818 *******************************************************************************/
1819 #if (SDP_INCLUDED == TRUE)
bta_dm_di_disc(tBTA_DM_MSG * p_data)1820 void bta_dm_di_disc (tBTA_DM_MSG *p_data)
1821 {
1822 UINT16 result = BTA_FAILURE;
1823 tBTA_DM_MSG *p_msg;
1824
1825 bta_dm_search_cb.p_search_cback = p_data->di_disc.p_cback;
1826 bdcpy(bta_dm_search_cb.peer_bdaddr, p_data->di_disc.bd_addr);
1827 bta_dm_di_cb.p_di_db = p_data->di_disc.p_sdp_db;
1828
1829 if ((bta_dm_search_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)osi_malloc(BTA_DM_SDP_DB_SIZE)) != NULL) {
1830 if ( SDP_DiDiscover(bta_dm_search_cb.peer_bdaddr, p_data->di_disc.p_sdp_db,
1831 p_data->di_disc.len, bta_dm_di_disc_callback) == SDP_SUCCESS) {
1832 result = BTA_SUCCESS;
1833 }
1834 } else {
1835 APPL_TRACE_ERROR("No buffer to start DI discovery");
1836 }
1837
1838 if ( result == BTA_FAILURE &&
1839 (p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG))) != NULL) {
1840 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1841 p_msg->hdr.layer_specific = BTA_DM_API_DI_DISCOVER_EVT;
1842 p_data->hdr.offset = result;
1843 bta_sys_sendmsg(p_msg);
1844 }
1845 }
1846 #endif ///SDP_INCLUDED == TRUE
1847
1848 /*******************************************************************************
1849 **
1850 ** Function bta_dm_inq_cmpl
1851 **
1852 ** Description Process the inquiry complete event from BTM
1853 **
1854 ** Returns void
1855 **
1856 *******************************************************************************/
bta_dm_inq_cmpl(tBTA_DM_MSG * p_data)1857 void bta_dm_inq_cmpl (tBTA_DM_MSG *p_data)
1858 {
1859 tBTA_DM_MSG *p_msg;
1860 tBTA_DM_SEARCH data;
1861
1862 APPL_TRACE_DEBUG("bta_dm_inq_cmpl");
1863
1864 data.inq_cmpl.num_resps = p_data->inq_cmpl.num;
1865 bta_dm_search_cb.p_search_cback(BTA_DM_INQ_CMPL_EVT, &data);
1866
1867 if ((bta_dm_search_cb.p_btm_inq_info = BTM_InqDbFirst()) != NULL) {
1868 /* start name and service discovery from the first device on inquiry result */
1869 bta_dm_search_cb.name_discover_done = FALSE;
1870 bta_dm_search_cb.peer_name[0] = 0;
1871 #if (SDP_INCLUDED == TRUE)
1872 bta_dm_discover_device(bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr);
1873 #endif ///SDP_INCLUDED == TRUE
1874 } else {
1875 /* no devices, search complete */
1876 bta_dm_search_cb.services = 0;
1877
1878 if ((p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG))) != NULL) {
1879 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1880 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1881 bta_sys_sendmsg(p_msg);
1882 }
1883 }
1884 }
1885
1886 /*******************************************************************************
1887 **
1888 ** Function bta_dm_rmt_name
1889 **
1890 ** Description Process the remote name result from BTM
1891 **
1892 ** Returns void
1893 **
1894 *******************************************************************************/
bta_dm_rmt_name(tBTA_DM_MSG * p_data)1895 void bta_dm_rmt_name (tBTA_DM_MSG *p_data)
1896 {
1897 APPL_TRACE_DEBUG("bta_dm_rmt_name");
1898
1899 if ( p_data->rem_name.result.disc_res.bd_name[0] && bta_dm_search_cb.p_btm_inq_info) {
1900 bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name = TRUE;
1901 }
1902 #if (SDP_INCLUDED == TRUE)
1903 bta_dm_discover_device(bta_dm_search_cb.peer_bdaddr);
1904 #endif ///SDP_INCLUDED == TRUE
1905 }
1906
1907 /*******************************************************************************
1908 **
1909 ** Function bta_dm_disc_rmt_name
1910 **
1911 ** Description Process the remote name result from BTM when application
1912 ** wants to find the name for a bdaddr
1913 **
1914 ** Returns void
1915 **
1916 *******************************************************************************/
bta_dm_disc_rmt_name(tBTA_DM_MSG * p_data)1917 void bta_dm_disc_rmt_name (tBTA_DM_MSG *p_data)
1918 {
1919 tBTM_INQ_INFO *p_btm_inq_info;
1920
1921 APPL_TRACE_DEBUG("bta_dm_disc_rmt_name");
1922
1923 p_btm_inq_info = BTM_InqDbRead (p_data->rem_name.result.disc_res.bd_addr);
1924 if ( p_btm_inq_info ) {
1925 if ( p_data->rem_name.result.disc_res.bd_name[0] ) {
1926 p_btm_inq_info->appl_knows_rem_name = TRUE;
1927 }
1928 }
1929 #if (SDP_INCLUDED == TRUE)
1930 bta_dm_discover_device(p_data->rem_name.result.disc_res.bd_addr);
1931 #endif ///SDP_INCLUDED == TRUE
1932 }
1933
1934 /*******************************************************************************
1935 **
1936 ** Function bta_dm_sdp_result
1937 **
1938 ** Description Process the discovery result from sdp
1939 **
1940 ** Returns void
1941 **
1942 *******************************************************************************/
1943 #if (SDP_INCLUDED == TRUE)
bta_dm_sdp_result(tBTA_DM_MSG * p_data)1944 void bta_dm_sdp_result (tBTA_DM_MSG *p_data)
1945 {
1946 tSDP_DISC_REC *p_sdp_rec = NULL;
1947 tBTA_DM_MSG *p_msg;
1948 BOOLEAN scn_found = FALSE;
1949 UINT16 service = 0xFFFF;
1950 tSDP_PROTOCOL_ELEM pe;
1951
1952 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
1953 tBT_UUID *p_uuid = bta_dm_search_cb.p_srvc_uuid;
1954 tBTA_DM_SEARCH result;
1955 tBT_UUID service_uuid;
1956 #endif
1957
1958 UINT32 num_uuids = 0;
1959 UINT8 uuid_list[32][MAX_UUID_SIZE]; // assuming a max of 32 services
1960
1961 if ((p_data->sdp_event.sdp_result == SDP_SUCCESS)
1962 || (p_data->sdp_event.sdp_result == SDP_NO_RECS_MATCH)
1963 || (p_data->sdp_event.sdp_result == SDP_DB_FULL)) {
1964 APPL_TRACE_DEBUG("sdp_result::0x%x", p_data->sdp_event.sdp_result);
1965 do {
1966 p_sdp_rec = NULL;
1967 if ( bta_dm_search_cb.service_index == (BTA_USER_SERVICE_ID + 1) ) {
1968 p_sdp_rec = SDP_FindServiceUUIDInDb(bta_dm_search_cb.p_sdp_db, &bta_dm_search_cb.uuid, p_sdp_rec);
1969 if (p_sdp_rec && SDP_FindProtocolListElemInRec(p_sdp_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
1970 bta_dm_search_cb.peer_scn = (UINT8) pe.params[0];
1971 scn_found = TRUE;
1972 }
1973 } else {
1974 service = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index - 1];
1975 p_sdp_rec = SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db, service, p_sdp_rec);
1976 }
1977 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
1978 /* finished with BR/EDR services, now we check the result for GATT based service UUID */
1979 if (bta_dm_search_cb.service_index == BTA_MAX_SERVICE_ID) {
1980 if (bta_dm_search_cb.uuid_to_search != 0 && p_uuid != NULL) {
1981 p_uuid += (bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search);
1982 /* only support 16 bits UUID for now */
1983 service = p_uuid->uu.uuid16;
1984 }
1985 /* all GATT based services */
1986 do {
1987 /* find a service record, report it */
1988 p_sdp_rec = SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db,
1989 0, p_sdp_rec);
1990 if (p_sdp_rec) {
1991 if (SDP_FindServiceUUIDInRec(p_sdp_rec, &service_uuid)) {
1992 /* send result back to app now, one by one */
1993 bdcpy (result.disc_ble_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
1994 BCM_STRNCPY_S((char *)result.disc_ble_res.bd_name, bta_dm_get_remname(), BD_NAME_LEN);
1995 result.disc_ble_res.bd_name[BD_NAME_LEN] = '\0';
1996 result.disc_ble_res.service.len = service_uuid.len;
1997 result.disc_ble_res.service.uu.uuid16 = service_uuid.uu.uuid16;
1998
1999 bta_dm_search_cb.p_search_cback(BTA_DM_DISC_BLE_RES_EVT, &result);
2000 }
2001 }
2002
2003 if (bta_dm_search_cb.uuid_to_search > 0) {
2004 break;
2005 }
2006
2007 } while (p_sdp_rec);
2008 } else
2009 #endif
2010 {
2011 /* SDP_DB_FULL means some records with the
2012 required attributes were received */
2013 if (((p_data->sdp_event.sdp_result == SDP_DB_FULL) &&
2014 bta_dm_search_cb.services != BTA_ALL_SERVICE_MASK) ||
2015 (p_sdp_rec != NULL)) {
2016 if (service != UUID_SERVCLASS_PNP_INFORMATION && service != 0) {
2017 UINT16 tmp_svc = 0xFFFF;
2018 bta_dm_search_cb.services_found |=
2019 (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index - 1));
2020 tmp_svc = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index - 1];
2021 /* Add to the list of UUIDs */
2022 sdpu_uuid16_to_uuid128(tmp_svc, uuid_list[num_uuids]);
2023 num_uuids++;
2024 }
2025 }
2026 }
2027
2028 if (bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK &&
2029 bta_dm_search_cb.services_to_search == 0) {
2030 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
2031 if ( bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID &&
2032 bta_dm_search_cb.uuid_to_search > 0) {
2033 bta_dm_search_cb.uuid_to_search --;
2034 }
2035
2036 if (bta_dm_search_cb.uuid_to_search == 0 ||
2037 bta_dm_search_cb.service_index != BTA_BLE_SERVICE_ID)
2038 #endif
2039 bta_dm_search_cb.service_index++;
2040 } else { /* regular one service per search or PNP search */
2041 break;
2042 }
2043 } while (bta_dm_search_cb.service_index <= BTA_MAX_SERVICE_ID);
2044
2045 APPL_TRACE_DEBUG("%s services_found = %04x", __FUNCTION__,
2046 bta_dm_search_cb.services_found);
2047
2048 /* Collect the 128-bit services here and put them into the list */
2049 if (bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK) {
2050 p_sdp_rec = NULL;
2051 do {
2052 tBT_UUID temp_uuid;
2053 /* find a service record, report it */
2054 p_sdp_rec = SDP_FindServiceInDb_128bit(bta_dm_search_cb.p_sdp_db, p_sdp_rec);
2055 if (p_sdp_rec) {
2056 if (SDP_FindServiceUUIDInRec_128bit(p_sdp_rec, &temp_uuid)) {
2057 memcpy(uuid_list[num_uuids], temp_uuid.uu.uuid128, MAX_UUID_SIZE);
2058 num_uuids++;
2059 }
2060 }
2061 } while (p_sdp_rec);
2062 }
2063 /* if there are more services to search for */
2064 if (bta_dm_search_cb.services_to_search) {
2065 /* Free up the p_sdp_db before checking the next one */
2066 bta_dm_free_sdp_db(NULL);
2067 bta_dm_find_services(bta_dm_search_cb.peer_bdaddr);
2068 } else {
2069 /* callbacks */
2070 /* start next bd_addr if necessary */
2071
2072 BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
2073
2074
2075 if ((p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG))) != NULL) {
2076 p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
2077 p_msg->disc_result.result.disc_res.result = BTA_SUCCESS;
2078 p_msg->disc_result.result.disc_res.p_raw_data = NULL;
2079 p_msg->disc_result.result.disc_res.raw_data_size = 0;
2080 p_msg->disc_result.result.disc_res.num_uuids = num_uuids;
2081 p_msg->disc_result.result.disc_res.p_uuid_list = NULL;
2082 if (num_uuids > 0) {
2083 p_msg->disc_result.result.disc_res.p_uuid_list = (UINT8 *)osi_malloc(num_uuids * MAX_UUID_SIZE);
2084 if (p_msg->disc_result.result.disc_res.p_uuid_list) {
2085 memcpy(p_msg->disc_result.result.disc_res.p_uuid_list, uuid_list,
2086 num_uuids * MAX_UUID_SIZE);
2087 } else {
2088 p_msg->disc_result.result.disc_res.num_uuids = 0;
2089 APPL_TRACE_ERROR("%s: Unable to allocate memory for uuid_list", __func__);
2090 }
2091 }
2092 //copy the raw_data to the discovery result structure
2093 //
2094
2095 if ( bta_dm_search_cb.p_sdp_db != NULL && bta_dm_search_cb.p_sdp_db->raw_used != 0 &&
2096 bta_dm_search_cb.p_sdp_db->raw_data != NULL) {
2097 APPL_TRACE_DEBUG(
2098 "%s raw_data used = 0x%x raw_data_ptr = %p", __func__,
2099 bta_dm_search_cb.p_sdp_db->raw_used,
2100 bta_dm_search_cb.p_sdp_db->raw_data);
2101
2102 p_msg->disc_result.result.disc_res.p_raw_data = osi_malloc(bta_dm_search_cb.p_sdp_db->raw_used);
2103 if ( NULL != p_msg->disc_result.result.disc_res.p_raw_data ) {
2104 memcpy( p_msg->disc_result.result.disc_res.p_raw_data,
2105 bta_dm_search_cb.p_sdp_db->raw_data,
2106 bta_dm_search_cb.p_sdp_db->raw_used );
2107
2108 p_msg->disc_result.result.disc_res.raw_data_size =
2109 bta_dm_search_cb.p_sdp_db->raw_used;
2110
2111 } else {
2112 APPL_TRACE_DEBUG("%s Alloc failed to allocate %d bytes !!", __func__,
2113 bta_dm_search_cb.p_sdp_db->raw_used);
2114 }
2115
2116 bta_dm_search_cb.p_sdp_db->raw_data = NULL; //no need to free this - it is a global assigned.
2117 bta_dm_search_cb.p_sdp_db->raw_used = 0;
2118 bta_dm_search_cb.p_sdp_db->raw_size = 0;
2119 } else {
2120 APPL_TRACE_DEBUG("%s raw data size is 0 or raw_data is null!!", __func__);
2121 }
2122 /* Done with p_sdp_db. Free it */
2123 bta_dm_free_sdp_db(NULL);
2124 p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
2125
2126 //Piggy back the SCN over result field
2127 if ( scn_found ) {
2128 p_msg->disc_result.result.disc_res.result = (3 + bta_dm_search_cb.peer_scn);
2129 p_msg->disc_result.result.disc_res.services |= BTA_USER_SERVICE_MASK;
2130
2131 APPL_TRACE_EVENT(" Piggy back the SCN over result field SCN=%d", bta_dm_search_cb.peer_scn);
2132
2133 }
2134 bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
2135 BCM_STRNCPY_S((char *)p_msg->disc_result.result.disc_res.bd_name, bta_dm_get_remname(), BD_NAME_LEN);
2136 p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN] = '\0';
2137
2138 bta_sys_sendmsg(p_msg);
2139 }
2140 }
2141 } else {
2142 /* conn failed. No need for timer */
2143 if (p_data->sdp_event.sdp_result == SDP_CONN_FAILED || p_data->sdp_event.sdp_result == SDP_CONN_REJECTED
2144 || p_data->sdp_event.sdp_result == SDP_SECURITY_ERR) {
2145 bta_dm_search_cb.wait_disc = FALSE;
2146 }
2147
2148 /* not able to connect go to next device */
2149 osi_free(bta_dm_search_cb.p_sdp_db);
2150 bta_dm_search_cb.p_sdp_db = NULL;
2151
2152 BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
2153
2154 if ((p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG))) != NULL) {
2155 p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
2156 p_msg->disc_result.result.disc_res.result = BTA_FAILURE;
2157 p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
2158 bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
2159 BCM_STRNCPY_S((char *)p_msg->disc_result.result.disc_res.bd_name, bta_dm_get_remname(), BD_NAME_LEN);
2160 p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN] = '\0';
2161
2162 bta_sys_sendmsg(p_msg);
2163 }
2164 }
2165 }
2166 #endif ///SDP_INCLUDE == TRUE
2167
2168 /*******************************************************************************
2169 **
2170 ** Function bta_dm_search_cmpl
2171 **
2172 ** Description Sends event to application
2173 **
2174 ** Returns void
2175 **
2176 *******************************************************************************/
bta_dm_search_cmpl(tBTA_DM_MSG * p_data)2177 void bta_dm_search_cmpl (tBTA_DM_MSG *p_data)
2178 {
2179 APPL_TRACE_EVENT("%s", __func__);
2180
2181 #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE && SDP_INCLUDED == TRUE)
2182 utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
2183 #endif
2184
2185 if (p_data->hdr.layer_specific == BTA_DM_API_DI_DISCOVER_EVT) {
2186 #if (SDP_INCLUDED == TRUE)
2187 bta_dm_di_disc_cmpl(p_data);
2188 #endif ///SDP_INCLUDED == TRUE
2189 } else {
2190 bta_dm_search_cb.p_search_cback(BTA_DM_DISC_CMPL_EVT, NULL);
2191 }
2192 }
2193
2194 /*******************************************************************************
2195 **
2196 ** Function bta_dm_disc_result
2197 **
2198 ** Description Service discovery result when discovering services on a device
2199 **
2200 ** Returns void
2201 **
2202 *******************************************************************************/
bta_dm_disc_result(tBTA_DM_MSG * p_data)2203 void bta_dm_disc_result (tBTA_DM_MSG *p_data)
2204 {
2205 APPL_TRACE_EVENT("%s", __func__);
2206
2207 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
2208 /* if any BR/EDR service discovery has been done, report the event */
2209 if ((bta_dm_search_cb.services & ((BTA_ALL_SERVICE_MASK | BTA_USER_SERVICE_MASK ) & ~BTA_BLE_SERVICE_MASK))) {
2210 bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, &p_data->disc_result.result);
2211 }
2212 #else
2213 bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, &p_data->disc_result.result);
2214 #endif
2215 tBTA_DM_MSG *p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG));
2216
2217 /* send a message to change state */
2218 if (p_msg != NULL) {
2219 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
2220 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
2221 bta_sys_sendmsg(p_msg);
2222 }
2223 }
2224
2225 /*******************************************************************************
2226 **
2227 ** Function bta_dm_search_result
2228 **
2229 ** Description Service discovery result while searching for devices
2230 **
2231 ** Returns void
2232 **
2233 *******************************************************************************/
bta_dm_search_result(tBTA_DM_MSG * p_data)2234 void bta_dm_search_result (tBTA_DM_MSG *p_data)
2235 {
2236 APPL_TRACE_DEBUG("%s searching:0x%04x, result:0x%04x", __func__,
2237 bta_dm_search_cb.services,
2238 p_data->disc_result.result.disc_res.services);
2239
2240 /* call back if application wants name discovery or found services that application is searching */
2241 if (( !bta_dm_search_cb.services )
2242 || (( bta_dm_search_cb.services ) && ( p_data->disc_result.result.disc_res.services ))) {
2243 bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, &p_data->disc_result.result);
2244 }
2245
2246 /* if searching did not initiate to create link */
2247 if (!bta_dm_search_cb.wait_disc ) {
2248 /* if service searching is done with EIR, don't search next device */
2249 if ( bta_dm_search_cb.p_btm_inq_info ) {
2250 bta_dm_discover_next_device();
2251 }
2252 } else {
2253 /* wait until link is disconnected or timeout */
2254 bta_dm_search_cb.sdp_results = TRUE;
2255 bta_dm_search_cb.search_timer.p_cback = (TIMER_CBACK *)&bta_dm_search_timer_cback;
2256 bta_sys_start_timer(&bta_dm_search_cb.search_timer, 0, 1000 * (L2CAP_LINK_INACTIVITY_TOUT + 1) );
2257 }
2258
2259 }
2260
2261 /*******************************************************************************
2262 **
2263 ** Function bta_dm_search_timer_cback
2264 **
2265 ** Description Called when ACL disconnect time is over
2266 **
2267 **
2268 ** Returns void
2269 **
2270 *******************************************************************************/
bta_dm_search_timer_cback(TIMER_LIST_ENT * p_tle)2271 static void bta_dm_search_timer_cback (TIMER_LIST_ENT *p_tle)
2272 {
2273 UNUSED(p_tle);
2274
2275 APPL_TRACE_EVENT("%s", __func__);
2276 bta_dm_search_cb.wait_disc = FALSE;
2277
2278 /* proceed with next device */
2279 bta_dm_discover_next_device();
2280
2281 }
2282
2283
2284 /*******************************************************************************
2285 **
2286 ** Function bta_dm_free_sdp_db
2287 **
2288 ** Description Frees SDP data base
2289 **
2290 ** Returns void
2291 **
2292 *******************************************************************************/
2293 #if (SDP_INCLUDED == TRUE)
bta_dm_free_sdp_db(tBTA_DM_MSG * p_data)2294 void bta_dm_free_sdp_db (tBTA_DM_MSG *p_data)
2295 {
2296 UNUSED(p_data);
2297 if (bta_dm_search_cb.p_sdp_db) {
2298 osi_free(bta_dm_search_cb.p_sdp_db);
2299 bta_dm_search_cb.p_sdp_db = NULL;
2300 }
2301 }
2302 #endif ///SDP_INCLUDED == TRUE
2303
2304 /*******************************************************************************
2305 **
2306 ** Function bta_dm_queue_search
2307 **
2308 ** Description Queues search command while search is being cancelled
2309 **
2310 ** Returns void
2311 **
2312 *******************************************************************************/
bta_dm_queue_search(tBTA_DM_MSG * p_data)2313 void bta_dm_queue_search (tBTA_DM_MSG *p_data)
2314 {
2315 if (bta_dm_search_cb.p_search_queue) {
2316 osi_free(bta_dm_search_cb.p_search_queue);
2317 }
2318
2319 bta_dm_search_cb.p_search_queue = (tBTA_DM_MSG *)osi_malloc(sizeof(tBTA_DM_API_SEARCH));
2320 memcpy(bta_dm_search_cb.p_search_queue, p_data, sizeof(tBTA_DM_API_SEARCH));
2321
2322 }
2323
2324 /*******************************************************************************
2325 **
2326 ** Function bta_dm_queue_disc
2327 **
2328 ** Description Queues discovery command while search is being cancelled
2329 **
2330 ** Returns void
2331 **
2332 *******************************************************************************/
2333 #if (SDP_INCLUDED == TRUE)
bta_dm_queue_disc(tBTA_DM_MSG * p_data)2334 void bta_dm_queue_disc (tBTA_DM_MSG *p_data)
2335 {
2336 if (bta_dm_search_cb.p_search_queue) {
2337 osi_free(bta_dm_search_cb.p_search_queue);
2338 }
2339
2340 bta_dm_search_cb.p_search_queue = (tBTA_DM_MSG *)osi_malloc(sizeof(tBTA_DM_API_DISCOVER));
2341 memcpy(bta_dm_search_cb.p_search_queue, p_data, sizeof(tBTA_DM_API_DISCOVER));
2342 }
2343 #endif ///SDP_INCLUDED == TRUE
2344
2345 /*******************************************************************************
2346 **
2347 ** Function bta_dm_search_clear_queue
2348 **
2349 ** Description Clears the queue if API search cancel is called
2350 **
2351 ** Returns void
2352 **
2353 *******************************************************************************/
bta_dm_search_clear_queue(tBTA_DM_MSG * p_data)2354 void bta_dm_search_clear_queue (tBTA_DM_MSG *p_data)
2355 {
2356 UNUSED(p_data);
2357 if (bta_dm_search_cb.p_search_queue) {
2358 osi_free(bta_dm_search_cb.p_search_queue);
2359 bta_dm_search_cb.p_search_queue = NULL;
2360 }
2361 }
2362
2363 /*******************************************************************************
2364 **
2365 ** Function bta_dm_search_cancel_cmpl
2366 **
2367 ** Description Search cancel is complete
2368 **
2369 ** Returns void
2370 **
2371 *******************************************************************************/
bta_dm_search_cancel_cmpl(tBTA_DM_MSG * p_data)2372 void bta_dm_search_cancel_cmpl (tBTA_DM_MSG *p_data)
2373 {
2374 UNUSED(p_data);
2375 if (bta_dm_search_cb.p_search_queue) {
2376 bta_sys_sendmsg(bta_dm_search_cb.p_search_queue);
2377 bta_dm_search_cb.p_search_queue = NULL;
2378 }
2379
2380 }
2381
2382 /*******************************************************************************
2383 **
2384 ** Function bta_dm_search_cancel_transac_cmpl
2385 **
2386 ** Description Current Service Discovery or remote name procedure is
2387 ** completed after search cancellation
2388 **
2389 ** Returns void
2390 **
2391 *******************************************************************************/
2392 #if (SDP_INCLUDED == TRUE)
bta_dm_search_cancel_transac_cmpl(tBTA_DM_MSG * p_data)2393 void bta_dm_search_cancel_transac_cmpl(tBTA_DM_MSG *p_data)
2394 {
2395 UNUSED(p_data);
2396 if (bta_dm_search_cb.p_sdp_db) {
2397 osi_free(bta_dm_search_cb.p_sdp_db);
2398 bta_dm_search_cb.p_sdp_db = NULL;
2399 }
2400
2401 bta_dm_search_cancel_notify(NULL);
2402 }
2403 #endif ///SDP_INCLUDED == TRUE
2404
2405
2406 /*******************************************************************************
2407 **
2408 ** Function bta_dm_search_cancel_notify
2409 **
2410 ** Description Notify application that search has been cancelled
2411 **
2412 ** Returns void
2413 **
2414 *******************************************************************************/
bta_dm_search_cancel_notify(tBTA_DM_MSG * p_data)2415 void bta_dm_search_cancel_notify (tBTA_DM_MSG *p_data)
2416 {
2417 UNUSED(p_data);
2418 if (bta_dm_search_cb.p_search_cback) {
2419 bta_dm_search_cb.p_search_cback(BTA_DM_SEARCH_CANCEL_CMPL_EVT, NULL);
2420 }
2421 if (!bta_dm_search_cb.name_discover_done) {
2422 BTM_CancelRemoteDeviceName();
2423 }
2424 #if (BLE_INCLUDED == TRUE) && (BTA_GATT_INCLUDED == TRUE) && (SDP_INCLUDED == TRUE) && (GATTC_INCLUDED) == TRUE
2425 if (bta_dm_search_cb.gatt_disc_active) {
2426 bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
2427 }
2428 #endif
2429
2430 }
2431
2432 /*******************************************************************************
2433 **
2434 ** Function bta_dm_find_services
2435 **
2436 ** Description Starts discovery on a device
2437 **
2438 ** Returns void
2439 **
2440 *******************************************************************************/
2441 #if (SDP_INCLUDED == TRUE)
bta_dm_find_services(BD_ADDR bd_addr)2442 static void bta_dm_find_services ( BD_ADDR bd_addr)
2443 {
2444 tSDP_UUID uuid;
2445 tBTA_DM_MSG *p_msg;
2446
2447 memset (&uuid, 0, sizeof(tSDP_UUID));
2448
2449 while (bta_dm_search_cb.service_index < BTA_MAX_SERVICE_ID) {
2450 tBTA_SERVICE_MASK this_service_mask = (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index));
2451 if ( bta_dm_search_cb.services_to_search & this_service_mask) {
2452 if ((bta_dm_search_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)osi_malloc(BTA_DM_SDP_DB_SIZE)) != NULL) {
2453 APPL_TRACE_DEBUG("bta_dm_search_cb.services = %04x***********", bta_dm_search_cb.services);
2454 /* try to search all services by search based on L2CAP UUID */
2455 if (bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK ) {
2456 APPL_TRACE_DEBUG("%s services_to_search=%08x", __func__, bta_dm_search_cb.services_to_search);
2457 if (bta_dm_search_cb.services_to_search & BTA_RES_SERVICE_MASK) {
2458 uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[0];
2459 bta_dm_search_cb.services_to_search &= ~BTA_RES_SERVICE_MASK;
2460 } else {
2461 uuid.uu.uuid16 = UUID_PROTOCOL_L2CAP;
2462 bta_dm_search_cb.services_to_search = 0;
2463 }
2464 } else {
2465 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
2466 /* for LE only profile */
2467 if (this_service_mask == BTA_BLE_SERVICE_MASK) {
2468 if (bta_dm_search_cb.uuid_to_search > 0 && bta_dm_search_cb.p_srvc_uuid) {
2469 memcpy(&uuid,
2470 (const void *)(bta_dm_search_cb.p_srvc_uuid + \
2471 bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search),
2472 sizeof(tBT_UUID));
2473
2474 bta_dm_search_cb.uuid_to_search -- ;
2475 } else {
2476 uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index];
2477 }
2478
2479 /* last one? clear the BLE service bit if all discovery has been done */
2480 if (bta_dm_search_cb.uuid_to_search == 0) {
2481 bta_dm_search_cb.services_to_search &=
2482 (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index)));
2483 }
2484
2485 } else
2486 #endif
2487 {
2488 /* remove the service from services to be searched */
2489 bta_dm_search_cb.services_to_search &=
2490 (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index)));
2491 uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index];
2492 }
2493 }
2494
2495 if (uuid.len == 0) {
2496 uuid.len = LEN_UUID_16;
2497 }
2498
2499 if (this_service_mask == BTA_USER_SERVICE_MASK) {
2500 memcpy(&uuid, &bta_dm_search_cb.uuid, sizeof(tSDP_UUID));
2501 }
2502
2503 APPL_TRACE_DEBUG("%s search UUID = %04x", __func__, uuid.uu.uuid16);
2504 SDP_InitDiscoveryDb (bta_dm_search_cb.p_sdp_db, BTA_DM_SDP_DB_SIZE, 1, &uuid, 0, NULL);
2505
2506 memset(g_disc_raw_data_buf, 0, MAX_DISC_RAW_DATA_BUF);
2507 bta_dm_search_cb.p_sdp_db->raw_data = g_disc_raw_data_buf;
2508
2509 bta_dm_search_cb.p_sdp_db->raw_size = MAX_DISC_RAW_DATA_BUF;
2510
2511 if (!SDP_ServiceSearchAttributeRequest (bd_addr, bta_dm_search_cb.p_sdp_db, &bta_dm_sdp_callback)) {
2512 /* if discovery not successful with this device
2513 proceed to next one */
2514 osi_free(bta_dm_search_cb.p_sdp_db);
2515 bta_dm_search_cb.p_sdp_db = NULL;
2516 bta_dm_search_cb.service_index = BTA_MAX_SERVICE_ID;
2517
2518 } else {
2519 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
2520 if ((this_service_mask == BTA_BLE_SERVICE_MASK &&
2521 bta_dm_search_cb.uuid_to_search == 0) ||
2522 this_service_mask != BTA_BLE_SERVICE_MASK)
2523 #endif
2524 bta_dm_search_cb.service_index++;
2525 return;
2526 }
2527 } else {
2528 APPL_TRACE_ERROR("#### Failed to allocate SDP DB buffer! ####");
2529 }
2530 }
2531
2532 bta_dm_search_cb.service_index++;
2533 }
2534
2535 /* no more services to be discovered */
2536 if (bta_dm_search_cb.service_index >= BTA_MAX_SERVICE_ID) {
2537 if ((p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG))) != NULL) {
2538 p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
2539 p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
2540 bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
2541 BCM_STRNCPY_S((char *)p_msg->disc_result.result.disc_res.bd_name,bta_dm_get_remname(), BD_NAME_LEN);
2542 p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN] = '\0';
2543
2544 bta_sys_sendmsg(p_msg);
2545 }
2546 }
2547 }
2548 #endif ///SDP_INCLUDED == TRUE
2549
2550 /*******************************************************************************
2551 **
2552 ** Function bta_dm_discover_next_device
2553 **
2554 ** Description Starts discovery on the next device in Inquiry data base
2555 **
2556 ** Returns void
2557 **
2558 *******************************************************************************/
bta_dm_discover_next_device(void)2559 static void bta_dm_discover_next_device(void)
2560 {
2561
2562 tBTA_DM_MSG *p_msg;
2563
2564 APPL_TRACE_DEBUG("bta_dm_discover_next_device");
2565
2566 /* searching next device on inquiry result */
2567 if ((bta_dm_search_cb.p_btm_inq_info = BTM_InqDbNext(bta_dm_search_cb.p_btm_inq_info)) != NULL) {
2568 bta_dm_search_cb.name_discover_done = FALSE;
2569 bta_dm_search_cb.peer_name[0] = 0;
2570 #if (SDP_INCLUDED == TRUE)
2571 bta_dm_discover_device(bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr);
2572 #endif ///SDP_INCLUDED == TRUE
2573 } else {
2574 /* no devices, search complete */
2575 bta_dm_search_cb.services = 0;
2576
2577 if ((p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG))) != NULL) {
2578 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
2579 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
2580 bta_sys_sendmsg(p_msg);
2581 }
2582 }
2583 }
2584
2585 /*******************************************************************************
2586 **
2587 ** Function bta_dm_discover_device
2588 **
2589 ** Description Starts name and service discovery on the device
2590 **
2591 ** Returns void
2592 **
2593 *******************************************************************************/
2594 #if (SDP_INCLUDED == TRUE)
bta_dm_discover_device(BD_ADDR remote_bd_addr)2595 static void bta_dm_discover_device(BD_ADDR remote_bd_addr)
2596 {
2597 tBTA_DM_MSG *p_msg;
2598 tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
2599
2600 #if BLE_INCLUDED == TRUE
2601 if (bta_dm_search_cb.transport == BTA_TRANSPORT_UNKNOWN) {
2602 tBT_DEVICE_TYPE dev_type;
2603 tBLE_ADDR_TYPE addr_type;
2604
2605 BTM_ReadDevInfo(remote_bd_addr, &dev_type, &addr_type);
2606 if (dev_type == BT_DEVICE_TYPE_BLE || addr_type == BLE_ADDR_RANDOM) {
2607 transport = BT_TRANSPORT_LE;
2608 }
2609 } else {
2610 transport = bta_dm_search_cb.transport;
2611 }
2612 #endif
2613
2614 /* Reset transport state for next discovery */
2615 bta_dm_search_cb.transport = BTA_TRANSPORT_UNKNOWN;
2616
2617 APPL_TRACE_DEBUG("%s BDA:0x%02X%02X%02X%02X%02X%02X", __func__,
2618 remote_bd_addr[0], remote_bd_addr[1],
2619 remote_bd_addr[2], remote_bd_addr[3],
2620 remote_bd_addr[4], remote_bd_addr[5]);
2621
2622 bdcpy(bta_dm_search_cb.peer_bdaddr, remote_bd_addr);
2623
2624 APPL_TRACE_DEBUG("%s name_discover_done = %d p_btm_inq_info %p state = %d, transport=%d",
2625 __func__,
2626 bta_dm_search_cb.name_discover_done,
2627 bta_dm_search_cb.p_btm_inq_info,
2628 bta_dm_search_cb.state,
2629 transport);
2630
2631 if (bta_dm_search_cb.p_btm_inq_info) {
2632 APPL_TRACE_DEBUG("%s appl_knows_rem_name %d", __func__,
2633 bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name);
2634 }
2635
2636 if ((bta_dm_search_cb.p_btm_inq_info)
2637 && (bta_dm_search_cb.p_btm_inq_info->results.device_type == BT_DEVICE_TYPE_BLE)
2638 && (bta_dm_search_cb.state == BTA_DM_SEARCH_ACTIVE)) {
2639 /* Do not perform RNR for LE devices at inquiry complete*/
2640 bta_dm_search_cb.name_discover_done = TRUE;
2641 }
2642
2643 /* if name discovery is not done and application needs remote name */
2644 if ((!bta_dm_search_cb.name_discover_done)
2645 && (( bta_dm_search_cb.p_btm_inq_info == NULL )
2646 || (bta_dm_search_cb.p_btm_inq_info && (!bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name)))) {
2647 if (bta_dm_read_remote_device_name(bta_dm_search_cb.peer_bdaddr, transport) == TRUE) {
2648 return;
2649 }
2650
2651 /* starting name discovery failed */
2652 bta_dm_search_cb.name_discover_done = TRUE;
2653 }
2654
2655 /* if application wants to discover service */
2656 if ( bta_dm_search_cb.services ) {
2657 /* initialize variables */
2658 bta_dm_search_cb.service_index = 0;
2659 bta_dm_search_cb.services_found = 0;
2660 bta_dm_search_cb.services_to_search = bta_dm_search_cb.services;
2661 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE && SDP_INCLUDED == TRUE
2662 bta_dm_search_cb.uuid_to_search = bta_dm_search_cb.num_uuid;
2663 #endif
2664 if ((bta_dm_search_cb.p_btm_inq_info != NULL) &&
2665 bta_dm_search_cb.services != BTA_USER_SERVICE_MASK
2666 && (bta_dm_search_cb.sdp_search == FALSE)) {
2667 /* check if EIR provides the information of supported services */
2668 bta_dm_eir_search_services( &bta_dm_search_cb.p_btm_inq_info->results,
2669 &bta_dm_search_cb.services_to_search,
2670 &bta_dm_search_cb.services_found );
2671 }
2672
2673 /* if searching with EIR is not completed */
2674 if (bta_dm_search_cb.services_to_search) {
2675 /* check whether connection already exists to the device
2676 if connection exists, we don't have to wait for ACL
2677 link to go down to start search on next device */
2678 if (BTM_IsAclConnectionUp(bta_dm_search_cb.peer_bdaddr, BT_TRANSPORT_BR_EDR)) {
2679 bta_dm_search_cb.wait_disc = FALSE;
2680 } else {
2681 bta_dm_search_cb.wait_disc = TRUE;
2682 }
2683
2684 #if (BLE_INCLUDED == TRUE && (defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE) && SDP_INCLUDED == TRUE) && (GATTC_INCLUDED == TRUE)
2685 if ( bta_dm_search_cb.p_btm_inq_info ) {
2686 APPL_TRACE_DEBUG("%s p_btm_inq_info %p results.device_type 0x%x services_to_search 0x%x",
2687 __func__,
2688 bta_dm_search_cb.p_btm_inq_info,
2689 bta_dm_search_cb.p_btm_inq_info->results.device_type,
2690 bta_dm_search_cb.services_to_search);
2691 }
2692
2693 if (transport == BT_TRANSPORT_LE) {
2694 if (bta_dm_search_cb.services_to_search & BTA_BLE_SERVICE_MASK) {
2695 //set the raw data buffer here
2696 memset(g_disc_raw_data_buf, 0, MAX_DISC_RAW_DATA_BUF);
2697 bta_dm_search_cb.p_ble_rawdata = g_disc_raw_data_buf;
2698
2699 bta_dm_search_cb.ble_raw_size = MAX_DISC_RAW_DATA_BUF;
2700 bta_dm_search_cb.ble_raw_used = 0;
2701
2702 /* start GATT for service discovery */
2703 btm_dm_start_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
2704 return;
2705 }
2706 } else
2707 #endif
2708 {
2709 bta_dm_search_cb.sdp_results = FALSE;
2710 bta_dm_find_services(bta_dm_search_cb.peer_bdaddr);
2711 return;
2712 }
2713 }
2714 }
2715
2716 /* name discovery and service discovery are done for this device */
2717 if ((p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG))) != NULL) {
2718 p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
2719 /* initialize the data structure - includes p_raw_data and raw_data_size */
2720 memset(&(p_msg->disc_result.result), 0, sizeof(tBTA_DM_DISC_RES));
2721 p_msg->disc_result.result.disc_res.result = BTA_SUCCESS;
2722 p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
2723 bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
2724 BCM_STRNCPY_S((char *)p_msg->disc_result.result.disc_res.bd_name, bta_dm_get_remname(), BD_NAME_LEN);
2725 p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN] = '\0';
2726
2727 bta_sys_sendmsg(p_msg);
2728 }
2729 }
2730
2731 /*******************************************************************************
2732 **
2733 ** Function bta_dm_sdp_callback
2734 **
2735 ** Description Callback from sdp with discovery status
2736 **
2737 ** Returns void
2738 **
2739 *******************************************************************************/
bta_dm_sdp_callback(UINT16 sdp_status)2740 static void bta_dm_sdp_callback (UINT16 sdp_status)
2741 {
2742
2743 tBTA_DM_SDP_RESULT *p_msg;
2744
2745 if ((p_msg = (tBTA_DM_SDP_RESULT *) osi_malloc(sizeof(tBTA_DM_SDP_RESULT))) != NULL) {
2746 p_msg->hdr.event = BTA_DM_SDP_RESULT_EVT;
2747 p_msg->sdp_result = sdp_status;
2748 bta_sys_sendmsg(p_msg);
2749
2750 }
2751 }
2752 #endif ///SDP_INCLUDED == TRUE
2753 /*******************************************************************************
2754 **
2755 ** Function bta_dm_inq_results_cb
2756 **
2757 ** Description Inquiry results callback from BTM
2758 **
2759 ** Returns void
2760 **
2761 *******************************************************************************/
bta_dm_inq_results_cb(tBTM_INQ_RESULTS * p_inq,UINT8 * p_eir)2762 static void bta_dm_inq_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir)
2763 {
2764
2765 tBTA_DM_SEARCH result;
2766 tBTM_INQ_INFO *p_inq_info;
2767 UINT16 service_class;
2768
2769 bdcpy(result.inq_res.bd_addr, p_inq->remote_bd_addr);
2770 memcpy(result.inq_res.dev_class, p_inq->dev_class, DEV_CLASS_LEN);
2771 BTM_COD_SERVICE_CLASS(service_class, p_inq->dev_class);
2772 result.inq_res.is_limited = (service_class & BTM_COD_SERVICE_LMTD_DISCOVER) ? TRUE : FALSE;
2773 result.inq_res.rssi = p_inq->rssi;
2774
2775 #if (BLE_INCLUDED == TRUE)
2776 result.inq_res.ble_addr_type = p_inq->ble_addr_type;
2777 result.inq_res.inq_result_type = p_inq->inq_result_type;
2778 result.inq_res.device_type = p_inq->device_type;
2779 result.inq_res.flag = p_inq->flag;
2780 #endif
2781
2782 /* application will parse EIR to find out remote device name */
2783 result.inq_res.p_eir = p_eir;
2784
2785 if ((p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr)) != NULL) {
2786 /* initialize remt_name_not_required to FALSE so that we get the name by default */
2787 result.inq_res.remt_name_not_required = FALSE;
2788
2789 }
2790
2791 if (bta_dm_search_cb.p_search_cback) {
2792 bta_dm_search_cb.p_search_cback(BTA_DM_INQ_RES_EVT, &result);
2793 }
2794
2795 if (p_inq_info) {
2796 /* application indicates if it knows the remote name, inside the callback
2797 copy that to the inquiry data base*/
2798 if (result.inq_res.remt_name_not_required) {
2799 p_inq_info->appl_knows_rem_name = TRUE;
2800 }
2801
2802 }
2803
2804
2805 }
2806
2807
2808 /*******************************************************************************
2809 **
2810 ** Function bta_dm_inq_cmpl_cb
2811 **
2812 ** Description Inquiry complete callback from BTM
2813 **
2814 ** Returns void
2815 **
2816 *******************************************************************************/
bta_dm_inq_cmpl_cb(void * p_result)2817 static void bta_dm_inq_cmpl_cb (void *p_result)
2818 {
2819 tBTA_DM_MSG *p_msg;
2820
2821 if (bta_dm_search_cb.cancel_pending == FALSE) {
2822 APPL_TRACE_DEBUG("%s", __FUNCTION__);
2823 p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG));
2824 if (p_msg != NULL) {
2825 p_msg->inq_cmpl.hdr.event = BTA_DM_INQUIRY_CMPL_EVT;
2826 p_msg->inq_cmpl.num = ((tBTM_INQUIRY_CMPL *)p_result)->num_resp;
2827 bta_sys_sendmsg(p_msg);
2828 }
2829 } else {
2830 bta_dm_search_cb.cancel_pending = FALSE;
2831 bta_dm_search_cancel_notify(NULL);
2832
2833 p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG));
2834 if (p_msg != NULL) {
2835 p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
2836 p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
2837 bta_sys_sendmsg(p_msg);
2838 }
2839 }
2840 }
2841
2842 /*******************************************************************************
2843 **
2844 ** Function bta_dm_service_search_remname_cback
2845 **
2846 ** Description Remote name call back from BTM during service discovery
2847 **
2848 ** Returns void
2849 **
2850 *******************************************************************************/
bta_dm_service_search_remname_cback(BD_ADDR bd_addr,DEV_CLASS dc,BD_NAME bd_name)2851 static void bta_dm_service_search_remname_cback (BD_ADDR bd_addr, DEV_CLASS dc, BD_NAME bd_name)
2852 {
2853 tBTM_REMOTE_DEV_NAME rem_name;
2854 tBTM_STATUS btm_status;
2855 UNUSED(dc);
2856
2857 APPL_TRACE_DEBUG("bta_dm_service_search_remname_cback name=<%s>", bd_name);
2858
2859 /* if this is what we are looking for */
2860 if (!bdcmp( bta_dm_search_cb.peer_bdaddr, bd_addr)) {
2861 rem_name.length = strlen((char *)bd_name);
2862 if (rem_name.length > BD_NAME_LEN) {
2863 rem_name.length = BD_NAME_LEN;
2864 }
2865 BCM_STRNCPY_S((char *)rem_name.remote_bd_name, (char *)bd_name, BD_NAME_LEN);
2866 rem_name.remote_bd_name[BD_NAME_LEN] = '\0';
2867 rem_name.status = BTM_SUCCESS;
2868
2869 bta_dm_remname_cback(&rem_name);
2870 } else {
2871 /* get name of device */
2872 btm_status = BTM_ReadRemoteDeviceName (bta_dm_search_cb.peer_bdaddr,
2873 (tBTM_CMPL_CB *) bta_dm_remname_cback,
2874 BT_TRANSPORT_BR_EDR);
2875 if ( btm_status == BTM_BUSY ) {
2876 /* wait for next chance(notification of remote name discovery done) */
2877 APPL_TRACE_DEBUG("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName is busy");
2878 } else if ( btm_status != BTM_CMD_STARTED ) {
2879 /* if failed to start getting remote name then continue */
2880 APPL_TRACE_WARNING("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName returns 0x%02X", btm_status);
2881
2882 rem_name.length = 0;
2883 rem_name.remote_bd_name[0] = '\0';
2884 rem_name.status = btm_status;
2885 bta_dm_remname_cback(&rem_name);
2886 }
2887 }
2888 }
2889
2890
2891 /*******************************************************************************
2892 **
2893 ** Function bta_dm_remname_cback
2894 **
2895 ** Description Remote name complete call back from BTM
2896 **
2897 ** Returns void
2898 **
2899 *******************************************************************************/
bta_dm_remname_cback(tBTM_REMOTE_DEV_NAME * p_remote_name)2900 static void bta_dm_remname_cback (tBTM_REMOTE_DEV_NAME *p_remote_name)
2901 {
2902 tBTA_DM_REM_NAME *p_msg;
2903
2904 APPL_TRACE_DEBUG("bta_dm_remname_cback len = %d name=<%s>", p_remote_name->length,
2905 p_remote_name->remote_bd_name);
2906 /* remote name discovery is done but it could be failed */
2907 bta_dm_search_cb.name_discover_done = TRUE;
2908 BCM_STRNCPY_S((char *)bta_dm_search_cb.peer_name, (char *)p_remote_name->remote_bd_name, BD_NAME_LEN);
2909 bta_dm_search_cb.peer_name[BD_NAME_LEN] = '\0';
2910
2911 BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
2912
2913 #if BLE_INCLUDED == TRUE && GATTS_INCLUDED == TRUE
2914 if (bta_dm_search_cb.transport == BT_TRANSPORT_LE ) {
2915 GAP_BleReadPeerPrefConnParams (bta_dm_search_cb.peer_bdaddr);
2916 }
2917 #endif
2918
2919 if ((p_msg = (tBTA_DM_REM_NAME *) osi_malloc(sizeof(tBTA_DM_REM_NAME))) != NULL) {
2920 bdcpy (p_msg->result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
2921 BCM_STRNCPY_S((char *)p_msg->result.disc_res.bd_name, (char *)p_remote_name->remote_bd_name, BD_NAME_LEN);
2922 p_msg->result.disc_res.bd_name[BD_NAME_LEN] = '\0';
2923
2924 p_msg->hdr.event = BTA_DM_REMT_NAME_EVT;
2925 bta_sys_sendmsg(p_msg);
2926 }
2927 }
2928
2929 /*******************************************************************************
2930 **
2931 ** Function bta_dm_authorize_cback
2932 **
2933 ** Description cback requesting authorization
2934 **
2935 ** Returns void
2936 **
2937 *******************************************************************************/
2938 #if (SMP_INCLUDED == TRUE)
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)2939 static UINT8 bta_dm_authorize_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name,
2940 UINT8 *service_name, UINT8 service_id, BOOLEAN is_originator)
2941 {
2942 tBTA_DM_SEC sec_event;
2943 UINT8 index = 1;
2944 UNUSED(service_name);
2945 UNUSED(is_originator);
2946
2947 bdcpy(sec_event.authorize.bd_addr, bd_addr);
2948 memcpy(sec_event.authorize.dev_class, dev_class, DEV_CLASS_LEN);
2949
2950 BCM_STRNCPY_S((char *)sec_event.authorize.bd_name, (char *)bd_name, BD_NAME_LEN);
2951 sec_event.authorize.bd_name[BD_NAME_LEN] = '\0';
2952
2953 #if ( defined(BTA_JV_INCLUDED) && BTA_JV_INCLUDED == TRUE )
2954 sec_event.authorize.service = service_id;
2955 #endif
2956
2957 while (index < BTA_MAX_SERVICE_ID) {
2958 /* get the BTA service id corresponding to BTM id */
2959 if (bta_service_id_to_btm_srv_id_lkup_tbl[index] == service_id) {
2960 sec_event.authorize.service = index;
2961 break;
2962 }
2963 index++;
2964 }
2965
2966
2967 /* if supported service callback otherwise not authorized */
2968 if (bta_dm_cb.p_sec_cback && (index < BTA_MAX_SERVICE_ID
2969 #if ( defined(BTA_JV_INCLUDED) && BTA_JV_INCLUDED == TRUE )
2970 /* pass through JV service ID */
2971 || (service_id >= BTA_FIRST_JV_SERVICE_ID && service_id <= BTA_LAST_JV_SERVICE_ID)
2972 #endif
2973 )) {
2974 bta_dm_cb.p_sec_cback(BTA_DM_AUTHORIZE_EVT, &sec_event);
2975 return BTM_CMD_STARTED;
2976 } else {
2977 return BTM_NOT_AUTHORIZED;
2978 }
2979 }
2980
2981
2982 #if (CLASSIC_BT_INCLUDED == TRUE)
2983 #if (BT_SSP_INCLUDED == TRUE)
2984 /*******************************************************************************
2985 **
2986 ** Function bta_dm_pinname_cback
2987 **
2988 ** Description Callback requesting pin_key
2989 **
2990 ** Returns void
2991 **
2992 *******************************************************************************/
bta_dm_pinname_cback(void * p_data)2993 static void bta_dm_pinname_cback (void *p_data)
2994 {
2995 tBTM_REMOTE_DEV_NAME *p_result = (tBTM_REMOTE_DEV_NAME *)p_data;
2996 tBTA_DM_SEC sec_event;
2997 tBTA_DM_SEC_EVT event = bta_dm_cb.pin_evt;
2998
2999 if (BTA_DM_SP_CFM_REQ_EVT == event) {
3000 /* Retrieved saved device class and bd_addr */
3001 bdcpy(sec_event.cfm_req.bd_addr, bta_dm_cb.pin_bd_addr);
3002 BTA_COPY_DEVICE_CLASS(sec_event.cfm_req.dev_class, bta_dm_cb.pin_dev_class);
3003
3004 if (p_result && p_result->status == BTM_SUCCESS) {
3005 BCM_STRNCPY_S((char *)sec_event.cfm_req.bd_name, (char *)p_result->remote_bd_name, BD_NAME_LEN);
3006 sec_event.cfm_req.bd_name[BD_NAME_LEN] = '\0';
3007 } else { /* No name found */
3008 sec_event.cfm_req.bd_name[0] = '\0';
3009 }
3010
3011 sec_event.cfm_req.num_val = bta_dm_cb.num_val; /* get PIN code numeric number */
3012
3013 /* 1 additional event data fields for this event */
3014 sec_event.cfm_req.just_works = bta_dm_cb.just_works;
3015 } else {
3016 /* Retrieved saved device class and bd_addr */
3017 bdcpy(sec_event.pin_req.bd_addr, bta_dm_cb.pin_bd_addr);
3018 BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, bta_dm_cb.pin_dev_class);
3019
3020 if (p_result && p_result->status == BTM_SUCCESS) {
3021 BCM_STRNCPY_S((char *)sec_event.pin_req.bd_name, (char *)p_result->remote_bd_name, BD_NAME_LEN);
3022 sec_event.pin_req.bd_name[BD_NAME_LEN] = '\0';
3023 } else { /* No name found */
3024 sec_event.pin_req.bd_name[0] = '\0';
3025 }
3026
3027 event = bta_dm_cb.pin_evt;
3028 sec_event.key_notif.passkey = bta_dm_cb.num_val; /* get PIN code numeric number */
3029 }
3030
3031 if ( bta_dm_cb.p_sec_cback ) {
3032 bta_dm_cb.p_sec_cback(event, &sec_event);
3033 }
3034 }
3035 #endif /// BT_SSP_INCLUDED == TRUE
3036
3037 /*******************************************************************************
3038 **
3039 ** Function bta_dm_pin_cback
3040 **
3041 ** Description Callback requesting pin_key
3042 **
3043 ** Returns void
3044 **
3045 *******************************************************************************/
bta_dm_pin_cback(BD_ADDR bd_addr,DEV_CLASS dev_class,BD_NAME bd_name,BOOLEAN min_16_digit)3046 static UINT8 bta_dm_pin_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name,
3047 BOOLEAN min_16_digit)
3048 {
3049 tBTA_DM_SEC sec_event;
3050
3051 if (!bta_dm_cb.p_sec_cback) {
3052 return BTM_NOT_AUTHORIZED;
3053 }
3054
3055 bdcpy(sec_event.pin_req.bd_addr, bd_addr);
3056 BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, dev_class);
3057 BCM_STRNCPY_S((char *)sec_event.pin_req.bd_name, (char *)bd_name, BD_NAME_LEN);
3058 sec_event.pin_req.bd_name[BD_NAME_LEN] = '\0';
3059 sec_event.pin_req.min_16_digit = min_16_digit;
3060
3061 bta_dm_cb.p_sec_cback(BTA_DM_PIN_REQ_EVT, &sec_event);
3062 return BTM_CMD_STARTED;
3063 }
3064 #endif ///CLASSIC_BT_INCLUDED == TRUE
3065
3066 /*******************************************************************************
3067 **
3068 ** Function bta_dm_new_link_key_cback
3069 **
3070 ** Description Callback from BTM to notify new link key
3071 **
3072 ** Returns void
3073 **
3074 *******************************************************************************/
bta_dm_new_link_key_cback(BD_ADDR bd_addr,DEV_CLASS dev_class,BD_NAME bd_name,LINK_KEY key,UINT8 key_type,BOOLEAN sc_support)3075 static UINT8 bta_dm_new_link_key_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,
3076 BD_NAME bd_name, LINK_KEY key, UINT8 key_type,
3077 BOOLEAN sc_support)
3078 {
3079 tBTA_DM_SEC sec_event;
3080 tBTA_DM_AUTH_CMPL *p_auth_cmpl;
3081 UINT8 event;
3082 UNUSED(dev_class);
3083
3084 memset (&sec_event, 0, sizeof(tBTA_DM_SEC));
3085
3086 /* Not AMP Key type */
3087 if (key_type != HCI_LKEY_TYPE_AMP_WIFI && key_type != HCI_LKEY_TYPE_AMP_UWB) {
3088 event = BTA_DM_AUTH_CMPL_EVT;
3089 p_auth_cmpl = &sec_event.auth_cmpl;
3090
3091 bdcpy(p_auth_cmpl->bd_addr, bd_addr);
3092
3093 memcpy(p_auth_cmpl->bd_name, bd_name, (BD_NAME_LEN - 1));
3094 p_auth_cmpl->bd_name[BD_NAME_LEN - 1] = 0;
3095
3096 p_auth_cmpl->key_present = TRUE;
3097 p_auth_cmpl->key_type = key_type;
3098 p_auth_cmpl->success = TRUE;
3099 p_auth_cmpl->sc_support = sc_support;
3100
3101 memcpy(p_auth_cmpl->key, key, LINK_KEY_LEN);
3102 sec_event.auth_cmpl.fail_reason = HCI_SUCCESS;
3103
3104 #if BLE_INCLUDED == TRUE
3105 // Report the BR link key based on the BR/EDR address and type
3106 BTM_ReadDevInfo(bd_addr, &sec_event.auth_cmpl.dev_type, &sec_event.auth_cmpl.addr_type);
3107 #endif
3108 if (bta_dm_cb.p_sec_cback) {
3109 bta_dm_cb.p_sec_cback(event, &sec_event);
3110 }
3111 } else {
3112 APPL_TRACE_WARNING("%s() Received AMP Key", __func__);
3113 }
3114
3115 return BTM_CMD_STARTED;
3116 }
3117
3118
3119 /*******************************************************************************
3120 **
3121 ** Function bta_dm_authentication_complete_cback
3122 **
3123 ** Description Authentication complete callback from BTM
3124 **
3125 ** Returns void
3126 **
3127 *******************************************************************************/
bta_dm_authentication_complete_cback(BD_ADDR bd_addr,DEV_CLASS dev_class,BD_NAME bd_name,int result)3128 static UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, int result)
3129 {
3130 tBTA_DM_SEC sec_event;
3131 UNUSED(dev_class);
3132
3133 if (result != BTM_SUCCESS) {
3134 memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
3135 bdcpy(sec_event.auth_cmpl.bd_addr, bd_addr);
3136
3137 memcpy(sec_event.auth_cmpl.bd_name, bd_name, (BD_NAME_LEN - 1));
3138 sec_event.auth_cmpl.bd_name[BD_NAME_LEN - 1] = 0;
3139
3140 #if BLE_INCLUDED == TRUE
3141 // Report the BR link key based on the BR/EDR address and type
3142 BTM_ReadDevInfo(bd_addr, &sec_event.auth_cmpl.dev_type, &sec_event.auth_cmpl.addr_type);
3143 #endif
3144 sec_event.auth_cmpl.fail_reason = (UINT8)result;
3145
3146 if (bta_dm_cb.p_sec_cback) {
3147 bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
3148 }
3149
3150 if (bta_dm_remove_sec_dev_entry(bd_addr)) {
3151 return BTM_SEC_DEV_REC_REMOVED;
3152 }
3153 }
3154
3155 return BTM_SUCCESS;
3156 }
3157
3158 #if (BT_SSP_INCLUDED == TRUE)
3159 /*******************************************************************************
3160 **
3161 ** Function bta_dm_sp_cback
3162 **
3163 ** Description simple pairing callback from BTM
3164 **
3165 ** Returns void
3166 **
3167 *******************************************************************************/
bta_dm_sp_cback(tBTM_SP_EVT event,tBTM_SP_EVT_DATA * p_data)3168 static UINT8 bta_dm_sp_cback (tBTM_SP_EVT event, tBTM_SP_EVT_DATA *p_data)
3169 {
3170 tBTM_STATUS status = BTM_CMD_STARTED;
3171 tBTA_DM_SEC sec_event;
3172 tBTA_DM_SEC_EVT pin_evt = BTA_DM_SP_KEY_NOTIF_EVT;
3173
3174 APPL_TRACE_EVENT("bta_dm_sp_cback: %d", event);
3175 if (!bta_dm_cb.p_sec_cback) {
3176 return BTM_NOT_AUTHORIZED;
3177 }
3178
3179 /* TODO_SP */
3180 switch (event) {
3181 case BTM_SP_IO_REQ_EVT:
3182 #if (BT_SSP_INCLUDED == TRUE)
3183 /* translate auth_req */
3184 bta_dm_co_io_req(p_data->io_req.bd_addr, &p_data->io_req.io_cap,
3185 &p_data->io_req.oob_data, &p_data->io_req.auth_req, p_data->io_req.is_orig);
3186 #endif
3187 #if BTM_OOB_INCLUDED == FALSE
3188 status = BTM_SUCCESS;
3189 #endif
3190
3191 APPL_TRACE_EVENT("io mitm: %d oob_data:%d", p_data->io_req.auth_req, p_data->io_req.oob_data);
3192 break;
3193 case BTM_SP_IO_RSP_EVT:
3194 #if (BT_SSP_INCLUDED == TRUE)
3195 bta_dm_co_io_rsp(p_data->io_rsp.bd_addr, p_data->io_rsp.io_cap,
3196 p_data->io_rsp.oob_data, p_data->io_rsp.auth_req );
3197 #endif
3198 break;
3199
3200 case BTM_SP_CFM_REQ_EVT:
3201 pin_evt = BTA_DM_SP_CFM_REQ_EVT;
3202 bta_dm_cb.just_works = sec_event.cfm_req.just_works = p_data->cfm_req.just_works;
3203 sec_event.cfm_req.loc_auth_req = p_data->cfm_req.loc_auth_req;
3204 sec_event.cfm_req.rmt_auth_req = p_data->cfm_req.rmt_auth_req;
3205 sec_event.cfm_req.loc_io_caps = p_data->cfm_req.loc_io_caps;
3206 sec_event.cfm_req.rmt_io_caps = p_data->cfm_req.rmt_io_caps;
3207
3208 /* continue to next case */
3209 #if (BT_SSP_INCLUDED == TRUE)
3210 /* Passkey entry mode, mobile device with output capability is very
3211 unlikely to receive key request, so skip this event */
3212 case BTM_SP_KEY_REQ_EVT:
3213 case BTM_SP_KEY_NOTIF_EVT:
3214 #endif
3215 if (BTM_SP_CFM_REQ_EVT == event) {
3216 /* Due to the switch case falling through below to BTM_SP_KEY_NOTIF_EVT,
3217 call remote name request using values from cfm_req */
3218 if (p_data->cfm_req.bd_name[0] == 0) {
3219 bta_dm_cb.pin_evt = pin_evt;
3220 bdcpy(bta_dm_cb.pin_bd_addr, p_data->cfm_req.bd_addr);
3221 BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->cfm_req.dev_class);
3222 if ((BTM_ReadRemoteDeviceName(p_data->cfm_req.bd_addr, bta_dm_pinname_cback,
3223 BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED) {
3224 return BTM_CMD_STARTED;
3225 }
3226 APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request ");
3227 } else {
3228 /* Due to the switch case falling through below to BTM_SP_KEY_NOTIF_EVT,
3229 copy these values into key_notif from cfm_req */
3230 bdcpy(sec_event.key_notif.bd_addr, p_data->cfm_req.bd_addr);
3231 BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->cfm_req.dev_class);
3232 BCM_STRNCPY_S((char *)sec_event.key_notif.bd_name, (char *)p_data->cfm_req.bd_name, BD_NAME_LEN);
3233 sec_event.key_notif.bd_name[BD_NAME_LEN] = '\0';
3234 }
3235 }
3236
3237 bta_dm_cb.num_val = sec_event.key_notif.passkey = p_data->key_notif.passkey;
3238 if (BTM_SP_KEY_NOTIF_EVT == event) {
3239 /* If the device name is not known, save bdaddr and devclass
3240 and initiate a name request with values from key_notif */
3241 if (p_data->key_notif.bd_name[0] == 0) {
3242 bta_dm_cb.pin_evt = pin_evt;
3243 bdcpy(bta_dm_cb.pin_bd_addr, p_data->key_notif.bd_addr);
3244 BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->key_notif.dev_class);
3245 if ((BTM_ReadRemoteDeviceName(p_data->key_notif.bd_addr, bta_dm_pinname_cback,
3246 BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED) {
3247 return BTM_CMD_STARTED;
3248 }
3249 APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request ");
3250 } else {
3251 bdcpy(sec_event.key_notif.bd_addr, p_data->key_notif.bd_addr);
3252 BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->key_notif.dev_class);
3253 BCM_STRNCPY_S((char *)sec_event.key_notif.bd_name, (char *)p_data->key_notif.bd_name, BD_NAME_LEN);
3254 sec_event.key_notif.bd_name[BD_NAME_LEN] = '\0';
3255 }
3256 }
3257
3258 if (BTM_SP_KEY_REQ_EVT == event) {
3259 pin_evt = BTA_DM_SP_KEY_REQ_EVT;
3260 /* If the device name is not known, save bdaddr and devclass
3261 and initiate a name request with values from key_notif */
3262 if (p_data->key_notif.bd_name[0] == 0) {
3263 bta_dm_cb.pin_evt = pin_evt;
3264 bdcpy(bta_dm_cb.pin_bd_addr, p_data->key_notif.bd_addr);
3265 BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->key_notif.dev_class);
3266 if ((BTM_ReadRemoteDeviceName(p_data->key_notif.bd_addr, bta_dm_pinname_cback,
3267 BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED) {
3268 return BTM_CMD_STARTED;
3269 }
3270 APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request ");
3271 } else {
3272 bdcpy(sec_event.key_notif.bd_addr, p_data->key_notif.bd_addr);
3273 BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->key_notif.dev_class);
3274 BCM_STRNCPY_S((char *)sec_event.key_notif.bd_name,(char *)p_data->key_notif.bd_name, BD_NAME_LEN);
3275 sec_event.key_notif.bd_name[BD_NAME_LEN] = '\0';
3276 }
3277 }
3278 bta_dm_cb.p_sec_cback(pin_evt, &sec_event);
3279
3280 break;
3281
3282 #if BTM_OOB_INCLUDED == TRUE
3283 case BTM_SP_LOC_OOB_EVT:
3284 bta_dm_co_loc_oob((BOOLEAN)(p_data->loc_oob.status == BTM_SUCCESS),
3285 p_data->loc_oob.c, p_data->loc_oob.r);
3286 break;
3287
3288 case BTM_SP_RMT_OOB_EVT:
3289 /* If the device name is not known, save bdaddr and devclass and initiate a name request */
3290 if (p_data->rmt_oob.bd_name[0] == 0) {
3291 bta_dm_cb.pin_evt = BTA_DM_SP_RMT_OOB_EVT;
3292 bdcpy(bta_dm_cb.pin_bd_addr, p_data->rmt_oob.bd_addr);
3293 BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->rmt_oob.dev_class);
3294 if ((BTM_ReadRemoteDeviceName(p_data->rmt_oob.bd_addr, bta_dm_pinname_cback,
3295 BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED) {
3296 return BTM_CMD_STARTED;
3297 }
3298 APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request ");
3299 }
3300
3301 bdcpy(sec_event.rmt_oob.bd_addr, p_data->rmt_oob.bd_addr);
3302 BTA_COPY_DEVICE_CLASS(sec_event.rmt_oob.dev_class, p_data->rmt_oob.dev_class);
3303 BCM_STRNCPY_S((char *)sec_event.rmt_oob.bd_name, (char *)p_data->rmt_oob.bd_name, BD_NAME_LEN);
3304 sec_event.rmt_oob.bd_name[BD_NAME_LEN] = '\0';
3305
3306 bta_dm_cb.p_sec_cback(BTA_DM_SP_RMT_OOB_EVT, &sec_event);
3307
3308 bta_dm_co_rmt_oob(p_data->rmt_oob.bd_addr);
3309 break;
3310 #endif
3311 case BTM_SP_COMPLT_EVT:
3312 /* do not report this event - handled by link_key_callback or auth_complete_callback */
3313 break;
3314
3315 case BTM_SP_KEYPRESS_EVT:
3316 memcpy(&sec_event.key_press, &p_data->key_press, sizeof(tBTM_SP_KEYPRESS));
3317 bta_dm_cb.p_sec_cback(BTA_DM_SP_KEYPRESS_EVT, &sec_event);
3318 break;
3319
3320 case BTM_SP_UPGRADE_EVT:
3321 bta_dm_co_lk_upgrade(p_data->upgrade.bd_addr, &p_data->upgrade.upgrade );
3322 break;
3323
3324 default:
3325 status = BTM_NOT_AUTHORIZED;
3326 break;
3327 }
3328 APPL_TRACE_EVENT("dm status: %d", status);
3329 return status;
3330 }
3331 #endif /* (BT_SSP_INCLUDED == TRUE) */
3332
3333 #endif ///SMP_INCLUDED == TRUE
3334
3335
3336 /*******************************************************************************
3337 **
3338 ** Function bta_dm_local_name_cback
3339 **
3340 ** Description Callback from btm after local name is read
3341 **
3342 **
3343 ** Returns void
3344 **
3345 *******************************************************************************/
bta_dm_local_name_cback(const BD_ADDR bd_addr)3346 static void bta_dm_local_name_cback(const BD_ADDR bd_addr)
3347 {
3348 tBTA_DM_SEC sec_event;
3349 UNUSED(bd_addr);
3350
3351 sec_event.enable.status = BTA_SUCCESS;
3352
3353 if (bta_dm_cb.p_sec_cback) {
3354 bta_dm_cb.p_sec_cback(BTA_DM_ENABLE_EVT, &sec_event);
3355 }
3356
3357 }
3358
3359 /*******************************************************************************
3360 **
3361 ** Function bta_dm_bl_change_cback
3362 **
3363 ** Description Callback from btm when acl connection goes up or down
3364 **
3365 **
3366 ** Returns void
3367 **
3368 *******************************************************************************/
bta_dm_bl_change_cback(tBTM_BL_EVENT_DATA * p_data)3369 static void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data)
3370 {
3371 tBTA_DM_ACL_CHANGE *p_msg;
3372
3373 if ((p_msg = (tBTA_DM_ACL_CHANGE *) osi_malloc(sizeof(tBTA_DM_ACL_CHANGE))) != NULL) {
3374 p_msg->event = p_data->event;
3375 p_msg->is_new = FALSE;
3376
3377 switch (p_msg->event) {
3378 case BTM_BL_CONN_EVT:
3379 p_msg->sc_downgrade = p_data->conn.sc_downgrade;
3380 p_msg->is_new = TRUE;
3381 bdcpy(p_msg->bd_addr, p_data->conn.p_bda);
3382 #if BLE_INCLUDED == TRUE
3383 p_msg->transport = p_data->conn.transport;
3384 p_msg->handle = p_data->conn.handle;
3385 #endif
3386 break;
3387 case BTM_BL_DISCN_EVT:
3388 bdcpy(p_msg->bd_addr, p_data->discn.p_bda);
3389 #if BLE_INCLUDED == TRUE
3390 p_msg->transport = p_data->discn.transport;
3391 p_msg->handle = p_data->discn.handle;
3392 #endif
3393 break;
3394 case BTM_BL_UPDATE_EVT:
3395 p_msg->busy_level = p_data->update.busy_level;
3396 p_msg->busy_level_flags = p_data->update.busy_level_flags;
3397 break;
3398 case BTM_BL_ROLE_CHG_EVT:
3399 p_msg->new_role = p_data->role_chg.new_role;
3400 p_msg->hci_status = p_data->role_chg.hci_status;
3401 bdcpy(p_msg->bd_addr, p_data->role_chg.p_bda);
3402 break;
3403 case BTM_BL_COLLISION_EVT:
3404 bdcpy(p_msg->bd_addr, p_data->conn.p_bda);
3405 break;
3406 }
3407
3408 p_msg->hdr.event = BTA_DM_ACL_CHANGE_EVT;
3409 bta_sys_sendmsg(p_msg);
3410
3411 }
3412
3413 }
3414
3415 /*******************************************************************************
3416 **
3417 ** Function bta_dm_acl_link_stat_cback
3418 **
3419 ** Description Callback from btm to report acl link status
3420 **
3421 ** Returns void
3422 **
3423 *******************************************************************************/
bta_dm_acl_link_stat_cback(tBTM_ACL_LINK_STAT_EVENT_DATA * p_data)3424 static void bta_dm_acl_link_stat_cback(tBTM_ACL_LINK_STAT_EVENT_DATA *p_data)
3425 {
3426 tBTA_DM_SEC sec_event;
3427 memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
3428 sec_event.acl_link_stat.event = p_data->event;
3429
3430 switch (sec_event.acl_link_stat.event) {
3431 case BTA_ACL_LINK_STAT_CONN_CMPL: {
3432 sec_event.acl_link_stat.link_act.conn_cmpl.status = p_data->link_act.conn_cmpl.status;
3433 sec_event.acl_link_stat.link_act.conn_cmpl.handle = p_data->link_act.conn_cmpl.handle;
3434 bdcpy(sec_event.acl_link_stat.link_act.conn_cmpl.bd_addr, p_data->link_act.conn_cmpl.bd_addr);
3435 break;
3436 }
3437 case BTA_ACL_LINK_STAT_DISCONN_CMPL: {
3438 sec_event.acl_link_stat.link_act.disconn_cmpl.reason = p_data->link_act.disconn_cmpl.reason;
3439 sec_event.acl_link_stat.link_act.disconn_cmpl.handle = p_data->link_act.disconn_cmpl.handle;
3440 bdcpy(sec_event.acl_link_stat.link_act.disconn_cmpl.bd_addr, p_data->link_act.disconn_cmpl.bd_addr);
3441 break;
3442 }
3443 default: {
3444 APPL_TRACE_WARNING("bta_dm_acl_link_stat: invalid event %d", sec_event.acl_link_stat.event);
3445 return;
3446 }
3447 }
3448
3449 if (bta_dm_cb.p_sec_cback) {
3450 (*bta_dm_cb.p_sec_cback)(BTA_DM_ACL_LINK_STAT_EVT, &sec_event);
3451 }
3452 }
3453
3454 /*******************************************************************************
3455 **
3456 ** Function bta_dm_rs_cback
3457 **
3458 ** Description Receives the role switch complete event
3459 **
3460 ** Returns
3461 **
3462 *******************************************************************************/
bta_dm_rs_cback(tBTM_ROLE_SWITCH_CMPL * p1)3463 static void bta_dm_rs_cback (tBTM_ROLE_SWITCH_CMPL *p1)
3464 {
3465 UNUSED(p1);
3466 APPL_TRACE_WARNING("bta_dm_rs_cback:%d", bta_dm_cb.rs_event);
3467 if (bta_dm_cb.rs_event == BTA_DM_API_SEARCH_EVT) {
3468 bta_dm_cb.search_msg.rs_res = BTA_DM_RS_OK; /* do not care about the result for now */
3469 bta_dm_cb.rs_event = 0;
3470 bta_dm_search_start((tBTA_DM_MSG *)&bta_dm_cb.search_msg);
3471 }
3472 }
3473
3474 /*******************************************************************************
3475 **
3476 ** Function bta_dm_check_av
3477 **
3478 ** Description This function checks if AV is active
3479 ** if yes, make sure the AV link is master
3480 **
3481 ** Returns BOOLEAN - TRUE, if switch is in progress
3482 **
3483 *******************************************************************************/
bta_dm_check_av(UINT16 event)3484 static BOOLEAN bta_dm_check_av(UINT16 event)
3485 {
3486 BOOLEAN avoid_roleswitch = FALSE;
3487 BOOLEAN switching = FALSE;
3488 UINT8 i;
3489 tBTA_DM_PEER_DEVICE *p_dev;
3490
3491 #if defined(BTA_DM_AVOID_A2DP_ROLESWITCH_ON_INQUIRY) && (BTA_DM_AVOID_A2DP_ROLESWITCH_ON_INQUIRY == TRUE)
3492
3493 /* avoid role switch upon inquiry if a2dp is actively streaming as it
3494 introduces an audioglitch due to FW scheduling delays (unavoidable) */
3495 if (event == BTA_DM_API_SEARCH_EVT) {
3496 avoid_roleswitch = TRUE;
3497 }
3498 #endif
3499
3500 APPL_TRACE_EVENT("bta_dm_check_av:%d", bta_dm_cb.cur_av_count);
3501 if (bta_dm_cb.cur_av_count) {
3502 for (i = 0; i < bta_dm_cb.device_list.count; i++) {
3503 p_dev = &bta_dm_cb.device_list.peer_device[i];
3504 APPL_TRACE_WARNING("[%d]: state:%d, info:x%x, avoid_rs %d",
3505 i, p_dev->conn_state, p_dev->info, avoid_roleswitch);
3506 if ((p_dev->conn_state == BTA_DM_CONNECTED) && (p_dev->info & BTA_DM_DI_AV_ACTIVE) &&
3507 (avoid_roleswitch == FALSE)) {
3508 /* make master and take away the role switch policy */
3509 if (BTM_CMD_STARTED == BTM_SwitchRole (p_dev->peer_bdaddr, HCI_ROLE_MASTER, (tBTM_CMPL_CB *)bta_dm_rs_cback)) {
3510 /* the role switch command is actually sent */
3511 bta_dm_cb.rs_event = event;
3512 switching = TRUE;
3513 }
3514 /* else either already master or can not switch for some reasons */
3515 bta_dm_policy_cback(BTA_SYS_PLCY_CLR, 0, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_dev->peer_bdaddr);
3516 break;
3517 }
3518 }
3519 }
3520 return switching;
3521 }
3522
3523 /*******************************************************************************
3524 **
3525 ** Function bta_dm_acl_change
3526 **
3527 ** Description Process BTA_DM_ACL_CHANGE_EVT
3528 **
3529 **
3530 ** Returns void
3531 **
3532 *******************************************************************************/
bta_dm_acl_change(tBTA_DM_MSG * p_data)3533 void bta_dm_acl_change(tBTA_DM_MSG *p_data)
3534 {
3535
3536 UINT8 i;
3537 UINT8 *p;
3538 tBTA_DM_SEC conn;
3539 BOOLEAN is_new = p_data->acl_change.is_new;
3540 BD_ADDR_PTR p_bda = p_data->acl_change.bd_addr;
3541 BOOLEAN need_policy_change = FALSE;
3542 BOOLEAN issue_unpair_cb = FALSE;
3543
3544 tBTA_DM_PEER_DEVICE *p_dev;
3545 memset(&conn, 0, sizeof(tBTA_DM_SEC));
3546
3547 switch (p_data->acl_change.event) {
3548 case BTM_BL_UPDATE_EVT: /* busy level update */
3549 if ( bta_dm_cb.p_sec_cback ) {
3550 conn.busy_level.level = p_data->acl_change.busy_level;
3551 conn.busy_level.level_flags = p_data->acl_change.busy_level_flags;
3552 bta_dm_cb.p_sec_cback(BTA_DM_BUSY_LEVEL_EVT, &conn);
3553 }
3554 return;
3555
3556 case BTM_BL_ROLE_CHG_EVT: /* role change event */
3557 p_dev = bta_dm_find_peer_device(p_bda);
3558 if (p_dev) {
3559 APPL_TRACE_DEBUG("bta_dm_acl_change role chg info:x%x new_role:%d dev count:%d",
3560 p_dev->info, p_data->acl_change.new_role, bta_dm_cb.device_list.count);
3561 if (p_dev->info & BTA_DM_DI_AV_ACTIVE) {
3562 /* there's AV activity on this link */
3563 if (p_data->acl_change.new_role == HCI_ROLE_SLAVE && bta_dm_cb.device_list.count > 1
3564 && p_data->acl_change.hci_status == HCI_SUCCESS) {
3565 /* more than one connections and the AV connection is role switched to slave
3566 * switch it back to master and remove the switch policy */
3567 BTM_SwitchRole(p_bda, BTM_ROLE_MASTER, NULL);
3568 need_policy_change = TRUE;
3569 } else if (p_bta_dm_cfg->avoid_scatter && (p_data->acl_change.new_role == HCI_ROLE_MASTER)) {
3570 /* if the link updated to be master include AV activities, remove the switch policy */
3571 need_policy_change = TRUE;
3572 }
3573
3574 if (need_policy_change) {
3575 bta_dm_policy_cback(BTA_SYS_PLCY_CLR, 0, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_dev->peer_bdaddr);
3576 }
3577 } else {
3578 /* there's AV no activity on this link and role switch happened
3579 * check if AV is active
3580 * if so, make sure the AV link is master */
3581 bta_dm_check_av(0);
3582 }
3583 bta_sys_notify_role_chg(p_data->acl_change.bd_addr, p_data->acl_change.new_role, p_data->acl_change.hci_status);
3584 bdcpy(conn.role_chg.bd_addr, p_bda);
3585 conn.role_chg.new_role = (UINT8) p_data->acl_change.new_role;
3586 if ( bta_dm_cb.p_sec_cback ) {
3587 bta_dm_cb.p_sec_cback(BTA_DM_ROLE_CHG_EVT, (tBTA_DM_SEC *)&conn);
3588 }
3589 }
3590 return;
3591 }
3592
3593 /* Collision report from Stack: Notify profiles */
3594 if (p_data->acl_change.event == BTM_BL_COLLISION_EVT) {
3595 bta_sys_notify_collision (p_bda);
3596 return;
3597 }
3598
3599 if (is_new) {
3600 for (i = 0; i < bta_dm_cb.device_list.count; i++) {
3601 if (!bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda)
3602 #if BLE_INCLUDED == TRUE
3603 && bta_dm_cb.device_list.peer_device[i].conn_handle == p_data->acl_change.handle
3604 #endif
3605 ) {
3606 break;
3607 }
3608
3609 }
3610
3611 if (i == bta_dm_cb.device_list.count) {
3612 if (bta_dm_cb.device_list.count < BTA_DM_NUM_PEER_DEVICE) {
3613 bdcpy(bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].peer_bdaddr, p_bda);
3614 bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].link_policy = bta_dm_cb.cur_policy;
3615 bta_dm_cb.device_list.count++;
3616 #if BLE_INCLUDED == TRUE
3617 bta_dm_cb.device_list.peer_device[i].conn_handle = p_data->acl_change.handle;
3618 if (p_data->acl_change.transport == BT_TRANSPORT_LE) {
3619 bta_dm_cb.device_list.le_count++;
3620 }
3621 #endif
3622 } else {
3623 APPL_TRACE_ERROR("%s max active connection reached, no resources", __func__);
3624 return;
3625 }
3626 }
3627
3628 bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_CONNECTED;
3629 bta_dm_cb.device_list.peer_device[i].pref_role = BTA_ANY_ROLE;
3630 bdcpy(conn.link_up.bd_addr, p_bda);
3631 bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_NONE;
3632 #if BLE_INCLUDED == TRUE
3633 conn.link_up.link_type = p_data->acl_change.transport;
3634 bta_dm_cb.device_list.peer_device[i].transport = p_data->acl_change.transport;
3635 #endif
3636
3637 if (((NULL != (p = BTM_ReadLocalFeatures ())) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) &&
3638 ((NULL != (p = BTM_ReadRemoteFeatures (p_bda))) && HCI_SNIFF_SUB_RATE_SUPPORTED(p))) {
3639 /* both local and remote devices support SSR */
3640 bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_USE_SSR;
3641 }
3642 APPL_TRACE_DEBUG("%s info: 0x%x", __func__, bta_dm_cb.device_list.peer_device[i].info);
3643
3644 if (bta_dm_cb.p_sec_cback) {
3645 conn.link_up.sc_downgrade = p_data->acl_change.sc_downgrade;
3646 bta_dm_cb.p_sec_cback(BTA_DM_LINK_UP_EVT, (tBTA_DM_SEC *)&conn);
3647 }
3648 } else {
3649 for (i = 0; i < bta_dm_cb.device_list.count; i++) {
3650 if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda)
3651 #if BLE_INCLUDED == TRUE
3652 || bta_dm_cb.device_list.peer_device[i].transport != p_data->acl_change.transport
3653 #endif
3654 ) {
3655 continue;
3656 }
3657
3658 if ( bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_UNPAIRING ) {
3659 if (BTM_SecDeleteDevice(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, bta_dm_cb.device_list.peer_device[i].transport)) {
3660 issue_unpair_cb = TRUE;
3661 }
3662
3663 APPL_TRACE_DEBUG("%s: Unpairing: issue unpair CB = %d ", __FUNCTION__, issue_unpair_cb);
3664 }
3665
3666 conn.link_down.is_removed = bta_dm_cb.device_list.peer_device[i].remove_dev_pending;
3667
3668 for (; i < bta_dm_cb.device_list.count ; i++) {
3669 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]));
3670 }
3671 break;
3672 }
3673 if (bta_dm_cb.device_list.count) {
3674 bta_dm_cb.device_list.count--;
3675 }
3676 #if BLE_INCLUDED == TRUE
3677 if ((p_data->acl_change.transport == BT_TRANSPORT_LE) &&
3678 (bta_dm_cb.device_list.le_count)) {
3679 bta_dm_cb.device_list.le_count--;
3680 }
3681 conn.link_down.link_type = p_data->acl_change.transport;
3682 #endif
3683
3684 if (bta_dm_search_cb.wait_disc && !bdcmp(bta_dm_search_cb.peer_bdaddr, p_bda)) {
3685 bta_dm_search_cb.wait_disc = FALSE;
3686
3687 if (bta_dm_search_cb.sdp_results) {
3688 APPL_TRACE_EVENT(" timer stopped ");
3689 bta_sys_stop_timer(&bta_dm_search_cb.search_timer);
3690 bta_dm_discover_next_device();
3691 }
3692
3693 }
3694
3695 if (bta_dm_cb.disabling) {
3696 if (!BTM_GetNumAclLinks()) {
3697 bta_sys_stop_timer(&bta_dm_cb.disable_timer);
3698 bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK *)&bta_dm_disable_conn_down_timer_cback;
3699 /*
3700 * Start a timer to make sure that the profiles
3701 * get the disconnect event.
3702 */
3703 bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 1000);
3704 }
3705 }
3706 if (conn.link_down.is_removed) {
3707 BTM_SecDeleteDevice(p_bda, p_data->acl_change.transport);
3708 #if (BLE_INCLUDED == TRUE && GATTC_INCLUDED == TRUE)
3709 /* need to remove all pending background connection */
3710 BTA_GATTC_CancelOpen(0, p_bda, FALSE);
3711 #endif
3712 }
3713
3714 bdcpy(conn.link_down.bd_addr, p_bda);
3715 conn.link_down.reason = (UINT8) btm_get_acl_disc_reason_code();
3716 if ( bta_dm_cb.p_sec_cback ) {
3717 bta_dm_cb.p_sec_cback(BTA_DM_LINK_DOWN_EVT, &conn);
3718 if ( issue_unpair_cb ) {
3719 if (p_data->acl_change.transport == BT_TRANSPORT_LE) {
3720 bta_dm_cb.p_sec_cback(BTA_DM_BLE_DEV_UNPAIRED_EVT, &conn);
3721 } else {
3722 bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &conn);
3723 }
3724 }
3725 }
3726 }
3727
3728 bta_dm_adjust_roles(TRUE);
3729 }
3730
3731 /*******************************************************************************
3732 **
3733 ** Function bta_dm_disable_conn_down_timer_cback
3734 **
3735 ** Description Sends disable event to application
3736 **
3737 **
3738 ** Returns void
3739 **
3740 *******************************************************************************/
bta_dm_disable_conn_down_timer_cback(TIMER_LIST_ENT * p_tle)3741 static void bta_dm_disable_conn_down_timer_cback (TIMER_LIST_ENT *p_tle)
3742 {
3743 UNUSED(p_tle);
3744 tBTA_SYS_HW_MSG *sys_enable_event;
3745
3746 #if (BTA_DM_PM_INCLUDED == TRUE)
3747 /* disable the power management module */
3748 bta_dm_disable_pm();
3749 #endif /* #if (BTA_DM_PM_INCLUDED == TRUE) */
3750
3751 /* register our callback to SYS HW manager */
3752 bta_sys_hw_register( BTA_SYS_HW_BLUETOOTH, bta_dm_sys_hw_cback );
3753
3754 /* send a message to BTA SYS */
3755 if ((sys_enable_event = (tBTA_SYS_HW_MSG *) osi_malloc(sizeof(tBTA_SYS_HW_MSG))) != NULL) {
3756 sys_enable_event->hdr.event = BTA_SYS_API_DISABLE_EVT;
3757 sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH;
3758 bta_sys_sendmsg(sys_enable_event);
3759 }
3760
3761 bta_dm_cb.disabling = FALSE;
3762
3763 }
3764
3765 /*******************************************************************************
3766 **
3767 ** Function bta_dm_rm_cback
3768 **
3769 ** Description Role management callback from sys
3770 **
3771 **
3772 ** Returns void
3773 **
3774 *******************************************************************************/
bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status,UINT8 id,UINT8 app_id,BD_ADDR peer_addr)3775 static void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
3776 {
3777 UINT8 j;
3778 tBTA_PREF_ROLES role;
3779 tBTA_DM_PEER_DEVICE *p_dev;
3780
3781 p_dev = bta_dm_find_peer_device(peer_addr);
3782 if ( status == BTA_SYS_CONN_OPEN) {
3783 if (p_dev) {
3784 /* Do not set to connected if we are in the middle of unpairing. When AV stream is
3785 * started it fakes out a SYS_CONN_OPEN to potentially trigger a role switch command.
3786 * But this should not be done if we are in the middle of unpairing.
3787 */
3788 if (p_dev->conn_state != BTA_DM_UNPAIRING) {
3789 p_dev->conn_state = BTA_DM_CONNECTED;
3790 }
3791
3792 for (j = 1; j <= p_bta_dm_rm_cfg[0].app_id; j++) {
3793 if (((p_bta_dm_rm_cfg[j].app_id == app_id) || (p_bta_dm_rm_cfg[j].app_id == BTA_ALL_APP_ID))
3794 && (p_bta_dm_rm_cfg[j].id == id)) {
3795 role = p_bta_dm_rm_cfg[j].cfg;
3796
3797 if (role > p_dev->pref_role ) {
3798 p_dev->pref_role = role;
3799 }
3800 break;
3801 }
3802 }
3803 }
3804 }
3805
3806 if ((BTA_ID_AV == id) || (BTA_ID_AVK == id)) {
3807 if ( status == BTA_SYS_CONN_BUSY) {
3808 if (p_dev) {
3809 p_dev->info |= BTA_DM_DI_AV_ACTIVE;
3810 }
3811 /* AV calls bta_sys_conn_open with the A2DP stream count as app_id */
3812 if (BTA_ID_AV == id) {
3813 bta_dm_cb.cur_av_count = bta_dm_get_av_count();
3814 }
3815 } else if ( status == BTA_SYS_CONN_IDLE) {
3816 if (p_dev) {
3817 p_dev->info &= ~BTA_DM_DI_AV_ACTIVE;
3818 }
3819
3820 /* get cur_av_count from connected services */
3821 if (BTA_ID_AV == id) {
3822 bta_dm_cb.cur_av_count = bta_dm_get_av_count();
3823 }
3824 }
3825 APPL_TRACE_EVENT("bta_dm_rm_cback:%d, status:%d", bta_dm_cb.cur_av_count, status);
3826 }
3827
3828 /* Don't adjust roles for each busy/idle state transition to avoid
3829 excessive switch requests when individual profile busy/idle status
3830 changes */
3831 if ((status != BTA_SYS_CONN_BUSY) && (status != BTA_SYS_CONN_IDLE)) {
3832 bta_dm_adjust_roles(FALSE);
3833 }
3834 }
3835
3836 /*******************************************************************************
3837 **
3838 ** Function bta_dm_delay_role_switch_cback
3839 **
3840 ** Description Callback from btm to delay a role switch
3841 **
3842 ** Returns void
3843 **
3844 *******************************************************************************/
bta_dm_delay_role_switch_cback(TIMER_LIST_ENT * p_tle)3845 static void bta_dm_delay_role_switch_cback(TIMER_LIST_ENT *p_tle)
3846 {
3847 UNUSED(p_tle);
3848 APPL_TRACE_EVENT("bta_dm_delay_role_switch_cback: initiating Delayed RS");
3849 bta_dm_adjust_roles (FALSE);
3850 }
3851
3852 /*******************************************************************************
3853 **
3854 ** Function bta_dm_remove_sec_dev_entry
3855 **
3856 ** Description Removes device entry from Security device DB if ACL connection with
3857 ** remtoe device does not exist, else schedule for dev entry removal upon
3858 ACL close
3859 **
3860 ** Returns TRUE if device entry is removed from Security device DB, FALSE otherwise
3861 **
3862 *******************************************************************************/
3863 #if (SMP_INCLUDED == TRUE)
bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr)3864 static BOOLEAN bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr)
3865 {
3866 BOOLEAN is_device_deleted = FALSE;
3867 UINT16 index = 0;
3868 if ( BTM_IsAclConnectionUp(remote_bd_addr, BT_TRANSPORT_LE) ||
3869 BTM_IsAclConnectionUp(remote_bd_addr, BT_TRANSPORT_BR_EDR)) {
3870 APPL_TRACE_DEBUG("%s ACL is not down. Schedule for Dev Removal when ACL closes",
3871 __FUNCTION__);
3872 BTM_SecClearSecurityFlags (remote_bd_addr);
3873 for (index = 0; index < bta_dm_cb.device_list.count; index ++) {
3874 if (!bdcmp( bta_dm_cb.device_list.peer_device[index].peer_bdaddr, remote_bd_addr)) {
3875 break;
3876 }
3877 }
3878 if (index != bta_dm_cb.device_list.count) {
3879 bta_dm_cb.device_list.peer_device[index].remove_dev_pending = TRUE;
3880 } else {
3881 APPL_TRACE_ERROR(" %s Device does not exist in DB", __FUNCTION__);
3882 }
3883 } else {
3884 is_device_deleted = BTM_SecDeleteDevice (remote_bd_addr, bta_dm_cb.device_list.peer_device[index].transport);
3885 #if (BLE_INCLUDED == TRUE && GATTC_INCLUDED == TRUE)
3886 /* need to remove all pending background connection */
3887 BTA_GATTC_CancelOpen(0, remote_bd_addr, FALSE);
3888 #endif
3889 }
3890 return is_device_deleted;
3891 }
3892 #endif ///SMP_INCLUDED == TRUE
3893
3894
3895 /*******************************************************************************
3896 **
3897 ** Function bta_dm_adjust_roles
3898 **
3899 ** Description Adjust roles
3900 **
3901 **
3902 ** Returns void
3903 **
3904 *******************************************************************************/
bta_dm_adjust_roles(BOOLEAN delay_role_switch)3905 static void bta_dm_adjust_roles(BOOLEAN delay_role_switch)
3906 {
3907
3908 UINT8 i;
3909 BOOLEAN set_master_role = FALSE;
3910 #if BLE_INCLUDED == TRUE
3911 UINT8 br_count = bta_dm_cb.device_list.count - bta_dm_cb.device_list.le_count;
3912 #else
3913 UINT8 br_count = bta_dm_cb.device_list.count;
3914 #endif
3915 if (br_count) {
3916
3917 /* the configuration is no scatternet
3918 * or AV connection exists and there are more than one ACL link */
3919 if ( (p_bta_dm_rm_cfg[0].cfg == BTA_DM_NO_SCATTERNET) ||
3920 (bta_dm_cb.cur_av_count && br_count > 1) ) {
3921
3922 L2CA_SetDesireRole (HCI_ROLE_MASTER);
3923 set_master_role = TRUE;
3924
3925 }
3926
3927 for (i = 0; i < bta_dm_cb.device_list.count; i++) {
3928 if (bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED
3929 #if BLE_INCLUDED == TRUE
3930 && bta_dm_cb.device_list.peer_device[i].transport == BT_TRANSPORT_BR_EDR
3931 #endif
3932 ) {
3933 if (!set_master_role && (bta_dm_cb.device_list.peer_device[i].pref_role != BTA_ANY_ROLE)
3934 && (p_bta_dm_rm_cfg[0].cfg == BTA_DM_PARTIAL_SCATTERNET)) {
3935 L2CA_SetDesireRole (HCI_ROLE_MASTER);
3936 set_master_role = TRUE;
3937 }
3938
3939 if ((bta_dm_cb.device_list.peer_device[i].pref_role == BTA_MASTER_ROLE_ONLY)
3940 || (br_count > 1)) {
3941
3942 /* Initiating immediate role switch with certain remote devices
3943 has caused issues due to role switch colliding with link encryption setup and
3944 causing encryption (and in turn the link) to fail . These device . Firmware
3945 versions are stored in a blacklist and role switch with these devices are
3946 delayed to avoid the collision with link encryption setup */
3947
3948 if (bta_dm_cb.device_list.peer_device[i].pref_role != BTA_SLAVE_ROLE_ONLY &&
3949 delay_role_switch == FALSE) {
3950 BTM_SwitchRole (bta_dm_cb.device_list.peer_device[i].peer_bdaddr,
3951 HCI_ROLE_MASTER, NULL);
3952 } else {
3953 bta_dm_cb.switch_delay_timer[i].p_cback =
3954 (TIMER_CBACK *)&bta_dm_delay_role_switch_cback;
3955 /* Start the timer if not active */
3956 if (!bta_sys_timer_is_active(&bta_dm_cb.switch_delay_timer[i])) {
3957 bta_sys_start_timer(&bta_dm_cb.switch_delay_timer[i], 0, 500);
3958 }
3959 }
3960 }
3961
3962 }
3963 }
3964
3965
3966 if (!set_master_role) {
3967
3968 L2CA_SetDesireRole (L2CAP_DESIRED_LINK_ROLE);
3969
3970 }
3971
3972 } else {
3973 L2CA_SetDesireRole (L2CAP_DESIRED_LINK_ROLE);
3974 }
3975
3976
3977 }
3978
3979 /*******************************************************************************
3980 **
3981 ** Function bta_dm_get_remname
3982 **
3983 ** Description Returns a pointer to the remote name stored in the DM control
3984 ** block if it exists, or from the BTM memory.
3985 **
3986 ** Returns char * - Pointer to the remote device name
3987 *******************************************************************************/
3988 #if (SDP_INCLUDED == TRUE || SMP_INCLUDED == TRUE)
bta_dm_get_remname(void)3989 static char *bta_dm_get_remname(void)
3990 {
3991 char *p_name = (char *)bta_dm_search_cb.peer_name;
3992 char *p_temp;
3993
3994 /* If the name isn't already stored, try retrieving from BTM */
3995 if (*p_name == '\0') {
3996 if ((p_temp = BTM_SecReadDevName(bta_dm_search_cb.peer_bdaddr)) != NULL) {
3997 p_name = p_temp;
3998 }
3999 }
4000 return p_name;
4001 }
4002 #endif ///SDP_INCLUDED == TRUE || SMP_INCLUDED == TRUE
4003
4004 /*******************************************************************************
4005 **
4006 ** Function bta_dm_bond_cancel_complete_cback
4007 **
4008 ** Description Authentication complete callback from BTM
4009 **
4010 ** Returns void
4011 **
4012 *******************************************************************************/
4013 #if (SMP_INCLUDED == TRUE)
bta_dm_bond_cancel_complete_cback(tBTM_STATUS result)4014 static void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result)
4015 {
4016
4017 tBTA_DM_SEC sec_event;
4018
4019 if (result == BTM_SUCCESS) {
4020 sec_event.bond_cancel_cmpl.result = BTA_SUCCESS;
4021 } else {
4022 sec_event.bond_cancel_cmpl.result = BTA_FAILURE;
4023 }
4024
4025 if (bta_dm_cb.p_sec_cback) {
4026 bta_dm_cb.p_sec_cback(BTA_DM_BOND_CANCEL_CMPL_EVT, &sec_event);
4027 }
4028 }
4029 #endif ///SMP_INCLUDED == TRUE
4030
4031 /*******************************************************************************
4032 **
4033 ** Function bta_dm_set_eir
4034 **
4035 ** Description This function creates EIR tagged data and writes it to controller.
4036 **
4037 ** Returns None
4038 **
4039 *******************************************************************************/
4040 #if (CLASSIC_BT_INCLUDED == TRUE)
bta_dm_set_eir(char * local_name)4041 static void bta_dm_set_eir (char *local_name)
4042 {
4043 BT_HDR *p_buf;
4044 UINT8 *p;
4045 UINT8 *p_length;
4046 #if (BTA_EIR_CANNED_UUID_LIST != TRUE)
4047 UINT8 *p_type;
4048 UINT8 max_num_uuid;
4049 #if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
4050 UINT8 custom_uuid_idx;
4051 #endif // BTA_EIR_SERVER_NUM_CUSTOM_UUID
4052 #endif // BTA_EIR_CANNED_UUID_LIST
4053
4054 UINT8 free_eir_length;
4055 if (p_bta_dm_eir_cfg->bta_dm_eir_fec_required) {
4056 free_eir_length = HCI_DM5_PACKET_SIZE;
4057 } else {
4058 free_eir_length = HCI_EXT_INQ_RESPONSE_LEN;
4059 }
4060
4061 UINT8 num_uuid;
4062 UINT8 data_type;
4063 UINT8 local_name_len;
4064
4065 UINT8 eir_type[BTM_EIR_TYPE_MAX_NUM];
4066 UINT8 eir_type_num = 0;
4067
4068 tBTA_STATUS status = BTA_SUCCESS;
4069
4070 /* wait until complete to disable */
4071 if (bta_dm_cb.disable_timer.in_use) {
4072 if (p_bta_dm_eir_cfg->config_eir_callback) {
4073 p_bta_dm_eir_cfg->config_eir_callback(BTA_WRONG_MODE, eir_type_num , eir_type);
4074 }
4075 return;
4076 }
4077
4078 #if ( BTA_EIR_CANNED_UUID_LIST != TRUE )
4079 /* wait until App is ready */
4080 if (bta_dm_cb.app_ready_timer.in_use) {
4081 if (p_bta_dm_eir_cfg->config_eir_callback) {
4082 p_bta_dm_eir_cfg->config_eir_callback(BTA_WRONG_MODE, eir_type_num , eir_type);
4083 }
4084 return;
4085 }
4086 #endif // BTA_EIR_CANNED_UUID_LIST
4087
4088 if (p_bta_dm_eir_cfg->bta_dm_eir_included_name) {
4089 /* if local name is not provided, get it from controller */
4090 if ( local_name == NULL ) {
4091 if ( BTM_ReadLocalDeviceName( &local_name ) != BTM_SUCCESS ) {
4092 APPL_TRACE_ERROR("Fail to read local device name for EIR");
4093 }
4094 }
4095 } else {
4096 local_name = NULL;
4097 }
4098
4099
4100 /* Allocate a buffer to hold HCI command */
4101 if ((p_buf = (BT_HDR *)osi_malloc(BTM_CMD_BUF_SIZE)) == NULL) {
4102 APPL_TRACE_ERROR("bta_dm_set_eir couldn't allocate buffer");
4103 if (p_bta_dm_eir_cfg->config_eir_callback) {
4104 p_bta_dm_eir_cfg->config_eir_callback(BTA_NO_RESOURCES, eir_type_num , eir_type);
4105 }
4106 return;
4107 }
4108 p = (UINT8 *)p_buf + BTM_HCI_EIR_OFFSET;
4109
4110 memset(p, 0x00, HCI_EXT_INQ_RESPONSE_LEN );
4111
4112 APPL_TRACE_DEBUG("BTA is generating EIR");
4113
4114 if ( local_name ) {
4115 local_name_len = strlen( local_name );
4116 } else {
4117 local_name_len = 0;
4118 }
4119
4120 data_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE;
4121 /* if local name is longer than minimum length of shortened name */
4122 /* check whether it needs to be shortened or not */
4123 if ( local_name_len > p_bta_dm_eir_cfg->bta_dm_eir_min_name_len ) {
4124 /* get number of UUID 16-bit list */
4125 #if (BTA_EIR_CANNED_UUID_LIST == TRUE)
4126 num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len / LEN_UUID_16;
4127 #else // BTA_EIR_CANNED_UUID_LIST
4128 max_num_uuid = (free_eir_length - 2) / LEN_UUID_16;
4129 data_type = BTM_GetEirSupportedServices( bta_dm_cb.eir_uuid, &p,
4130 max_num_uuid, &num_uuid );
4131 p = (UINT8 *)p_buf + BTM_HCI_EIR_OFFSET; /* reset p */
4132 #endif // BTA_EIR_CANNED_UUID_LIST
4133
4134 /* if UUID doesn't fit remaining space, shorten local name */
4135 if ( local_name_len > (free_eir_length - 4 - num_uuid * LEN_UUID_16)) {
4136 APPL_TRACE_WARNING("BTA EIR: local name is shortened");
4137 local_name_len = p_bta_dm_eir_cfg->bta_dm_eir_min_name_len;
4138 data_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE;
4139 } else {
4140 data_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE;
4141 }
4142 }
4143
4144
4145
4146 if (local_name != NULL) {
4147 UINT8_TO_STREAM(p, local_name_len + 1);
4148 UINT8_TO_STREAM(p, data_type);
4149 eir_type[eir_type_num++] = data_type;
4150 memcpy(p, local_name, local_name_len);
4151 p += local_name_len;
4152 free_eir_length -= local_name_len + 2;
4153 }
4154
4155 /* if UUIDs are provided in configuration */
4156 if (p_bta_dm_eir_cfg->bta_dm_eir_included_uuid) {
4157 #if (BTA_EIR_CANNED_UUID_LIST == TRUE)
4158 /* if UUID list is provided as static data in configuration */
4159 if (( p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len > 0 )
4160 && (p_bta_dm_eir_cfg->bta_dm_eir_uuid16)) {
4161 if ( free_eir_length > LEN_UUID_16 + 2) {
4162 free_eir_length -= 2;
4163
4164 if ( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len) {
4165 num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len / LEN_UUID_16;
4166 data_type = BTM_EIR_COMPLETE_16BITS_UUID_TYPE;
4167 } else { /* not enough room for all UUIDs */
4168 APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
4169 num_uuid = free_eir_length / LEN_UUID_16;
4170 data_type = BTM_EIR_MORE_16BITS_UUID_TYPE;
4171 }
4172 UINT8_TO_STREAM(p, num_uuid * LEN_UUID_16 + 1);
4173 UINT8_TO_STREAM(p, data_type);
4174 eir_type[eir_type_num++] = data_type;
4175 memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_uuid16, num_uuid * LEN_UUID_16 );
4176 p += num_uuid * LEN_UUID_16;
4177 free_eir_length -= num_uuid * LEN_UUID_16;
4178 } else {
4179 status = BTA_EIR_TOO_LARGE;
4180 }
4181 }
4182 #else /* (BTA_EIR_CANNED_UUID_LIST == TRUE) */
4183 /* if UUID list is dynamic */
4184 if ( free_eir_length >= 2) {
4185 p_length = p++;
4186 p_type = p++;
4187 num_uuid = 0;
4188
4189 max_num_uuid = (free_eir_length - 2) / LEN_UUID_16;
4190 data_type = BTM_GetEirSupportedServices( bta_dm_cb.eir_uuid, &p, max_num_uuid, &num_uuid );
4191
4192 if ( data_type == BTM_EIR_MORE_16BITS_UUID_TYPE ) {
4193 APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
4194 }
4195 #if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
4196 else {
4197 for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++) {
4198 if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_16) {
4199 if ( num_uuid < max_num_uuid ) {
4200 UINT16_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid16);
4201 num_uuid++;
4202 } else {
4203 data_type = BTM_EIR_MORE_16BITS_UUID_TYPE;
4204 APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
4205 break;
4206 }
4207 }
4208 }
4209 }
4210 #endif /* (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) */
4211
4212 UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_16 + 1);
4213 UINT8_TO_STREAM(p_type, data_type);
4214 eir_type[eir_type_num++] = data_type;
4215 free_eir_length -= num_uuid * LEN_UUID_16 + 2;
4216 } else {
4217 status = BTA_EIR_TOO_LARGE;
4218 }
4219 #endif /* (BTA_EIR_CANNED_UUID_LIST == TRUE) */
4220
4221 #if ( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
4222 /* Adding 32-bit UUID list */
4223 if ( free_eir_length >= 2) {
4224 p_length = p++;
4225 p_type = p++;
4226 num_uuid = 0;
4227 data_type = BTM_EIR_COMPLETE_32BITS_UUID_TYPE;
4228
4229 max_num_uuid = (free_eir_length - 2) / LEN_UUID_32;
4230
4231 for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++) {
4232 if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_32) {
4233 if ( num_uuid < max_num_uuid ) {
4234 UINT32_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid32);
4235 num_uuid++;
4236 } else {
4237 data_type = BTM_EIR_MORE_32BITS_UUID_TYPE;
4238 APPL_TRACE_WARNING("BTA EIR: UUID 32-bit list is truncated");
4239 break;
4240 }
4241 }
4242 }
4243
4244 UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_32 + 1);
4245 UINT8_TO_STREAM(p_type, data_type);
4246 eir_type[eir_type_num++] = data_type;
4247 free_eir_length -= num_uuid * LEN_UUID_32 + 2;
4248 } else {
4249 status = BTA_EIR_TOO_LARGE;
4250 }
4251
4252 /* Adding 128-bit UUID list */
4253 if ( free_eir_length >= 2) {
4254 p_length = p++;
4255 p_type = p++;
4256 num_uuid = 0;
4257 data_type = BTM_EIR_COMPLETE_128BITS_UUID_TYPE;
4258
4259 max_num_uuid = (free_eir_length - 2) / LEN_UUID_128;
4260
4261 for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++) {
4262 if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_128) {
4263 if ( num_uuid < max_num_uuid ) {
4264 ARRAY_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid128, LEN_UUID_128);
4265 num_uuid++;
4266 } else {
4267 data_type = BTM_EIR_MORE_128BITS_UUID_TYPE;
4268 APPL_TRACE_WARNING("BTA EIR: UUID 128-bit list is truncated");
4269 break;
4270 }
4271 }
4272 }
4273
4274 UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_128 + 1);
4275 UINT8_TO_STREAM(p_type, data_type);
4276 eir_type[eir_type_num++] = data_type;
4277 free_eir_length -= num_uuid * LEN_UUID_128 + 2;
4278 }
4279 else {
4280 status = BTA_EIR_TOO_LARGE;
4281 }
4282 #endif /* ( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) */
4283 }
4284
4285 /* if Flags are provided in configuration */
4286 if ( p_bta_dm_eir_cfg->bta_dm_eir_flags != 0 ) {
4287 if ( free_eir_length >= 3 ) {
4288 UINT8_TO_STREAM(p, 2);
4289 UINT8_TO_STREAM(p, BTM_EIR_FLAGS_TYPE);
4290 eir_type[eir_type_num++] = BTM_EIR_FLAGS_TYPE;
4291 UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_flags);
4292 free_eir_length -= 3;
4293 } else {
4294 status = BTA_EIR_TOO_LARGE;
4295 }
4296 }
4297
4298 /* if Manufacturer Specific are provided in configuration */
4299 if (( p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len > 0 )
4300 && ( p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec )) {
4301 if ( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2) {
4302 p_length = p;
4303
4304 UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 1);
4305 UINT8_TO_STREAM(p, BTM_EIR_MANUFACTURER_SPECIFIC_TYPE);
4306 eir_type[eir_type_num++] = BTM_EIR_MANUFACTURER_SPECIFIC_TYPE;
4307 memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec,
4308 p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len);
4309 p += p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len;
4310 free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2;
4311 } else {
4312 status = BTA_EIR_TOO_LARGE;
4313 }
4314 } else {
4315 p_length = NULL;
4316 }
4317
4318 /* if Inquiry Tx Resp Power compiled */
4319 if (p_bta_dm_eir_cfg->bta_dm_eir_included_tx_power) {
4320 if (free_eir_length >= 3) {
4321 int min_power_level, max_power_level;
4322 if (bredr_txpwr_get(&min_power_level, &max_power_level) == 0) {
4323 INT8 btm_tx_power[BTM_TX_POWER_LEVEL_MAX + 1] = BTM_TX_POWER;
4324 p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power = btm_tx_power[max_power_level];
4325 UINT8_TO_STREAM(p, 2); /* Length field */
4326 UINT8_TO_STREAM(p, BTM_EIR_TX_POWER_LEVEL_TYPE);
4327 eir_type[eir_type_num++] = BTM_EIR_TX_POWER_LEVEL_TYPE;
4328 UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power);
4329 free_eir_length -= 3;
4330 }
4331 } else {
4332 status = BTA_EIR_TOO_LARGE;
4333 }
4334 }
4335
4336 /* if URL are provided in configuration */
4337 if (( p_bta_dm_eir_cfg->bta_dm_eir_url_len > 0 )
4338 && ( p_bta_dm_eir_cfg->bta_dm_eir_url )) {
4339 if ( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_url_len + 2 ) {
4340 UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_url_len + 1);
4341 UINT8_TO_STREAM(p, BTM_EIR_URL_TYPE);
4342 eir_type[eir_type_num++] = BTM_EIR_URL_TYPE;
4343 memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_url,
4344 p_bta_dm_eir_cfg->bta_dm_eir_url_len);
4345 p += p_bta_dm_eir_cfg->bta_dm_eir_url_len;
4346 free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_url_len + 2;
4347 } else {
4348 status = BTA_EIR_TOO_LARGE;
4349 }
4350 }
4351
4352 /* If there is no other data to be sent in the EIR packet, the Host shall
4353 * send a name tag with zero length and the type field set to indicate
4354 * that this is the complete name (i.e., total of 2 octets with length =
4355 * 1).
4356 */
4357 if (eir_type_num == 0) {
4358 UINT8_TO_STREAM(p, 1);
4359 UINT8_TO_STREAM(p, BTM_EIR_COMPLETE_LOCAL_NAME_TYPE);
4360 free_eir_length -= 2;
4361 }
4362
4363 if (free_eir_length) {
4364 UINT8_TO_STREAM(p, 0); /* terminator of significant part */
4365 }
4366
4367 tBTM_STATUS btm_status = BTM_WriteEIR( p_buf, p_bta_dm_eir_cfg->bta_dm_eir_fec_required );
4368
4369 if (btm_status == BTM_MODE_UNSUPPORTED) {
4370 status = BTA_WRONG_MODE;
4371 } else if (btm_status != BTM_SUCCESS) {
4372 status = BTA_FAILURE;
4373 }
4374
4375 if (p_bta_dm_eir_cfg->config_eir_callback) {
4376 p_bta_dm_eir_cfg->config_eir_callback(status, eir_type_num, eir_type);
4377 }
4378 }
4379 #endif
4380
4381 /*******************************************************************************
4382 **
4383 ** Function bta_dm_eir_search_services
4384 **
4385 ** Description This function searches services in received EIR
4386 **
4387 ** Returns None
4388 **
4389 *******************************************************************************/
4390 #if (SDP_INCLUDED == TRUE)
bta_dm_eir_search_services(tBTM_INQ_RESULTS * p_result,tBTA_SERVICE_MASK * p_services_to_search,tBTA_SERVICE_MASK * p_services_found)4391 static void bta_dm_eir_search_services( tBTM_INQ_RESULTS *p_result,
4392 tBTA_SERVICE_MASK *p_services_to_search,
4393 tBTA_SERVICE_MASK *p_services_found)
4394 {
4395 tBTA_SERVICE_MASK service_index = 0;
4396 tBTM_EIR_SEARCH_RESULT result;
4397
4398 APPL_TRACE_DEBUG("BTA searching services in EIR of BDA:0x%02X%02X%02X%02X%02X%02X",
4399 p_result->remote_bd_addr[0], p_result->remote_bd_addr[1],
4400 p_result->remote_bd_addr[2], p_result->remote_bd_addr[3],
4401 p_result->remote_bd_addr[4], p_result->remote_bd_addr[5]);
4402
4403 APPL_TRACE_DEBUG(" with services_to_search=0x%08X", *p_services_to_search);
4404
4405 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
4406 /* always do GATT based service discovery by SDP instead of from EIR */
4407 /* if GATT based service is also to be put in EIR, need to modify this */
4408 while (service_index < (BTA_MAX_SERVICE_ID - 1))
4409 #else
4410 while (service_index < BTA_MAX_SERVICE_ID)
4411 #endif
4412 {
4413 if ( *p_services_to_search
4414 & (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index))) {
4415 result = BTM_HasInquiryEirService( p_result,
4416 bta_service_id_to_uuid_lkup_tbl[service_index] );
4417
4418 /* Searching for HSP v1.2 only device */
4419 if ((result != BTM_EIR_FOUND) &&
4420 (bta_service_id_to_uuid_lkup_tbl[service_index] == UUID_SERVCLASS_HEADSET)) {
4421 result = BTM_HasInquiryEirService (p_result, UUID_SERVCLASS_HEADSET_HS);
4422 }
4423
4424 if ( result == BTM_EIR_FOUND ) {
4425 /* If Plug and Play service record, need to check to see if Broadcom stack */
4426 /* However, EIR data doesn't have EXT_BRCM_VERSION so just skip it */
4427 if ( bta_service_id_to_uuid_lkup_tbl[service_index]
4428 != UUID_SERVCLASS_PNP_INFORMATION ) {
4429
4430 *p_services_found |=
4431 (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index));
4432 /* remove the service from services to be searched */
4433 *p_services_to_search &=
4434 (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)));
4435 }
4436 } else if ( result == BTM_EIR_NOT_FOUND ) {
4437 /* remove the service from services to be searched */
4438 *p_services_to_search &=
4439 (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)));
4440 }
4441 }
4442
4443 service_index++;
4444 }
4445
4446 APPL_TRACE_ERROR("BTA EIR search result, services_to_search=0x%08X, services_found=0x%08X",
4447 *p_services_to_search, *p_services_found);
4448 }
4449 #endif ///SDP_INCLUDED == TRUE
4450
4451 #if (BTA_EIR_CANNED_UUID_LIST != TRUE)
4452 /*******************************************************************************
4453 **
4454 ** Function bta_dm_eir_update_uuid
4455 **
4456 ** Description This function adds or removes service UUID in EIR database.
4457 **
4458 ** Returns None
4459 **
4460 *******************************************************************************/
bta_dm_eir_update_uuid(tBT_UUID uuid,BOOLEAN adding)4461 void bta_dm_eir_update_uuid(tBT_UUID uuid, BOOLEAN adding)
4462 {
4463 /* 32 and 128-bit UUIDs go to the bta_dm_cb.custom_uuid array */
4464 if ((uuid.len == LEN_UUID_32) || (uuid.len == LEN_UUID_128)) {
4465 if (adding) {
4466 if (BTM_HasCustomEirService(bta_dm_cb.custom_uuid, uuid)) {
4467 APPL_TRACE_EVENT("UUID is already added for EIR");
4468 return;
4469 }
4470 APPL_TRACE_EVENT("Adding %d-bit UUID into EIR", uuid.len * 8);
4471
4472 BTM_AddCustomEirService(bta_dm_cb.custom_uuid, uuid);
4473 } else {
4474 APPL_TRACE_EVENT("Removing %d-bit UUID from EIR", uuid.len * 8);
4475
4476 BTM_RemoveCustomEirService(bta_dm_cb.custom_uuid, uuid);
4477 }
4478 } else {
4479 /* if this UUID is not advertised in EIR */
4480 if (!BTM_HasEirService(p_bta_dm_eir_cfg->uuid_mask, uuid.uu.uuid16)) {
4481 return;
4482 }
4483
4484 if (adding) {
4485 APPL_TRACE_EVENT("Adding UUID=0x%04X into EIR", uuid.uu.uuid16);
4486
4487 BTM_AddEirService(bta_dm_cb.eir_uuid, uuid.uu.uuid16);
4488 } else {
4489 APPL_TRACE_EVENT("Removing UUID=0x%04X from EIR", uuid.uu.uuid16);
4490
4491 BTM_RemoveEirService(bta_dm_cb.eir_uuid, uuid.uu.uuid16);
4492 }
4493 }
4494 #if CLASSIC_BT_INCLUDED
4495 bta_dm_set_eir (NULL);
4496 #endif
4497
4498 APPL_TRACE_EVENT("bta_dm_eir_update_uuid UUID bit mask=0x%08X %08X",
4499 bta_dm_cb.eir_uuid[1], bta_dm_cb.eir_uuid[0] );
4500 }
4501 #endif
4502
4503 /*******************************************************************************
4504 **
4505 ** Function bta_dm_enable_test_mode
4506 **
4507 ** Description enable test mode
4508 **
4509 **
4510 ** Returns void
4511 **
4512 *******************************************************************************/
bta_dm_enable_test_mode(tBTA_DM_MSG * p_data)4513 void bta_dm_enable_test_mode(tBTA_DM_MSG *p_data)
4514 {
4515 UNUSED(p_data);
4516 BTM_EnableTestMode();
4517 }
4518
4519 /*******************************************************************************
4520 **
4521 ** Function bta_dm_disable_test_mode
4522 **
4523 ** Description disable test mode
4524 **
4525 **
4526 ** Returns void
4527 **
4528 *******************************************************************************/
bta_dm_disable_test_mode(tBTA_DM_MSG * p_data)4529 void bta_dm_disable_test_mode(tBTA_DM_MSG *p_data)
4530 {
4531 UNUSED(p_data);
4532 BTM_DeviceReset(NULL);
4533 }
4534
4535 /*******************************************************************************
4536 **
4537 ** Function bta_dm_execute_callback
4538 **
4539 ** Description Just execute a generic call back in the context of the BTU/BTA tack
4540 **
4541 **
4542 ** Returns void
4543 **
4544 *******************************************************************************/
bta_dm_execute_callback(tBTA_DM_MSG * p_data)4545 void bta_dm_execute_callback(tBTA_DM_MSG *p_data)
4546 {
4547 /* sanity check */
4548 if (p_data->exec_cback.p_exec_cback == NULL) {
4549 return;
4550 }
4551
4552 p_data->exec_cback.p_exec_cback(p_data->exec_cback.p_param);
4553 }
4554
4555 /*******************************************************************************
4556 **
4557 ** Function bta_dm_encrypt_cback
4558 **
4559 ** Description link encryption complete callback.
4560 **
4561 ** Returns None
4562 **
4563 *******************************************************************************/
bta_dm_encrypt_cback(BD_ADDR bd_addr,tBT_TRANSPORT transport,void * p_ref_data,tBTM_STATUS result)4564 void bta_dm_encrypt_cback(BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, tBTM_STATUS result)
4565 {
4566 tBTA_STATUS bta_status = BTA_SUCCESS;
4567 tBTA_DM_ENCRYPT_CBACK *p_callback = NULL;
4568 UINT8 i ;
4569 UNUSED(p_ref_data);
4570
4571 for (i = 0; i < bta_dm_cb.device_list.count; i++) {
4572 if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, bd_addr) == 0 &&
4573 bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED) {
4574 break;
4575 }
4576 }
4577
4578 if (i < bta_dm_cb.device_list.count) {
4579 p_callback = bta_dm_cb.device_list.peer_device[i].p_encrypt_cback;
4580 bta_dm_cb.device_list.peer_device[i].p_encrypt_cback = NULL;
4581 }
4582
4583 switch (result) {
4584 case BTM_SUCCESS:
4585 break;
4586 case BTM_WRONG_MODE:
4587 bta_status = BTA_WRONG_MODE;
4588 break;
4589 case BTM_NO_RESOURCES:
4590 bta_status = BTA_NO_RESOURCES;
4591 break;
4592 case BTM_BUSY:
4593 bta_status = BTA_BUSY;
4594 break;
4595 default:
4596 bta_status = BTA_FAILURE;
4597 break;
4598 }
4599
4600 APPL_TRACE_DEBUG("bta_dm_encrypt_cback status =%d p_callback=%p", bta_status, p_callback);
4601
4602 if (p_callback) {
4603 (*p_callback)(bd_addr, transport, bta_status);
4604 }
4605 }
4606
4607 /*******************************************************************************
4608 **
4609 ** Function bta_dm_set_encryption
4610 **
4611 ** Description This function to encrypt the link
4612 **
4613 ** Returns None
4614 **
4615 *******************************************************************************/
4616 #if (SMP_INCLUDED == TRUE)
bta_dm_set_encryption(tBTA_DM_MSG * p_data)4617 void bta_dm_set_encryption (tBTA_DM_MSG *p_data)
4618 {
4619 UINT8 i ;
4620
4621 APPL_TRACE_DEBUG("bta_dm_set_encryption\n"); //todo
4622 if (!p_data->set_encryption.p_callback) {
4623 APPL_TRACE_ERROR("bta_dm_set_encryption callback is not provided\n");
4624 return;
4625 }
4626 for (i = 0; i < bta_dm_cb.device_list.count; i++) {
4627 if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_data->set_encryption.bd_addr) == 0 &&
4628 bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED) {
4629 break;
4630 }
4631 }
4632 if (i < bta_dm_cb.device_list.count) {
4633 if (bta_dm_cb.device_list.peer_device[i].p_encrypt_cback) {
4634 APPL_TRACE_ERROR("earlier enc was not done for same device\n");
4635 (*p_data->set_encryption.p_callback)(p_data->set_encryption.bd_addr,
4636 p_data->set_encryption.transport,
4637 BTA_BUSY);
4638 return;
4639 }
4640
4641 if (BTM_SetEncryption(p_data->set_encryption.bd_addr, p_data->set_encryption.transport,
4642 bta_dm_encrypt_cback, &p_data->set_encryption.sec_act)
4643 == BTM_CMD_STARTED) {
4644 bta_dm_cb.device_list.peer_device[i].p_encrypt_cback = p_data->set_encryption.p_callback;
4645 }
4646 }else{
4647 APPL_TRACE_ERROR("%s, not find peer_bdaddr or peer_bdaddr connection state error", __func__);
4648 }
4649 }
4650 #endif ///SMP_INCLUDED == TRUE
4651
4652 #if (BTA_HD_INCLUDED == TRUE)
bta_dm_check_if_only_hd_connected(BD_ADDR peer_addr)4653 BOOLEAN bta_dm_check_if_only_hd_connected(BD_ADDR peer_addr)
4654 {
4655 APPL_TRACE_DEBUG("%s: count(%d)", __func__, bta_dm_conn_srvcs.count);
4656 for (uint8_t j = 0; j < bta_dm_conn_srvcs.count; j++) {
4657 // Check if profiles other than hid are connected
4658 if ((bta_dm_conn_srvcs.conn_srvc[j].id != BTA_ID_HD) &&
4659 !bdcmp(bta_dm_conn_srvcs.conn_srvc[j].peer_bdaddr, peer_addr)) {
4660 APPL_TRACE_DEBUG("%s: Another profile (id=%d) is connected", __func__, bta_dm_conn_srvcs.conn_srvc[j].id);
4661 return FALSE;
4662 }
4663 }
4664 return TRUE;
4665 }
4666 #endif /* BTA_HD_INCLUDED == TRUE */
4667
4668 #if (BLE_INCLUDED == TRUE)
4669 /*******************************************************************************
4670 **
4671 ** Function bta_dm_observe_results_cb
4672 **
4673 ** Description Callback for BLE Observe result
4674 **
4675 **
4676 ** Returns void
4677 **
4678 *******************************************************************************/
bta_dm_observe_results_cb(tBTM_INQ_RESULTS * p_inq,UINT8 * p_eir)4679 static void bta_dm_observe_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir)
4680 {
4681 tBTA_DM_SEARCH result;
4682 tBTM_INQ_INFO *p_inq_info;
4683 APPL_TRACE_DEBUG("bta_dm_observe_results_cb")
4684
4685 bdcpy(result.inq_res.bd_addr, p_inq->remote_bd_addr);
4686 result.inq_res.rssi = p_inq->rssi;
4687 result.inq_res.ble_addr_type = p_inq->ble_addr_type;
4688 result.inq_res.inq_result_type = p_inq->inq_result_type;
4689 result.inq_res.device_type = p_inq->device_type;
4690 result.inq_res.flag = p_inq->flag;
4691 result.inq_res.adv_data_len = p_inq->adv_data_len;
4692 result.inq_res.scan_rsp_len = p_inq->scan_rsp_len;
4693 memcpy(result.inq_res.dev_class, p_inq->dev_class, sizeof(DEV_CLASS));
4694 result.inq_res.ble_evt_type = p_inq->ble_evt_type;
4695
4696 /* application will parse EIR to find out remote device name */
4697 result.inq_res.p_eir = p_eir;
4698
4699 if ((p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr)) != NULL) {
4700 /* initialize remt_name_not_required to FALSE so that we get the name by default */
4701 result.inq_res.remt_name_not_required = FALSE;
4702 }
4703
4704 if (bta_dm_search_cb.p_scan_cback) {
4705 bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_RES_EVT, &result);
4706 }
4707
4708 if (p_inq_info) {
4709 /* application indicates if it knows the remote name, inside the callback
4710 copy that to the inquiry data base*/
4711 if (result.inq_res.remt_name_not_required) {
4712 p_inq_info->appl_knows_rem_name = TRUE;
4713 }
4714 }
4715 }
4716
4717 /*******************************************************************************
4718 **
4719 ** Function bta_dm_observe_cmpl_cb
4720 **
4721 ** Description Callback for BLE Observe complete
4722 **
4723 **
4724 ** Returns void
4725 **
4726 *******************************************************************************/
bta_dm_observe_cmpl_cb(void * p_result)4727 static void bta_dm_observe_cmpl_cb (void *p_result)
4728 {
4729 tBTA_DM_SEARCH data;
4730
4731 APPL_TRACE_DEBUG("bta_dm_observe_cmpl_cb");
4732
4733 data.inq_cmpl.num_resps = ((tBTM_INQUIRY_CMPL *)p_result)->num_resp;
4734 if (bta_dm_search_cb.p_scan_cback) {
4735 bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_CMPL_EVT, &data);
4736 }
4737 }
4738
4739 /*******************************************************************************
4740 **
4741 ** Function bta_dm_observe_discard_cb
4742 **
4743 ** Description Callback for BLE Observe lost
4744 **
4745 **
4746 ** Returns void
4747 **
4748 *******************************************************************************/
bta_dm_observe_discard_cb(uint32_t num_dis)4749 static void bta_dm_observe_discard_cb (uint32_t num_dis)
4750 {
4751 tBTA_DM_SEARCH data;
4752
4753 APPL_TRACE_DEBUG("bta_dm_observe_discard_cb");
4754
4755 data.inq_dis.num_dis = num_dis;
4756 if (bta_dm_search_cb.p_scan_cback) {
4757 bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_DISCARD_NUM_EVT, &data);
4758 }
4759 }
4760
4761 #if (SMP_INCLUDED == TRUE)
4762 /*******************************************************************************
4763 **
4764 ** Function bta_dm_ble_smp_cback
4765 **
4766 ** Description Callback for BLE SMP
4767 **
4768 **
4769 ** Returns void
4770 **
4771 *******************************************************************************/
bta_dm_ble_smp_cback(tBTM_LE_EVT event,BD_ADDR bda,tBTM_LE_EVT_DATA * p_data)4772 static UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_DATA *p_data)
4773 {
4774 tBTM_STATUS status = BTM_SUCCESS;
4775 tBTA_DM_SEC sec_event;
4776 char *p_name = NULL;
4777
4778 if (!bta_dm_cb.p_sec_cback) {
4779 return BTM_NOT_AUTHORIZED;
4780 }
4781
4782 memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
4783 switch (event) {
4784 case BTM_LE_IO_REQ_EVT: {
4785 // #if (BT_SSP_INCLUDED == TRUE)
4786 bta_dm_co_ble_io_req(bda,
4787 &p_data->io_req.io_cap,
4788 &p_data->io_req.oob_data,
4789 &p_data->io_req.auth_req,
4790 &p_data->io_req.max_key_size,
4791 &p_data->io_req.init_keys,
4792 &p_data->io_req.resp_keys);
4793 // #endif
4794 #if BTM_OOB_INCLUDED == FALSE
4795 status = BTM_SUCCESS;
4796 #endif
4797 APPL_TRACE_EVENT("io mitm: %d oob_data:%d\n", p_data->io_req.auth_req, p_data->io_req.oob_data);
4798
4799 break;
4800 }
4801
4802 case BTM_LE_SEC_REQUEST_EVT:
4803 bdcpy(sec_event.ble_req.bd_addr, bda);
4804 p_name = BTM_SecReadDevName(bda);
4805 if (p_name != NULL) {
4806 BCM_STRNCPY_S((char *)sec_event.ble_req.bd_name, p_name, BD_NAME_LEN);
4807 sec_event.ble_req.bd_name[BD_NAME_LEN] = '\0';
4808 } else {
4809 sec_event.ble_req.bd_name[0] = '\0';
4810 }
4811 bta_dm_cb.p_sec_cback(BTA_DM_BLE_SEC_REQ_EVT, &sec_event);
4812 break;
4813
4814 case BTM_LE_KEY_NOTIF_EVT:
4815 bdcpy(sec_event.key_notif.bd_addr, bda);
4816 p_name = BTM_SecReadDevName(bda);
4817 if (p_name != NULL) {
4818 BCM_STRNCPY_S((char *)sec_event.key_notif.bd_name, p_name, BD_NAME_LEN);
4819 sec_event.key_notif.bd_name[BD_NAME_LEN] = '\0';
4820 } else {
4821 sec_event.key_notif.bd_name[0] = '\0';
4822 }
4823 sec_event.key_notif.passkey = p_data->key_notif;
4824 bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_NOTIF_EVT, &sec_event);
4825 break;
4826
4827 case BTM_LE_KEY_REQ_EVT:
4828 bdcpy(sec_event.ble_req.bd_addr, bda);
4829 bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_REQ_EVT, &sec_event);
4830 break;
4831
4832 case BTM_LE_OOB_REQ_EVT:
4833 bdcpy(sec_event.ble_req.bd_addr, bda);
4834 bta_dm_cb.p_sec_cback(BTA_DM_BLE_OOB_REQ_EVT, &sec_event);
4835 break;
4836
4837 case BTM_LE_SC_OOB_REQ_EVT:
4838 bdcpy(sec_event.ble_req.bd_addr, bda);
4839 bta_dm_cb.p_sec_cback(BTA_DM_BLE_SC_OOB_REQ_EVT, &sec_event);
4840 break;
4841
4842 case BTM_LE_SC_LOC_OOB_EVT:
4843 memcpy(sec_event.local_oob_data.local_oob_c, p_data->local_oob_data.commitment, BT_OCTET16_LEN);
4844 memcpy(sec_event.local_oob_data.local_oob_r, p_data->local_oob_data.randomizer, BT_OCTET16_LEN);
4845 bta_dm_cb.p_sec_cback(BTA_DM_BLE_SC_CR_LOC_OOB_EVT, &sec_event);
4846 break;
4847
4848 case BTM_LE_NC_REQ_EVT:
4849 bdcpy(sec_event.key_notif.bd_addr, bda);
4850 BCM_STRNCPY_S((char *)sec_event.key_notif.bd_name,bta_dm_get_remname(), BD_NAME_LEN);
4851 sec_event.key_notif.bd_name[BD_NAME_LEN] = '\0';
4852 sec_event.key_notif.passkey = p_data->key_notif;
4853 bta_dm_cb.p_sec_cback(BTA_DM_BLE_NC_REQ_EVT, &sec_event);
4854 break;
4855
4856 case BTM_LE_KEY_EVT:
4857 bdcpy(sec_event.ble_key.bd_addr, bda);
4858 sec_event.ble_key.key_type = p_data->key.key_type;
4859 sec_event.ble_key.p_key_value = p_data->key.p_key_value;
4860 bta_dm_cb.p_sec_cback(BTA_DM_BLE_KEY_EVT, &sec_event);
4861 break;
4862
4863 case BTM_LE_COMPLT_EVT:
4864 bdcpy(sec_event.auth_cmpl.bd_addr, bda);
4865 #if BLE_INCLUDED == TRUE
4866 BTM_ReadDevInfo(bda, &sec_event.auth_cmpl.dev_type, &sec_event.auth_cmpl.addr_type);
4867 #endif
4868 p_name = BTM_SecReadDevName(bda);
4869 if (p_name != NULL) {
4870 BCM_STRNCPY_S((char *)sec_event.auth_cmpl.bd_name, p_name, BD_NAME_LEN);
4871 sec_event.auth_cmpl.bd_name[BD_NAME_LEN] = '\0';
4872 } else {
4873 sec_event.auth_cmpl.bd_name[0] = '\0';
4874 }
4875 if (p_data->complt.reason != 0) {
4876 sec_event.auth_cmpl.fail_reason = BTA_DM_AUTH_CONVERT_SMP_CODE(((UINT8)p_data->complt.reason));
4877 /* delete this device entry from Sec Dev DB */
4878 bta_dm_remove_sec_dev_entry (bda);
4879 } else {
4880 sec_event.auth_cmpl.success = TRUE;
4881 if (!p_data->complt.smp_over_br) {
4882
4883 }
4884 }
4885 sec_event.auth_cmpl.auth_mode = p_data->complt.auth_mode;
4886 if (bta_dm_cb.p_sec_cback) {
4887 //bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
4888 bta_dm_cb.p_sec_cback(BTA_DM_BLE_AUTH_CMPL_EVT, &sec_event);
4889 }
4890
4891 break;
4892
4893 default:
4894 status = BTM_NOT_AUTHORIZED;
4895 break;
4896 }
4897 return status;
4898 }
4899
4900 /*******************************************************************************
4901 **
4902 ** Function bta_dm_ble_id_key_cback
4903 **
4904 ** Description Callback for BLE local ID keys
4905 **
4906 **
4907 ** Returns void
4908 **
4909 *******************************************************************************/
bta_dm_ble_id_key_cback(UINT8 key_type,tBTM_BLE_LOCAL_KEYS * p_key)4910 static void bta_dm_ble_id_key_cback (UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key)
4911 {
4912 UINT8 evt;
4913 tBTA_DM_SEC dm_key;
4914
4915 switch (key_type) {
4916 case BTM_BLE_KEY_TYPE_ID:
4917 case BTM_BLE_KEY_TYPE_ER:
4918 if (bta_dm_cb.p_sec_cback) {
4919 memcpy(&dm_key.ble_id_keys, p_key, sizeof(tBTM_BLE_LOCAL_KEYS));
4920
4921 evt = (key_type == BTM_BLE_KEY_TYPE_ID) ? BTA_DM_BLE_LOCAL_IR_EVT : \
4922 BTA_DM_BLE_LOCAL_ER_EVT;
4923 bta_dm_cb.p_sec_cback(evt, &dm_key);
4924 }
4925 break;
4926
4927 default:
4928 APPL_TRACE_DEBUG("Unknown key type %d", key_type);
4929 break;
4930 }
4931 return;
4932
4933 }
4934
4935 /*******************************************************************************
4936 **
4937 ** Function bta_dm_add_blekey
4938 **
4939 ** Description This function adds an BLE Key to an security database entry.
4940 ** This function shall only be called AFTER BTA_DmAddBleDevice has been called.
4941 ** It is normally called during host startup to restore all required information
4942 ** stored in the NVRAM.
4943 **
4944 ** Parameters:
4945 **
4946 *******************************************************************************/
bta_dm_add_blekey(tBTA_DM_MSG * p_data)4947 void bta_dm_add_blekey (tBTA_DM_MSG *p_data)
4948 {
4949 if (!BTM_SecAddBleKey (p_data->add_ble_key.bd_addr,
4950 (tBTM_LE_KEY_VALUE *)&p_data->add_ble_key.blekey,
4951 p_data->add_ble_key.key_type)) {
4952 APPL_TRACE_ERROR ("BTA_DM: Error adding BLE Key for device %08x%04x",
4953 (p_data->add_ble_key.bd_addr[0] << 24) + (p_data->add_ble_key.bd_addr[1] << 16) + \
4954 (p_data->add_ble_key.bd_addr[2] << 8) + p_data->add_ble_key.bd_addr[3],
4955 (p_data->add_ble_key.bd_addr[4] << 8) + p_data->add_ble_key.bd_addr[5]);
4956 }
4957 }
4958
4959 /*******************************************************************************
4960 **
4961 ** Function bta_dm_add_ble_device
4962 **
4963 ** Description This function adds an BLE device to an security database entry.
4964 ** It is normally called during host startup to restore all required information
4965 ** stored in the NVRAM.
4966 **
4967 ** Parameters:
4968 **
4969 *******************************************************************************/
bta_dm_add_ble_device(tBTA_DM_MSG * p_data)4970 void bta_dm_add_ble_device (tBTA_DM_MSG *p_data)
4971 {
4972 if (!BTM_SecAddBleDevice (p_data->add_ble_device.bd_addr, NULL,
4973 p_data->add_ble_device.dev_type ,
4974 p_data->add_ble_device.addr_type,
4975 p_data->add_ble_device.auth_mode)) {
4976 APPL_TRACE_ERROR ("BTA_DM: Error adding BLE Device for device %08x%04x",
4977 (p_data->add_ble_device.bd_addr[0] << 24) + (p_data->add_ble_device.bd_addr[1] << 16) + \
4978 (p_data->add_ble_device.bd_addr[2] << 8) + p_data->add_ble_device.bd_addr[3],
4979 (p_data->add_ble_device.bd_addr[4] << 8) + p_data->add_ble_device.bd_addr[5]);
4980 }
4981 }
4982
4983 /*******************************************************************************
4984 **
4985 ** Function bta_dm_add_ble_device
4986 **
4987 ** Description This function adds an BLE device to an security database entry.
4988 ** It is normally called during host startup to restore all required information
4989 ** stored in the NVRAM.
4990 **
4991 ** Parameters:
4992 **
4993 *******************************************************************************/
bta_dm_ble_passkey_reply(tBTA_DM_MSG * p_data)4994 void bta_dm_ble_passkey_reply (tBTA_DM_MSG *p_data)
4995 {
4996 if (p_data->pin_reply.accept) {
4997 BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_SUCCESS, p_data->ble_passkey_reply.passkey);
4998 } else {
4999 BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_NOT_AUTHORIZED, p_data->ble_passkey_reply.passkey);
5000 }
5001
5002 }
5003
bta_dm_ble_set_static_passkey(tBTA_DM_MSG * p_data)5004 void bta_dm_ble_set_static_passkey(tBTA_DM_MSG *p_data)
5005 {
5006 BTM_BleSetStaticPasskey(p_data->ble_set_static_passkey.add, p_data->ble_set_static_passkey.static_passkey);
5007 }
5008 /*******************************************************************************
5009 **
5010 ** Function bta_dm_ble_confirm_reply
5011 **
5012 ** Description This is response to SM numeric comparison request submitted
5013 ** to application.
5014 **
5015 ** Parameters:
5016 **
5017 *******************************************************************************/
bta_dm_ble_confirm_reply(tBTA_DM_MSG * p_data)5018 void bta_dm_ble_confirm_reply (tBTA_DM_MSG *p_data)
5019 {
5020 if (p_data->confirm.accept) {
5021 BTM_BleConfirmReply(p_data->confirm.bd_addr, BTM_SUCCESS);
5022 } else {
5023 BTM_BleConfirmReply(p_data->ble_passkey_reply.bd_addr, BTM_NOT_AUTHORIZED);
5024 }
5025 }
5026
5027 /*******************************************************************************
5028 **
5029 ** Function bta_dm_security_grant
5030 **
5031 ** Description This function grant SMP security request access.
5032 **
5033 ** Parameters:
5034 **
5035 *******************************************************************************/
bta_dm_security_grant(tBTA_DM_MSG * p_data)5036 void bta_dm_security_grant (tBTA_DM_MSG *p_data)
5037 {
5038 BTM_SecurityGrant(p_data->ble_sec_grant.bd_addr, p_data->ble_sec_grant.res);
5039 }
5040 #endif ///SMP_INCLUDED == TRUE
5041
5042 /*******************************************************************************
5043 **
5044 ** Function bta_dm_ble_set_bg_conn_type
5045 **
5046 ** Description This function set the BLE background connection type
5047 **
5048 ** Parameters:
5049 **
5050 *******************************************************************************/
bta_dm_ble_set_bg_conn_type(tBTA_DM_MSG * p_data)5051 void bta_dm_ble_set_bg_conn_type (tBTA_DM_MSG *p_data)
5052 {
5053 BTM_BleSetBgConnType(p_data->ble_set_bd_conn_type.bg_conn_type,
5054 p_data->ble_set_bd_conn_type.p_select_cback);
5055 }
5056
5057 /*******************************************************************************
5058 **
5059 ** Function bta_dm_ble_set_conn_params
5060 **
5061 ** Description This function set the preferred connection parameters.
5062 **
5063 ** Parameters:
5064 **
5065 *******************************************************************************/
bta_dm_ble_set_conn_params(tBTA_DM_MSG * p_data)5066 void bta_dm_ble_set_conn_params (tBTA_DM_MSG *p_data)
5067 {
5068 BTM_BleSetPrefConnParams(p_data->ble_set_conn_params.peer_bda,
5069 p_data->ble_set_conn_params.conn_int_min,
5070 p_data->ble_set_conn_params.conn_int_max,
5071 p_data->ble_set_conn_params.slave_latency,
5072 p_data->ble_set_conn_params.supervision_tout);
5073
5074 BTM_BleConfigConnParams(p_data->ble_set_conn_params.conn_int_min, p_data->ble_set_conn_params.conn_int_max,
5075 p_data->ble_set_conn_params.slave_latency, p_data->ble_set_conn_params.supervision_tout);
5076 }
5077
5078 /*******************************************************************************
5079 **
5080 ** Function bta_dm_ble_set_conn_scan_params
5081 **
5082 ** Description This function sets BLE scan parameters.
5083 **
5084 ** Parameters:
5085 **
5086 *******************************************************************************/
bta_dm_ble_set_scan_params(tBTA_DM_MSG * p_data)5087 void bta_dm_ble_set_scan_params(tBTA_DM_MSG *p_data)
5088 {
5089 BTM_BleSetScanParams(p_data->ble_set_scan_params.client_if,
5090 p_data->ble_set_scan_params.scan_int,
5091 p_data->ble_set_scan_params.scan_window,
5092 p_data->ble_set_scan_params.scan_mode,
5093 p_data->ble_set_scan_params.scan_param_setup_cback);
5094 }
5095
5096 /*******************************************************************************
5097 **
5098 ** Function bta_dm_ble_set_scan_fil_params
5099 **
5100 ** Description This function sets BLE scan filter & parameters.
5101 **
5102 ** Parameters:
5103 **
5104 *******************************************************************************/
bta_dm_ble_set_scan_fil_params(tBTA_DM_MSG * p_data)5105 void bta_dm_ble_set_scan_fil_params(tBTA_DM_MSG *p_data)
5106 {
5107 tBTA_STATUS status = BTA_FAILURE;
5108
5109 if (BTM_BleSetScanFilterParams (p_data->ble_set_scan_fil_params.client_if,
5110 p_data->ble_set_scan_fil_params.scan_int,
5111 p_data->ble_set_scan_fil_params.scan_window,
5112 p_data->ble_set_scan_fil_params.scan_mode,
5113 p_data->ble_set_scan_fil_params.addr_type_own,
5114 p_data->ble_set_scan_fil_params.scan_duplicate_filter,
5115 p_data->ble_set_scan_fil_params.scan_filter_policy,
5116 p_data->ble_set_scan_fil_params.scan_param_setup_cback) == BTM_SUCCESS) {
5117 status = BTA_SUCCESS;
5118
5119 } else {
5120 APPL_TRACE_ERROR("%s(), fail to set scan params.", __func__);
5121 }
5122 if (p_data->ble_set_scan_fil_params.scan_param_setup_cback != NULL) {
5123 p_data->ble_set_scan_fil_params.scan_param_setup_cback(p_data->ble_set_scan_fil_params.client_if, status);
5124 }
5125
5126 }
5127
5128
5129 /*******************************************************************************
5130 **
5131 ** Function bta_dm_ble_set_conn_scan_params
5132 **
5133 ** Description This function set the preferred connection scan parameters.
5134 **
5135 ** Parameters:
5136 **
5137 *******************************************************************************/
bta_dm_ble_set_conn_scan_params(tBTA_DM_MSG * p_data)5138 void bta_dm_ble_set_conn_scan_params (tBTA_DM_MSG *p_data)
5139 {
5140 BTM_BleSetConnScanParams(p_data->ble_set_conn_scan_params.scan_int,
5141 p_data->ble_set_conn_scan_params.scan_window);
5142 }
5143 /*******************************************************************************
5144 **
5145 ** Function bta_dm_ble_update_conn_params
5146 **
5147 ** Description This function update LE connection parameters.
5148 **
5149 ** Parameters:
5150 **
5151 *******************************************************************************/
bta_dm_ble_update_conn_params(tBTA_DM_MSG * p_data)5152 void bta_dm_ble_update_conn_params (tBTA_DM_MSG *p_data)
5153 {
5154 if (!L2CA_UpdateBleConnParams(p_data->ble_update_conn_params.bd_addr,
5155 p_data->ble_update_conn_params.min_int,
5156 p_data->ble_update_conn_params.max_int,
5157 p_data->ble_update_conn_params.latency,
5158 p_data->ble_update_conn_params.timeout)) {
5159 APPL_TRACE_ERROR("Update connection parameters failed!");
5160 }
5161 }
5162 /*******************************************************************************
5163 **
5164 ** Function bta_dm_ble_disconnect
5165 **
5166 ** Description This function disconnect the ble connection.
5167 **
5168 ** Parameters:
5169 **
5170 *******************************************************************************/
bta_dm_ble_disconnect(tBTA_DM_MSG * p_data)5171 void bta_dm_ble_disconnect (tBTA_DM_MSG *p_data)
5172 {
5173 L2CA_BleDisconnect(p_data->ble_disconnect.remote_bda);
5174 }
5175
5176 /*******************************************************************************
5177 **
5178 ** Function bta_dm_ble_set_rand_address
5179 **
5180 ** Description This function set the LE random address for the device.
5181 **
5182 ** Parameters: rand_addr:the random address which should be setting
5183 ** Explanation: This function added by Yulong at 2016/9/9
5184 *******************************************************************************/
bta_dm_ble_set_rand_address(tBTA_DM_MSG * p_data)5185 void bta_dm_ble_set_rand_address(tBTA_DM_MSG *p_data)
5186 {
5187 tBTM_STATUS status = BTM_SET_STATIC_RAND_ADDR_FAIL;
5188 if (p_data->set_addr.addr_type != BLE_ADDR_RANDOM) {
5189 APPL_TRACE_ERROR("Invalid random address type = %d\n", p_data->set_addr.addr_type);
5190 if(p_data->set_addr.p_set_rand_addr_cback) {
5191 (*p_data->set_addr.p_set_rand_addr_cback)(status);
5192 }
5193 return;
5194 }
5195 //send the setting random address to BTM layer
5196 status = BTM_BleSetRandAddress(p_data->set_addr.address);
5197 if(p_data->set_addr.p_set_rand_addr_cback) {
5198 (*p_data->set_addr.p_set_rand_addr_cback)(status);
5199 }
5200
5201 }
5202
bta_dm_ble_clear_rand_address(tBTA_DM_MSG * p_data)5203 void bta_dm_ble_clear_rand_address(tBTA_DM_MSG *p_data)
5204 {
5205 UNUSED(p_data);
5206 BTM_BleClearRandAddress();
5207 }
5208
5209 /*******************************************************************************
5210 **
5211 ** Function bta_dm_ble_stop_advertising
5212 **
5213 ** Description This function stop the BLE avdertising for the device.
5214 **
5215 ** Parameters: void
5216 ** Explanation: This function added by Yulong at 2016/10/19
5217 *******************************************************************************/
bta_dm_ble_stop_advertising(tBTA_DM_MSG * p_data)5218 void bta_dm_ble_stop_advertising(tBTA_DM_MSG *p_data)
5219 {
5220 if (p_data->hdr.event != BTA_DM_API_BLE_STOP_ADV_EVT) {
5221 APPL_TRACE_ERROR("Invalid BTA event,can't stop the BLE adverting\n");
5222 }
5223
5224 btm_ble_stop_adv();
5225 }
5226
5227
5228
5229 #if BLE_PRIVACY_SPT == TRUE
5230 /*******************************************************************************
5231 **
5232 ** Function bta_dm_ble_config_local_privacy
5233 **
5234 ** Description This function set the local device LE privacy settings.
5235 **
5236 ** Parameters:
5237 **
5238 *******************************************************************************/
bta_dm_ble_config_local_privacy(tBTA_DM_MSG * p_data)5239 void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data)
5240 {
5241 BTM_BleConfigPrivacy (p_data->ble_local_privacy.privacy_enable, p_data->ble_local_privacy.set_local_privacy_cback);
5242 }
5243 #endif
5244
5245 /*******************************************************************************
5246 **
5247 ** Function bta_dm_ble_config_local_icon
5248 **
5249 ** Description This function sets the local icon value.
5250 **
5251 **
5252 *******************************************************************************/
bta_dm_ble_config_local_icon(tBTA_DM_MSG * p_data)5253 void bta_dm_ble_config_local_icon (tBTA_DM_MSG *p_data)
5254 {
5255 BTM_BleConfigLocalIcon (p_data->ble_local_icon.icon);
5256 }
5257
5258 /*******************************************************************************
5259 **
5260 ** Function bta_dm_ble_observe
5261 **
5262 ** Description This function set the preferred connection scan parameters.
5263 **
5264 ** Parameters:
5265 **
5266 *******************************************************************************/
bta_dm_ble_observe(tBTA_DM_MSG * p_data)5267 void bta_dm_ble_observe (tBTA_DM_MSG *p_data)
5268 {
5269 tBTM_STATUS status;
5270 if (p_data->ble_observe.start) {
5271 /*Save the callback to be called when a scan results are available */
5272 bta_dm_search_cb.p_scan_cback = p_data->ble_observe.p_cback;
5273
5274 if ((status = BTM_BleObserve(TRUE, p_data->ble_observe.duration,
5275 bta_dm_observe_results_cb, bta_dm_observe_cmpl_cb)) != BTM_CMD_STARTED) {
5276 APPL_TRACE_WARNING(" %s start observe failed. status=0x%x\n", __FUNCTION__, status);
5277 }
5278
5279 if (p_data->ble_observe.p_start_scan_cback) {
5280 status = (status == BTM_CMD_STARTED ? BTA_SUCCESS : BTA_FAILURE);
5281 p_data->ble_observe.p_start_scan_cback(status);
5282 }
5283 } else {
5284 bta_dm_search_cb.p_scan_cback = NULL;
5285 status = BTM_BleObserve(FALSE, 0, NULL, NULL);
5286
5287 if (status != BTM_CMD_STARTED){
5288 APPL_TRACE_WARNING(" %s stop observe failed, status=0x%x\n", __FUNCTION__, status);
5289 }
5290
5291 if (p_data->ble_observe.p_stop_scan_cback) {
5292 status = (status == BTM_CMD_STARTED ? BTA_SUCCESS : BTA_FAILURE);
5293 p_data->ble_observe.p_stop_scan_cback(status);
5294 }
5295 }
5296 }
5297
5298 /*******************************************************************************
5299 **
5300 ** Function bta_dm_ble_scan
5301 **
5302 ** Description This function set the preferred connection scan parameters.
5303 **
5304 ** Parameters:
5305 **
5306 *******************************************************************************/
bta_dm_ble_scan(tBTA_DM_MSG * p_data)5307 void bta_dm_ble_scan (tBTA_DM_MSG *p_data)
5308 {
5309 tBTM_STATUS status;
5310 if (p_data->ble_scan.start) {
5311 /*Save the callback to be called when a scan results are available */
5312 bta_dm_search_cb.p_scan_cback = p_data->ble_scan.p_cback;
5313
5314 if ((status = BTM_BleScan(TRUE, p_data->ble_scan.duration,
5315 bta_dm_observe_results_cb, bta_dm_observe_cmpl_cb, bta_dm_observe_discard_cb)) != BTM_CMD_STARTED) {
5316 APPL_TRACE_WARNING(" %s start scan failed. status=0x%x\n", __FUNCTION__, status);
5317 }
5318
5319 if (p_data->ble_scan.p_start_scan_cback) {
5320 status = (status == BTM_CMD_STARTED ? BTA_SUCCESS : BTA_FAILURE);
5321 p_data->ble_scan.p_start_scan_cback(status);
5322 }
5323 } else {
5324 bta_dm_search_cb.p_scan_cback = NULL;
5325 status = BTM_BleScan(FALSE, 0, NULL, NULL, NULL);
5326
5327 if (status != BTM_CMD_STARTED){
5328 APPL_TRACE_WARNING(" %s stop scan failed, status=0x%x\n", __FUNCTION__, status);
5329 }
5330
5331 if (p_data->ble_scan.p_stop_scan_cback) {
5332 status = (status == BTM_CMD_STARTED ? BTA_SUCCESS : BTA_FAILURE);
5333 p_data->ble_scan.p_stop_scan_cback(status);
5334 }
5335
5336 // reset BLE scan link state when stop scan
5337 btm_ble_clear_topology_mask(BTM_BLE_STATE_ACTIVE_SCAN_BIT);
5338 btm_ble_clear_topology_mask(BTM_BLE_STATE_PASSIVE_SCAN_BIT);
5339 }
5340 }
5341
5342 /*******************************************************************************
5343 **
5344 ** Function bta_dm_ble_set_adv_params
5345 **
5346 ** Description This function set the adv parameters.
5347 **
5348 ** Parameters:
5349 **
5350 *******************************************************************************/
bta_dm_ble_set_adv_params(tBTA_DM_MSG * p_data)5351 void bta_dm_ble_set_adv_params (tBTA_DM_MSG *p_data)
5352 {
5353 BTM_BleSetAdvParams(p_data->ble_set_adv_params.adv_int_min,
5354 p_data->ble_set_adv_params.adv_int_max,
5355 p_data->ble_set_adv_params.p_dir_bda,
5356 BTA_DM_BLE_ADV_CHNL_MAP);
5357 }
5358
5359 /*******************************************************************************
5360 **
5361 ** Function bta_dm_ble_set_adv_params_all
5362 **
5363 ** Description This function is called to set all of the advertising parameters.
5364 **
5365 ** Parameters: None.
5366 **
5367 ** Returns void
5368 **
5369 *******************************************************************************/
bta_dm_ble_set_adv_params_all(tBTA_DM_MSG * p_data)5370 void bta_dm_ble_set_adv_params_all (tBTA_DM_MSG *p_data)
5371 {
5372 tBTA_STATUS status = BTA_FAILURE;
5373 if (BTM_BleSetAdvParamsAll(p_data->ble_set_adv_params_all.adv_int_min,
5374 p_data->ble_set_adv_params_all.adv_int_max,
5375 p_data->ble_set_adv_params_all.adv_type,
5376 p_data->ble_set_adv_params_all.addr_type_own,
5377 p_data->ble_set_adv_params_all.p_dir_bda,
5378 p_data->ble_set_adv_params_all.channel_map,
5379 p_data->ble_set_adv_params_all.adv_filter_policy,
5380 p_data->ble_set_adv_params_all.p_start_adv_cback) == BTM_SUCCESS) {
5381 APPL_TRACE_DEBUG("%s(), success to set ble adv params.", __func__);
5382 } else {
5383 APPL_TRACE_ERROR("%s(), fail to set ble adv params.", __func__);
5384 if(p_data->ble_set_adv_params_all.p_start_adv_cback) {
5385 (*p_data->ble_set_adv_params_all.p_start_adv_cback)(status);
5386 }
5387 return;
5388 }
5389 if(BTM_BleStartAdv() == BTM_SUCCESS) {
5390 status = BTA_SUCCESS;
5391 }
5392 if(p_data->ble_set_adv_params_all.p_start_adv_cback) {
5393 (*p_data->ble_set_adv_params_all.p_start_adv_cback)(status);
5394 }
5395 }
5396
5397 /*******************************************************************************
5398 **
5399 ** Function bta_dm_ble_update_duplicate_exceptional_list
5400 **
5401 ** Description This function is to update duplicate scan exceptional list
5402 **
5403 **
5404 *******************************************************************************/
bta_dm_ble_update_duplicate_exceptional_list(tBTA_DM_MSG * p_data)5405 void bta_dm_ble_update_duplicate_exceptional_list(tBTA_DM_MSG *p_data)
5406 {
5407 BTM_UpdateBleDuplicateExceptionalList(p_data->ble_duplicate_exceptional_list.subcode,
5408 p_data->ble_duplicate_exceptional_list.type,
5409 p_data->ble_duplicate_exceptional_list.device_info,
5410 p_data->ble_duplicate_exceptional_list.exceptional_list_cb);
5411 }
5412
5413 /*******************************************************************************
5414 **
5415 ** Function bta_dm_ble_set_adv_config
5416 **
5417 ** Description This function set the customized ADV data configuration
5418 **
5419 ** Parameters:
5420 **
5421 *******************************************************************************/
bta_dm_ble_set_adv_config(tBTA_DM_MSG * p_data)5422 void bta_dm_ble_set_adv_config (tBTA_DM_MSG *p_data)
5423 {
5424 tBTA_STATUS status = BTA_FAILURE;
5425
5426 if (BTM_BleWriteAdvData(p_data->ble_set_adv_data.data_mask,
5427 (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg) == BTM_SUCCESS) {
5428 status = BTA_SUCCESS;
5429 }
5430
5431 if (p_data->ble_set_adv_data.p_adv_data_cback) {
5432 (*p_data->ble_set_adv_data.p_adv_data_cback)(status);
5433 }
5434 }
5435
5436 /*******************************************************************************
5437 **
5438 ** Function bta_dm_ble_set_long_adv
5439 **
5440 ** Description This function set the long ADV data
5441 **
5442 ** Parameters:
5443 **
5444 *******************************************************************************/
bta_dm_ble_set_long_adv(tBTA_DM_MSG * p_data)5445 void bta_dm_ble_set_long_adv (tBTA_DM_MSG *p_data)
5446 {
5447 tBTA_STATUS status = BTA_FAILURE;
5448
5449 if (BTM_BleWriteLongAdvData(p_data->ble_set_long_adv_data.adv_data,
5450 p_data->ble_set_long_adv_data.adv_data_len) == BTM_SUCCESS) {
5451 status = BTA_SUCCESS;
5452 }
5453
5454 if (p_data->ble_set_adv_data.p_adv_data_cback) {
5455 (*p_data->ble_set_adv_data.p_adv_data_cback)(status);
5456 }
5457 }
5458
5459 /*******************************************************************************
5460 **
5461 ** Function bta_dm_ble_set_adv_config_raw
5462 **
5463 ** Description This function set the customized ADV data configuration
5464 **
5465 ** Parameters:
5466 **
5467 *******************************************************************************/
bta_dm_ble_set_adv_config_raw(tBTA_DM_MSG * p_data)5468 void bta_dm_ble_set_adv_config_raw (tBTA_DM_MSG *p_data)
5469 {
5470 tBTA_STATUS status = BTA_FAILURE;
5471
5472 if (BTM_BleWriteAdvDataRaw(p_data->ble_set_adv_data_raw.p_raw_adv,
5473 p_data->ble_set_adv_data_raw.raw_adv_len) == BTM_SUCCESS) {
5474 status = BTA_SUCCESS;
5475 }
5476
5477 if (p_data->ble_set_adv_data_raw.p_adv_data_cback) {
5478 (*p_data->ble_set_adv_data_raw.p_adv_data_cback)(status);
5479 }
5480 }
5481
5482
5483 /*******************************************************************************
5484 **
5485 ** Function bta_dm_ble_set_scan_rsp
5486 **
5487 ** Description This function set the customized ADV scan resp. configuration
5488 **
5489 ** Parameters:
5490 **
5491 *******************************************************************************/
bta_dm_ble_set_scan_rsp(tBTA_DM_MSG * p_data)5492 void bta_dm_ble_set_scan_rsp (tBTA_DM_MSG *p_data)
5493 {
5494 tBTA_STATUS status = BTA_FAILURE;
5495
5496 if (BTM_BleWriteScanRsp(p_data->ble_set_adv_data.data_mask,
5497 (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg) == BTM_SUCCESS) {
5498 status = BTA_SUCCESS;
5499 }
5500
5501 if (p_data->ble_set_adv_data.p_adv_data_cback) {
5502 (*p_data->ble_set_adv_data.p_adv_data_cback)(status);
5503 }
5504 }
5505
5506 /*******************************************************************************
5507 **
5508 ** Function bta_dm_ble_set_scan_rsp_raw
5509 **
5510 ** Description This function set the raw scan response data
5511 **
5512 ** Parameters:
5513 **
5514 *******************************************************************************/
bta_dm_ble_set_scan_rsp_raw(tBTA_DM_MSG * p_data)5515 void bta_dm_ble_set_scan_rsp_raw (tBTA_DM_MSG *p_data)
5516 {
5517 tBTA_STATUS status = BTA_FAILURE;
5518
5519 if (BTM_BleWriteScanRspRaw(p_data->ble_set_adv_data_raw.p_raw_adv,
5520 p_data->ble_set_adv_data_raw.raw_adv_len) == BTM_SUCCESS) {
5521 status = BTA_SUCCESS;
5522 }
5523
5524 if (p_data->ble_set_adv_data_raw.p_adv_data_cback) {
5525 (*p_data->ble_set_adv_data_raw.p_adv_data_cback)(status);
5526 }
5527 }
5528
5529 /*******************************************************************************
5530 **
5531 ** Function bta_dm_ble_set_data_length
5532 **
5533 ** Description This function set the maximum transmission packet size
5534 **
5535 ** Parameters
5536 **
5537 *******************************************************************************/
bta_dm_ble_set_data_length(tBTA_DM_MSG * p_data)5538 void bta_dm_ble_set_data_length(tBTA_DM_MSG *p_data)
5539 {
5540 UINT8 status = BTM_SUCCESS;
5541 tACL_CONN *p_acl_cb = btm_bda_to_acl(p_data->ble_set_data_length.remote_bda, BT_TRANSPORT_LE);
5542 if (p_acl_cb == NULL) {
5543 APPL_TRACE_ERROR("%s error: Invalid connection remote_bda.", __func__);
5544 return;
5545 }
5546
5547 p_acl_cb->p_set_pkt_data_cback = p_data->ble_set_data_length.p_set_pkt_data_cback;
5548 // if the value of the data length is same, trigger callback directly
5549 if(p_data->ble_set_data_length.tx_data_length == p_acl_cb->data_length_params.tx_len) {
5550 if(p_data->ble_set_data_length.p_set_pkt_data_cback) {
5551 (*p_data->ble_set_data_length.p_set_pkt_data_cback)(status, &p_acl_cb->data_length_params);
5552 }
5553 return;
5554 }
5555
5556 if(p_acl_cb->data_len_updating) {
5557 // already have one cmd
5558 if(p_acl_cb->data_len_waiting) {
5559 status = BTM_ILLEGAL_ACTION;
5560 } else {
5561 // save the command
5562 p_acl_cb->p_set_data_len_cback_waiting = p_data->ble_set_data_length.p_set_pkt_data_cback;
5563 p_acl_cb->tx_len_waiting = p_data->ble_set_data_length.tx_data_length;
5564 p_acl_cb->data_len_waiting = true;
5565 return;
5566 }
5567 } else {
5568 status = BTM_SetBleDataLength(p_data->ble_set_data_length.remote_bda,
5569 p_data->ble_set_data_length.tx_data_length);
5570 }
5571 if (status != BTM_SUCCESS) {
5572 APPL_TRACE_ERROR("%s failed\n", __FUNCTION__);
5573 }
5574 if (p_data->ble_set_data_length.p_set_pkt_data_cback && status != BTM_SUCCESS) {
5575 if (p_acl_cb->data_length_params.tx_len == 0){
5576 uint16_t length = controller_get_interface()->get_acl_data_size_ble();
5577 p_acl_cb->data_length_params.rx_len = length;
5578 p_acl_cb->data_length_params.tx_len = length;
5579 }
5580 (*p_data->ble_set_data_length.p_set_pkt_data_cback)(status, &p_acl_cb->data_length_params);
5581 }
5582
5583 }
5584
5585 /*******************************************************************************
5586 **
5587 ** Function bta_dm_ble_broadcast
5588 **
5589 ** Description Starts or stops LE broadcasts
5590 **
5591 ** Parameters:
5592 **
5593 *******************************************************************************/
bta_dm_ble_broadcast(tBTA_DM_MSG * p_data)5594 void bta_dm_ble_broadcast (tBTA_DM_MSG *p_data)
5595 {
5596 tBTA_STATUS status = BTA_FAILURE;
5597 BOOLEAN start = p_data->ble_observe.start;
5598
5599 if (BTM_BleBroadcast(start, p_data->ble_observe.p_stop_adv_cback) == BTM_SUCCESS) {
5600 status = BTA_SUCCESS;
5601 } else {
5602 APPL_TRACE_ERROR("%s failed\n", __FUNCTION__);
5603 }
5604
5605 if (p_data->ble_observe.p_stop_adv_cback){
5606 (*p_data->ble_observe.p_stop_adv_cback)(status);
5607 }
5608
5609 }
5610
5611 /*******************************************************************************
5612 **
5613 ** Function bta_dm_ble_multi_adv_enb
5614 **
5615 ** Description This function enables a single advertising instance
5616 **
5617 ** Parameters:
5618 **
5619 *******************************************************************************/
bta_dm_ble_multi_adv_enb(tBTA_DM_MSG * p_data)5620 void bta_dm_ble_multi_adv_enb(tBTA_DM_MSG *p_data)
5621 {
5622 tBTM_STATUS btm_status = 0;
5623
5624 bta_dm_cb.p_multi_adv_cback = p_data->ble_multi_adv_enb.p_cback;
5625 if (BTM_BleMaxMultiAdvInstanceCount() > 0 && NULL != p_data->ble_multi_adv_enb.p_ref) {
5626 btm_status = BTM_BleEnableAdvInstance((tBTM_BLE_ADV_PARAMS *)
5627 p_data->ble_multi_adv_enb.p_params,
5628 p_data->ble_multi_adv_enb.p_cback,
5629 p_data->ble_multi_adv_enb.p_ref);
5630 }
5631
5632 if (BTM_CMD_STARTED != btm_status) {
5633 bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_ENB_EVT, 0xFF,
5634 p_data->ble_multi_adv_enb.p_ref, BTA_FAILURE);
5635 }
5636 }
5637 /*******************************************************************************
5638 **
5639 ** Function bta_dm_ble_multi_adv_param_upd
5640 **
5641 ** Description This function updates multiple advertising instance parameters
5642 **
5643 ** Parameters:
5644 **
5645 *******************************************************************************/
bta_dm_ble_multi_adv_upd_param(tBTA_DM_MSG * p_data)5646 void bta_dm_ble_multi_adv_upd_param(tBTA_DM_MSG *p_data)
5647 {
5648 tBTM_STATUS btm_status = 0;
5649 void *p_ref = NULL;
5650
5651 if (BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_param.inst_id > 0
5652 && p_data->ble_multi_adv_param.inst_id < BTM_BleMaxMultiAdvInstanceCount()) {
5653 btm_status = BTM_BleUpdateAdvInstParam(p_data->ble_multi_adv_param.inst_id,
5654 (tBTM_BLE_ADV_PARAMS *)p_data->ble_multi_adv_param.p_params);
5655 }
5656
5657 if (BTM_CMD_STARTED != btm_status) {
5658 p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_param.inst_id);
5659 bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_PARAM_EVT,
5660 p_data->ble_multi_adv_param.inst_id, p_ref, BTA_FAILURE);
5661 }
5662 }
5663 /*******************************************************************************
5664 **
5665 ** Function bta_dm_ble_multi_adv_data
5666 **
5667 ** Description This function write multiple advertising instance adv data
5668 ** or scan response data
5669 **
5670 ** Parameters:
5671 **
5672 *******************************************************************************/
bta_dm_ble_multi_adv_data(tBTA_DM_MSG * p_data)5673 void bta_dm_ble_multi_adv_data(tBTA_DM_MSG *p_data)
5674 {
5675 tBTM_STATUS btm_status = 0;
5676 void *p_ref = NULL;
5677
5678 if (BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_data.inst_id > 0
5679 && p_data->ble_multi_adv_data.inst_id < BTM_BleMaxMultiAdvInstanceCount()) {
5680 btm_status = BTM_BleCfgAdvInstData(p_data->ble_multi_adv_data.inst_id,
5681 p_data->ble_multi_adv_data.is_scan_rsp,
5682 p_data->ble_multi_adv_data.data_mask,
5683 (tBTM_BLE_ADV_DATA *)p_data->ble_multi_adv_data.p_data);
5684 }
5685
5686 if (BTM_CMD_STARTED != btm_status) {
5687 p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_data.inst_id);
5688 bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_DATA_EVT,
5689 p_data->ble_multi_adv_data.inst_id, p_ref, BTA_FAILURE);
5690 }
5691
5692 }
5693 /*******************************************************************************
5694 **
5695 ** Function btm_dm_ble_multi_adv_disable
5696 **
5697 ** Description This function disable a single adv instance
5698 **
5699 ** Parameters:
5700 **
5701 *******************************************************************************/
btm_dm_ble_multi_adv_disable(tBTA_DM_MSG * p_data)5702 void btm_dm_ble_multi_adv_disable(tBTA_DM_MSG *p_data)
5703 {
5704 tBTM_STATUS btm_status = 0;
5705 void *p_ref = NULL;
5706
5707 if (BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_disable.inst_id > 0
5708 && p_data->ble_multi_adv_disable.inst_id < BTM_BleMaxMultiAdvInstanceCount()) {
5709 btm_status = BTM_BleDisableAdvInstance(p_data->ble_multi_adv_disable.inst_id);
5710 }
5711
5712 if (BTM_CMD_STARTED != btm_status) {
5713 p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_disable.inst_id);
5714 bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_DISABLE_EVT,
5715 p_data->ble_multi_adv_disable.inst_id, p_ref, BTA_FAILURE);
5716 }
5717 }
5718
bta_dm_ble_gap_dtm_tx_start(tBTA_DM_MSG * p_data)5719 void bta_dm_ble_gap_dtm_tx_start(tBTA_DM_MSG *p_data)
5720 {
5721 BTM_BleTransmitterTest(p_data->dtm_tx_start.tx_channel, p_data->dtm_tx_start.len_of_data, p_data->dtm_tx_start.pkt_payload, p_data->dtm_tx_start.p_dtm_cmpl_cback);
5722 }
5723
bta_dm_ble_gap_dtm_rx_start(tBTA_DM_MSG * p_data)5724 void bta_dm_ble_gap_dtm_rx_start(tBTA_DM_MSG *p_data)
5725 {
5726 BTM_BleReceiverTest(p_data->dtm_rx_start.rx_channel, p_data->dtm_rx_start.p_dtm_cmpl_cback);
5727 }
5728
bta_dm_ble_gap_dtm_stop(tBTA_DM_MSG * p_data)5729 void bta_dm_ble_gap_dtm_stop(tBTA_DM_MSG *p_data)
5730 {
5731 BTM_BleTestEnd(p_data->dtm_stop.p_dtm_cmpl_cback);
5732 }
5733
bta_dm_ble_gap_clear_adv(tBTA_DM_MSG * p_data)5734 void bta_dm_ble_gap_clear_adv(tBTA_DM_MSG *p_data)
5735 {
5736 if (BTM_BleClearAdv(p_data->ble_clear_adv.p_clear_adv_cback) == FALSE) {
5737 if (p_data->ble_clear_adv.p_clear_adv_cback) {
5738 (*p_data->ble_clear_adv.p_clear_adv_cback)(BTA_FAILURE);
5739 }
5740 }
5741 }
5742
bta_dm_ble_gap_set_rpa_timeout(tBTA_DM_MSG * p_data)5743 void bta_dm_ble_gap_set_rpa_timeout(tBTA_DM_MSG *p_data)
5744 {
5745 APPL_TRACE_API("%s, rpa_timeout = %d", __func__, p_data->set_rpa_timeout.rpa_timeout);
5746 BTM_BleSetRpaTimeout(p_data->set_rpa_timeout.rpa_timeout,p_data->set_rpa_timeout.p_set_rpa_timeout_cback);
5747 }
5748
bta_dm_ble_gap_add_dev_to_resolving_list(tBTA_DM_MSG * p_data)5749 void bta_dm_ble_gap_add_dev_to_resolving_list(tBTA_DM_MSG *p_data)
5750 {
5751 APPL_TRACE_API("%s", __func__);
5752 BTM_BleAddDevToResolvingList(p_data->add_dev_to_resolving_list.addr,
5753 p_data->add_dev_to_resolving_list.addr_type,
5754 p_data->add_dev_to_resolving_list.irk,
5755 p_data->add_dev_to_resolving_list.p_add_dev_to_resolving_list_callback);
5756 }
5757
bta_dm_ble_gap_set_privacy_mode(tBTA_DM_MSG * p_data)5758 void bta_dm_ble_gap_set_privacy_mode(tBTA_DM_MSG *p_data)
5759 {
5760 APPL_TRACE_API("%s, privacy_mode = %d", __func__, p_data->ble_set_privacy_mode.privacy_mode);
5761 BTM_BleSetPrivacyMode(p_data->ble_set_privacy_mode.addr_type, p_data->ble_set_privacy_mode.addr,
5762 p_data->ble_set_privacy_mode.privacy_mode, p_data->ble_set_privacy_mode.p_cback);
5763 }
5764
bta_dm_ble_gap_set_csa_support(tBTA_DM_MSG * p_data)5765 void bta_dm_ble_gap_set_csa_support(tBTA_DM_MSG *p_data)
5766 {
5767 APPL_TRACE_API("%s, csa_select = %d", __func__, p_data->ble_set_csa_support.csa_select);
5768 BTM_BleSetCsaSupport(p_data->ble_set_csa_support.csa_select, p_data->ble_set_csa_support.p_cback);
5769 }
5770
5771 #if (BLE_50_FEATURE_SUPPORT == TRUE)
bta_dm_ble_gap_dtm_enhance_tx_start(tBTA_DM_MSG * p_data)5772 void bta_dm_ble_gap_dtm_enhance_tx_start(tBTA_DM_MSG *p_data)
5773 {
5774 BTM_BleEnhancedTransmitterTest(p_data->dtm_enh_tx_start.tx_channel, p_data->dtm_enh_tx_start.len_of_data,
5775 p_data->dtm_enh_tx_start.pkt_payload, p_data->dtm_enh_tx_start.phy, p_data->dtm_enh_tx_start.p_dtm_cmpl_cback);
5776 }
5777
bta_dm_ble_gap_dtm_enhance_rx_start(tBTA_DM_MSG * p_data)5778 void bta_dm_ble_gap_dtm_enhance_rx_start(tBTA_DM_MSG *p_data)
5779 {
5780 BTM_BleEnhancedReceiverTest(p_data->dtm_enh_rx_start.rx_channel, p_data->dtm_enh_rx_start.phy,
5781 p_data->dtm_enh_rx_start.modulation_index, p_data->dtm_enh_rx_start.p_dtm_cmpl_cback);
5782 }
5783
bta_dm_ble_gap_read_phy(tBTA_DM_MSG * p_data)5784 void bta_dm_ble_gap_read_phy(tBTA_DM_MSG *p_data)
5785 {
5786 //tBTM_STATUS btm_status = 0;
5787 UINT8 tx_phy = 0, rx_phy = 0;
5788
5789 BTM_BleReadPhy(p_data->ble_read_phy.bd_addr, &tx_phy, &rx_phy);
5790
5791 }
5792
bta_dm_ble_gap_set_prefer_default_phy(tBTA_DM_MSG * p_data)5793 void bta_dm_ble_gap_set_prefer_default_phy(tBTA_DM_MSG *p_data)
5794 {
5795 APPL_TRACE_API("%s, tx_phy_mask = %d, rx_phy_mask = %d", __func__, p_data->ble_set_per_def_phy.tx_phy_mask, p_data->ble_set_per_def_phy.rx_phy_mask);
5796 BTM_BleSetPreferDefaultPhy(p_data->ble_set_per_def_phy.tx_phy_mask, p_data->ble_set_per_def_phy.rx_phy_mask);
5797 }
5798
bta_dm_ble_gap_set_prefer_phy(tBTA_DM_MSG * p_data)5799 void bta_dm_ble_gap_set_prefer_phy(tBTA_DM_MSG *p_data)
5800 {
5801 APPL_TRACE_API("%s, tx_phy_mask = %d, rx_phy_mask = %d, phy_options = %d",
5802 __func__, p_data->ble_set_per_phy.tx_phy_mask,
5803 p_data->ble_set_per_phy.rx_phy_mask, p_data->ble_set_per_phy.phy_options);
5804 BTM_BleSetPreferPhy(p_data->ble_set_per_phy.bd_addr, p_data->ble_set_per_phy.all_phys,
5805 p_data->ble_set_per_phy.tx_phy_mask, p_data->ble_set_per_phy.rx_phy_mask,
5806 p_data->ble_set_per_phy.phy_options);
5807 }
5808
bta_dm_ble_gap_ext_adv_set_rand_addr(tBTA_DM_MSG * p_data)5809 void bta_dm_ble_gap_ext_adv_set_rand_addr(tBTA_DM_MSG *p_data)
5810 {
5811 BTM_BleSetExtendedAdvRandaddr(p_data->ble_set_ext_adv_rand_addr.instance, p_data->ble_set_ext_adv_rand_addr.rand_addr);
5812 }
bta_dm_ble_gap_ext_adv_set_params(tBTA_DM_MSG * p_data)5813 void bta_dm_ble_gap_ext_adv_set_params(tBTA_DM_MSG *p_data)
5814 {
5815 APPL_TRACE_API("%s, instance = %d", __func__, p_data->ble_set_ext_adv_params.instance);
5816
5817 BTM_BleSetExtendedAdvParams(p_data->ble_set_ext_adv_params.instance,
5818 (tBTM_BLE_GAP_EXT_ADV_PARAMS *)&p_data->ble_set_ext_adv_params.params);
5819 }
5820
bta_dm_ble_gap_config_ext_adv_data_raw(tBTA_DM_MSG * p_data)5821 void bta_dm_ble_gap_config_ext_adv_data_raw(tBTA_DM_MSG *p_data)
5822 {
5823 APPL_TRACE_API("%s, instance = %d, len = %d", __func__, p_data->ble_cfg_ext_adv_data.instance,
5824 p_data->ble_cfg_ext_adv_data.length);
5825
5826 BTM_BleConfigExtendedAdvDataRaw(p_data->ble_cfg_ext_adv_data.is_scan_rsp,
5827 p_data->ble_cfg_ext_adv_data.instance,
5828 p_data->ble_cfg_ext_adv_data.length,
5829 p_data->ble_cfg_ext_adv_data.data);
5830 }
5831
bta_dm_ble_gap_start_ext_adv(tBTA_DM_MSG * p_data)5832 void bta_dm_ble_gap_start_ext_adv(tBTA_DM_MSG *p_data)
5833 {
5834 APPL_TRACE_API("%s, enable = %d, num = %d", __func__, p_data->ble_start_ext_adv.enable,
5835 p_data->ble_start_ext_adv.num);
5836 BTM_BleStartExtAdv(p_data->ble_start_ext_adv.enable, p_data->ble_start_ext_adv.num,
5837 (tBTM_BLE_EXT_ADV *)p_data->ble_start_ext_adv.ext_adv);
5838 }
5839
bta_dm_ble_gap_ext_adv_set_remove(tBTA_DM_MSG * p_data)5840 void bta_dm_ble_gap_ext_adv_set_remove(tBTA_DM_MSG *p_data)
5841 {
5842 BTM_BleExtAdvSetRemove(p_data->ble_ext_adv_set_remove.instance);
5843 }
5844
bta_dm_ble_gap_ext_adv_set_clear(tBTA_DM_MSG * p_data)5845 void bta_dm_ble_gap_ext_adv_set_clear(tBTA_DM_MSG *p_data)
5846 {
5847 BTM_BleExtAdvSetClear();
5848 }
5849
bta_dm_ble_gap_periodic_adv_set_params(tBTA_DM_MSG * p_data)5850 void bta_dm_ble_gap_periodic_adv_set_params(tBTA_DM_MSG *p_data)
5851 {
5852 APPL_TRACE_API("%s, instance = %d", __func__, p_data->ble_set_periodic_adv_params.instance);
5853 BTM_BlePeriodicAdvSetParams(p_data->ble_set_periodic_adv_params.instance,
5854 (tBTM_BLE_Periodic_Adv_Params *)&p_data->ble_set_periodic_adv_params.params);
5855 }
5856
bta_dm_ble_gap_periodic_adv_cfg_data_raw(tBTA_DM_MSG * p_data)5857 void bta_dm_ble_gap_periodic_adv_cfg_data_raw(tBTA_DM_MSG *p_data)
5858 {
5859 APPL_TRACE_API("%s, instance = %d, length = %d", __func__, p_data->ble_cfg_periodic_adv_data.instance,
5860 p_data->ble_cfg_periodic_adv_data.length);
5861
5862 BTM_BlePeriodicAdvCfgDataRaw(p_data->ble_cfg_periodic_adv_data.instance,
5863 p_data->ble_cfg_periodic_adv_data.length,
5864 p_data->ble_cfg_periodic_adv_data.data,
5865 p_data->ble_cfg_periodic_adv_data.only_update_did);
5866 }
5867
bta_dm_ble_gap_periodic_adv_enable(tBTA_DM_MSG * p_data)5868 void bta_dm_ble_gap_periodic_adv_enable(tBTA_DM_MSG *p_data)
5869 {
5870 APPL_TRACE_API("%s, instance = %d, enable = %d", __func__, p_data->ble_enable_periodic_adv.instance,
5871 p_data->ble_enable_periodic_adv.enable);
5872
5873 BTM_BlePeriodicAdvEnable(p_data->ble_enable_periodic_adv.instance,
5874 p_data->ble_enable_periodic_adv.enable);
5875 }
5876
bta_dm_ble_gap_periodic_adv_create_sync(tBTA_DM_MSG * p_data)5877 void bta_dm_ble_gap_periodic_adv_create_sync(tBTA_DM_MSG *p_data)
5878 {
5879 APPL_TRACE_API("%s", __func__);
5880 BTM_BlePeriodicAdvCreateSync((tBTM_BLE_Periodic_Sync_Params *)&p_data->ble_periodic_adv_sync.params);
5881 }
5882
bta_dm_ble_gap_periodic_adv_sync_cancel(tBTA_DM_MSG * p_data)5883 void bta_dm_ble_gap_periodic_adv_sync_cancel(tBTA_DM_MSG *p_data)
5884 {
5885 APPL_TRACE_API("%s", __func__);
5886 BTM_BlePeriodicAdvSyncCancel();
5887 }
5888
bta_dm_ble_gap_periodic_adv_sync_terminate(tBTA_DM_MSG * p_data)5889 void bta_dm_ble_gap_periodic_adv_sync_terminate(tBTA_DM_MSG *p_data)
5890 {
5891 APPL_TRACE_API("%s", __func__);
5892 BTM_BlePeriodicAdvSyncTerm(p_data->ble_periodic_adv_sync_term.sync_handle);
5893 }
5894
bta_dm_ble_gap_periodic_adv_add_dev_to_list(tBTA_DM_MSG * p_data)5895 void bta_dm_ble_gap_periodic_adv_add_dev_to_list(tBTA_DM_MSG *p_data)
5896 {
5897 APPL_TRACE_API("%s, addr_type = %d, sid = %d", __func__, p_data->ble_periodic_adv_add_dev_to_list.addr_type,
5898 p_data->ble_periodic_adv_add_dev_to_list.sid);
5899
5900 BTM_BlePeriodicAdvAddDevToList(p_data->ble_periodic_adv_add_dev_to_list.addr_type,
5901 p_data->ble_periodic_adv_add_dev_to_list.addr,
5902 p_data->ble_periodic_adv_add_dev_to_list.sid);
5903 }
5904
bta_dm_ble_gap_periodic_adv_remove_dev_from_list(tBTA_DM_MSG * p_data)5905 void bta_dm_ble_gap_periodic_adv_remove_dev_from_list(tBTA_DM_MSG *p_data)
5906 {
5907 APPL_TRACE_API("%s, addr_type = %d, sid = %d", __func__, p_data->ble_periodic_adv_remove_dev_from_list.addr_type,
5908 p_data->ble_periodic_adv_remove_dev_from_list.sid);
5909
5910 BTM_BlePeriodicAdvRemoveDevFromList(p_data->ble_periodic_adv_remove_dev_from_list.addr_type,
5911 p_data->ble_periodic_adv_remove_dev_from_list.addr,
5912 p_data->ble_periodic_adv_remove_dev_from_list.sid);
5913
5914 }
5915
bta_dm_ble_gap_periodic_adv_clear_dev(tBTA_DM_MSG * p_data)5916 void bta_dm_ble_gap_periodic_adv_clear_dev(tBTA_DM_MSG *p_data)
5917 {
5918 APPL_TRACE_API("%s", __func__);
5919 BTM_BlePeriodicAdvClearDev();
5920 }
5921
5922
bta_dm_ble_gap_set_ext_scan_params(tBTA_DM_MSG * p_data)5923 void bta_dm_ble_gap_set_ext_scan_params(tBTA_DM_MSG *p_data)
5924 {
5925 APPL_TRACE_API("%s", __func__);
5926 BTM_BleSetExtendedScanParams((tBTM_BLE_EXT_SCAN_PARAMS *)&p_data->ble_set_ext_scan_params.params);
5927 }
5928
bta_dm_ble_gap_ext_scan(tBTA_DM_MSG * p_data)5929 void bta_dm_ble_gap_ext_scan(tBTA_DM_MSG *p_data)
5930 {
5931 APPL_TRACE_API("%s, start = %d, duration = %d, period = %d", __func__, p_data->ble_ext_scan.start, p_data->ble_ext_scan.duration,
5932 p_data->ble_ext_scan.period);
5933 BTM_BleExtendedScan(p_data->ble_ext_scan.start, p_data->ble_ext_scan.duration,
5934 p_data->ble_ext_scan.period);
5935 }
5936
bta_dm_ble_gap_set_prefer_ext_conn_params(tBTA_DM_MSG * p_data)5937 void bta_dm_ble_gap_set_prefer_ext_conn_params(tBTA_DM_MSG *p_data)
5938 {
5939 tBTM_EXT_CONN_PARAMS conn_params;
5940 conn_params.phy_mask = p_data->ble_set_per_ext_conn_params.phy_mask;
5941
5942 APPL_TRACE_API("%s, start = %d, duration = %d, period = %d", __func__, p_data->ble_ext_scan.start, p_data->ble_ext_scan.duration,
5943 p_data->ble_ext_scan.period);
5944
5945 if (conn_params.phy_mask & BTA_PHY_1M_MASK) {
5946 memcpy(&conn_params.phy_1m_conn_params, &p_data->ble_set_per_ext_conn_params.phy_1m_conn_params,
5947 sizeof(tBTA_DM_BLE_CONN_PARAMS));
5948 }
5949
5950 if (conn_params.phy_mask & BTA_PHY_2M_MASK) {
5951 memcpy(&conn_params.phy_2m_conn_params, &p_data->ble_set_per_ext_conn_params.phy_2m_conn_params,
5952 sizeof(tBTA_DM_BLE_CONN_PARAMS));
5953 }
5954
5955 if (conn_params.phy_mask & BTA_PHY_CODED_MASK) {
5956 memcpy(&conn_params.phy_coded_conn_params, &p_data->ble_set_per_ext_conn_params.phy_coded_conn_params,
5957 sizeof(tBTA_DM_BLE_CONN_PARAMS));
5958 }
5959
5960 BTM_BleSetPreferExtenedConnParams(p_data->ble_set_per_ext_conn_params.bd_addr, &conn_params);
5961 }
5962
5963 #endif // #if (BLE_50_FEATURE_SUPPORT == TRUE)
5964
5965 #if (BLE_FEAT_PERIODIC_ADV_SYNC_TRANSFER == TRUE)
bta_dm_ble_gap_periodic_adv_recv_enable(tBTA_DM_MSG * p_data)5966 void bta_dm_ble_gap_periodic_adv_recv_enable(tBTA_DM_MSG *p_data)
5967 {
5968 BTM_BlePeriodicAdvRecvEnable(p_data->ble_periodic_adv_recv_enable.sync_handle,
5969 p_data->ble_periodic_adv_recv_enable.enable);
5970 }
5971
bta_dm_ble_gap_periodic_adv_sync_trans(tBTA_DM_MSG * p_data)5972 void bta_dm_ble_gap_periodic_adv_sync_trans(tBTA_DM_MSG *p_data)
5973 {
5974 BTM_BlePeriodicAdvSyncTrans(p_data->ble_periodic_adv_sync_trans.addr,
5975 p_data->ble_periodic_adv_sync_trans.service_data,
5976 p_data->ble_periodic_adv_sync_trans.sync_handle);
5977 }
5978
bta_dm_ble_gap_periodic_adv_set_info_trans(tBTA_DM_MSG * p_data)5979 void bta_dm_ble_gap_periodic_adv_set_info_trans(tBTA_DM_MSG *p_data)
5980 {
5981 BTM_BlePeriodicAdvSetInfoTrans(p_data->ble_periodic_adv_set_info_trans.addr,
5982 p_data->ble_periodic_adv_set_info_trans.service_data,
5983 p_data->ble_periodic_adv_set_info_trans.adv_hanlde);
5984 }
5985
bta_dm_ble_gap_set_periodic_adv_sync_trans_params(tBTA_DM_MSG * p_data)5986 void bta_dm_ble_gap_set_periodic_adv_sync_trans_params(tBTA_DM_MSG *p_data)
5987 {
5988 BTM_BleSetPeriodicAdvSyncTransParams(p_data->ble_set_past_params.addr,
5989 p_data->ble_set_past_params.params.mode,
5990 p_data->ble_set_past_params.params.skip,
5991 p_data->ble_set_past_params.params.sync_timeout,
5992 p_data->ble_set_past_params.params.cte_type);
5993 }
5994 #endif // #if (BLE_FEAT_PERIODIC_ADV_SYNC_TRANSFER == TRUE)
5995 /*******************************************************************************
5996 **
5997 ** Function bta_dm_ble_setup_storage
5998 **
5999 ** Description This function configures up the storage parameters for ADV batch scanning
6000 **
6001 ** Parameters:
6002 **
6003 *******************************************************************************/
bta_dm_ble_setup_storage(tBTA_DM_MSG * p_data)6004 void bta_dm_ble_setup_storage (tBTA_DM_MSG *p_data)
6005 {
6006 tBTM_STATUS btm_status = 0;
6007 tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
6008
6009 BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
6010
6011 if (0 != cmn_ble_vsc_cb.tot_scan_results_strg) {
6012 btm_status = BTM_BleSetStorageConfig(p_data->ble_set_storage.batch_scan_full_max,
6013 p_data->ble_set_storage.batch_scan_trunc_max,
6014 p_data->ble_set_storage.batch_scan_notify_threshold,
6015 p_data->ble_set_storage.p_setup_cback,
6016 p_data->ble_set_storage.p_thres_cback,
6017 p_data->ble_set_storage.p_read_rep_cback,
6018 p_data->ble_set_storage.ref_value);
6019 }
6020
6021 if (BTM_CMD_STARTED != btm_status) {
6022 bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_CFG_STRG_EVT, p_data->ble_set_storage.ref_value,
6023 btm_status);
6024 }
6025 }
6026
6027 /*******************************************************************************
6028 **
6029 ** Function bta_dm_ble_enable_batch_scan
6030 **
6031 ** Description This function sets up the parameters and enables batch scan
6032 **
6033 ** Parameters:
6034 **
6035 *******************************************************************************/
bta_dm_ble_enable_batch_scan(tBTA_DM_MSG * p_data)6036 void bta_dm_ble_enable_batch_scan (tBTA_DM_MSG *p_data)
6037 {
6038 tBTM_STATUS btm_status = 0;
6039 tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
6040
6041 BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
6042
6043 if (0 != cmn_ble_vsc_cb.tot_scan_results_strg) {
6044 btm_status = BTM_BleEnableBatchScan(p_data->ble_enable_scan.scan_mode,
6045 p_data->ble_enable_scan.scan_int,
6046 p_data->ble_enable_scan.scan_window,
6047 p_data->ble_enable_scan.discard_rule,
6048 p_data->ble_enable_scan.addr_type,
6049 p_data->ble_enable_scan.ref_value);
6050 }
6051
6052 if (BTM_CMD_STARTED != btm_status) {
6053 bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_ENABLE_EVT, p_data->ble_enable_scan.ref_value,
6054 btm_status);
6055 }
6056 }
6057
6058 /*******************************************************************************
6059 **
6060 ** Function bta_dm_ble_disable_batch_scan
6061 **
6062 ** Description This function disables the batch scan
6063 **
6064 ** Parameters:
6065 **
6066 *******************************************************************************/
bta_dm_ble_disable_batch_scan(tBTA_DM_MSG * p_data)6067 void bta_dm_ble_disable_batch_scan (tBTA_DM_MSG *p_data)
6068 {
6069 UNUSED(p_data);
6070 tBTM_STATUS btm_status = 0;
6071 tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
6072
6073 BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
6074
6075 if (0 != cmn_ble_vsc_cb.tot_scan_results_strg) {
6076 btm_status = BTM_BleDisableBatchScan(p_data->ble_disable_scan.ref_value);
6077 }
6078
6079 if (BTM_CMD_STARTED != btm_status) {
6080 bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_DISABLE_EVT, p_data->ble_enable_scan.ref_value,
6081 btm_status);
6082 }
6083 }
6084
6085 /*******************************************************************************
6086 **
6087 ** Function bta_dm_ble_read_scan_reports
6088 **
6089 ** Description This function reads the batch scan reports
6090 **
6091 ** Parameters:
6092 **
6093 *******************************************************************************/
bta_dm_ble_read_scan_reports(tBTA_DM_MSG * p_data)6094 void bta_dm_ble_read_scan_reports(tBTA_DM_MSG *p_data)
6095 {
6096 tBTM_STATUS btm_status = 0;
6097 tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
6098
6099 BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
6100
6101 if (0 != cmn_ble_vsc_cb.tot_scan_results_strg) {
6102 btm_status = BTM_BleReadScanReports(p_data->ble_read_reports.scan_type,
6103 p_data->ble_read_reports.ref_value);
6104 }
6105
6106 if (BTM_CMD_STARTED != btm_status) {
6107 bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_READ_REPTS_EVT, p_data->ble_enable_scan.ref_value,
6108 btm_status);
6109 }
6110 }
6111
6112 /*******************************************************************************
6113 **
6114 ** Function bta_dm_ble_track_advertiser
6115 **
6116 ** Description This function tracks the specific advertiser
6117 **
6118 ** Parameters:
6119 **
6120 *******************************************************************************/
bta_dm_ble_track_advertiser(tBTA_DM_MSG * p_data)6121 void bta_dm_ble_track_advertiser(tBTA_DM_MSG *p_data)
6122 {
6123 tBTM_STATUS btm_status = 0;
6124 BD_ADDR bda;
6125 memset(&bda, 0 , sizeof(BD_ADDR));
6126 tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
6127 tBTA_DM_BLE_TRACK_ADV_DATA track_adv_data;
6128
6129 BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
6130
6131 if (0 != cmn_ble_vsc_cb.tot_scan_results_strg) {
6132 btm_status = BTM_BleTrackAdvertiser((tBTM_BLE_TRACK_ADV_CBACK *)
6133 p_data->ble_track_advert.p_track_adv_cback,
6134 p_data->ble_track_advert.ref_value);
6135 }
6136
6137 if (BTM_CMD_STARTED != btm_status) {
6138 memset(&track_adv_data, 0, sizeof(tBTA_DM_BLE_TRACK_ADV_DATA));
6139 track_adv_data.advertiser_info_present = NO_ADV_INFO_PRESENT; /* Indicates failure */
6140 track_adv_data.client_if = (UINT8)p_data->ble_track_advert.ref_value;
6141 p_data->ble_track_advert.p_track_adv_cback(&track_adv_data);
6142 }
6143 }
6144
6145 /*******************************************************************************
6146 **
6147 ** Function bta_ble_scan_setup_cb
6148 **
6149 ** Description Handle the setup callback from BTM layer and forward it to app layer
6150 **
6151 ** Parameters:
6152 **
6153 *******************************************************************************/
bta_ble_scan_setup_cb(tBTM_BLE_BATCH_SCAN_EVT evt,tBTM_BLE_REF_VALUE ref_value,tBTM_STATUS status)6154 void bta_ble_scan_setup_cb(tBTM_BLE_BATCH_SCAN_EVT evt, tBTM_BLE_REF_VALUE ref_value,
6155 tBTM_STATUS status)
6156 {
6157 tBTA_BLE_BATCH_SCAN_EVT bta_evt = 0;
6158
6159 APPL_TRACE_DEBUG("bta_ble_scan_setup_cb : evt: %d, ref_value: %d, status:%d", evt,
6160 ref_value, status);
6161
6162 switch (evt) {
6163 case BTM_BLE_BATCH_SCAN_ENABLE_EVT:
6164 bta_evt = BTA_BLE_BATCH_SCAN_ENB_EVT;
6165 break;
6166 case BTM_BLE_BATCH_SCAN_CFG_STRG_EVT:
6167 bta_evt = BTA_BLE_BATCH_SCAN_CFG_STRG_EVT;
6168 break;
6169 case BTM_BLE_BATCH_SCAN_DISABLE_EVT:
6170 bta_evt = BTA_BLE_BATCH_SCAN_DIS_EVT;
6171 break;
6172 case BTM_BLE_BATCH_SCAN_PARAM_EVT:
6173 bta_evt = BTA_BLE_BATCH_SCAN_PARAM_EVT;
6174 break;
6175 default:
6176 break;
6177 }
6178
6179 if (NULL != bta_dm_cb.p_setup_cback) {
6180 bta_dm_cb.p_setup_cback(bta_evt, ref_value, status);
6181 }
6182 }
6183
6184
6185 #if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
6186 /*******************************************************************************
6187 **
6188 ** Function bta_ble_scan_pf_cmpl
6189 **
6190 ** Description ADV payload filtering operation complete callback
6191 **
6192 **
6193 ** Returns TRUE if handled, otherwise FALSE.
6194 **
6195 *******************************************************************************/
bta_ble_scan_cfg_cmpl(tBTM_BLE_PF_ACTION action,tBTM_BLE_SCAN_COND_OP cfg_op,tBTM_BLE_PF_AVBL_SPACE avbl_space,tBTM_STATUS status,tBTM_BLE_REF_VALUE ref_value)6196 static void bta_ble_scan_cfg_cmpl(tBTM_BLE_PF_ACTION action, tBTM_BLE_SCAN_COND_OP cfg_op,
6197 tBTM_BLE_PF_AVBL_SPACE avbl_space, tBTM_STATUS status,
6198 tBTM_BLE_REF_VALUE ref_value)
6199 {
6200 tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS : BTA_FAILURE;
6201
6202 APPL_TRACE_DEBUG("bta_ble_scan_cfg_cmpl: %d, %d, %d, %d", action, cfg_op, avbl_space, status);
6203
6204 if (bta_dm_cb.p_scan_filt_cfg_cback) {
6205 bta_dm_cb.p_scan_filt_cfg_cback(action, cfg_op, avbl_space, st, ref_value);
6206 }
6207 }
6208
6209 /*******************************************************************************
6210 **
6211 ** Function bta_dm_cfg_filter_cond
6212 **
6213 ** Description This function configure adv payload filtering condition
6214 **
6215 ** Parameters:
6216 **
6217 *******************************************************************************/
bta_dm_cfg_filter_cond(tBTA_DM_MSG * p_data)6218 void bta_dm_cfg_filter_cond (tBTA_DM_MSG *p_data)
6219 {
6220 tBTM_STATUS st = BTM_MODE_UNSUPPORTED;
6221 tBTA_STATUS status = BTA_FAILURE;
6222
6223 tBTM_BLE_VSC_CB cmn_vsc_cb;
6224
6225 APPL_TRACE_DEBUG("bta_dm_cfg_filter_cond");
6226 BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
6227 if (0 != cmn_vsc_cb.filter_support) {
6228 if ((st = BTM_BleCfgFilterCondition(p_data->ble_cfg_filter_cond.action,
6229 p_data->ble_cfg_filter_cond.cond_type,
6230 (tBTM_BLE_PF_FILT_INDEX)p_data->ble_cfg_filter_cond.filt_index,
6231 (tBTM_BLE_PF_COND_PARAM *)p_data->ble_cfg_filter_cond.p_cond_param,
6232 bta_ble_scan_cfg_cmpl, p_data->ble_cfg_filter_cond.ref_value))
6233 == BTM_CMD_STARTED) {
6234 bta_dm_cb.p_scan_filt_cfg_cback = p_data->ble_cfg_filter_cond.p_filt_cfg_cback;
6235 return;
6236 }
6237 }
6238
6239 if (p_data->ble_cfg_filter_cond.p_filt_cfg_cback) {
6240 p_data->ble_cfg_filter_cond.p_filt_cfg_cback(BTA_DM_BLE_PF_CONFIG_EVT,
6241 p_data->ble_cfg_filter_cond.cond_type, 0, status,
6242 p_data->ble_cfg_filter_cond.ref_value);
6243 }
6244 return;
6245 }
6246
6247 /*******************************************************************************
6248 **
6249 ** Function bta_dm_enable_scan_filter
6250 **
6251 ** Description This function enable/disable adv payload filtering condition
6252 **
6253 ** Parameters:
6254 **
6255 *******************************************************************************/
bta_dm_enable_scan_filter(tBTA_DM_MSG * p_data)6256 void bta_dm_enable_scan_filter(tBTA_DM_MSG *p_data)
6257 {
6258 tBTM_STATUS st = BTM_MODE_UNSUPPORTED;
6259 tBTA_STATUS status = BTA_FAILURE;
6260
6261 tBTM_BLE_VSC_CB cmn_vsc_cb;
6262 APPL_TRACE_DEBUG("bta_dm_enable_scan_filter");
6263 BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
6264
6265 if (0 != cmn_vsc_cb.filter_support) {
6266 if ((st = BTM_BleEnableDisableFilterFeature(p_data->ble_enable_scan_filt.action,
6267 p_data->ble_enable_scan_filt.p_filt_status_cback,
6268 (tBTM_BLE_REF_VALUE)p_data->ble_enable_scan_filt.ref_value)) == BTM_CMD_STARTED) {
6269 bta_dm_cb.p_scan_filt_status_cback = p_data->ble_enable_scan_filt.p_filt_status_cback;
6270 }
6271 return;
6272 }
6273
6274 if (p_data->ble_enable_scan_filt.p_filt_status_cback) {
6275 p_data->ble_enable_scan_filt.p_filt_status_cback (BTA_DM_BLE_PF_ENABLE_EVT,
6276 p_data->ble_enable_scan_filt.ref_value, status);
6277 }
6278
6279 }
6280
6281 /*******************************************************************************
6282 **
6283 ** Function bta_dm_scan_filter_param_setup
6284 **
6285 ** Description This function sets up scan filter params
6286 **
6287 ** Parameters:
6288 **
6289 *******************************************************************************/
bta_dm_scan_filter_param_setup(tBTA_DM_MSG * p_data)6290 void bta_dm_scan_filter_param_setup (tBTA_DM_MSG *p_data)
6291 {
6292 tBTM_STATUS st = BTM_MODE_UNSUPPORTED;
6293 tBTA_STATUS status = BTA_FAILURE;
6294
6295 tBTM_BLE_VSC_CB cmn_vsc_cb;
6296
6297 APPL_TRACE_DEBUG("bta_dm_scan_filter_param_setup");
6298 BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
6299 if (0 != cmn_vsc_cb.filter_support) {
6300 if ((st = BTM_BleAdvFilterParamSetup(p_data->ble_scan_filt_param_setup.action,
6301 p_data->ble_scan_filt_param_setup.filt_index,
6302 (tBTM_BLE_PF_FILT_PARAMS *)&p_data->ble_scan_filt_param_setup.filt_params,
6303 p_data->ble_scan_filt_param_setup.p_target,
6304 p_data->ble_scan_filt_param_setup.p_filt_param_cback,
6305 p_data->ble_scan_filt_param_setup.ref_value)) == BTM_CMD_STARTED) {
6306 bta_dm_cb.p_scan_filt_param_cback = p_data->ble_scan_filt_param_setup.p_filt_param_cback;
6307 return;
6308 }
6309 }
6310
6311 if (p_data->ble_scan_filt_param_setup.p_filt_param_cback) {
6312 p_data->ble_scan_filt_param_setup.p_filt_param_cback (BTA_DM_BLE_PF_ENABLE_EVT, 0,
6313 p_data->ble_scan_filt_param_setup.ref_value, status);
6314 }
6315
6316 return;
6317 }
6318 #endif
6319
6320 /*******************************************************************************
6321 **
6322 ** Function bta_ble_enable_scan_cmpl
6323 **
6324 ** Description ADV payload filtering enable / disable complete callback
6325 **
6326 **
6327 ** Returns None
6328 **
6329 *******************************************************************************/
bta_ble_energy_info_cmpl(tBTM_BLE_TX_TIME_MS tx_time,tBTM_BLE_RX_TIME_MS rx_time,tBTM_BLE_IDLE_TIME_MS idle_time,tBTM_BLE_ENERGY_USED energy_used,tBTM_STATUS status)6330 static void bta_ble_energy_info_cmpl(tBTM_BLE_TX_TIME_MS tx_time,
6331 tBTM_BLE_RX_TIME_MS rx_time,
6332 tBTM_BLE_IDLE_TIME_MS idle_time,
6333 tBTM_BLE_ENERGY_USED energy_used,
6334 tBTM_STATUS status)
6335 {
6336 tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS : BTA_FAILURE;
6337 tBTA_DM_CONTRL_STATE ctrl_state = 0;
6338 #if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE) && SDP_INCLUDED == TRUE)
6339 if (BTA_SUCCESS == st) {
6340 ctrl_state = bta_dm_pm_obtain_controller_state();
6341 }
6342 #endif
6343 if (bta_dm_cb.p_energy_info_cback) {
6344 bta_dm_cb.p_energy_info_cback(tx_time, rx_time, idle_time, energy_used, ctrl_state, st);
6345 }
6346 }
6347
6348 /*******************************************************************************
6349 **
6350 ** Function bta_dm_ble_get_energy_info
6351 **
6352 ** Description This function obtains the energy info
6353 **
6354 ** Parameters:
6355 **
6356 *******************************************************************************/
bta_dm_ble_get_energy_info(tBTA_DM_MSG * p_data)6357 void bta_dm_ble_get_energy_info(tBTA_DM_MSG *p_data)
6358 {
6359 tBTM_STATUS btm_status = 0;
6360
6361 bta_dm_cb.p_energy_info_cback = p_data->ble_energy_info.p_energy_info_cback;
6362 btm_status = BTM_BleGetEnergyInfo(bta_ble_energy_info_cmpl);
6363 if (BTM_CMD_STARTED != btm_status) {
6364 bta_ble_energy_info_cmpl(0, 0, 0, 0, btm_status);
6365 }
6366 }
6367
6368 #if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE) && SDP_INCLUDED == TRUE)
6369 #ifndef BTA_DM_GATT_CLOSE_DELAY_TOUT
6370 #define BTA_DM_GATT_CLOSE_DELAY_TOUT 1000
6371 #endif
6372
6373 /*******************************************************************************
6374 **
6375 ** Function bta_dm_gattc_register
6376 **
6377 ** Description Register with GATTC in DM if BLE is needed.
6378 **
6379 **
6380 ** Returns void
6381 **
6382 *******************************************************************************/
6383 #if (GATTC_INCLUDED == TRUE)
bta_dm_gattc_register(void)6384 static void bta_dm_gattc_register(void)
6385 {
6386 tBT_UUID app_uuid = {LEN_UUID_128, {0}};
6387
6388 if (bta_dm_search_cb.client_if == BTA_GATTS_INVALID_IF) {
6389 memset (&app_uuid.uu.uuid128, 0x87, LEN_UUID_128);
6390 BTA_GATTC_AppRegister(&app_uuid, bta_dm_gattc_callback);
6391 }
6392 }
6393 #endif /* GATTC_INCLUDED == TRUE */
6394
6395 /*******************************************************************************
6396 **
6397 ** Function btm_dm_start_disc_gatt_services
6398 **
6399 ** Description This function starts a GATT service search request.
6400 **
6401 ** Parameters:
6402 **
6403 *******************************************************************************/
6404 #if (GATTC_INCLUDED == TRUE)
btm_dm_start_disc_gatt_services(UINT16 conn_id)6405 static void btm_dm_start_disc_gatt_services (UINT16 conn_id)
6406 {
6407 tBT_UUID *p_uuid = bta_dm_search_cb.p_srvc_uuid +
6408 bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search;
6409
6410 p_uuid = bta_dm_search_cb.p_srvc_uuid +
6411 bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search;
6412
6413 /* always search for all services */
6414 BTA_GATTC_ServiceSearchRequest(conn_id, p_uuid);
6415 }
6416 #endif /* GATTC_INCLUDED == TRUE */
6417
6418 /*******************************************************************************
6419 **
6420 ** Function bta_dm_gatt_disc_result
6421 **
6422 ** Description This function process the GATT service search result.
6423 **
6424 ** Parameters:
6425 **
6426 *******************************************************************************/
6427 #if (GATTC_INCLUDED == TRUE)
bta_dm_gatt_disc_result(tBTA_GATT_ID service_id)6428 static void bta_dm_gatt_disc_result(tBTA_GATT_ID service_id)
6429 {
6430 tBTA_DM_SEARCH result;
6431
6432 /*
6433 * This logic will not work for gatt case. We are checking against the bluetooth profiles here
6434 * just copy the GATTID in raw data field and send it across.
6435 */
6436
6437
6438 if ( bta_dm_search_cb.ble_raw_used + sizeof(tBTA_GATT_ID) < bta_dm_search_cb.ble_raw_size ) {
6439 APPL_TRACE_DEBUG("ADDING BLE SERVICE uuid=0x%x, ble_ptr = %p, ble_raw_used = 0x%x",
6440 service_id.uuid.uu.uuid16, bta_dm_search_cb.p_ble_rawdata, bta_dm_search_cb.ble_raw_used);
6441
6442 if (bta_dm_search_cb.p_ble_rawdata) {
6443 memcpy((bta_dm_search_cb.p_ble_rawdata + bta_dm_search_cb.ble_raw_used), &service_id,
6444 sizeof(service_id) );
6445
6446 bta_dm_search_cb.ble_raw_used += sizeof(service_id);
6447 } else {
6448 APPL_TRACE_ERROR("p_ble_rawdata is NULL");
6449 }
6450
6451 } else {
6452 APPL_TRACE_ERROR("%s out of room to accommodate 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 );
6453 }
6454
6455 APPL_TRACE_API("%s service_id_uuid_len=%d ", __func__, service_id.uuid.len);
6456 if ( bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) {
6457
6458 /* send result back to app now, one by one */
6459 bdcpy (result.disc_ble_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
6460 BCM_STRNCPY_S((char *)result.disc_ble_res.bd_name, bta_dm_get_remname(), BD_NAME_LEN);
6461 result.disc_ble_res.bd_name[BD_NAME_LEN] = '\0';
6462 memcpy(&result.disc_ble_res.service, &service_id.uuid, sizeof(tBT_UUID));
6463
6464 bta_dm_search_cb.p_search_cback(BTA_DM_DISC_BLE_RES_EVT, &result);
6465 }
6466 }
6467 #endif /* #if (GATTC_INCLUDED == TRUE) */
6468 /*******************************************************************************
6469 **
6470 ** Function bta_dm_gatt_disc_complete
6471 **
6472 ** Description This function process the GATT service search complete.
6473 **
6474 ** Parameters:
6475 **
6476 *******************************************************************************/
6477 #if (GATTC_INCLUDED == TRUE)
bta_dm_gatt_disc_complete(UINT16 conn_id,tBTA_GATT_STATUS status)6478 static void bta_dm_gatt_disc_complete(UINT16 conn_id, tBTA_GATT_STATUS status)
6479 {
6480 tBTA_DM_MSG *p_msg;
6481
6482 APPL_TRACE_DEBUG("bta_dm_gatt_disc_complete conn_id = %d", conn_id);
6483
6484 if (bta_dm_search_cb.uuid_to_search > 0) {
6485 bta_dm_search_cb.uuid_to_search --;
6486 }
6487
6488 if (status == BTA_GATT_OK && bta_dm_search_cb.uuid_to_search > 0) {
6489 btm_dm_start_disc_gatt_services(conn_id);
6490 } else {
6491 bta_dm_search_cb.uuid_to_search = 0;
6492
6493 /* no more services to be discovered */
6494 if ((p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG))) != NULL) {
6495 p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
6496 p_msg->disc_result.result.disc_res.result = (status == BTA_GATT_OK) ? BTA_SUCCESS : BTA_FAILURE;
6497 APPL_TRACE_DEBUG("%s service found: 0x%08x", __FUNCTION__,
6498 bta_dm_search_cb.services_found);
6499 p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
6500 p_msg->disc_result.result.disc_res.num_uuids = 0;
6501 p_msg->disc_result.result.disc_res.p_uuid_list = NULL;
6502 bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
6503 BCM_STRNCPY_S((char *)p_msg->disc_result.result.disc_res.bd_name, bta_dm_get_remname(), BD_NAME_LEN);
6504 p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN] = '\0';
6505
6506 p_msg->disc_result.result.disc_res.device_type |= BT_DEVICE_TYPE_BLE;
6507 if ( bta_dm_search_cb.ble_raw_used > 0 ) {
6508 p_msg->disc_result.result.disc_res.p_raw_data = osi_malloc(bta_dm_search_cb.ble_raw_used);
6509
6510 memcpy( p_msg->disc_result.result.disc_res.p_raw_data,
6511 bta_dm_search_cb.p_ble_rawdata,
6512 bta_dm_search_cb.ble_raw_used );
6513
6514 p_msg->disc_result.result.disc_res.raw_data_size = bta_dm_search_cb.ble_raw_used;
6515 } else {
6516 p_msg->disc_result.result.disc_res.p_raw_data = NULL;
6517 bta_dm_search_cb.p_ble_rawdata = 0;
6518 }
6519
6520 bta_sys_sendmsg(p_msg);
6521 }
6522
6523 if (conn_id != BTA_GATT_INVALID_CONN_ID) {
6524 /* start a GATT channel close delay timer */
6525 bta_sys_start_timer(&bta_dm_search_cb.gatt_close_timer, BTA_DM_DISC_CLOSE_TOUT_EVT,
6526 BTA_DM_GATT_CLOSE_DELAY_TOUT);
6527 bdcpy(bta_dm_search_cb.pending_close_bda, bta_dm_search_cb.peer_bdaddr);
6528 }
6529 bta_dm_search_cb.gatt_disc_active = FALSE;
6530 }
6531 }
6532 #endif /* #if (GATTC_INCLUDED == TRUE) */
6533
6534 /*******************************************************************************
6535 **
6536 ** Function bta_dm_close_gatt_conn
6537 **
6538 ** Description This function close the GATT connection after delay timeout.
6539 **
6540 ** Parameters:
6541 **
6542 *******************************************************************************/
6543 #if (GATTC_INCLUDED == TRUE)
bta_dm_close_gatt_conn(tBTA_DM_MSG * p_data)6544 void bta_dm_close_gatt_conn(tBTA_DM_MSG *p_data)
6545 {
6546 UNUSED(p_data);
6547
6548 if (bta_dm_search_cb.conn_id != BTA_GATT_INVALID_CONN_ID) {
6549 BTA_GATTC_Close(bta_dm_search_cb.conn_id);
6550 }
6551
6552 memset(bta_dm_search_cb.pending_close_bda, 0, BD_ADDR_LEN);
6553 bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID;
6554 }
6555 #endif /* #if (GATTC_INCLUDED == TRUE) */
6556 /*******************************************************************************
6557 **
6558 ** Function btm_dm_start_gatt_discovery
6559 **
6560 ** Description This is GATT initiate the service search by open a GATT connection
6561 ** first.
6562 **
6563 ** Parameters:
6564 **
6565 *******************************************************************************/
6566 #if (GATTC_INCLUDED == TRUE)
btm_dm_start_gatt_discovery(BD_ADDR bd_addr)6567 void btm_dm_start_gatt_discovery (BD_ADDR bd_addr)
6568 {
6569 bta_dm_search_cb.gatt_disc_active = TRUE;
6570
6571 /* connection is already open */
6572 if (bdcmp(bta_dm_search_cb.pending_close_bda, bd_addr) == 0 &&
6573 bta_dm_search_cb.conn_id != BTA_GATT_INVALID_CONN_ID) {
6574 memset(bta_dm_search_cb.pending_close_bda, 0, BD_ADDR_LEN);
6575 bta_sys_stop_timer(&bta_dm_search_cb.gatt_close_timer);
6576 btm_dm_start_disc_gatt_services(bta_dm_search_cb.conn_id);
6577 } else {
6578 //TODO need to add addr_type in future
6579 BTA_GATTC_Enh_Open(bta_dm_search_cb.client_if, bd_addr, BLE_ADDR_UNKNOWN_TYPE, TRUE,
6580 BTA_GATT_TRANSPORT_LE, FALSE, BLE_ADDR_UNKNOWN_TYPE, 0, NULL, NULL, NULL);
6581
6582 }
6583 }
6584 #endif /* #if (GATTC_INCLUDED == TRUE) */
6585 /*******************************************************************************
6586 **
6587 ** Function bta_dm_cancel_gatt_discovery
6588 **
6589 ** Description This is GATT cancel the GATT service search.
6590 **
6591 ** Parameters:
6592 **
6593 *******************************************************************************/
6594 #if (GATTC_INCLUDED == TRUE)
bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr)6595 static void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr)
6596 {
6597 if (bta_dm_search_cb.conn_id == BTA_GATT_INVALID_CONN_ID) {
6598 BTA_GATTC_CancelOpen(bta_dm_search_cb.client_if, bd_addr, TRUE);
6599 }
6600
6601 bta_dm_gatt_disc_complete(bta_dm_search_cb.conn_id, (tBTA_GATT_STATUS) BTA_GATT_ERROR);
6602 }
6603 #endif /* #if (GATTC_INCLUDED == TRUE) */
6604
6605 /*******************************************************************************
6606 **
6607 ** Function bta_dm_proc_open_evt
6608 **
6609 ** Description process BTA_GATTC_OPEN_EVT in DM.
6610 **
6611 ** Parameters:
6612 **
6613 *******************************************************************************/
6614 #if (GATTC_INCLUDED == TRUE)
bta_dm_proc_open_evt(tBTA_GATTC_OPEN * p_data)6615 void bta_dm_proc_open_evt(tBTA_GATTC_OPEN *p_data)
6616 {
6617 UINT8 *p1;
6618 UINT8 *p2;
6619
6620 p1 = bta_dm_search_cb.peer_bdaddr;
6621 p2 = p_data->remote_bda;
6622
6623 APPL_TRACE_DEBUG("DM Search state= %d search_cb.peer_dbaddr: [%08x%04x] connected_bda= [%08x%04x] ",
6624 bta_dm_search_cb.state,
6625 ((p1[0]) << 24) + ((p1[1]) << 16) + ((p1[2]) << 8) + (p1[3]),
6626 ((p1[4]) << 8) + p1[5],
6627 ((p2[0]) << 24) + ((p2[1]) << 16) + ((p2[2]) << 8) + (p2[3]),
6628 ((p2[4]) << 8) + p2[5]);
6629
6630 UNUSED(p1);
6631 UNUSED(p2);
6632 APPL_TRACE_DEBUG("BTA_GATTC_OPEN_EVT conn_id = %d client_if=%d status = %d" ,
6633 p_data->conn_id,
6634 p_data->client_if,
6635 p_data->status);
6636
6637 bta_dm_search_cb.conn_id = p_data->conn_id;
6638
6639 if (p_data->status == BTA_GATT_OK) {
6640 btm_dm_start_disc_gatt_services(p_data->conn_id);
6641 } else {
6642 bta_dm_gatt_disc_complete(BTA_GATT_INVALID_CONN_ID, p_data->status);
6643 }
6644 }
6645 #endif /* #if (GATTC_INCLUDED == TRUE) */
6646
6647 /*******************************************************************************
6648 **
6649 ** Function bta_dm_gattc_callback
6650 **
6651 ** Description This is GATT client callback function used in DM.
6652 **
6653 ** Parameters:
6654 **
6655 *******************************************************************************/
6656 #if (GATTC_INCLUDED == TRUE)
bta_dm_gattc_callback(tBTA_GATTC_EVT event,tBTA_GATTC * p_data)6657 static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data)
6658 {
6659 APPL_TRACE_DEBUG("bta_dm_gattc_callback event = %d", event);
6660
6661 switch (event) {
6662 case BTA_GATTC_REG_EVT:
6663 APPL_TRACE_DEBUG("BTA_GATTC_REG_EVT client_if = %d", p_data->reg_oper.client_if);
6664 if (p_data->reg_oper.status == BTA_GATT_OK) {
6665 bta_dm_search_cb.client_if = p_data->reg_oper.client_if;
6666 } else {
6667 bta_dm_search_cb.client_if = BTA_GATTS_INVALID_IF;
6668 }
6669 break;
6670
6671 case BTA_GATTC_OPEN_EVT:
6672 bta_dm_proc_open_evt(&p_data->open);
6673 break;
6674
6675 case BTA_GATTC_SEARCH_RES_EVT:
6676 bta_dm_gatt_disc_result(p_data->srvc_res.service_uuid);
6677 break;
6678
6679 case BTA_GATTC_SEARCH_CMPL_EVT:
6680 if ( bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) {
6681 bta_dm_gatt_disc_complete(p_data->search_cmpl.conn_id, p_data->search_cmpl.status);
6682 }
6683 break;
6684
6685 case BTA_GATTC_CLOSE_EVT:
6686 APPL_TRACE_DEBUG("BTA_GATTC_CLOSE_EVT reason = %d", p_data->close.reason);
6687 /* in case of disconnect before search is completed */
6688 if ( (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) &&
6689 (bta_dm_search_cb.state != BTA_DM_SEARCH_ACTIVE) &&
6690 !memcmp(p_data->close.remote_bda, bta_dm_search_cb.peer_bdaddr, BD_ADDR_LEN)) {
6691 bta_dm_gatt_disc_complete((UINT16)BTA_GATT_INVALID_CONN_ID, (tBTA_GATT_STATUS) BTA_GATT_ERROR);
6692 }
6693 break;
6694
6695 default:
6696 break;
6697 }
6698 }
6699 #endif /* #if (GATTC_INCLUDED == TRUE) */
6700 #endif /* BTA_GATT_INCLUDED */
6701
6702 #if BLE_VND_INCLUDED == TRUE
6703 /*******************************************************************************
6704 **
6705 ** Function bta_dm_ctrl_features_rd_cmpl_cback
6706 **
6707 ** Description callback to handle controller feature read complete
6708 **
6709 ** Parameters:
6710 **
6711 *******************************************************************************/
bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result)6712 static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result)
6713 {
6714 APPL_TRACE_DEBUG("%s status = %d ", __FUNCTION__, result);
6715 if (result == BTM_SUCCESS) {
6716 if (bta_dm_cb.p_sec_cback) {
6717 bta_dm_cb.p_sec_cback(BTA_DM_LE_FEATURES_READ, NULL);
6718 }
6719 } else {
6720 APPL_TRACE_ERROR("%s Ctrl BLE feature read failed: status :%d", __FUNCTION__, result);
6721 }
6722
6723 }
6724 #endif /* BLE_VND_INCLUDED */
6725
6726 #endif /* BLE_INCLUDED */
6727