OSDN Git Service

DO NOT MERGE Fix unexpected behavior in smp_sm_event
[android-x86/system-bt.git] / bta / dm / bta_dm_act.cc
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 #define LOG_TAG "bt_bta_dm"
27
28 #include <base/bind.h>
29 #include <base/callback.h>
30 #include <base/logging.h>
31 #include <string.h>
32
33 #include "bt_common.h"
34 #include "bt_target.h"
35 #include "bt_types.h"
36 #include "bta_api.h"
37 #include "bta_dm_api.h"
38 #include "bta_dm_co.h"
39 #include "bta_dm_int.h"
40 #include "bta_sys.h"
41 #include "btm_api.h"
42 #include "btm_int.h"
43 #include "btu.h"
44 #include "gap_api.h" /* For GAP_BleReadPeerPrefConnParams */
45 #include "l2c_api.h"
46 #include "osi/include/log.h"
47 #include "osi/include/osi.h"
48 #include "sdp_api.h"
49 #include "utl.h"
50
51 #if (GAP_INCLUDED == TRUE)
52 #include "gap_api.h"
53 #endif
54
55 static void bta_dm_inq_results_cb(tBTM_INQ_RESULTS* p_inq, uint8_t* p_eir,
56                                   uint16_t eir_len);
57 static void bta_dm_inq_cmpl_cb(void* p_result);
58 static void bta_dm_service_search_remname_cback(const RawAddress& bd_addr,
59                                                 DEV_CLASS dc, BD_NAME bd_name);
60 static void bta_dm_remname_cback(tBTM_REMOTE_DEV_NAME* p_remote_name);
61 static void bta_dm_find_services(const RawAddress& bd_addr);
62 static void bta_dm_discover_next_device(void);
63 static void bta_dm_sdp_callback(uint16_t sdp_status);
64 static uint8_t bta_dm_authorize_cback(const RawAddress& bd_addr,
65                                       DEV_CLASS dev_class, BD_NAME bd_name,
66                                       uint8_t* service_name, uint8_t service_id,
67                                       bool is_originator);
68 static uint8_t bta_dm_pin_cback(const RawAddress& bd_addr, DEV_CLASS dev_class,
69                                 BD_NAME bd_name, bool min_16_digit);
70 static uint8_t bta_dm_new_link_key_cback(const RawAddress& bd_addr,
71                                          DEV_CLASS dev_class, BD_NAME bd_name,
72                                          LINK_KEY key, uint8_t key_type);
73 static uint8_t bta_dm_authentication_complete_cback(const RawAddress& bd_addr,
74                                                     DEV_CLASS dev_class,
75                                                     BD_NAME bd_name,
76                                                     int result);
77 static void bta_dm_local_name_cback(const RawAddress& bd_addr);
78 static bool bta_dm_check_av(uint16_t event);
79 static void bta_dm_bl_change_cback(tBTM_BL_EVENT_DATA* p_data);
80
81 static void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, uint8_t id,
82                                 uint8_t app_id, const RawAddress* peer_addr);
83
84 /* Extended Inquiry Response */
85 #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
86 static uint8_t bta_dm_sp_cback(tBTM_SP_EVT event, tBTM_SP_EVT_DATA* p_data);
87 #endif
88
89 static void bta_dm_set_eir(char* local_name);
90
91 static void bta_dm_eir_search_services(tBTM_INQ_RESULTS* p_result,
92                                        tBTA_SERVICE_MASK* p_services_to_search,
93                                        tBTA_SERVICE_MASK* p_services_found);
94
95 static void bta_dm_search_timer_cback(void* data);
96 static void bta_dm_disable_conn_down_timer_cback(void* data);
97 static void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, uint8_t id,
98                             uint8_t app_id, const RawAddress* peer_addr);
99 static void bta_dm_adjust_roles(bool delay_role_switch);
100 static char* bta_dm_get_remname(void);
101 static void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result);
102
103 static bool bta_dm_read_remote_device_name(const RawAddress& bd_addr,
104                                            tBT_TRANSPORT transport);
105 static void bta_dm_discover_device(const RawAddress& remote_bd_addr);
106
107 static void bta_dm_sys_hw_cback(tBTA_SYS_HW_EVT status);
108 static void bta_dm_disable_search_and_disc(void);
109
110 static uint8_t bta_dm_ble_smp_cback(tBTM_LE_EVT event, const RawAddress& bda,
111                                     tBTM_LE_EVT_DATA* p_data);
112 static void bta_dm_ble_id_key_cback(uint8_t key_type,
113                                     tBTM_BLE_LOCAL_KEYS* p_key);
114 static void bta_dm_gattc_register(void);
115 static void btm_dm_start_gatt_discovery(const RawAddress& bd_addr);
116 static void bta_dm_cancel_gatt_discovery(const RawAddress& bd_addr);
117 static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC* p_data);
118 extern tBTA_DM_CONTRL_STATE bta_dm_pm_obtain_controller_state(void);
119
120 #if (BLE_VND_INCLUDED == TRUE)
121 static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result);
122 #endif
123
124 #ifndef BTA_DM_BLE_ADV_CHNL_MAP
125 #define BTA_DM_BLE_ADV_CHNL_MAP \
126   (BTM_BLE_ADV_CHNL_37 | BTM_BLE_ADV_CHNL_38 | BTM_BLE_ADV_CHNL_39)
127 #endif
128
129 /* Disable timer interval (in milliseconds) */
130 #ifndef BTA_DM_DISABLE_TIMER_MS
131 #define BTA_DM_DISABLE_TIMER_MS 5000
132 #endif
133
134 /* Disable timer retrial interval (in milliseconds) */
135 #ifndef BTA_DM_DISABLE_TIMER_RETRIAL_MS
136 #define BTA_DM_DISABLE_TIMER_RETRIAL_MS 1500
137 #endif
138
139 /* Disable connection down timer (in milliseconds) */
140 #ifndef BTA_DM_DISABLE_CONN_DOWN_TIMER_MS
141 #define BTA_DM_DISABLE_CONN_DOWN_TIMER_MS 1000
142 #endif
143
144 /* Switch delay timer (in milliseconds) */
145 #ifndef BTA_DM_SWITCH_DELAY_TIMER_MS
146 #define BTA_DM_SWITCH_DELAY_TIMER_MS 500
147 #endif
148
149 static void bta_dm_reset_sec_dev_pending(const RawAddress& remote_bd_addr);
150 static void bta_dm_remove_sec_dev_entry(const RawAddress& remote_bd_addr);
151 static void bta_dm_observe_results_cb(tBTM_INQ_RESULTS* p_inq, uint8_t* p_eir,
152                                       uint16_t eir_len);
153 static void bta_dm_observe_cmpl_cb(void* p_result);
154 static void bta_dm_delay_role_switch_cback(void* data);
155 static void bta_dm_disable_timer_cback(void* data);
156
157 const uint16_t bta_service_id_to_uuid_lkup_tbl[BTA_MAX_SERVICE_ID] = {
158     UUID_SERVCLASS_PNP_INFORMATION,       /* Reserved */
159     UUID_SERVCLASS_SERIAL_PORT,           /* BTA_SPP_SERVICE_ID */
160     UUID_SERVCLASS_DIALUP_NETWORKING,     /* BTA_DUN_SERVICE_ID */
161     UUID_SERVCLASS_AUDIO_SOURCE,          /* BTA_A2DP_SOURCE_SERVICE_ID */
162     UUID_SERVCLASS_LAN_ACCESS_USING_PPP,  /* BTA_LAP_SERVICE_ID */
163     UUID_SERVCLASS_HEADSET,               /* BTA_HSP_HS_SERVICE_ID */
164     UUID_SERVCLASS_HF_HANDSFREE,          /* BTA_HFP_HS_SERVICE_ID */
165     UUID_SERVCLASS_OBEX_OBJECT_PUSH,      /* BTA_OPP_SERVICE_ID */
166     UUID_SERVCLASS_OBEX_FILE_TRANSFER,    /* BTA_FTP_SERVICE_ID */
167     UUID_SERVCLASS_CORDLESS_TELEPHONY,    /* BTA_CTP_SERVICE_ID */
168     UUID_SERVCLASS_INTERCOM,              /* BTA_ICP_SERVICE_ID */
169     UUID_SERVCLASS_IRMC_SYNC,             /* BTA_SYNC_SERVICE_ID */
170     UUID_SERVCLASS_DIRECT_PRINTING,       /* BTA_BPP_SERVICE_ID */
171     UUID_SERVCLASS_IMAGING_RESPONDER,     /* BTA_BIP_SERVICE_ID */
172     UUID_SERVCLASS_PANU,                  /* BTA_PANU_SERVICE_ID */
173     UUID_SERVCLASS_NAP,                   /* BTA_NAP_SERVICE_ID */
174     UUID_SERVCLASS_GN,                    /* BTA_GN_SERVICE_ID */
175     UUID_SERVCLASS_SAP,                   /* BTA_SAP_SERVICE_ID */
176     UUID_SERVCLASS_AUDIO_SINK,            /* BTA_A2DP_SERVICE_ID */
177     UUID_SERVCLASS_AV_REMOTE_CONTROL,     /* BTA_AVRCP_SERVICE_ID */
178     UUID_SERVCLASS_HUMAN_INTERFACE,       /* BTA_HID_SERVICE_ID */
179     UUID_SERVCLASS_VIDEO_SINK,            /* BTA_VDP_SERVICE_ID */
180     UUID_SERVCLASS_PBAP_PSE,              /* BTA_PBAP_SERVICE_ID */
181     UUID_SERVCLASS_HEADSET_AUDIO_GATEWAY, /* BTA_HSP_SERVICE_ID */
182     UUID_SERVCLASS_AG_HANDSFREE,          /* BTA_HFP_SERVICE_ID */
183     UUID_SERVCLASS_MESSAGE_ACCESS,        /* BTA_MAP_SERVICE_ID */
184     UUID_SERVCLASS_MESSAGE_NOTIFICATION,  /* BTA_MN_SERVICE_ID */
185     UUID_SERVCLASS_HDP_PROFILE,           /* BTA_HDP_SERVICE_ID */
186     UUID_SERVCLASS_PBAP_PCE,              /* BTA_PCE_SERVICE_ID */
187     UUID_PROTOCOL_ATT                     /* BTA_GATT_SERVICE_ID */
188 };
189
190 /*
191  * NOTE : The number of element in bta_service_id_to_btm_srv_id_lkup_tbl should
192  * be matching with
193  *        the value BTA_MAX_SERVICE_ID in bta_api.h
194  *
195  *        i.e., If you add new Service ID for BTA, the correct security ID of
196  * the new service
197  *              from Security service definitions (btm_api.h) should be added to
198  * this lookup table.
199  */
200 const uint32_t bta_service_id_to_btm_srv_id_lkup_tbl[BTA_MAX_SERVICE_ID] = {
201     0,                             /* Reserved */
202     BTM_SEC_SERVICE_SERIAL_PORT,   /* BTA_SPP_SERVICE_ID */
203     BTM_SEC_SERVICE_DUN,           /* BTA_DUN_SERVICE_ID */
204     BTM_SEC_SERVICE_AVDTP,         /* BTA_AUDIO_SOURCE_SERVICE_ID */
205     BTM_SEC_SERVICE_LAN_ACCESS,    /* BTA_LAP_SERVICE_ID */
206     BTM_SEC_SERVICE_HEADSET_AG,    /* BTA_HSP_SERVICE_ID */
207     BTM_SEC_SERVICE_AG_HANDSFREE,  /* BTA_HFP_SERVICE_ID */
208     BTM_SEC_SERVICE_OBEX,          /* BTA_OPP_SERVICE_ID */
209     BTM_SEC_SERVICE_OBEX_FTP,      /* BTA_FTP_SERVICE_ID */
210     BTM_SEC_SERVICE_CORDLESS,      /* BTA_CTP_SERVICE_ID */
211     BTM_SEC_SERVICE_INTERCOM,      /* BTA_ICP_SERVICE_ID */
212     BTM_SEC_SERVICE_IRMC_SYNC,     /* BTA_SYNC_SERVICE_ID */
213     BTM_SEC_SERVICE_BPP_JOB,       /* BTA_BPP_SERVICE_ID */
214     BTM_SEC_SERVICE_BIP,           /* BTA_BIP_SERVICE_ID */
215     BTM_SEC_SERVICE_BNEP_PANU,     /* BTA_PANU_SERVICE_ID */
216     BTM_SEC_SERVICE_BNEP_NAP,      /* BTA_NAP_SERVICE_ID */
217     BTM_SEC_SERVICE_BNEP_GN,       /* BTA_GN_SERVICE_ID */
218     BTM_SEC_SERVICE_SAP,           /* BTA_SAP_SERVICE_ID */
219     BTM_SEC_SERVICE_AVDTP,         /* BTA_A2DP_SERVICE_ID */
220     BTM_SEC_SERVICE_AVCTP,         /* BTA_AVRCP_SERVICE_ID */
221     BTM_SEC_SERVICE_HIDH_SEC_CTRL, /* BTA_HID_SERVICE_ID */
222     BTM_SEC_SERVICE_AVDTP,         /* BTA_VDP_SERVICE_ID */
223     BTM_SEC_SERVICE_PBAP,          /* BTA_PBAP_SERVICE_ID */
224     BTM_SEC_SERVICE_HEADSET,       /* BTA_HSP_HS_SERVICE_ID */
225     BTM_SEC_SERVICE_HF_HANDSFREE,  /* BTA_HFP_HS_SERVICE_ID */
226     BTM_SEC_SERVICE_MAP,           /* BTA_MAP_SERVICE_ID */
227     BTM_SEC_SERVICE_MAP,           /* BTA_MN_SERVICE_ID */
228     BTM_SEC_SERVICE_HDP_SNK,       /* BTA_HDP_SERVICE_ID */
229     BTM_SEC_SERVICE_PBAP,          /* BTA_PCE_SERVICE_ID */
230     BTM_SEC_SERVICE_ATT            /* BTA_GATT_SERVICE_ID */
231 };
232
233 /* bta security callback */
234 const tBTM_APPL_INFO bta_security = {&bta_dm_authorize_cback,
235                                      &bta_dm_pin_cback,
236                                      &bta_dm_new_link_key_cback,
237                                      &bta_dm_authentication_complete_cback,
238                                      &bta_dm_bond_cancel_complete_cback,
239 #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
240                                      &bta_dm_sp_cback,
241 #else
242                                      NULL,
243 #endif
244                                      &bta_dm_ble_smp_cback,
245                                      &bta_dm_ble_id_key_cback};
246
247 #define MAX_DISC_RAW_DATA_BUF (4096)
248 uint8_t g_disc_raw_data_buf[MAX_DISC_RAW_DATA_BUF];
249
250 extern DEV_CLASS local_device_default_class;
251
252 /*******************************************************************************
253  *
254  * Function         bta_dm_enable
255  *
256  * Description      Initialises the BT device manager
257  *
258  *
259  * Returns          void
260  *
261  ******************************************************************************/
262 void bta_dm_enable(tBTA_DM_MSG* p_data) {
263   tBTA_DM_ENABLE enable_event;
264
265   /* if already in use, return an error */
266   if (bta_dm_cb.is_bta_dm_active == true) {
267     APPL_TRACE_WARNING("%s Device already started by another application",
268                        __func__);
269     memset(&enable_event, 0, sizeof(tBTA_DM_ENABLE));
270     enable_event.status = BTA_FAILURE;
271     if (p_data->enable.p_sec_cback != NULL)
272       p_data->enable.p_sec_cback(BTA_DM_ENABLE_EVT,
273                                  (tBTA_DM_SEC*)&enable_event);
274     return;
275   }
276
277   /* first, register our callback to SYS HW manager */
278   bta_sys_hw_register(BTA_SYS_HW_BLUETOOTH, bta_dm_sys_hw_cback);
279
280   /* make sure security callback is saved - if no callback, do not erase the
281   previous one,
282   it could be an error recovery mechanism */
283   if (p_data->enable.p_sec_cback != NULL)
284     bta_dm_cb.p_sec_cback = p_data->enable.p_sec_cback;
285   /* notify BTA DM is now active */
286   bta_dm_cb.is_bta_dm_active = true;
287
288   /* send a message to BTA SYS */
289   tBTA_SYS_HW_MSG* sys_enable_event =
290       (tBTA_SYS_HW_MSG*)osi_malloc(sizeof(tBTA_SYS_HW_MSG));
291   sys_enable_event->hdr.event = BTA_SYS_API_ENABLE_EVT;
292   sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH;
293
294   bta_sys_sendmsg(sys_enable_event);
295 }
296
297 /*******************************************************************************
298  *
299  * Function         bta_dm_init_cb
300  *
301  * Description      Initializes the bta_dm_cb control block
302  *
303  *
304  * Returns          void
305  *
306  ******************************************************************************/
307 void bta_dm_init_cb(void) {
308   memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));
309   bta_dm_cb.disable_timer = alarm_new("bta_dm.disable_timer");
310   bta_dm_cb.switch_delay_timer = alarm_new("bta_dm.switch_delay_timer");
311   for (size_t i = 0; i < BTA_DM_NUM_PM_TIMER; i++) {
312     for (size_t j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++) {
313       bta_dm_cb.pm_timer[i].timer[j] = alarm_new("bta_dm.pm_timer");
314     }
315   }
316 }
317
318 /*******************************************************************************
319  *
320  * Function         bta_dm_deinit_cb
321  *
322  * Description      De-initializes the bta_dm_cb control block
323  *
324  *
325  * Returns          void
326  *
327  ******************************************************************************/
328 void bta_dm_deinit_cb(void) {
329   /*
330    * TODO: Should alarm_free() the bta_dm_cb timers during graceful
331    * shutdown.
332    */
333   alarm_free(bta_dm_cb.disable_timer);
334   alarm_free(bta_dm_cb.switch_delay_timer);
335   for (size_t i = 0; i < BTA_DM_NUM_PM_TIMER; i++) {
336     for (size_t j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++) {
337       alarm_free(bta_dm_cb.pm_timer[i].timer[j]);
338     }
339   }
340   memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));
341 }
342
343 /*******************************************************************************
344  *
345  * Function         bta_dm_sys_hw_cback
346  *
347  * Description     callback register to SYS to get HW status updates
348  *
349  *
350  * Returns          void
351  *
352  ******************************************************************************/
353 static void bta_dm_sys_hw_cback(tBTA_SYS_HW_EVT status) {
354   DEV_CLASS dev_class;
355   tBTA_DM_SEC_CBACK* temp_cback;
356   uint8_t key_mask = 0;
357   BT_OCTET16 er;
358   tBTA_BLE_LOCAL_ID_KEYS id_key;
359
360   APPL_TRACE_DEBUG("%s with event: %i", __func__, status);
361
362   /* On H/W error evt, report to the registered DM application callback */
363   if (status == BTA_SYS_HW_ERROR_EVT) {
364     if (bta_dm_cb.p_sec_cback != NULL)
365       bta_dm_cb.p_sec_cback(BTA_DM_HW_ERROR_EVT, NULL);
366     return;
367   }
368
369   if (status == BTA_SYS_HW_OFF_EVT) {
370     if (bta_dm_cb.p_sec_cback != NULL)
371       bta_dm_cb.p_sec_cback(BTA_DM_DISABLE_EVT, NULL);
372
373     /* reinitialize the control block */
374     bta_dm_deinit_cb();
375
376     /* hw is ready, go on with BTA DM initialization */
377     alarm_free(bta_dm_search_cb.search_timer);
378     alarm_free(bta_dm_search_cb.gatt_close_timer);
379     memset(&bta_dm_search_cb, 0, sizeof(bta_dm_search_cb));
380
381     /* unregister from SYS */
382     bta_sys_hw_unregister(BTA_SYS_HW_BLUETOOTH);
383     /* notify BTA DM is now unactive */
384     bta_dm_cb.is_bta_dm_active = false;
385   } else if (status == BTA_SYS_HW_ON_EVT) {
386     /* FIXME: We should not unregister as the SYS shall invoke this callback on
387      * a H/W error.
388      * We need to revisit when this platform has more than one BLuetooth H/W
389      * chip
390      */
391     // bta_sys_hw_unregister( BTA_SYS_HW_BLUETOOTH);
392
393     /* save security callback */
394     temp_cback = bta_dm_cb.p_sec_cback;
395     /* make sure the control block is properly initialized */
396     bta_dm_init_cb();
397     /* and retrieve the callback */
398     bta_dm_cb.p_sec_cback = temp_cback;
399     bta_dm_cb.is_bta_dm_active = true;
400
401     /* hw is ready, go on with BTA DM initialization */
402     alarm_free(bta_dm_search_cb.search_timer);
403     alarm_free(bta_dm_search_cb.gatt_close_timer);
404     memset(&bta_dm_search_cb, 0, sizeof(bta_dm_search_cb));
405     /*
406      * TODO: Should alarm_free() the bta_dm_search_cb timers during
407      * graceful shutdown.
408      */
409     bta_dm_search_cb.search_timer = alarm_new("bta_dm_search.search_timer");
410     bta_dm_search_cb.gatt_close_timer =
411         alarm_new("bta_dm_search.gatt_close_timer");
412
413     memset(&bta_dm_conn_srvcs, 0, sizeof(bta_dm_conn_srvcs));
414     memset(&bta_dm_di_cb, 0, sizeof(tBTA_DM_DI_CB));
415
416     memcpy(dev_class, p_bta_dm_cfg->dev_class, sizeof(dev_class));
417     BTM_SetDeviceClass(dev_class);
418
419     /* load BLE local information: ID keys, ER if available */
420     bta_dm_co_ble_load_local_keys(&key_mask, er, &id_key);
421
422     if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ER) {
423       BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ER,
424                            (tBTM_BLE_LOCAL_KEYS*)&er);
425     }
426     if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ID) {
427       BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ID,
428                            (tBTM_BLE_LOCAL_KEYS*)&id_key);
429     }
430     bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID;
431
432     BTM_SecRegister((tBTM_APPL_INFO*)&bta_security);
433     BTM_SetDefaultLinkSuperTout(p_bta_dm_cfg->link_timeout);
434     BTM_WritePageTimeout(p_bta_dm_cfg->page_timeout);
435     bta_dm_cb.cur_policy = p_bta_dm_cfg->policy_settings;
436     BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
437     BTM_RegBusyLevelNotif(bta_dm_bl_change_cback, NULL,
438                           BTM_BL_UPDATE_MASK | BTM_BL_ROLE_CHG_MASK);
439
440 #if (BLE_VND_INCLUDED == TRUE)
441     BTM_BleReadControllerFeatures(bta_dm_ctrl_features_rd_cmpl_cback);
442 #else
443     /* If VSC multi adv commands are available, advertising will be initialized
444      * when capabilities are read. If they are not avaliable, initialize
445      * advertising here */
446     btm_ble_adv_init();
447 #endif
448
449     /* Earlier, we used to invoke BTM_ReadLocalAddr which was just copying the
450        bd_addr
451        from the control block and invoking the callback which was sending the
452        DM_ENABLE_EVT.
453        But then we have a few HCI commands being invoked above which were still
454        in progress
455        when the ENABLE_EVT was sent. So modified this to fetch the local name
456        which forces
457        the DM_ENABLE_EVT to be sent only after all the init steps are complete
458        */
459     BTM_ReadLocalDeviceNameFromController(
460         (tBTM_CMPL_CB*)bta_dm_local_name_cback);
461
462     bta_sys_rm_register((tBTA_SYS_CONN_CBACK*)bta_dm_rm_cback);
463
464     /* initialize bluetooth low power manager */
465     bta_dm_init_pm();
466
467     bta_sys_policy_register((tBTA_SYS_CONN_CBACK*)bta_dm_policy_cback);
468
469     bta_dm_gattc_register();
470
471   } else
472     APPL_TRACE_DEBUG(" --- ignored event");
473 }
474
475 /*******************************************************************************
476  *
477  * Function         bta_dm_disable
478  *
479  * Description      Disables the BT device manager
480  *
481  *
482  * Returns          void
483  *
484  ******************************************************************************/
485 void bta_dm_disable(UNUSED_ATTR tBTA_DM_MSG* p_data) {
486   /* Set l2cap idle timeout to 0 (so BTE immediately disconnects ACL link after
487    * last channel is closed) */
488   L2CA_SetIdleTimeoutByBdAddr(RawAddress::kAny, 0, BT_TRANSPORT_BR_EDR);
489   L2CA_SetIdleTimeoutByBdAddr(RawAddress::kAny, 0, BT_TRANSPORT_LE);
490
491   /* disable all active subsystems */
492   bta_sys_disable(BTA_SYS_HW_BLUETOOTH);
493
494   BTM_SetDiscoverability(BTM_NON_DISCOVERABLE, 0, 0);
495   BTM_SetConnectability(BTM_NON_CONNECTABLE, 0, 0);
496
497   bta_dm_disable_pm();
498   bta_dm_disable_search_and_disc();
499   bta_dm_cb.disabling = true;
500
501   BTM_BleClearBgConnDev();
502
503   if (BTM_GetNumAclLinks() == 0) {
504 #if (BTA_DISABLE_DELAY > 0)
505     /* If BTA_DISABLE_DELAY is defined and greater than zero, then delay the
506      * shutdown by
507      * BTA_DISABLE_DELAY milliseconds
508      */
509     APPL_TRACE_WARNING("%s BTA_DISABLE_DELAY set to %d ms", __func__,
510                        BTA_DISABLE_DELAY);
511     alarm_set_on_mloop(bta_dm_cb.disable_timer, BTA_DISABLE_DELAY,
512                        bta_dm_disable_conn_down_timer_cback, NULL);
513 #else
514     bta_dm_disable_conn_down_timer_cback(NULL);
515 #endif
516   } else {
517     alarm_set_on_mloop(bta_dm_cb.disable_timer, BTA_DM_DISABLE_TIMER_MS,
518                        bta_dm_disable_timer_cback, UINT_TO_PTR(0));
519   }
520 }
521
522 /*******************************************************************************
523  *
524  * Function         bta_dm_disable_timer_cback
525  *
526  * Description      Called if the disable timer expires
527  *                  Used to close ACL connections which are still active
528  *
529  *
530  *
531  * Returns          void
532  *
533  ******************************************************************************/
534 static void bta_dm_disable_timer_cback(void* data) {
535   uint8_t i;
536   tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
537   bool trigger_disc = false;
538   uint32_t param = PTR_TO_UINT(data);
539
540   APPL_TRACE_EVENT("%s trial %u", __func__, param);
541
542   if (BTM_GetNumAclLinks() && (param == 0)) {
543     for (i = 0; i < bta_dm_cb.device_list.count; i++) {
544       transport = bta_dm_cb.device_list.peer_device[i].transport;
545       btm_remove_acl(bta_dm_cb.device_list.peer_device[i].peer_bdaddr,
546                      transport);
547       trigger_disc = true;
548     }
549
550     /* Retrigger disable timer in case ACL disconnect failed, DISABLE_EVT still
551        need
552         to be sent out to avoid jave layer disable timeout */
553     if (trigger_disc) {
554       alarm_set_on_mloop(bta_dm_cb.disable_timer,
555                          BTA_DM_DISABLE_TIMER_RETRIAL_MS,
556                          bta_dm_disable_timer_cback, UINT_TO_PTR(1));
557     }
558   } else {
559     bta_dm_cb.disabling = false;
560
561     bta_sys_remove_uuid(UUID_SERVCLASS_PNP_INFORMATION);
562     bta_dm_cb.p_sec_cback(BTA_DM_DISABLE_EVT, NULL);
563   }
564 }
565
566 /*******************************************************************************
567  *
568  * Function         bta_dm_set_dev_name
569  *
570  * Description      Sets local device name
571  *
572  *
573  * Returns          void
574  *
575  ******************************************************************************/
576 void bta_dm_set_dev_name(tBTA_DM_MSG* p_data) {
577   BTM_SetLocalDeviceName((char*)p_data->set_name.name);
578   bta_dm_set_eir((char*)p_data->set_name.name);
579 }
580
581 /*******************************************************************************
582  *
583  * Function         bta_dm_set_visibility
584  *
585  * Description      Sets discoverability, connectability and pairability
586  *
587  *
588  * Returns          void
589  *
590  ******************************************************************************/
591 void bta_dm_set_visibility(tBTA_DM_MSG* p_data) {
592   uint16_t window, interval;
593   uint16_t le_disc_mode = BTM_BleReadDiscoverability();
594   uint16_t le_conn_mode = BTM_BleReadConnectability();
595   uint16_t disc_mode = BTM_ReadDiscoverability(&window, &interval);
596   uint16_t conn_mode = BTM_ReadConnectability(&window, &interval);
597
598   /* set modes for Discoverability and connectability if not ignore */
599   if (p_data->set_visibility.disc_mode != (BTA_DM_IGNORE | BTA_DM_LE_IGNORE)) {
600     if ((p_data->set_visibility.disc_mode & BTA_DM_LE_IGNORE) ==
601         BTA_DM_LE_IGNORE)
602       p_data->set_visibility.disc_mode =
603           ((p_data->set_visibility.disc_mode & ~BTA_DM_LE_IGNORE) |
604            le_disc_mode);
605     if ((p_data->set_visibility.disc_mode & BTA_DM_IGNORE) == BTA_DM_IGNORE)
606       p_data->set_visibility.disc_mode =
607           ((p_data->set_visibility.disc_mode & ~BTA_DM_IGNORE) | disc_mode);
608
609     BTM_SetDiscoverability(p_data->set_visibility.disc_mode,
610                            bta_dm_cb.inquiry_scan_window,
611                            bta_dm_cb.inquiry_scan_interval);
612   }
613
614   if (p_data->set_visibility.conn_mode != (BTA_DM_IGNORE | BTA_DM_LE_IGNORE)) {
615     if ((p_data->set_visibility.conn_mode & BTA_DM_LE_IGNORE) ==
616         BTA_DM_LE_IGNORE)
617       p_data->set_visibility.conn_mode =
618           ((p_data->set_visibility.conn_mode & ~BTA_DM_LE_IGNORE) |
619            le_conn_mode);
620     if ((p_data->set_visibility.conn_mode & BTA_DM_IGNORE) == BTA_DM_IGNORE)
621       p_data->set_visibility.conn_mode =
622           ((p_data->set_visibility.conn_mode & ~BTA_DM_IGNORE) | conn_mode);
623
624     BTM_SetConnectability(p_data->set_visibility.conn_mode,
625                           bta_dm_cb.page_scan_window,
626                           bta_dm_cb.page_scan_interval);
627   }
628
629   /* Send False or True if not ignore */
630   if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE) {
631     if (p_data->set_visibility.pair_mode == BTA_DM_NON_PAIRABLE)
632       bta_dm_cb.disable_pair_mode = true;
633     else
634       bta_dm_cb.disable_pair_mode = false;
635   }
636
637   /* Send False or True if not ignore */
638   if (p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE) {
639     if (p_data->set_visibility.conn_paired_only == BTA_DM_CONN_ALL)
640       bta_dm_cb.conn_paired_only = false;
641     else
642       bta_dm_cb.conn_paired_only = true;
643   }
644
645   /* Change mode if either mode is not ignore */
646   if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE ||
647       p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE)
648     BTM_SetPairableMode((bool)(!(bta_dm_cb.disable_pair_mode)),
649                         bta_dm_cb.conn_paired_only);
650 }
651
652 /*******************************************************************************
653  *
654  * Function         bta_dm_process_remove_device
655  *
656  * Description      Removes device, Disconnects ACL link if required.
657  ***
658  ******************************************************************************/
659 void bta_dm_process_remove_device(const RawAddress& bd_addr) {
660   /* need to remove all pending background connection before unpair */
661   BTA_GATTC_CancelOpen(0, bd_addr, false);
662
663   BTM_SecDeleteDevice(bd_addr);
664
665   /* remove all cached GATT information */
666   BTA_GATTC_Refresh(bd_addr);
667
668   if (bta_dm_cb.p_sec_cback) {
669     tBTA_DM_SEC sec_event;
670     sec_event.link_down.bd_addr = bd_addr;
671     ;
672     /* No connection, set status to success (acl disc code not valid) */
673     sec_event.link_down.status = HCI_SUCCESS;
674     bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &sec_event);
675   }
676 }
677
678 /*******************************************************************************
679  *
680  * Function         bta_dm_remove_device
681  *
682  * Description      Removes device, disconnects ACL link if required.
683  ***
684  ******************************************************************************/
685 void bta_dm_remove_device(tBTA_DM_MSG* p_data) {
686   tBTA_DM_API_REMOVE_DEVICE* p_dev = &p_data->remove_dev;
687   bool continue_delete_other_dev = false;
688   if (p_dev == NULL) return;
689
690   RawAddress other_address = p_dev->bd_addr;
691
692   /* If ACL exists for the device in the remove_bond message*/
693   bool continue_delete_dev = false;
694   uint8_t other_transport = BT_TRANSPORT_INVALID;
695
696   if (BTM_IsAclConnectionUp(p_dev->bd_addr, BT_TRANSPORT_LE) ||
697       BTM_IsAclConnectionUp(p_dev->bd_addr, BT_TRANSPORT_BR_EDR)) {
698     APPL_TRACE_DEBUG("%s: ACL Up count  %d", __func__,
699                      bta_dm_cb.device_list.count);
700     continue_delete_dev = false;
701
702     /* Take the link down first, and mark the device for removal when
703      * disconnected */
704     for (int i = 0; i < bta_dm_cb.device_list.count; i++) {
705       if (bta_dm_cb.device_list.peer_device[i].peer_bdaddr == p_dev->bd_addr) {
706         uint8_t transport = BT_TRANSPORT_BR_EDR;
707
708         transport = bta_dm_cb.device_list.peer_device[i].transport;
709         bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_UNPAIRING;
710         btm_remove_acl(p_dev->bd_addr, transport);
711         APPL_TRACE_DEBUG("%s:transport = %d", __func__,
712                          bta_dm_cb.device_list.peer_device[i].transport);
713
714         /* save the other transport to check if device is connected on
715          * other_transport */
716         if (bta_dm_cb.device_list.peer_device[i].transport == BT_TRANSPORT_LE)
717           other_transport = BT_TRANSPORT_BR_EDR;
718         else
719           other_transport = BT_TRANSPORT_LE;
720
721         break;
722       }
723     }
724   } else {
725     continue_delete_dev = true;
726   }
727   // If it is DUMO device and device is paired as different address, unpair that
728   // device
729   // if different address
730   if ((other_transport &&
731        (BTM_ReadConnectedTransportAddress(&other_address, other_transport))) ||
732       (!other_transport &&
733        (BTM_ReadConnectedTransportAddress(&other_address,
734                                           BT_TRANSPORT_BR_EDR) ||
735         BTM_ReadConnectedTransportAddress(&other_address, BT_TRANSPORT_LE)))) {
736     continue_delete_other_dev = false;
737     /* Take the link down first, and mark the device for removal when
738      * disconnected */
739     for (int i = 0; i < bta_dm_cb.device_list.count; i++) {
740       if (bta_dm_cb.device_list.peer_device[i].peer_bdaddr == other_address) {
741         bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_UNPAIRING;
742         btm_remove_acl(other_address,
743                        bta_dm_cb.device_list.peer_device[i].transport);
744         break;
745       }
746     }
747   } else {
748     APPL_TRACE_DEBUG("%s: continue to delete the other dev ", __func__);
749     continue_delete_other_dev = true;
750   }
751   /* Delete the device mentioned in the msg */
752   if (continue_delete_dev) bta_dm_process_remove_device(p_dev->bd_addr);
753
754   /* Delete the other paired device too */
755   if (continue_delete_other_dev && !other_address.IsEmpty())
756     bta_dm_process_remove_device(other_address);
757 }
758
759 /*******************************************************************************
760  *
761  * Function         bta_dm_add_device
762  *
763  * Description      This function adds a Link Key to an security database entry.
764  *                  It is normally called during host startup to restore all
765  *                  required information stored in the NVRAM.
766  ***
767  ******************************************************************************/
768 void bta_dm_add_device(tBTA_DM_MSG* p_data) {
769   tBTA_DM_API_ADD_DEVICE* p_dev = &p_data->add_dev;
770   uint8_t* p_dc = NULL;
771   uint8_t* p_lc = NULL;
772   uint32_t trusted_services_mask[BTM_SEC_SERVICE_ARRAY_SIZE];
773   uint8_t index = 0;
774   uint8_t btm_mask_index = 0;
775
776   memset(trusted_services_mask, 0, sizeof(trusted_services_mask));
777
778   /* If not all zeros, the device class has been specified */
779   if (p_dev->dc_known) p_dc = (uint8_t*)p_dev->dc;
780
781   if (p_dev->link_key_known) p_lc = (uint8_t*)p_dev->link_key;
782
783   if (p_dev->is_trusted) {
784     /* covert BTA service mask to BTM mask */
785     while (p_dev->tm && (index < BTA_MAX_SERVICE_ID)) {
786       if (p_dev->tm & (uint32_t)(1 << index)) {
787         btm_mask_index =
788             bta_service_id_to_btm_srv_id_lkup_tbl[index] / BTM_SEC_ARRAY_BITS;
789         trusted_services_mask[btm_mask_index] |=
790             (uint32_t)(1 << (bta_service_id_to_btm_srv_id_lkup_tbl[index] -
791                              (uint32_t)(btm_mask_index * 32)));
792
793         p_dev->tm &= (uint32_t)(~(1 << index));
794       }
795       index++;
796     }
797   }
798
799   if (!BTM_SecAddDevice(p_dev->bd_addr, p_dc, p_dev->bd_name, p_dev->features,
800                         trusted_services_mask, p_lc, p_dev->key_type,
801                         p_dev->io_cap, p_dev->pin_length)) {
802     LOG(ERROR) << "BTA_DM: Error adding device " << p_dev->bd_addr;
803   }
804 }
805
806 /*******************************************************************************
807  *
808  * Function         bta_dm_close_acl
809  *
810  * Description      This function forces to close the connection to a remote
811  *                  device and optionaly remove the device from security
812  *                  database if required.
813  ***
814  ******************************************************************************/
815 void bta_dm_close_acl(tBTA_DM_MSG* p_data) {
816   tBTA_DM_API_REMOVE_ACL* p_remove_acl = &p_data->remove_acl;
817   uint8_t index;
818
819   APPL_TRACE_DEBUG("bta_dm_close_acl");
820
821   if (BTM_IsAclConnectionUp(p_remove_acl->bd_addr, p_remove_acl->transport)) {
822     for (index = 0; index < bta_dm_cb.device_list.count; index++) {
823       if (bta_dm_cb.device_list.peer_device[index].peer_bdaddr ==
824           p_remove_acl->bd_addr)
825         break;
826     }
827     if (index != bta_dm_cb.device_list.count) {
828       if (p_remove_acl->remove_dev)
829         bta_dm_cb.device_list.peer_device[index].remove_dev_pending = true;
830     } else {
831       APPL_TRACE_ERROR("unknown device, remove ACL failed");
832     }
833     /* Disconnect the ACL link */
834     btm_remove_acl(p_remove_acl->bd_addr, p_remove_acl->transport);
835   }
836   /* if to remove the device from security database ? do it now */
837   else if (p_remove_acl->remove_dev) {
838     if (!BTM_SecDeleteDevice(p_remove_acl->bd_addr)) {
839       APPL_TRACE_ERROR("delete device from security database failed.");
840     }
841     /* need to remove all pending background connection if any */
842     BTA_GATTC_CancelOpen(0, p_remove_acl->bd_addr, false);
843     /* remove all cached GATT information */
844     BTA_GATTC_Refresh(p_remove_acl->bd_addr);
845   }
846   /* otherwise, no action needed */
847 }
848
849 /*******************************************************************************
850  *
851  * Function         bta_dm_remove_all_acl
852  *
853  * Description      This function forces to close all the ACL links specified by
854  *                  link type
855  ***
856  ******************************************************************************/
857 void bta_dm_remove_all_acl(tBTA_DM_MSG* p_data) {
858   const tBTA_DM_LINK_TYPE link_type = p_data->remove_all_acl.link_type;
859   tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
860
861   APPL_TRACE_DEBUG("%s link type = %d", __func__, link_type);
862
863   for (uint8_t i = 0; i < bta_dm_cb.device_list.count; i++) {
864     transport = bta_dm_cb.device_list.peer_device[i].transport;
865     if ((link_type == BTA_DM_LINK_TYPE_ALL) ||
866         ((link_type == BTA_DM_LINK_TYPE_LE) &&
867          (transport == BT_TRANSPORT_LE)) ||
868         ((link_type == BTA_DM_LINK_TYPE_BR_EDR) &&
869          (transport == BT_TRANSPORT_BR_EDR))) {
870       /* Disconnect the ACL link */
871       btm_remove_acl(bta_dm_cb.device_list.peer_device[i].peer_bdaddr,
872                      transport);
873     }
874   }
875 }
876
877 /*******************************************************************************
878  *
879  * Function         bta_dm_bond
880  *
881  * Description      Bonds with peer device
882  *
883  *
884  * Returns          void
885  *
886  ******************************************************************************/
887 void bta_dm_bond(tBTA_DM_MSG* p_data) {
888   tBTM_STATUS status;
889   tBTA_DM_SEC sec_event;
890   char* p_name;
891
892   if (p_data->bond.transport == BTA_TRANSPORT_UNKNOWN)
893     status = BTM_SecBond(p_data->bond.bd_addr, 0, NULL, 0);
894   else
895     status = BTM_SecBondByTransport(p_data->bond.bd_addr,
896                                     p_data->bond.transport, 0, NULL, 0);
897
898   if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED)) {
899     memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
900     sec_event.auth_cmpl.bd_addr = p_data->bond.bd_addr;
901     p_name = BTM_SecReadDevName(p_data->bond.bd_addr);
902     if (p_name != NULL) {
903       memcpy(sec_event.auth_cmpl.bd_name, p_name, (BD_NAME_LEN - 1));
904       sec_event.auth_cmpl.bd_name[BD_NAME_LEN - 1] = 0;
905     }
906
907     /*      taken care of by memset [above]
908             sec_event.auth_cmpl.key_present = false;
909             sec_event.auth_cmpl.success = false;
910     */
911     sec_event.auth_cmpl.fail_reason = HCI_ERR_ILLEGAL_COMMAND;
912     if (status == BTM_SUCCESS) {
913       sec_event.auth_cmpl.success = true;
914     } else {
915       /* delete this device entry from Sec Dev DB */
916       bta_dm_remove_sec_dev_entry(p_data->bond.bd_addr);
917     }
918     bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
919   }
920 }
921
922 /*******************************************************************************
923  *
924  * Function         bta_dm_bond_cancel
925  *
926  * Description      Cancels bonding with a peer device
927  *
928  *
929  * Returns          void
930  *
931  ******************************************************************************/
932 void bta_dm_bond_cancel(tBTA_DM_MSG* p_data) {
933   tBTM_STATUS status;
934   tBTA_DM_SEC sec_event;
935
936   APPL_TRACE_EVENT(" bta_dm_bond_cancel ");
937   status = BTM_SecBondCancel(p_data->bond_cancel.bd_addr);
938
939   if (bta_dm_cb.p_sec_cback &&
940       (status != BTM_CMD_STARTED && status != BTM_SUCCESS)) {
941     sec_event.bond_cancel_cmpl.result = BTA_FAILURE;
942
943     bta_dm_cb.p_sec_cback(BTA_DM_BOND_CANCEL_CMPL_EVT, &sec_event);
944   }
945 }
946
947 /*******************************************************************************
948  *
949  * Function         bta_dm_pin_reply
950  *
951  * Description      Send the pin_reply to a request from BTM
952  *
953  *
954  * Returns          void
955  *
956  ******************************************************************************/
957 void bta_dm_pin_reply(tBTA_DM_MSG* p_data) {
958   uint32_t trusted_mask[BTM_SEC_SERVICE_ARRAY_SIZE];
959   uint32_t* current_trusted_mask;
960
961   current_trusted_mask = BTM_ReadTrustedMask(p_data->pin_reply.bd_addr);
962
963   if (current_trusted_mask) {
964     memcpy(trusted_mask, current_trusted_mask, sizeof(trusted_mask));
965   } else {
966     memset(trusted_mask, 0, sizeof(trusted_mask));
967   }
968
969   if (p_data->pin_reply.accept) {
970     BTM_PINCodeReply(p_data->pin_reply.bd_addr, BTM_SUCCESS,
971                      p_data->pin_reply.pin_len, p_data->pin_reply.p_pin,
972                      trusted_mask);
973   } else {
974     BTM_PINCodeReply(p_data->pin_reply.bd_addr, BTM_NOT_AUTHORIZED, 0, NULL,
975                      trusted_mask);
976   }
977 }
978
979 /*******************************************************************************
980  *
981  * Function         bta_dm_policy_cback
982  *
983  * Description      process the link policy changes
984  *
985  * Returns          void
986  *
987  ******************************************************************************/
988 static void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, uint8_t id,
989                                 uint8_t app_id, const RawAddress* peer_addr) {
990   tBTA_DM_PEER_DEVICE* p_dev = NULL;
991   uint16_t policy = app_id;
992   uint32_t mask = (uint32_t)(1 << id);
993
994   if (peer_addr) p_dev = bta_dm_find_peer_device(*peer_addr);
995
996   APPL_TRACE_DEBUG(" bta_dm_policy_cback cmd:%d, policy:0x%x", status, policy);
997   switch (status) {
998     case BTA_SYS_PLCY_SET:
999       if (!p_dev) return;
1000       /* restore the default link policy */
1001       p_dev->link_policy |= policy;
1002       BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
1003       break;
1004
1005     case BTA_SYS_PLCY_CLR:
1006       if (!p_dev) return;
1007       /* clear the policy from the default link policy */
1008       p_dev->link_policy &= (~policy);
1009       BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
1010
1011       if (policy & (HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_PARK_MODE)) {
1012         /* if clearing sniff/park, wake the link */
1013         bta_dm_pm_active(p_dev->peer_bdaddr);
1014       }
1015       break;
1016
1017     case BTA_SYS_PLCY_DEF_SET:
1018       /* want to restore/set the role switch policy */
1019       bta_dm_cb.role_policy_mask &= ~mask;
1020       if (0 == bta_dm_cb.role_policy_mask) {
1021         /* if nobody wants to insist on the role */
1022         bta_dm_cb.cur_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH;
1023         BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
1024       }
1025       break;
1026
1027     case BTA_SYS_PLCY_DEF_CLR:
1028       /* want to remove the role switch policy */
1029       bta_dm_cb.role_policy_mask |= mask;
1030       bta_dm_cb.cur_policy &= ~HCI_ENABLE_MASTER_SLAVE_SWITCH;
1031       BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
1032       break;
1033   }
1034 }
1035
1036 /*******************************************************************************
1037  *
1038  * Function         bta_dm_confirm
1039  *
1040  * Description      Send the user confirm request reply in response to a
1041  *                  request from BTM
1042  *
1043  * Returns          void
1044  *
1045  ******************************************************************************/
1046 void bta_dm_confirm(tBTA_DM_MSG* p_data) {
1047   tBTM_STATUS res = BTM_NOT_AUTHORIZED;
1048
1049   if (p_data->confirm.accept == true) res = BTM_SUCCESS;
1050   BTM_ConfirmReqReply(res, p_data->confirm.bd_addr);
1051 }
1052
1053 /*******************************************************************************
1054  *
1055  * Function         bta_dm_loc_oob
1056  *
1057  * Description      Retrieve the OOB data from the local LM
1058  *
1059  * Returns          void
1060  *
1061  ******************************************************************************/
1062 void bta_dm_loc_oob(UNUSED_ATTR tBTA_DM_MSG* p_data) { BTM_ReadLocalOobData(); }
1063
1064 /*******************************************************************************
1065  *
1066  * Function         bta_dm_ci_io_req_act
1067  *
1068  * Description      respond to the IO capabilities request from BTM
1069  *
1070  * Returns          void
1071  *
1072  ******************************************************************************/
1073 void bta_dm_ci_io_req_act(tBTA_DM_MSG* p_data) {
1074   tBTM_AUTH_REQ auth_req = BTM_AUTH_AP_NO;
1075   if (p_data->ci_io_req.auth_req) auth_req = BTM_AUTH_AP_YES;
1076   BTM_IoCapRsp(p_data->ci_io_req.bd_addr, p_data->ci_io_req.io_cap,
1077                p_data->ci_io_req.oob_data, auth_req);
1078 }
1079
1080 /*******************************************************************************
1081  *
1082  * Function         bta_dm_ci_rmt_oob_act
1083  *
1084  * Description      respond to the OOB data request for the remote device from
1085  *                  BTM
1086  *
1087  *
1088  * Returns          void
1089  *
1090  ******************************************************************************/
1091 void bta_dm_ci_rmt_oob_act(tBTA_DM_MSG* p_data) {
1092   tBTM_STATUS res = BTM_NOT_AUTHORIZED;
1093
1094   if (p_data->ci_rmt_oob.accept == true) res = BTM_SUCCESS;
1095   BTM_RemoteOobDataReply(res, p_data->ci_rmt_oob.bd_addr, p_data->ci_rmt_oob.c,
1096                          p_data->ci_rmt_oob.r);
1097 }
1098
1099 /*******************************************************************************
1100  *
1101  * Function         bta_dm_search_start
1102  *
1103  * Description      Starts an inquiry
1104  *
1105  *
1106  * Returns          void
1107  *
1108  ******************************************************************************/
1109 void bta_dm_search_start(tBTA_DM_MSG* p_data) {
1110   tBTM_INQUIRY_CMPL result;
1111
1112   size_t len = sizeof(tBT_UUID) * p_data->search.num_uuid;
1113   bta_dm_gattc_register();
1114
1115   APPL_TRACE_DEBUG("%s avoid_scatter=%d", __func__,
1116                    p_bta_dm_cfg->avoid_scatter);
1117
1118   if (p_bta_dm_cfg->avoid_scatter &&
1119       (p_data->search.rs_res == BTA_DM_RS_NONE) &&
1120       bta_dm_check_av(BTA_DM_API_SEARCH_EVT)) {
1121     memcpy(&bta_dm_cb.search_msg, &p_data->search, sizeof(tBTA_DM_API_SEARCH));
1122     return;
1123   }
1124
1125   BTM_ClearInqDb(NULL);
1126   /* save search params */
1127   bta_dm_search_cb.p_search_cback = p_data->search.p_cback;
1128   bta_dm_search_cb.services = p_data->search.services;
1129
1130   osi_free_and_reset((void**)&bta_dm_search_cb.p_srvc_uuid);
1131
1132   if ((bta_dm_search_cb.num_uuid = p_data->search.num_uuid) != 0 &&
1133       p_data->search.p_uuid != NULL) {
1134     bta_dm_search_cb.p_srvc_uuid = (tBT_UUID*)osi_malloc(len);
1135     memcpy(bta_dm_search_cb.p_srvc_uuid, p_data->search.p_uuid, len);
1136   }
1137   result.status = BTM_StartInquiry((tBTM_INQ_PARMS*)&p_data->search.inq_params,
1138                                    bta_dm_inq_results_cb,
1139                                    (tBTM_CMPL_CB*)bta_dm_inq_cmpl_cb);
1140
1141   APPL_TRACE_EVENT("%s status=%d", __func__, result.status);
1142   if (result.status != BTM_CMD_STARTED) {
1143     result.num_resp = 0;
1144     bta_dm_inq_cmpl_cb((void*)&result);
1145   }
1146 }
1147
1148 /*******************************************************************************
1149  *
1150  * Function         bta_dm_search_cancel
1151  *
1152  * Description      Cancels an ongoing search for devices
1153  *
1154  *
1155  * Returns          void
1156  *
1157  ******************************************************************************/
1158 void bta_dm_search_cancel(UNUSED_ATTR tBTA_DM_MSG* p_data) {
1159   tBTA_DM_MSG* p_msg;
1160
1161   if (BTM_IsInquiryActive()) {
1162     if (BTM_CancelInquiry() == BTM_SUCCESS) {
1163       bta_dm_search_cancel_notify(NULL);
1164       p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG));
1165       p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1166       p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1167       bta_sys_sendmsg(p_msg);
1168     } else {
1169       /* flag a search cancel is pending */
1170       bta_dm_search_cb.cancel_pending = true;
1171     }
1172   }
1173   /* If no Service Search going on then issue cancel remote name in case it is
1174      active */
1175   else if (!bta_dm_search_cb.name_discover_done) {
1176     BTM_CancelRemoteDeviceName();
1177
1178     p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG));
1179     p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1180     p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1181     bta_sys_sendmsg(p_msg);
1182   } else {
1183     p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG));
1184     p_msg->hdr.event = BTA_DM_INQUIRY_CMPL_EVT;
1185     p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1186     bta_sys_sendmsg(p_msg);
1187   }
1188
1189   if (bta_dm_search_cb.gatt_disc_active) {
1190     bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
1191   }
1192 }
1193
1194 /*******************************************************************************
1195  *
1196  * Function         bta_dm_discover
1197  *
1198  * Description      Discovers services on a remote device
1199  *
1200  *
1201  * Returns          void
1202  *
1203  ******************************************************************************/
1204 void bta_dm_discover(tBTA_DM_MSG* p_data) {
1205   size_t len = sizeof(tBT_UUID) * p_data->discover.num_uuid;
1206   APPL_TRACE_EVENT("%s services_to_search=0x%04X, sdp_search=%d", __func__,
1207                    p_data->discover.services, p_data->discover.sdp_search);
1208
1209   /* save the search condition */
1210   bta_dm_search_cb.services = p_data->discover.services;
1211
1212   bta_dm_gattc_register();
1213   osi_free_and_reset((void**)&bta_dm_search_cb.p_srvc_uuid);
1214   if ((bta_dm_search_cb.num_uuid = p_data->discover.num_uuid) != 0 &&
1215       p_data->discover.p_uuid != NULL) {
1216     bta_dm_search_cb.p_srvc_uuid = (tBT_UUID*)osi_malloc(len);
1217     memcpy(bta_dm_search_cb.p_srvc_uuid, p_data->discover.p_uuid, len);
1218   }
1219   bta_dm_search_cb.uuid_to_search = bta_dm_search_cb.num_uuid;
1220
1221   bta_dm_search_cb.p_search_cback = p_data->discover.p_cback;
1222   bta_dm_search_cb.sdp_search = p_data->discover.sdp_search;
1223   bta_dm_search_cb.services_to_search = bta_dm_search_cb.services;
1224   bta_dm_search_cb.service_index = 0;
1225   bta_dm_search_cb.services_found = 0;
1226   bta_dm_search_cb.peer_name[0] = 0;
1227   bta_dm_search_cb.sdp_search = p_data->discover.sdp_search;
1228   bta_dm_search_cb.p_btm_inq_info = BTM_InqDbRead(p_data->discover.bd_addr);
1229   bta_dm_search_cb.transport = p_data->discover.transport;
1230
1231   bta_dm_search_cb.name_discover_done = false;
1232   memcpy(&bta_dm_search_cb.uuid, &p_data->discover.uuid, sizeof(tSDP_UUID));
1233   bta_dm_discover_device(p_data->discover.bd_addr);
1234 }
1235
1236 /*******************************************************************************
1237  *
1238  * Function         bta_dm_di_disc_cmpl
1239  *
1240  * Description      Sends event to application when DI discovery complete
1241  *
1242  * Returns          void
1243  *
1244  ******************************************************************************/
1245 void bta_dm_di_disc_cmpl(tBTA_DM_MSG* p_data) {
1246   tBTA_DM_DI_DISC_CMPL di_disc;
1247
1248   memset(&di_disc, 0, sizeof(tBTA_DM_DI_DISC_CMPL));
1249   di_disc.bd_addr = bta_dm_search_cb.peer_bdaddr;
1250
1251   if ((p_data->hdr.offset == SDP_SUCCESS) ||
1252       (p_data->hdr.offset == SDP_DB_FULL)) {
1253     di_disc.num_record = SDP_GetNumDiRecords(bta_dm_di_cb.p_di_db);
1254   } else
1255     di_disc.result = BTA_FAILURE;
1256
1257   bta_dm_di_cb.p_di_db = NULL;
1258   bta_dm_search_cb.p_search_cback(BTA_DM_DI_DISC_CMPL_EVT,
1259                                   (tBTA_DM_SEARCH*)&di_disc);
1260 }
1261
1262 /*******************************************************************************
1263  *
1264  * Function         bta_dm_di_disc_callback
1265  *
1266  * Description      This function queries a remote device for DI information.
1267  *
1268  *
1269  * Returns          void
1270  *
1271  ******************************************************************************/
1272 static void bta_dm_di_disc_callback(uint16_t result) {
1273   tBTA_DM_MSG* p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG));
1274
1275   p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1276   p_msg->hdr.layer_specific = BTA_DM_API_DI_DISCOVER_EVT;
1277   p_msg->hdr.offset = result;
1278
1279   bta_sys_sendmsg(p_msg);
1280 }
1281
1282 /*******************************************************************************
1283  *
1284  * Function         bta_dm_disable_search_and_disc
1285  *
1286  * Description      Cancels an ongoing search or discovery for devices in case
1287  *                  of a Bluetooth disable
1288  *
1289  *
1290  * Returns          void
1291  *
1292  ******************************************************************************/
1293 static void bta_dm_disable_search_and_disc(void) {
1294   tBTA_DM_DI_DISC_CMPL di_disc;
1295
1296   if (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) bta_dm_search_cancel(NULL);
1297
1298   if (bta_dm_di_cb.p_di_db != NULL) {
1299     memset(&di_disc, 0, sizeof(tBTA_DM_DI_DISC_CMPL));
1300     di_disc.bd_addr = bta_dm_search_cb.peer_bdaddr;
1301     di_disc.result = BTA_FAILURE;
1302
1303     bta_dm_di_cb.p_di_db = NULL;
1304     bta_dm_search_cb.p_search_cback(BTA_DM_DI_DISC_CMPL_EVT, NULL);
1305   }
1306 }
1307
1308 /*******************************************************************************
1309  *
1310  * Function         bta_dm_di_disc
1311  *
1312  * Description      This function queries a remote device for DI information.
1313  *
1314  *
1315  * Returns          void
1316  *
1317  ******************************************************************************/
1318 void bta_dm_di_disc(tBTA_DM_MSG* p_data) {
1319   uint16_t result = BTA_FAILURE;
1320
1321   bta_dm_search_cb.p_search_cback = p_data->di_disc.p_cback;
1322   bta_dm_search_cb.peer_bdaddr = p_data->di_disc.bd_addr;
1323   bta_dm_di_cb.p_di_db = p_data->di_disc.p_sdp_db;
1324
1325   bta_dm_search_cb.p_sdp_db =
1326       (tSDP_DISCOVERY_DB*)osi_malloc(BTA_DM_SDP_DB_SIZE);
1327   if (SDP_DiDiscover(bta_dm_search_cb.peer_bdaddr, p_data->di_disc.p_sdp_db,
1328                      p_data->di_disc.len,
1329                      bta_dm_di_disc_callback) == SDP_SUCCESS) {
1330     result = BTA_SUCCESS;
1331   }
1332
1333   if (result == BTA_FAILURE) {
1334     tBTA_DM_MSG* p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG));
1335
1336     p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1337     p_msg->hdr.layer_specific = BTA_DM_API_DI_DISCOVER_EVT;
1338     p_data->hdr.offset = result;
1339     bta_sys_sendmsg(p_msg);
1340   }
1341 }
1342
1343 /*******************************************************************************
1344  *
1345  * Function         bta_dm_read_remote_device_name
1346  *
1347  * Description      Initiate to get remote device name
1348  *
1349  * Returns          true if started to get remote name
1350  *
1351  ******************************************************************************/
1352 static bool bta_dm_read_remote_device_name(const RawAddress& bd_addr,
1353                                            tBT_TRANSPORT transport) {
1354   tBTM_STATUS btm_status;
1355
1356   APPL_TRACE_DEBUG("%s", __func__);
1357
1358   bta_dm_search_cb.peer_bdaddr = bd_addr;
1359   bta_dm_search_cb.peer_name[0] = 0;
1360
1361   btm_status =
1362       BTM_ReadRemoteDeviceName(bta_dm_search_cb.peer_bdaddr,
1363                                (tBTM_CMPL_CB*)bta_dm_remname_cback, transport);
1364
1365   if (btm_status == BTM_CMD_STARTED) {
1366     APPL_TRACE_DEBUG("%s: BTM_ReadRemoteDeviceName is started", __func__);
1367
1368     return (true);
1369   } else if (btm_status == BTM_BUSY) {
1370     APPL_TRACE_DEBUG("%s: BTM_ReadRemoteDeviceName is busy", __func__);
1371
1372     /* Remote name discovery is on going now so BTM cannot notify through
1373      * "bta_dm_remname_cback" */
1374     /* adding callback to get notified that current reading remore name done */
1375     BTM_SecAddRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
1376
1377     return (true);
1378   } else {
1379     APPL_TRACE_WARNING("%s: BTM_ReadRemoteDeviceName returns 0x%02X", __func__,
1380                        btm_status);
1381
1382     return (false);
1383   }
1384 }
1385
1386 /*******************************************************************************
1387  *
1388  * Function         bta_dm_inq_cmpl
1389  *
1390  * Description      Process the inquiry complete event from BTM
1391  *
1392  * Returns          void
1393  *
1394  ******************************************************************************/
1395 void bta_dm_inq_cmpl(tBTA_DM_MSG* p_data) {
1396   tBTA_DM_SEARCH data;
1397
1398   APPL_TRACE_DEBUG("bta_dm_inq_cmpl");
1399
1400   data.inq_cmpl.num_resps = p_data->inq_cmpl.num;
1401   bta_dm_search_cb.p_search_cback(BTA_DM_INQ_CMPL_EVT, &data);
1402
1403   bta_dm_search_cb.p_btm_inq_info = BTM_InqDbFirst();
1404   if (bta_dm_search_cb.p_btm_inq_info != NULL) {
1405     /* start name and service discovery from the first device on inquiry result
1406      */
1407     bta_dm_search_cb.name_discover_done = false;
1408     bta_dm_search_cb.peer_name[0] = 0;
1409     bta_dm_discover_device(
1410         bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr);
1411   } else {
1412     tBTA_DM_MSG* p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG));
1413
1414     /* no devices, search complete */
1415     bta_dm_search_cb.services = 0;
1416
1417     p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1418     p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1419     bta_sys_sendmsg(p_msg);
1420   }
1421 }
1422
1423 /*******************************************************************************
1424  *
1425  * Function         bta_dm_rmt_name
1426  *
1427  * Description      Process the remote name result from BTM
1428  *
1429  * Returns          void
1430  *
1431  ******************************************************************************/
1432 void bta_dm_rmt_name(tBTA_DM_MSG* p_data) {
1433   APPL_TRACE_DEBUG("bta_dm_rmt_name");
1434
1435   if (p_data->rem_name.result.disc_res.bd_name[0] &&
1436       bta_dm_search_cb.p_btm_inq_info) {
1437     bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name = true;
1438   }
1439
1440   bta_dm_discover_device(bta_dm_search_cb.peer_bdaddr);
1441 }
1442
1443 /*******************************************************************************
1444  *
1445  * Function         bta_dm_disc_rmt_name
1446  *
1447  * Description      Process the remote name result from BTM when application
1448  *                  wants to find the name for a bdaddr
1449  *
1450  * Returns          void
1451  *
1452  ******************************************************************************/
1453 void bta_dm_disc_rmt_name(tBTA_DM_MSG* p_data) {
1454   tBTM_INQ_INFO* p_btm_inq_info;
1455
1456   APPL_TRACE_DEBUG("bta_dm_disc_rmt_name");
1457
1458   p_btm_inq_info = BTM_InqDbRead(p_data->rem_name.result.disc_res.bd_addr);
1459   if (p_btm_inq_info) {
1460     if (p_data->rem_name.result.disc_res.bd_name[0]) {
1461       p_btm_inq_info->appl_knows_rem_name = true;
1462     }
1463   }
1464
1465   bta_dm_discover_device(p_data->rem_name.result.disc_res.bd_addr);
1466 }
1467
1468 /*******************************************************************************
1469  *
1470  * Function         bta_dm_sdp_result
1471  *
1472  * Description      Process the discovery result from sdp
1473  *
1474  * Returns          void
1475  *
1476  ******************************************************************************/
1477 void bta_dm_sdp_result(tBTA_DM_MSG* p_data) {
1478   tSDP_DISC_REC* p_sdp_rec = NULL;
1479   tBTA_DM_MSG* p_msg;
1480   bool scn_found = false;
1481   uint16_t service = 0xFFFF;
1482   tSDP_PROTOCOL_ELEM pe;
1483
1484   tBT_UUID* p_uuid = bta_dm_search_cb.p_srvc_uuid;
1485   tBTA_DM_SEARCH result;
1486   tBT_UUID service_uuid;
1487
1488   uint32_t num_uuids = 0;
1489   uint8_t uuid_list[32][MAX_UUID_SIZE];  // assuming a max of 32 services
1490
1491   if ((p_data->sdp_event.sdp_result == SDP_SUCCESS) ||
1492       (p_data->sdp_event.sdp_result == SDP_NO_RECS_MATCH) ||
1493       (p_data->sdp_event.sdp_result == SDP_DB_FULL)) {
1494     APPL_TRACE_DEBUG("sdp_result::0x%x", p_data->sdp_event.sdp_result);
1495     do {
1496       p_sdp_rec = NULL;
1497       if (bta_dm_search_cb.service_index == (BTA_USER_SERVICE_ID + 1)) {
1498         p_sdp_rec = SDP_FindServiceUUIDInDb(bta_dm_search_cb.p_sdp_db,
1499                                             &bta_dm_search_cb.uuid, p_sdp_rec);
1500
1501         if (p_sdp_rec && SDP_FindProtocolListElemInRec(
1502                              p_sdp_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
1503           bta_dm_search_cb.peer_scn = (uint8_t)pe.params[0];
1504           scn_found = true;
1505         }
1506       } else {
1507         service =
1508             bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index - 1];
1509         p_sdp_rec =
1510             SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db, service, p_sdp_rec);
1511       }
1512       /* finished with BR/EDR services, now we check the result for GATT based
1513        * service UUID */
1514       if (bta_dm_search_cb.service_index == BTA_MAX_SERVICE_ID) {
1515         if (bta_dm_search_cb.uuid_to_search != 0 && p_uuid != NULL) {
1516           p_uuid +=
1517               (bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search);
1518           /* only support 16 bits UUID for now */
1519           service = p_uuid->uu.uuid16;
1520         }
1521         /* all GATT based services */
1522         do {
1523           /* find a service record, report it */
1524           p_sdp_rec =
1525               SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db, 0, p_sdp_rec);
1526           if (p_sdp_rec) {
1527             if (SDP_FindServiceUUIDInRec(p_sdp_rec, &service_uuid)) {
1528               /* send result back to app now, one by one */
1529               result.disc_ble_res.bd_addr = bta_dm_search_cb.peer_bdaddr;
1530               strlcpy((char*)result.disc_ble_res.bd_name, bta_dm_get_remname(),
1531                       BD_NAME_LEN);
1532               result.disc_ble_res.service.len = service_uuid.len;
1533               result.disc_ble_res.service.uu.uuid16 = service_uuid.uu.uuid16;
1534
1535               bta_dm_search_cb.p_search_cback(BTA_DM_DISC_BLE_RES_EVT, &result);
1536             }
1537           }
1538
1539           if (bta_dm_search_cb.uuid_to_search > 0) break;
1540
1541         } while (p_sdp_rec);
1542       } else {
1543         /* SDP_DB_FULL means some records with the
1544            required attributes were received */
1545         if (((p_data->sdp_event.sdp_result == SDP_DB_FULL) &&
1546              bta_dm_search_cb.services != BTA_ALL_SERVICE_MASK) ||
1547             (p_sdp_rec != NULL)) {
1548           if (service != UUID_SERVCLASS_PNP_INFORMATION) {
1549             uint16_t tmp_svc = 0xFFFF;
1550             bta_dm_search_cb.services_found |=
1551                 (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(
1552                     bta_dm_search_cb.service_index - 1));
1553             tmp_svc =
1554                 bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index -
1555                                                 1];
1556             /* Add to the list of UUIDs */
1557             sdpu_uuid16_to_uuid128(tmp_svc, uuid_list[num_uuids]);
1558             num_uuids++;
1559           }
1560         }
1561       }
1562
1563       if (bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK &&
1564           bta_dm_search_cb.services_to_search == 0) {
1565         if (bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID &&
1566             bta_dm_search_cb.uuid_to_search > 0)
1567           bta_dm_search_cb.uuid_to_search--;
1568
1569         if (bta_dm_search_cb.uuid_to_search == 0 ||
1570             bta_dm_search_cb.service_index != BTA_BLE_SERVICE_ID)
1571           bta_dm_search_cb.service_index++;
1572       } else /* regular one service per search or PNP search */
1573         break;
1574
1575     } while (bta_dm_search_cb.service_index <= BTA_MAX_SERVICE_ID);
1576
1577     APPL_TRACE_DEBUG("%s services_found = %04x", __func__,
1578                      bta_dm_search_cb.services_found);
1579
1580     /* Collect the 128-bit services here and put them into the list */
1581     if (bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK) {
1582       p_sdp_rec = NULL;
1583       do {
1584         tBT_UUID temp_uuid;
1585         /* find a service record, report it */
1586         p_sdp_rec =
1587             SDP_FindServiceInDb_128bit(bta_dm_search_cb.p_sdp_db, p_sdp_rec);
1588         if (p_sdp_rec) {
1589           if (SDP_FindServiceUUIDInRec_128bit(p_sdp_rec, &temp_uuid)) {
1590             memcpy(uuid_list[num_uuids], temp_uuid.uu.uuid128, MAX_UUID_SIZE);
1591             num_uuids++;
1592           }
1593         }
1594       } while (p_sdp_rec);
1595     }
1596     /* if there are more services to search for */
1597     if (bta_dm_search_cb.services_to_search) {
1598       /* Free up the p_sdp_db before checking the next one */
1599       bta_dm_free_sdp_db(NULL);
1600       bta_dm_find_services(bta_dm_search_cb.peer_bdaddr);
1601     } else {
1602       /* callbacks */
1603       /* start next bd_addr if necessary */
1604
1605       BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
1606
1607       p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG));
1608       p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
1609       p_msg->disc_result.result.disc_res.result = BTA_SUCCESS;
1610       p_msg->disc_result.result.disc_res.p_raw_data = NULL;
1611       p_msg->disc_result.result.disc_res.raw_data_size = 0;
1612       p_msg->disc_result.result.disc_res.num_uuids = num_uuids;
1613       p_msg->disc_result.result.disc_res.p_uuid_list = NULL;
1614       if (num_uuids > 0) {
1615         p_msg->disc_result.result.disc_res.p_uuid_list =
1616             (uint8_t*)osi_malloc(num_uuids * MAX_UUID_SIZE);
1617         memcpy(p_msg->disc_result.result.disc_res.p_uuid_list, uuid_list,
1618                num_uuids * MAX_UUID_SIZE);
1619       }
1620       // Copy the raw_data to the discovery result structure
1621       if (bta_dm_search_cb.p_sdp_db != NULL &&
1622           bta_dm_search_cb.p_sdp_db->raw_used != 0 &&
1623           bta_dm_search_cb.p_sdp_db->raw_data != NULL) {
1624         APPL_TRACE_DEBUG("%s raw_data used = 0x%x raw_data_ptr = 0x%x",
1625                          __func__, bta_dm_search_cb.p_sdp_db->raw_used,
1626                          bta_dm_search_cb.p_sdp_db->raw_data);
1627
1628         p_msg->disc_result.result.disc_res.p_raw_data =
1629             (uint8_t*)osi_malloc(bta_dm_search_cb.p_sdp_db->raw_used);
1630         memcpy(p_msg->disc_result.result.disc_res.p_raw_data,
1631                bta_dm_search_cb.p_sdp_db->raw_data,
1632                bta_dm_search_cb.p_sdp_db->raw_used);
1633
1634         p_msg->disc_result.result.disc_res.raw_data_size =
1635             bta_dm_search_cb.p_sdp_db->raw_used;
1636
1637         bta_dm_search_cb.p_sdp_db->raw_data =
1638             NULL;  // no need to free this - it is a global assigned.
1639         bta_dm_search_cb.p_sdp_db->raw_used = 0;
1640         bta_dm_search_cb.p_sdp_db->raw_size = 0;
1641       } else {
1642         APPL_TRACE_DEBUG("%s raw data size is 0 or raw_data is null!!",
1643                          __func__);
1644       }
1645       /* Done with p_sdp_db. Free it */
1646       bta_dm_free_sdp_db(NULL);
1647       p_msg->disc_result.result.disc_res.services =
1648           bta_dm_search_cb.services_found;
1649
1650       // Piggy back the SCN over result field
1651       if (scn_found) {
1652         p_msg->disc_result.result.disc_res.result =
1653             (3 + bta_dm_search_cb.peer_scn);
1654         p_msg->disc_result.result.disc_res.services |= BTA_USER_SERVICE_MASK;
1655
1656         APPL_TRACE_EVENT(" Piggy back the SCN over result field  SCN=%d",
1657                          bta_dm_search_cb.peer_scn);
1658       }
1659       p_msg->disc_result.result.disc_res.bd_addr = bta_dm_search_cb.peer_bdaddr;
1660       strlcpy((char*)p_msg->disc_result.result.disc_res.bd_name,
1661               bta_dm_get_remname(), BD_NAME_LEN);
1662
1663       bta_sys_sendmsg(p_msg);
1664     }
1665   } else {
1666     /* conn failed. No need for timer */
1667     if (p_data->sdp_event.sdp_result == SDP_CONN_FAILED ||
1668         p_data->sdp_event.sdp_result == SDP_CONN_REJECTED ||
1669         p_data->sdp_event.sdp_result == SDP_SECURITY_ERR)
1670       bta_dm_search_cb.wait_disc = false;
1671
1672     /* not able to connect go to next device */
1673     if (bta_dm_search_cb.p_sdp_db)
1674       osi_free_and_reset((void**)&bta_dm_search_cb.p_sdp_db);
1675
1676     BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
1677
1678     p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG));
1679     p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
1680     p_msg->disc_result.result.disc_res.result = BTA_FAILURE;
1681     p_msg->disc_result.result.disc_res.services =
1682         bta_dm_search_cb.services_found;
1683     p_msg->disc_result.result.disc_res.bd_addr = bta_dm_search_cb.peer_bdaddr;
1684     strlcpy((char*)p_msg->disc_result.result.disc_res.bd_name,
1685             bta_dm_get_remname(), BD_NAME_LEN);
1686
1687     bta_sys_sendmsg(p_msg);
1688   }
1689 }
1690
1691 /*******************************************************************************
1692  *
1693  * Function         bta_dm_search_cmpl
1694  *
1695  * Description      Sends event to application
1696  *
1697  * Returns          void
1698  *
1699  ******************************************************************************/
1700 void bta_dm_search_cmpl(tBTA_DM_MSG* p_data) {
1701   APPL_TRACE_EVENT("%s", __func__);
1702
1703   osi_free_and_reset((void**)&bta_dm_search_cb.p_srvc_uuid);
1704
1705   if (p_data->hdr.layer_specific == BTA_DM_API_DI_DISCOVER_EVT)
1706     bta_dm_di_disc_cmpl(p_data);
1707   else
1708     bta_dm_search_cb.p_search_cback(BTA_DM_DISC_CMPL_EVT, NULL);
1709 }
1710
1711 /*******************************************************************************
1712  *
1713  * Function         bta_dm_disc_result
1714  *
1715  * Description      Service discovery result when discovering services on a
1716  *                  device
1717  *
1718  * Returns          void
1719  *
1720  ******************************************************************************/
1721 void bta_dm_disc_result(tBTA_DM_MSG* p_data) {
1722   APPL_TRACE_EVENT("%s", __func__);
1723
1724   /* if any BR/EDR service discovery has been done, report the event */
1725   if ((bta_dm_search_cb.services &
1726        ((BTA_ALL_SERVICE_MASK | BTA_USER_SERVICE_MASK) &
1727         ~BTA_BLE_SERVICE_MASK)))
1728     bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT,
1729                                     &p_data->disc_result.result);
1730
1731   tBTA_DM_MSG* p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG));
1732
1733   /* send a message to change state */
1734   p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
1735   p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
1736   bta_sys_sendmsg(p_msg);
1737 }
1738
1739 /*******************************************************************************
1740  *
1741  * Function         bta_dm_search_result
1742  *
1743  * Description      Service discovery result while searching for devices
1744  *
1745  * Returns          void
1746  *
1747  ******************************************************************************/
1748 void bta_dm_search_result(tBTA_DM_MSG* p_data) {
1749   APPL_TRACE_DEBUG("%s searching:0x%04x, result:0x%04x", __func__,
1750                    bta_dm_search_cb.services,
1751                    p_data->disc_result.result.disc_res.services);
1752
1753   /* call back if application wants name discovery or found services that
1754    * application is searching */
1755   if ((!bta_dm_search_cb.services) ||
1756       ((bta_dm_search_cb.services) &&
1757        (p_data->disc_result.result.disc_res.services))) {
1758     bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT,
1759                                     &p_data->disc_result.result);
1760   }
1761
1762   /* if searching did not initiate to create link */
1763   if (!bta_dm_search_cb.wait_disc) {
1764     /* if service searching is done with EIR, don't search next device */
1765     if (bta_dm_search_cb.p_btm_inq_info) bta_dm_discover_next_device();
1766   } else {
1767     /* wait until link is disconnected or timeout */
1768     bta_dm_search_cb.sdp_results = true;
1769     alarm_set_on_mloop(bta_dm_search_cb.search_timer,
1770                        1000 * (L2CAP_LINK_INACTIVITY_TOUT + 1),
1771                        bta_dm_search_timer_cback, NULL);
1772   }
1773 }
1774
1775 /*******************************************************************************
1776  *
1777  * Function         bta_dm_search_timer_cback
1778  *
1779  * Description      Called when ACL disconnect time is over
1780  *
1781  *
1782  * Returns          void
1783  *
1784  ******************************************************************************/
1785 static void bta_dm_search_timer_cback(UNUSED_ATTR void* data) {
1786   APPL_TRACE_EVENT("%s", __func__);
1787   bta_dm_search_cb.wait_disc = false;
1788
1789   /* proceed with next device */
1790   bta_dm_discover_next_device();
1791 }
1792
1793 /*******************************************************************************
1794  *
1795  * Function         bta_dm_free_sdp_db
1796  *
1797  * Description      Frees SDP data base
1798  *
1799  * Returns          void
1800  *
1801  ******************************************************************************/
1802 void bta_dm_free_sdp_db(UNUSED_ATTR tBTA_DM_MSG* p_data) {
1803   osi_free_and_reset((void**)&bta_dm_search_cb.p_sdp_db);
1804 }
1805
1806 /*******************************************************************************
1807  *
1808  * Function         bta_dm_queue_search
1809  *
1810  * Description      Queues search command while search is being cancelled
1811  *
1812  * Returns          void
1813  *
1814  ******************************************************************************/
1815 void bta_dm_queue_search(tBTA_DM_MSG* p_data) {
1816   osi_free(bta_dm_search_cb.p_search_queue);
1817   bta_dm_search_cb.p_search_queue =
1818       (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_API_SEARCH));
1819   memcpy(bta_dm_search_cb.p_search_queue, p_data, sizeof(tBTA_DM_API_SEARCH));
1820 }
1821
1822 /*******************************************************************************
1823  *
1824  * Function         bta_dm_queue_disc
1825  *
1826  * Description      Queues discovery command while search is being cancelled
1827  *
1828  * Returns          void
1829  *
1830  ******************************************************************************/
1831 void bta_dm_queue_disc(tBTA_DM_MSG* p_data) {
1832   osi_free(bta_dm_search_cb.p_search_queue);
1833   bta_dm_search_cb.p_search_queue =
1834       (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_API_DISCOVER));
1835   memcpy(bta_dm_search_cb.p_search_queue, p_data, sizeof(tBTA_DM_API_DISCOVER));
1836 }
1837
1838 /*******************************************************************************
1839  *
1840  * Function         bta_dm_search_clear_queue
1841  *
1842  * Description      Clears the queue if API search cancel is called
1843  *
1844  * Returns          void
1845  *
1846  ******************************************************************************/
1847 void bta_dm_search_clear_queue(UNUSED_ATTR tBTA_DM_MSG* p_data) {
1848   osi_free_and_reset((void**)&bta_dm_search_cb.p_search_queue);
1849 }
1850
1851 /*******************************************************************************
1852  *
1853  * Function         bta_dm_search_cancel_cmpl
1854  *
1855  * Description      Search cancel is complete
1856  *
1857  * Returns          void
1858  *
1859  ******************************************************************************/
1860 void bta_dm_search_cancel_cmpl(UNUSED_ATTR tBTA_DM_MSG* p_data) {
1861   if (bta_dm_search_cb.p_search_queue) {
1862     bta_sys_sendmsg(bta_dm_search_cb.p_search_queue);
1863     bta_dm_search_cb.p_search_queue = NULL;
1864   }
1865 }
1866
1867 /*******************************************************************************
1868  *
1869  * Function         bta_dm_search_cancel_transac_cmpl
1870  *
1871  * Description      Current Service Discovery or remote name procedure is
1872  *                  completed after search cancellation
1873  *
1874  * Returns          void
1875  *
1876  ******************************************************************************/
1877 void bta_dm_search_cancel_transac_cmpl(UNUSED_ATTR tBTA_DM_MSG* p_data) {
1878   osi_free_and_reset((void**)&bta_dm_search_cb.p_sdp_db);
1879   bta_dm_search_cancel_notify(NULL);
1880 }
1881
1882 /*******************************************************************************
1883  *
1884  * Function         bta_dm_search_cancel_notify
1885  *
1886  * Description      Notify application that search has been cancelled
1887  *
1888  * Returns          void
1889  *
1890  ******************************************************************************/
1891 void bta_dm_search_cancel_notify(UNUSED_ATTR tBTA_DM_MSG* p_data) {
1892   if (bta_dm_search_cb.p_search_cback) {
1893     bta_dm_search_cb.p_search_cback(BTA_DM_SEARCH_CANCEL_CMPL_EVT, NULL);
1894   }
1895   if (!bta_dm_search_cb.name_discover_done) {
1896     BTM_CancelRemoteDeviceName();
1897   }
1898   if (bta_dm_search_cb.gatt_disc_active) {
1899     bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
1900   }
1901 }
1902
1903 /*******************************************************************************
1904  *
1905  * Function         bta_dm_find_services
1906  *
1907  * Description      Starts discovery on a device
1908  *
1909  * Returns          void
1910  *
1911  ******************************************************************************/
1912 static void bta_dm_find_services(const RawAddress& bd_addr) {
1913   tSDP_UUID uuid;
1914
1915   memset(&uuid, 0, sizeof(tSDP_UUID));
1916
1917   while (bta_dm_search_cb.service_index < BTA_MAX_SERVICE_ID) {
1918     if (bta_dm_search_cb.services_to_search &
1919         (tBTA_SERVICE_MASK)(
1920             BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index))) {
1921       bta_dm_search_cb.p_sdp_db =
1922           (tSDP_DISCOVERY_DB*)osi_malloc(BTA_DM_SDP_DB_SIZE);
1923       APPL_TRACE_DEBUG("bta_dm_search_cb.services = %04x***********",
1924                        bta_dm_search_cb.services);
1925       /* try to search all services by search based on L2CAP UUID */
1926       if (bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK) {
1927         LOG_INFO(LOG_TAG, "%s services_to_search=%08x", __func__,
1928                  bta_dm_search_cb.services_to_search);
1929         if (bta_dm_search_cb.services_to_search & BTA_RES_SERVICE_MASK) {
1930           uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[0];
1931           bta_dm_search_cb.services_to_search &= ~BTA_RES_SERVICE_MASK;
1932         } else {
1933           uuid.uu.uuid16 = UUID_PROTOCOL_L2CAP;
1934           bta_dm_search_cb.services_to_search = 0;
1935         }
1936       } else {
1937         /* for LE only profile */
1938         if (bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID) {
1939           if (bta_dm_search_cb.uuid_to_search > 0 &&
1940               bta_dm_search_cb.p_srvc_uuid) {
1941             memcpy(&uuid, (const void*)(bta_dm_search_cb.p_srvc_uuid +
1942                                         bta_dm_search_cb.num_uuid -
1943                                         bta_dm_search_cb.uuid_to_search),
1944                    sizeof(tBT_UUID));
1945
1946             bta_dm_search_cb.uuid_to_search--;
1947           } else {
1948             uuid.uu.uuid16 =
1949                 bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index];
1950           }
1951
1952           /* last one? clear the BLE service bit if all discovery has been done
1953            */
1954           if (bta_dm_search_cb.uuid_to_search == 0)
1955             bta_dm_search_cb.services_to_search &=
1956                 (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(
1957                     bta_dm_search_cb.service_index)));
1958
1959         } else {
1960           /* remove the service from services to be searched  */
1961           bta_dm_search_cb.services_to_search &= (tBTA_SERVICE_MASK)(~(
1962               BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index)));
1963           uuid.uu.uuid16 =
1964               bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index];
1965         }
1966       }
1967
1968       if (uuid.len == 0) uuid.len = LEN_UUID_16;
1969
1970       if (bta_dm_search_cb.service_index == BTA_USER_SERVICE_ID) {
1971         memcpy(&uuid, &bta_dm_search_cb.uuid, sizeof(tSDP_UUID));
1972       }
1973
1974       LOG_INFO(LOG_TAG, "%s search UUID = %04x", __func__, uuid.uu.uuid16);
1975       SDP_InitDiscoveryDb(bta_dm_search_cb.p_sdp_db, BTA_DM_SDP_DB_SIZE, 1,
1976                           &uuid, 0, NULL);
1977
1978       memset(g_disc_raw_data_buf, 0, sizeof(g_disc_raw_data_buf));
1979       bta_dm_search_cb.p_sdp_db->raw_data = g_disc_raw_data_buf;
1980
1981       bta_dm_search_cb.p_sdp_db->raw_size = MAX_DISC_RAW_DATA_BUF;
1982
1983       if (!SDP_ServiceSearchAttributeRequest(bd_addr, bta_dm_search_cb.p_sdp_db,
1984                                              &bta_dm_sdp_callback)) {
1985         /*
1986          * If discovery is not successful with this device, then
1987          * proceed with the next one.
1988          */
1989         osi_free_and_reset((void**)&bta_dm_search_cb.p_sdp_db);
1990         bta_dm_search_cb.service_index = BTA_MAX_SERVICE_ID;
1991
1992       } else {
1993         if ((bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID &&
1994              bta_dm_search_cb.uuid_to_search == 0) ||
1995             bta_dm_search_cb.service_index != BTA_BLE_SERVICE_ID)
1996           bta_dm_search_cb.service_index++;
1997         return;
1998       }
1999     }
2000
2001     bta_dm_search_cb.service_index++;
2002   }
2003
2004   /* no more services to be discovered */
2005   if (bta_dm_search_cb.service_index >= BTA_MAX_SERVICE_ID) {
2006     tBTA_DM_MSG* p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG));
2007     /* initialize the data structure - includes p_raw_data and raw_data_size */
2008     memset(&(p_msg->disc_result.result), 0, sizeof(tBTA_DM_DISC_RES));
2009     p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
2010     p_msg->disc_result.result.disc_res.services =
2011         bta_dm_search_cb.services_found;
2012     p_msg->disc_result.result.disc_res.bd_addr = bta_dm_search_cb.peer_bdaddr;
2013     strlcpy((char*)p_msg->disc_result.result.disc_res.bd_name,
2014             bta_dm_get_remname(), BD_NAME_LEN);
2015
2016     bta_sys_sendmsg(p_msg);
2017   }
2018 }
2019
2020 /*******************************************************************************
2021  *
2022  * Function         bta_dm_discover_next_device
2023  *
2024  * Description      Starts discovery on the next device in Inquiry data base
2025  *
2026  * Returns          void
2027  *
2028  ******************************************************************************/
2029 static void bta_dm_discover_next_device(void) {
2030   APPL_TRACE_DEBUG("bta_dm_discover_next_device");
2031
2032   /* searching next device on inquiry result */
2033   bta_dm_search_cb.p_btm_inq_info =
2034       BTM_InqDbNext(bta_dm_search_cb.p_btm_inq_info);
2035   if (bta_dm_search_cb.p_btm_inq_info != NULL) {
2036     bta_dm_search_cb.name_discover_done = false;
2037     bta_dm_search_cb.peer_name[0] = 0;
2038     bta_dm_discover_device(
2039         bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr);
2040   } else {
2041     tBTA_DM_MSG* p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG));
2042
2043     /* no devices, search complete */
2044     bta_dm_search_cb.services = 0;
2045
2046     p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
2047     p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
2048
2049     bta_sys_sendmsg(p_msg);
2050   }
2051 }
2052
2053 /*******************************************************************************
2054  *
2055  * Function         bta_dm_discover_device
2056  *
2057  * Description      Starts name and service discovery on the device
2058  *
2059  * Returns          void
2060  *
2061  ******************************************************************************/
2062 static void bta_dm_discover_device(const RawAddress& remote_bd_addr) {
2063   tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
2064   if (bta_dm_search_cb.transport == BTA_TRANSPORT_UNKNOWN) {
2065     tBT_DEVICE_TYPE dev_type;
2066     tBLE_ADDR_TYPE addr_type;
2067
2068     BTM_ReadDevInfo(remote_bd_addr, &dev_type, &addr_type);
2069     if (dev_type == BT_DEVICE_TYPE_BLE || addr_type == BLE_ADDR_RANDOM)
2070       transport = BT_TRANSPORT_LE;
2071   } else {
2072     transport = bta_dm_search_cb.transport;
2073   }
2074
2075   /* Reset transport state for next discovery */
2076   bta_dm_search_cb.transport = BTA_TRANSPORT_UNKNOWN;
2077
2078   VLOG(1) << __func__ << " BDA: " << remote_bd_addr;
2079
2080   bta_dm_search_cb.peer_bdaddr = remote_bd_addr;
2081
2082   APPL_TRACE_DEBUG(
2083       "%s name_discover_done = %d p_btm_inq_info 0x%x state = %d, transport=%d",
2084       __func__, bta_dm_search_cb.name_discover_done,
2085       bta_dm_search_cb.p_btm_inq_info, bta_dm_search_cb.state, transport);
2086
2087   if (bta_dm_search_cb.p_btm_inq_info) {
2088     APPL_TRACE_DEBUG("%s appl_knows_rem_name %d", __func__,
2089                      bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name);
2090   }
2091   if ((bta_dm_search_cb.p_btm_inq_info) &&
2092       (bta_dm_search_cb.p_btm_inq_info->results.device_type ==
2093        BT_DEVICE_TYPE_BLE) &&
2094       (bta_dm_search_cb.state == BTA_DM_SEARCH_ACTIVE)) {
2095     /* Do not perform RNR for LE devices at inquiry complete*/
2096     bta_dm_search_cb.name_discover_done = true;
2097   }
2098   /* if name discovery is not done and application needs remote name */
2099   if ((!bta_dm_search_cb.name_discover_done) &&
2100       ((bta_dm_search_cb.p_btm_inq_info == NULL) ||
2101        (bta_dm_search_cb.p_btm_inq_info &&
2102         (!bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name)))) {
2103     if (bta_dm_read_remote_device_name(bta_dm_search_cb.peer_bdaddr,
2104                                        transport) == true)
2105       return;
2106
2107     /* starting name discovery failed */
2108     bta_dm_search_cb.name_discover_done = true;
2109   }
2110
2111   /* if application wants to discover service */
2112   if (bta_dm_search_cb.services) {
2113     /* initialize variables */
2114     bta_dm_search_cb.service_index = 0;
2115     bta_dm_search_cb.services_found = 0;
2116     bta_dm_search_cb.services_to_search = bta_dm_search_cb.services;
2117     bta_dm_search_cb.uuid_to_search = bta_dm_search_cb.num_uuid;
2118     if ((bta_dm_search_cb.p_btm_inq_info != NULL) &&
2119         bta_dm_search_cb.services != BTA_USER_SERVICE_MASK &&
2120         (bta_dm_search_cb.sdp_search == false)) {
2121       /* check if EIR provides the information of supported services */
2122       bta_dm_eir_search_services(&bta_dm_search_cb.p_btm_inq_info->results,
2123                                  &bta_dm_search_cb.services_to_search,
2124                                  &bta_dm_search_cb.services_found);
2125     }
2126
2127     /* if seaching with EIR is not completed */
2128     if (bta_dm_search_cb.services_to_search) {
2129       /* check whether connection already exists to the device
2130          if connection exists, we don't have to wait for ACL
2131          link to go down to start search on next device */
2132       if (BTM_IsAclConnectionUp(bta_dm_search_cb.peer_bdaddr,
2133                                 BT_TRANSPORT_BR_EDR))
2134         bta_dm_search_cb.wait_disc = false;
2135       else
2136         bta_dm_search_cb.wait_disc = true;
2137
2138       if (bta_dm_search_cb.p_btm_inq_info) {
2139         APPL_TRACE_DEBUG(
2140             "%s p_btm_inq_info 0x%x results.device_type 0x%x "
2141             "services_to_search 0x%x",
2142             __func__, bta_dm_search_cb.p_btm_inq_info,
2143             bta_dm_search_cb.p_btm_inq_info->results.device_type,
2144             bta_dm_search_cb.services_to_search);
2145       }
2146
2147       if (transport == BT_TRANSPORT_LE) {
2148         if (bta_dm_search_cb.services_to_search & BTA_BLE_SERVICE_MASK) {
2149           // set the raw data buffer here
2150           memset(g_disc_raw_data_buf, 0, sizeof(g_disc_raw_data_buf));
2151           bta_dm_search_cb.p_ble_rawdata = g_disc_raw_data_buf;
2152
2153           bta_dm_search_cb.ble_raw_size = MAX_DISC_RAW_DATA_BUF;
2154           bta_dm_search_cb.ble_raw_used = 0;
2155
2156           /* start GATT for service discovery */
2157           btm_dm_start_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
2158           return;
2159         }
2160       } else {
2161         bta_dm_search_cb.sdp_results = false;
2162         bta_dm_find_services(bta_dm_search_cb.peer_bdaddr);
2163         return;
2164       }
2165     }
2166   }
2167
2168   /* name discovery and service discovery are done for this device */
2169   tBTA_DM_MSG* p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG));
2170   p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
2171   /* initialize the data structure - includes p_raw_data and raw_data_size */
2172   memset(&(p_msg->disc_result.result), 0, sizeof(tBTA_DM_DISC_RES));
2173   p_msg->disc_result.result.disc_res.result = BTA_SUCCESS;
2174   p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
2175   p_msg->disc_result.result.disc_res.bd_addr = bta_dm_search_cb.peer_bdaddr;
2176   strlcpy((char*)p_msg->disc_result.result.disc_res.bd_name,
2177           (char*)bta_dm_search_cb.peer_name, BD_NAME_LEN);
2178
2179   bta_sys_sendmsg(p_msg);
2180 }
2181
2182 /*******************************************************************************
2183  *
2184  * Function         bta_dm_sdp_callback
2185  *
2186  * Description      Callback from sdp with discovery status
2187  *
2188  * Returns          void
2189  *
2190  ******************************************************************************/
2191 static void bta_dm_sdp_callback(uint16_t sdp_status) {
2192   tBTA_DM_SDP_RESULT* p_msg =
2193       (tBTA_DM_SDP_RESULT*)osi_malloc(sizeof(tBTA_DM_SDP_RESULT));
2194
2195   p_msg->hdr.event = BTA_DM_SDP_RESULT_EVT;
2196   p_msg->sdp_result = sdp_status;
2197
2198   bta_sys_sendmsg(p_msg);
2199 }
2200
2201 /*******************************************************************************
2202  *
2203  * Function         bta_dm_inq_results_cb
2204  *
2205  * Description      Inquiry results callback from BTM
2206  *
2207  * Returns          void
2208  *
2209  ******************************************************************************/
2210 static void bta_dm_inq_results_cb(tBTM_INQ_RESULTS* p_inq, uint8_t* p_eir,
2211                                   uint16_t eir_len) {
2212   tBTA_DM_SEARCH result;
2213   tBTM_INQ_INFO* p_inq_info;
2214   uint16_t service_class;
2215
2216   result.inq_res.bd_addr = p_inq->remote_bd_addr;
2217   memcpy(result.inq_res.dev_class, p_inq->dev_class, DEV_CLASS_LEN);
2218   BTM_COD_SERVICE_CLASS(service_class, p_inq->dev_class);
2219   result.inq_res.is_limited =
2220       (service_class & BTM_COD_SERVICE_LMTD_DISCOVER) ? true : false;
2221   result.inq_res.rssi = p_inq->rssi;
2222
2223   result.inq_res.ble_addr_type = p_inq->ble_addr_type;
2224   result.inq_res.inq_result_type = p_inq->inq_result_type;
2225   result.inq_res.device_type = p_inq->device_type;
2226   result.inq_res.flag = p_inq->flag;
2227
2228   /* application will parse EIR to find out remote device name */
2229   result.inq_res.p_eir = p_eir;
2230   result.inq_res.eir_len = eir_len;
2231
2232   p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr);
2233   if (p_inq_info != NULL) {
2234     /* initialize remt_name_not_required to false so that we get the name by
2235      * default */
2236     result.inq_res.remt_name_not_required = false;
2237   }
2238
2239   if (bta_dm_search_cb.p_search_cback)
2240     bta_dm_search_cb.p_search_cback(BTA_DM_INQ_RES_EVT, &result);
2241
2242   if (p_inq_info) {
2243     /* application indicates if it knows the remote name, inside the callback
2244      copy that to the inquiry data base*/
2245     if (result.inq_res.remt_name_not_required)
2246       p_inq_info->appl_knows_rem_name = true;
2247   }
2248 }
2249
2250 /*******************************************************************************
2251  *
2252  * Function         bta_dm_inq_cmpl_cb
2253  *
2254  * Description      Inquiry complete callback from BTM
2255  *
2256  * Returns          void
2257  *
2258  ******************************************************************************/
2259 static void bta_dm_inq_cmpl_cb(void* p_result) {
2260   tBTA_DM_MSG* p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG));
2261
2262   APPL_TRACE_DEBUG("%s", __func__);
2263
2264   if (bta_dm_search_cb.cancel_pending == false) {
2265     p_msg->inq_cmpl.hdr.event = BTA_DM_INQUIRY_CMPL_EVT;
2266     p_msg->inq_cmpl.num = ((tBTM_INQUIRY_CMPL*)p_result)->num_resp;
2267   } else {
2268     bta_dm_search_cb.cancel_pending = false;
2269     bta_dm_search_cancel_notify(NULL);
2270     p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
2271     p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
2272   }
2273
2274   bta_sys_sendmsg(p_msg);
2275 }
2276
2277 /*******************************************************************************
2278  *
2279  * Function         bta_dm_service_search_remname_cback
2280  *
2281  * Description      Remote name call back from BTM during service discovery
2282  *
2283  * Returns          void
2284  *
2285  ******************************************************************************/
2286 static void bta_dm_service_search_remname_cback(const RawAddress& bd_addr,
2287                                                 UNUSED_ATTR DEV_CLASS dc,
2288                                                 BD_NAME bd_name) {
2289   tBTM_REMOTE_DEV_NAME rem_name;
2290   tBTM_STATUS btm_status;
2291
2292   APPL_TRACE_DEBUG("%s name=<%s>", __func__, bd_name);
2293
2294   /* if this is what we are looking for */
2295   if (bta_dm_search_cb.peer_bdaddr == bd_addr) {
2296     rem_name.length = strlen((char*)bd_name);
2297     if (rem_name.length > (BD_NAME_LEN - 1)) {
2298       rem_name.length = (BD_NAME_LEN - 1);
2299       rem_name.remote_bd_name[(BD_NAME_LEN - 1)] = 0;
2300     }
2301     strlcpy((char*)rem_name.remote_bd_name, (char*)bd_name, BD_NAME_LEN);
2302     rem_name.status = BTM_SUCCESS;
2303
2304     bta_dm_remname_cback(&rem_name);
2305   } else {
2306     /* get name of device */
2307     btm_status = BTM_ReadRemoteDeviceName(bta_dm_search_cb.peer_bdaddr,
2308                                           (tBTM_CMPL_CB*)bta_dm_remname_cback,
2309                                           BT_TRANSPORT_BR_EDR);
2310     if (btm_status == BTM_BUSY) {
2311       /* wait for next chance(notification of remote name discovery done) */
2312       APPL_TRACE_DEBUG("%s: BTM_ReadRemoteDeviceName is busy", __func__);
2313     } else if (btm_status != BTM_CMD_STARTED) {
2314       /* if failed to start getting remote name then continue */
2315       APPL_TRACE_WARNING("%s: BTM_ReadRemoteDeviceName returns 0x%02X",
2316                          __func__, btm_status);
2317
2318       rem_name.length = 0;
2319       rem_name.remote_bd_name[0] = 0;
2320       rem_name.status = btm_status;
2321       bta_dm_remname_cback(&rem_name);
2322     }
2323   }
2324 }
2325
2326 /*******************************************************************************
2327  *
2328  * Function         bta_dm_remname_cback
2329  *
2330  * Description      Remote name complete call back from BTM
2331  *
2332  * Returns          void
2333  *
2334  ******************************************************************************/
2335 static void bta_dm_remname_cback(tBTM_REMOTE_DEV_NAME* p_remote_name) {
2336   APPL_TRACE_DEBUG("bta_dm_remname_cback len = %d name=<%s>",
2337                    p_remote_name->length, p_remote_name->remote_bd_name);
2338
2339   /* remote name discovery is done but it could be failed */
2340   bta_dm_search_cb.name_discover_done = true;
2341   strlcpy((char*)bta_dm_search_cb.peer_name,
2342           (char*)p_remote_name->remote_bd_name, BD_NAME_LEN);
2343
2344   BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
2345
2346   if (bta_dm_search_cb.transport == BT_TRANSPORT_LE) {
2347     GAP_BleReadPeerPrefConnParams(bta_dm_search_cb.peer_bdaddr);
2348   }
2349
2350   tBTA_DM_REM_NAME* p_msg =
2351       (tBTA_DM_REM_NAME*)osi_malloc(sizeof(tBTA_DM_REM_NAME));
2352   p_msg->result.disc_res.bd_addr = bta_dm_search_cb.peer_bdaddr;
2353   strlcpy((char*)p_msg->result.disc_res.bd_name,
2354           (char*)p_remote_name->remote_bd_name, BD_NAME_LEN);
2355   p_msg->hdr.event = BTA_DM_REMT_NAME_EVT;
2356
2357   bta_sys_sendmsg(p_msg);
2358 }
2359
2360 /*******************************************************************************
2361  *
2362  * Function         bta_dm_authorize_cback
2363  *
2364  * Description      cback requesting authorization
2365  *
2366  * Returns          void
2367  *
2368  ******************************************************************************/
2369 static uint8_t bta_dm_authorize_cback(const RawAddress& bd_addr,
2370                                       DEV_CLASS dev_class, BD_NAME bd_name,
2371                                       UNUSED_ATTR uint8_t* service_name,
2372                                       uint8_t service_id,
2373                                       UNUSED_ATTR bool is_originator) {
2374   tBTA_DM_SEC sec_event;
2375   uint8_t index = 1;
2376
2377   sec_event.authorize.bd_addr = bd_addr;
2378   memcpy(sec_event.authorize.dev_class, dev_class, DEV_CLASS_LEN);
2379   strlcpy((char*)sec_event.authorize.bd_name, (char*)bd_name, BD_NAME_LEN);
2380
2381 #if (BTA_JV_INCLUDED == TRUE)
2382   sec_event.authorize.service = service_id;
2383 #endif
2384
2385   while (index < BTA_MAX_SERVICE_ID) {
2386     /* get the BTA service id corresponding to BTM id */
2387     if (bta_service_id_to_btm_srv_id_lkup_tbl[index] == service_id) {
2388       sec_event.authorize.service = index;
2389       break;
2390     }
2391     index++;
2392   }
2393
2394   /* if supported service callback otherwise not authorized */
2395   if (bta_dm_cb.p_sec_cback && (index < BTA_MAX_SERVICE_ID
2396 #if (BTA_JV_INCLUDED == TRUE)
2397                                 /* pass through JV service ID */
2398                                 || (service_id >= BTA_FIRST_JV_SERVICE_ID &&
2399                                     service_id <= BTA_LAST_JV_SERVICE_ID)
2400 #endif
2401                                     )) {
2402     bta_dm_cb.p_sec_cback(BTA_DM_AUTHORIZE_EVT, &sec_event);
2403     return BTM_CMD_STARTED;
2404   } else {
2405     return BTM_NOT_AUTHORIZED;
2406   }
2407 }
2408
2409 /*******************************************************************************
2410  *
2411  * Function         bta_dm_pinname_cback
2412  *
2413  * Description      Callback requesting pin_key
2414  *
2415  * Returns          void
2416  *
2417  ******************************************************************************/
2418 static void bta_dm_pinname_cback(void* p_data) {
2419   tBTM_REMOTE_DEV_NAME* p_result = (tBTM_REMOTE_DEV_NAME*)p_data;
2420   tBTA_DM_SEC sec_event;
2421   uint32_t bytes_to_copy;
2422   tBTA_DM_SEC_EVT event = bta_dm_cb.pin_evt;
2423
2424   if (BTA_DM_SP_CFM_REQ_EVT == event) {
2425     /* Retrieved saved device class and bd_addr */
2426     sec_event.cfm_req.bd_addr = bta_dm_cb.pin_bd_addr;
2427     BTA_COPY_DEVICE_CLASS(sec_event.cfm_req.dev_class, bta_dm_cb.pin_dev_class);
2428
2429     if (p_result && p_result->status == BTM_SUCCESS) {
2430       bytes_to_copy = (p_result->length < (BD_NAME_LEN - 1))
2431                           ? p_result->length
2432                           : (BD_NAME_LEN - 1);
2433       memcpy(sec_event.cfm_req.bd_name, p_result->remote_bd_name,
2434              bytes_to_copy);
2435       sec_event.pin_req.bd_name[BD_NAME_LEN - 1] = 0;
2436     } else /* No name found */
2437       sec_event.cfm_req.bd_name[0] = 0;
2438
2439     sec_event.key_notif.passkey =
2440         bta_dm_cb.num_val; /* get PIN code numeric number */
2441
2442     /* 1 additional event data fields for this event */
2443     sec_event.cfm_req.just_works = bta_dm_cb.just_works;
2444   } else {
2445     /* Retrieved saved device class and bd_addr */
2446     sec_event.pin_req.bd_addr = bta_dm_cb.pin_bd_addr;
2447     BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, bta_dm_cb.pin_dev_class);
2448
2449     if (p_result && p_result->status == BTM_SUCCESS) {
2450       bytes_to_copy = (p_result->length < (BD_NAME_LEN - 1))
2451                           ? p_result->length
2452                           : (BD_NAME_LEN - 1);
2453       memcpy(sec_event.pin_req.bd_name, p_result->remote_bd_name,
2454              bytes_to_copy);
2455       sec_event.pin_req.bd_name[BD_NAME_LEN - 1] = 0;
2456     } else /* No name found */
2457       sec_event.pin_req.bd_name[0] = 0;
2458
2459     event = bta_dm_cb.pin_evt;
2460     sec_event.key_notif.passkey =
2461         bta_dm_cb.num_val; /* get PIN code numeric number */
2462   }
2463
2464   if (bta_dm_cb.p_sec_cback) bta_dm_cb.p_sec_cback(event, &sec_event);
2465 }
2466
2467 /*******************************************************************************
2468  *
2469  * Function         bta_dm_pin_cback
2470  *
2471  * Description      Callback requesting pin_key
2472  *
2473  * Returns          void
2474  *
2475  ******************************************************************************/
2476 static uint8_t bta_dm_pin_cback(const RawAddress& bd_addr, DEV_CLASS dev_class,
2477                                 BD_NAME bd_name, bool min_16_digit) {
2478   tBTA_DM_SEC sec_event;
2479
2480   if (!bta_dm_cb.p_sec_cback) return BTM_NOT_AUTHORIZED;
2481
2482   /* If the device name is not known, save bdaddr and devclass and initiate a
2483    * name request */
2484   if (bd_name[0] == 0) {
2485     bta_dm_cb.pin_evt = BTA_DM_PIN_REQ_EVT;
2486     bta_dm_cb.pin_bd_addr = bd_addr;
2487     BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, dev_class);
2488     if ((BTM_ReadRemoteDeviceName(bd_addr, bta_dm_pinname_cback,
2489                                   BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
2490       return BTM_CMD_STARTED;
2491
2492     APPL_TRACE_WARNING(
2493         " bta_dm_pin_cback() -> Failed to start Remote Name Request  ");
2494   }
2495
2496   sec_event.pin_req.bd_addr = bd_addr;
2497   BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, dev_class);
2498   strlcpy((char*)sec_event.pin_req.bd_name, (char*)bd_name, BD_NAME_LEN);
2499   sec_event.pin_req.min_16_digit = min_16_digit;
2500
2501   bta_dm_cb.p_sec_cback(BTA_DM_PIN_REQ_EVT, &sec_event);
2502   return BTM_CMD_STARTED;
2503 }
2504
2505 /*******************************************************************************
2506  *
2507  * Function         bta_dm_new_link_key_cback
2508  *
2509  * Description      Callback from BTM to notify new link key
2510  *
2511  * Returns          void
2512  *
2513  ******************************************************************************/
2514 static uint8_t bta_dm_new_link_key_cback(const RawAddress& bd_addr,
2515                                          UNUSED_ATTR DEV_CLASS dev_class,
2516                                          BD_NAME bd_name, LINK_KEY key,
2517                                          uint8_t key_type) {
2518   tBTA_DM_SEC sec_event;
2519   tBTA_DM_AUTH_CMPL* p_auth_cmpl;
2520   uint8_t event;
2521
2522   memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
2523
2524   /* Not AMP Key type */
2525   if (key_type != HCI_LKEY_TYPE_AMP_WIFI && key_type != HCI_LKEY_TYPE_AMP_UWB) {
2526     event = BTA_DM_AUTH_CMPL_EVT;
2527     p_auth_cmpl = &sec_event.auth_cmpl;
2528
2529     p_auth_cmpl->bd_addr = bd_addr;
2530
2531     memcpy(p_auth_cmpl->bd_name, bd_name, (BD_NAME_LEN - 1));
2532     p_auth_cmpl->bd_name[BD_NAME_LEN - 1] = 0;
2533
2534     p_auth_cmpl->key_present = true;
2535     p_auth_cmpl->key_type = key_type;
2536     p_auth_cmpl->success = true;
2537
2538     memcpy(p_auth_cmpl->key, key, LINK_KEY_LEN);
2539     sec_event.auth_cmpl.fail_reason = HCI_SUCCESS;
2540
2541     // Report the BR link key based on the BR/EDR address and type
2542     BTM_ReadDevInfo(bd_addr, &sec_event.auth_cmpl.dev_type,
2543                     &sec_event.auth_cmpl.addr_type);
2544     if (bta_dm_cb.p_sec_cback) bta_dm_cb.p_sec_cback(event, &sec_event);
2545
2546     // Setting remove_dev_pending flag to false, where it will avoid deleting
2547     // the
2548     // security device record when the ACL connection link goes down in case of
2549     // reconnection.
2550     if (bta_dm_cb.device_list.count)
2551       bta_dm_reset_sec_dev_pending(p_auth_cmpl->bd_addr);
2552   } else {
2553     APPL_TRACE_WARNING("%s() Received AMP Key", __func__);
2554   }
2555
2556   return BTM_CMD_STARTED;
2557 }
2558
2559 /*******************************************************************************
2560  *
2561  * Function         bta_dm_authentication_complete_cback
2562  *
2563  * Description      Authentication complete callback from BTM
2564  *
2565  * Returns          void
2566  *
2567  ******************************************************************************/
2568 static uint8_t bta_dm_authentication_complete_cback(
2569     const RawAddress& bd_addr, UNUSED_ATTR DEV_CLASS dev_class, BD_NAME bd_name,
2570     int result) {
2571   tBTA_DM_SEC sec_event;
2572
2573   if (result != BTM_SUCCESS) {
2574     memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
2575     sec_event.auth_cmpl.bd_addr = bd_addr;
2576
2577     memcpy(sec_event.auth_cmpl.bd_name, bd_name, (BD_NAME_LEN - 1));
2578     sec_event.auth_cmpl.bd_name[BD_NAME_LEN - 1] = 0;
2579
2580     // Report the BR link key based on the BR/EDR address and type
2581     BTM_ReadDevInfo(bd_addr, &sec_event.auth_cmpl.dev_type,
2582                     &sec_event.auth_cmpl.addr_type);
2583     sec_event.auth_cmpl.fail_reason = (uint8_t)result;
2584
2585     if (bta_dm_cb.p_sec_cback)
2586       bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
2587
2588     if (result == HCI_ERR_AUTH_FAILURE || result == HCI_ERR_KEY_MISSING ||
2589         result == HCI_ERR_HOST_REJECT_SECURITY ||
2590         result == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE) {
2591       APPL_TRACE_WARNING("%s deleting %s - result: 0x%02x", __func__,
2592                          bd_addr.ToString().c_str(), result);
2593       bta_dm_remove_sec_dev_entry(bd_addr);
2594     }
2595   }
2596
2597   return BTM_SUCCESS;
2598 }
2599
2600 #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
2601 /*******************************************************************************
2602  *
2603  * Function         bta_dm_sp_cback
2604  *
2605  * Description      simple pairing callback from BTM
2606  *
2607  * Returns          void
2608  *
2609  ******************************************************************************/
2610 static uint8_t bta_dm_sp_cback(tBTM_SP_EVT event, tBTM_SP_EVT_DATA* p_data) {
2611   tBTM_STATUS status = BTM_CMD_STARTED;
2612   tBTA_DM_SEC sec_event;
2613   tBTA_DM_SEC_EVT pin_evt = BTA_DM_SP_KEY_NOTIF_EVT;
2614
2615   APPL_TRACE_EVENT("bta_dm_sp_cback: %d", event);
2616   if (!bta_dm_cb.p_sec_cback) return BTM_NOT_AUTHORIZED;
2617
2618   /* TODO_SP */
2619   switch (event) {
2620     case BTM_SP_IO_REQ_EVT:
2621       /* translate auth_req */
2622       bta_dm_co_io_req(p_data->io_req.bd_addr, &p_data->io_req.io_cap,
2623                        &p_data->io_req.oob_data, &p_data->io_req.auth_req,
2624                        p_data->io_req.is_orig);
2625       APPL_TRACE_EVENT("io mitm: %d oob_data:%d", p_data->io_req.auth_req,
2626                        p_data->io_req.oob_data);
2627       break;
2628     case BTM_SP_IO_RSP_EVT:
2629       bta_dm_co_io_rsp(p_data->io_rsp.bd_addr, p_data->io_rsp.io_cap,
2630                        p_data->io_rsp.oob_data, p_data->io_rsp.auth_req);
2631       break;
2632
2633     case BTM_SP_CFM_REQ_EVT:
2634       pin_evt = BTA_DM_SP_CFM_REQ_EVT;
2635       bta_dm_cb.just_works = sec_event.cfm_req.just_works =
2636           p_data->cfm_req.just_works;
2637       sec_event.cfm_req.loc_auth_req = p_data->cfm_req.loc_auth_req;
2638       sec_event.cfm_req.rmt_auth_req = p_data->cfm_req.rmt_auth_req;
2639       sec_event.cfm_req.loc_io_caps = p_data->cfm_req.loc_io_caps;
2640       sec_event.cfm_req.rmt_io_caps = p_data->cfm_req.rmt_io_caps;
2641
2642     /* continue to next case */
2643     /* Passkey entry mode, mobile device with output capability is very
2644         unlikely to receive key request, so skip this event */
2645     /*case BTM_SP_KEY_REQ_EVT: */
2646     case BTM_SP_KEY_NOTIF_EVT:
2647       bta_dm_cb.num_val = sec_event.key_notif.passkey =
2648           p_data->key_notif.passkey;
2649
2650       if (BTM_SP_CFM_REQ_EVT == event) {
2651         /* Due to the switch case falling through below to BTM_SP_KEY_NOTIF_EVT,
2652            call remote name request using values from cfm_req */
2653         if (p_data->cfm_req.bd_name[0] == 0) {
2654           bta_dm_cb.pin_evt = pin_evt;
2655           bta_dm_cb.pin_bd_addr = p_data->cfm_req.bd_addr;
2656           BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class,
2657                                 p_data->cfm_req.dev_class);
2658           if ((BTM_ReadRemoteDeviceName(
2659                   p_data->cfm_req.bd_addr, bta_dm_pinname_cback,
2660                   BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
2661             return BTM_CMD_STARTED;
2662           APPL_TRACE_WARNING(
2663               " bta_dm_sp_cback() -> Failed to start Remote Name Request  ");
2664         } else {
2665           /* Due to the switch case falling through below to
2666              BTM_SP_KEY_NOTIF_EVT,
2667              copy these values into key_notif from cfm_req */
2668           sec_event.key_notif.bd_addr = p_data->cfm_req.bd_addr;
2669           BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class,
2670                                 p_data->cfm_req.dev_class);
2671           strlcpy((char*)sec_event.key_notif.bd_name,
2672                   (char*)p_data->cfm_req.bd_name, BD_NAME_LEN);
2673         }
2674       }
2675
2676       if (BTM_SP_KEY_NOTIF_EVT == event) {
2677         /* If the device name is not known, save bdaddr and devclass
2678            and initiate a name request with values from key_notif */
2679         if (p_data->key_notif.bd_name[0] == 0) {
2680           bta_dm_cb.pin_evt = pin_evt;
2681           bta_dm_cb.pin_bd_addr = p_data->key_notif.bd_addr;
2682           BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class,
2683                                 p_data->key_notif.dev_class);
2684           if ((BTM_ReadRemoteDeviceName(
2685                   p_data->key_notif.bd_addr, bta_dm_pinname_cback,
2686                   BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
2687             return BTM_CMD_STARTED;
2688           APPL_TRACE_WARNING(
2689               " bta_dm_sp_cback() -> Failed to start Remote Name Request  ");
2690         } else {
2691           sec_event.key_notif.bd_addr = p_data->key_notif.bd_addr;
2692           BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class,
2693                                 p_data->key_notif.dev_class);
2694           strlcpy((char*)sec_event.key_notif.bd_name,
2695                   (char*)p_data->key_notif.bd_name, BD_NAME_LEN);
2696           sec_event.key_notif.bd_name[BD_NAME_LEN - 1] = 0;
2697         }
2698       }
2699
2700       bta_dm_cb.p_sec_cback(pin_evt, &sec_event);
2701
2702       break;
2703
2704     case BTM_SP_LOC_OOB_EVT:
2705       bta_dm_co_loc_oob((bool)(p_data->loc_oob.status == BTM_SUCCESS),
2706                         p_data->loc_oob.c, p_data->loc_oob.r);
2707       break;
2708
2709     case BTM_SP_RMT_OOB_EVT:
2710       /* If the device name is not known, save bdaddr and devclass and initiate
2711        * a name request */
2712       if (p_data->rmt_oob.bd_name[0] == 0) {
2713         bta_dm_cb.pin_evt = BTA_DM_SP_RMT_OOB_EVT;
2714         bta_dm_cb.pin_bd_addr = p_data->rmt_oob.bd_addr;
2715         BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class,
2716                               p_data->rmt_oob.dev_class);
2717         if ((BTM_ReadRemoteDeviceName(p_data->rmt_oob.bd_addr,
2718                                       bta_dm_pinname_cback,
2719                                       BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED)
2720           return BTM_CMD_STARTED;
2721         APPL_TRACE_WARNING(
2722             " bta_dm_sp_cback() -> Failed to start Remote Name Request  ");
2723       }
2724
2725       sec_event.rmt_oob.bd_addr = p_data->rmt_oob.bd_addr;
2726       BTA_COPY_DEVICE_CLASS(sec_event.rmt_oob.dev_class,
2727                             p_data->rmt_oob.dev_class);
2728       strlcpy((char*)sec_event.rmt_oob.bd_name, (char*)p_data->rmt_oob.bd_name,
2729               BD_NAME_LEN);
2730
2731       bta_dm_cb.p_sec_cback(BTA_DM_SP_RMT_OOB_EVT, &sec_event);
2732
2733       bta_dm_co_rmt_oob(p_data->rmt_oob.bd_addr);
2734       break;
2735
2736     case BTM_SP_COMPLT_EVT:
2737       /* do not report this event - handled by link_key_callback or
2738        * auth_complete_callback */
2739       break;
2740
2741     case BTM_SP_KEYPRESS_EVT:
2742       memcpy(&sec_event.key_press, &p_data->key_press,
2743              sizeof(tBTM_SP_KEYPRESS));
2744       bta_dm_cb.p_sec_cback(BTA_DM_SP_KEYPRESS_EVT, &sec_event);
2745       break;
2746
2747     case BTM_SP_UPGRADE_EVT:
2748       bta_dm_co_lk_upgrade(p_data->upgrade.bd_addr, &p_data->upgrade.upgrade);
2749       break;
2750
2751     default:
2752       status = BTM_NOT_AUTHORIZED;
2753       break;
2754   }
2755   APPL_TRACE_EVENT("dm status: %d", status);
2756   return status;
2757 }
2758 #endif
2759
2760 /*******************************************************************************
2761  *
2762  * Function         bta_dm_local_name_cback
2763  *
2764  * Description      Callback from btm after local name is read
2765  *
2766  *
2767  * Returns          void
2768  *
2769  ******************************************************************************/
2770 static void bta_dm_local_name_cback(UNUSED_ATTR const RawAddress& p_name) {
2771   tBTA_DM_SEC sec_event;
2772
2773   sec_event.enable.status = BTA_SUCCESS;
2774
2775   if (bta_dm_cb.p_sec_cback)
2776     bta_dm_cb.p_sec_cback(BTA_DM_ENABLE_EVT, &sec_event);
2777 }
2778
2779 /*******************************************************************************
2780  *
2781  * Function         bta_dm_bl_change_cback
2782  *
2783  * Description      Callback from btm when acl connection goes up or down
2784  *
2785  *
2786  * Returns          void
2787  *
2788  ******************************************************************************/
2789 static void bta_dm_bl_change_cback(tBTM_BL_EVENT_DATA* p_data) {
2790   tBTA_DM_ACL_CHANGE* p_msg =
2791       (tBTA_DM_ACL_CHANGE*)osi_malloc(sizeof(tBTA_DM_ACL_CHANGE));
2792
2793   p_msg->event = p_data->event;
2794   p_msg->is_new = false;
2795
2796   switch (p_msg->event) {
2797     case BTM_BL_CONN_EVT:
2798       p_msg->is_new = true;
2799       p_msg->bd_addr = *p_data->conn.p_bda;
2800       p_msg->transport = p_data->conn.transport;
2801       p_msg->handle = p_data->conn.handle;
2802       break;
2803     case BTM_BL_DISCN_EVT:
2804       p_msg->bd_addr = *p_data->discn.p_bda;
2805       p_msg->transport = p_data->discn.transport;
2806       p_msg->handle = p_data->discn.handle;
2807       break;
2808     case BTM_BL_UPDATE_EVT:
2809       p_msg->busy_level = p_data->update.busy_level;
2810       p_msg->busy_level_flags = p_data->update.busy_level_flags;
2811       break;
2812     case BTM_BL_ROLE_CHG_EVT:
2813       p_msg->new_role = p_data->role_chg.new_role;
2814       p_msg->hci_status = p_data->role_chg.hci_status;
2815       p_msg->bd_addr = *p_data->role_chg.p_bda;
2816       break;
2817     case BTM_BL_COLLISION_EVT:
2818       p_msg->bd_addr = *p_data->conn.p_bda;
2819       break;
2820   }
2821
2822   p_msg->hdr.event = BTA_DM_ACL_CHANGE_EVT;
2823   bta_sys_sendmsg(p_msg);
2824 }
2825
2826 /*******************************************************************************
2827  *
2828  * Function         bta_dm_rs_cback
2829  *
2830  * Description      Receives the role switch complete event
2831  *
2832  * Returns
2833  *
2834  ******************************************************************************/
2835 static void bta_dm_rs_cback(UNUSED_ATTR tBTM_ROLE_SWITCH_CMPL* p1) {
2836   APPL_TRACE_WARNING("bta_dm_rs_cback:%d", bta_dm_cb.rs_event);
2837   if (bta_dm_cb.rs_event == BTA_DM_API_SEARCH_EVT) {
2838     bta_dm_cb.search_msg.rs_res =
2839         BTA_DM_RS_OK; /* do not care about the result for now */
2840     bta_dm_cb.rs_event = 0;
2841     bta_dm_search_start((tBTA_DM_MSG*)&bta_dm_cb.search_msg);
2842   }
2843 }
2844
2845 /*******************************************************************************
2846  *
2847  * Function         bta_dm_check_av
2848  *
2849  * Description      This function checks if AV is active
2850  *                  if yes, make sure the AV link is master
2851  *
2852  * Returns          bool - true, if switch is in progress
2853  *
2854  ******************************************************************************/
2855 static bool bta_dm_check_av(uint16_t event) {
2856   bool avoid_roleswitch = false;
2857   bool switching = false;
2858   uint8_t i;
2859   tBTA_DM_PEER_DEVICE* p_dev;
2860
2861 #if (BTA_DM_AVOID_A2DP_ROLESWITCH_ON_INQUIRY == TRUE)
2862
2863   /* avoid role switch upon inquiry if a2dp is actively streaming as it
2864      introduces an audioglitch due to FW scheduling delays (unavoidable) */
2865   if (event == BTA_DM_API_SEARCH_EVT) {
2866     avoid_roleswitch = true;
2867   }
2868 #endif
2869
2870   APPL_TRACE_WARNING("bta_dm_check_av:%d", bta_dm_cb.cur_av_count);
2871   if (bta_dm_cb.cur_av_count) {
2872     for (i = 0; i < bta_dm_cb.device_list.count; i++) {
2873       p_dev = &bta_dm_cb.device_list.peer_device[i];
2874       APPL_TRACE_WARNING("[%d]: state:%d, info:x%x, avoid_rs %d", i,
2875                          p_dev->conn_state, p_dev->info, avoid_roleswitch);
2876       if ((p_dev->conn_state == BTA_DM_CONNECTED) &&
2877           (p_dev->info & BTA_DM_DI_AV_ACTIVE) && (avoid_roleswitch == false)) {
2878         /* make master and take away the role switch policy */
2879         if (BTM_CMD_STARTED == BTM_SwitchRole(p_dev->peer_bdaddr,
2880                                               HCI_ROLE_MASTER,
2881                                               (tBTM_CMPL_CB*)bta_dm_rs_cback)) {
2882           /* the role switch command is actually sent */
2883           bta_dm_cb.rs_event = event;
2884           switching = true;
2885         }
2886         /* else either already master or can not switch for some reasons */
2887         bta_dm_policy_cback(BTA_SYS_PLCY_CLR, 0, HCI_ENABLE_MASTER_SLAVE_SWITCH,
2888                             &p_dev->peer_bdaddr);
2889         break;
2890       }
2891     }
2892   }
2893   return switching;
2894 }
2895
2896 /*******************************************************************************
2897  *
2898  * Function         bta_dm_acl_change
2899  *
2900  * Description      Process BTA_DM_ACL_CHANGE_EVT
2901  *
2902  *
2903  * Returns          void
2904  *
2905  ******************************************************************************/
2906 void bta_dm_acl_change(tBTA_DM_MSG* p_data) {
2907   uint8_t i;
2908   uint8_t* p;
2909   tBTA_DM_SEC conn;
2910   bool is_new = p_data->acl_change.is_new;
2911   const RawAddress& p_bda = p_data->acl_change.bd_addr;
2912   bool need_policy_change = false;
2913   bool issue_unpair_cb = false;
2914
2915   tBTA_DM_PEER_DEVICE* p_dev;
2916   memset(&conn, 0, sizeof(tBTA_DM_SEC));
2917
2918   switch (p_data->acl_change.event) {
2919     case BTM_BL_UPDATE_EVT: /* busy level update */
2920       if (bta_dm_cb.p_sec_cback) {
2921         conn.busy_level.level = p_data->acl_change.busy_level;
2922         conn.busy_level.level_flags = p_data->acl_change.busy_level_flags;
2923         bta_dm_cb.p_sec_cback(BTA_DM_BUSY_LEVEL_EVT, &conn);
2924       }
2925       return;
2926
2927     case BTM_BL_ROLE_CHG_EVT: /* role change event */
2928       p_dev = bta_dm_find_peer_device(p_bda);
2929       if (p_dev) {
2930         APPL_TRACE_DEBUG(
2931             "bta_dm_acl_change role chg info:x%x new_role:%d dev count:%d",
2932             p_dev->info, p_data->acl_change.new_role,
2933             bta_dm_cb.device_list.count);
2934         if (p_dev->info & BTA_DM_DI_AV_ACTIVE) {
2935           /* there's AV activity on this link */
2936           if (p_data->acl_change.new_role == HCI_ROLE_SLAVE &&
2937               bta_dm_cb.device_list.count > 1 &&
2938               p_data->acl_change.hci_status == HCI_SUCCESS) {
2939             /* more than one connections and the AV connection is role switched
2940              * to slave
2941              * switch it back to master and remove the switch policy */
2942             BTM_SwitchRole(p_bda, BTM_ROLE_MASTER, NULL);
2943             need_policy_change = true;
2944           } else if (p_bta_dm_cfg->avoid_scatter &&
2945                      (p_data->acl_change.new_role == HCI_ROLE_MASTER)) {
2946             /* if the link updated to be master include AV activities, remove
2947              * the switch policy */
2948             need_policy_change = true;
2949           }
2950
2951           if (need_policy_change) {
2952             bta_dm_policy_cback(BTA_SYS_PLCY_CLR, 0,
2953                                 HCI_ENABLE_MASTER_SLAVE_SWITCH,
2954                                 &p_dev->peer_bdaddr);
2955           }
2956         } else {
2957           /* there's AV no activity on this link and role switch happened
2958            * check if AV is active
2959            * if so, make sure the AV link is master */
2960           bta_dm_check_av(0);
2961         }
2962         bta_sys_notify_role_chg(p_data->acl_change.bd_addr,
2963                                 p_data->acl_change.new_role,
2964                                 p_data->acl_change.hci_status);
2965         conn.role_chg.bd_addr = p_bda;
2966         conn.role_chg.new_role = (uint8_t)p_data->acl_change.new_role;
2967         if (bta_dm_cb.p_sec_cback)
2968           bta_dm_cb.p_sec_cback(BTA_DM_ROLE_CHG_EVT, (tBTA_DM_SEC*)&conn);
2969       }
2970       return;
2971   }
2972
2973   /* Collision report from Stack: Notify profiles */
2974   if (p_data->acl_change.event == BTM_BL_COLLISION_EVT) {
2975     bta_sys_notify_collision(p_bda);
2976     return;
2977   }
2978
2979   if (is_new) {
2980     for (i = 0; i < bta_dm_cb.device_list.count; i++) {
2981       if (bta_dm_cb.device_list.peer_device[i].peer_bdaddr == p_bda &&
2982           bta_dm_cb.device_list.peer_device[i].conn_handle ==
2983               p_data->acl_change.handle)
2984         break;
2985     }
2986
2987     if (i == bta_dm_cb.device_list.count) {
2988       if (bta_dm_cb.device_list.count < BTA_DM_NUM_PEER_DEVICE) {
2989         bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count]
2990             .peer_bdaddr = p_bda;
2991         bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count]
2992             .link_policy = bta_dm_cb.cur_policy;
2993         bta_dm_cb.device_list.count++;
2994         bta_dm_cb.device_list.peer_device[i].conn_handle =
2995             p_data->acl_change.handle;
2996         if (p_data->acl_change.transport == BT_TRANSPORT_LE)
2997           bta_dm_cb.device_list.le_count++;
2998       } else {
2999         APPL_TRACE_ERROR("%s max active connection reached, no resources",
3000                          __func__);
3001         return;
3002       }
3003     }
3004
3005     bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_CONNECTED;
3006     bta_dm_cb.device_list.peer_device[i].pref_role = BTA_ANY_ROLE;
3007     conn.link_up.bd_addr = p_bda;
3008     bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_NONE;
3009     conn.link_up.link_type = p_data->acl_change.transport;
3010     bta_dm_cb.device_list.peer_device[i].transport =
3011         p_data->acl_change.transport;
3012
3013     if (((NULL != (p = BTM_ReadLocalFeatures())) &&
3014          HCI_SNIFF_SUB_RATE_SUPPORTED(p)) &&
3015         ((NULL != (p = BTM_ReadRemoteFeatures(p_bda))) &&
3016          HCI_SNIFF_SUB_RATE_SUPPORTED(p))) {
3017       /* both local and remote devices support SSR */
3018       bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_USE_SSR;
3019     }
3020     APPL_TRACE_WARNING("%s info: 0x%x", __func__,
3021                        bta_dm_cb.device_list.peer_device[i].info);
3022
3023     if (bta_dm_cb.p_sec_cback)
3024       bta_dm_cb.p_sec_cback(BTA_DM_LINK_UP_EVT, (tBTA_DM_SEC*)&conn);
3025   } else {
3026     for (i = 0; i < bta_dm_cb.device_list.count; i++) {
3027       if (bta_dm_cb.device_list.peer_device[i].peer_bdaddr != p_bda ||
3028           bta_dm_cb.device_list.peer_device[i].transport !=
3029               p_data->acl_change.transport)
3030         continue;
3031
3032       if (bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_UNPAIRING) {
3033         if (BTM_SecDeleteDevice(
3034                 bta_dm_cb.device_list.peer_device[i].peer_bdaddr))
3035           issue_unpair_cb = true;
3036
3037         APPL_TRACE_DEBUG("%s: Unpairing: issue unpair CB = %d ", __func__,
3038                          issue_unpair_cb);
3039       }
3040
3041       conn.link_down.is_removed =
3042           bta_dm_cb.device_list.peer_device[i].remove_dev_pending;
3043
3044       // Iterate to the one before the last when shrinking the list,
3045       // otherwise we memcpy garbage data into the record.
3046       // Then clear out the last item in the list since we are shrinking.
3047       for (; i < bta_dm_cb.device_list.count - 1; i++) {
3048         memcpy(&bta_dm_cb.device_list.peer_device[i],
3049                &bta_dm_cb.device_list.peer_device[i + 1],
3050                sizeof(bta_dm_cb.device_list.peer_device[i]));
3051       }
3052       if (bta_dm_cb.device_list.count > 0) {
3053         int clear_index = bta_dm_cb.device_list.count - 1;
3054         memset(&bta_dm_cb.device_list.peer_device[clear_index], 0,
3055                sizeof(bta_dm_cb.device_list.peer_device[clear_index]));
3056       }
3057       break;
3058     }
3059     if (bta_dm_cb.device_list.count) bta_dm_cb.device_list.count--;
3060     if ((p_data->acl_change.transport == BT_TRANSPORT_LE) &&
3061         (bta_dm_cb.device_list.le_count))
3062       bta_dm_cb.device_list.le_count--;
3063     conn.link_down.link_type = p_data->acl_change.transport;
3064
3065     if (bta_dm_search_cb.wait_disc && bta_dm_search_cb.peer_bdaddr == p_bda) {
3066       bta_dm_search_cb.wait_disc = false;
3067
3068       if (bta_dm_search_cb.sdp_results) {
3069         APPL_TRACE_EVENT(" timer stopped  ");
3070         alarm_cancel(bta_dm_search_cb.search_timer);
3071         bta_dm_discover_next_device();
3072       }
3073     }
3074
3075     if (bta_dm_cb.disabling) {
3076       if (!BTM_GetNumAclLinks()) {
3077         /*
3078          * Start a timer to make sure that the profiles
3079          * get the disconnect event.
3080          */
3081         alarm_set_on_mloop(bta_dm_cb.disable_timer,
3082                            BTA_DM_DISABLE_CONN_DOWN_TIMER_MS,
3083                            bta_dm_disable_conn_down_timer_cback, NULL);
3084       }
3085     }
3086     if (conn.link_down.is_removed) {
3087       BTM_SecDeleteDevice(p_bda);
3088       /* need to remove all pending background connection */
3089       BTA_GATTC_CancelOpen(0, p_bda, false);
3090       /* remove all cached GATT information */
3091       BTA_GATTC_Refresh(p_bda);
3092     }
3093
3094     conn.link_down.bd_addr = p_bda;
3095     conn.link_down.status = (uint8_t)btm_get_acl_disc_reason_code();
3096     if (bta_dm_cb.p_sec_cback) {
3097       bta_dm_cb.p_sec_cback(BTA_DM_LINK_DOWN_EVT, &conn);
3098       if (issue_unpair_cb)
3099         bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &conn);
3100     }
3101   }
3102
3103   bta_dm_adjust_roles(true);
3104 }
3105
3106 /*******************************************************************************
3107  *
3108  * Function         bta_dm_disable_conn_down_timer_cback
3109  *
3110  * Description      Sends disable event to application
3111  *
3112  *
3113  * Returns          void
3114  *
3115  ******************************************************************************/
3116 static void bta_dm_disable_conn_down_timer_cback(UNUSED_ATTR void* data) {
3117   tBTA_SYS_HW_MSG* sys_enable_event =
3118       (tBTA_SYS_HW_MSG*)osi_malloc(sizeof(tBTA_SYS_HW_MSG));
3119
3120   /* disable the power managment module */
3121   bta_dm_disable_pm();
3122
3123   /* register our callback to SYS HW manager */
3124   bta_sys_hw_register(BTA_SYS_HW_BLUETOOTH, bta_dm_sys_hw_cback);
3125
3126   /* send a message to BTA SYS */
3127   sys_enable_event->hdr.event = BTA_SYS_API_DISABLE_EVT;
3128   sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH;
3129   bta_sys_sendmsg(sys_enable_event);
3130
3131   bta_dm_cb.disabling = false;
3132 }
3133
3134 /*******************************************************************************
3135  *
3136  * Function         bta_dm_rm_cback
3137  *
3138  * Description      Role management callback from sys
3139  *
3140  *
3141  * Returns          void
3142  *
3143  ******************************************************************************/
3144 static void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, uint8_t id,
3145                             uint8_t app_id, const RawAddress* peer_addr) {
3146   uint8_t j;
3147   tBTA_PREF_ROLES role;
3148   tBTA_DM_PEER_DEVICE* p_dev;
3149
3150   p_dev = bta_dm_find_peer_device(*peer_addr);
3151   if (status == BTA_SYS_CONN_OPEN) {
3152     if (p_dev) {
3153       /* Do not set to connected if we are in the middle of unpairing. When AV
3154        * stream is
3155        * started it fakes out a SYS_CONN_OPEN to potentially trigger a role
3156        * switch command.
3157        * But this should not be done if we are in the middle of unpairing.
3158        */
3159       if (p_dev->conn_state != BTA_DM_UNPAIRING)
3160         p_dev->conn_state = BTA_DM_CONNECTED;
3161
3162       for (j = 1; j <= p_bta_dm_rm_cfg[0].app_id; j++) {
3163         if (((p_bta_dm_rm_cfg[j].app_id == app_id) ||
3164              (p_bta_dm_rm_cfg[j].app_id == BTA_ALL_APP_ID)) &&
3165             (p_bta_dm_rm_cfg[j].id == id)) {
3166           role = p_bta_dm_rm_cfg[j].cfg;
3167
3168           if (role > p_dev->pref_role) p_dev->pref_role = role;
3169           break;
3170         }
3171       }
3172     }
3173   }
3174
3175   if ((BTA_ID_AV == id) || (BTA_ID_AVK == id)) {
3176     if (status == BTA_SYS_CONN_BUSY) {
3177       if (p_dev) p_dev->info |= BTA_DM_DI_AV_ACTIVE;
3178       /* AV calls bta_sys_conn_open with the A2DP stream count as app_id */
3179       if (BTA_ID_AV == id) bta_dm_cb.cur_av_count = bta_dm_get_av_count();
3180     } else if (status == BTA_SYS_CONN_IDLE) {
3181       if (p_dev) p_dev->info &= ~BTA_DM_DI_AV_ACTIVE;
3182
3183       /* get cur_av_count from connected services */
3184       if (BTA_ID_AV == id) bta_dm_cb.cur_av_count = bta_dm_get_av_count();
3185     }
3186     APPL_TRACE_WARNING("bta_dm_rm_cback:%d, status:%d", bta_dm_cb.cur_av_count,
3187                        status);
3188   }
3189
3190   /* Don't adjust roles for each busy/idle state transition to avoid
3191      excessive switch requests when individual profile busy/idle status
3192      changes */
3193   if ((status != BTA_SYS_CONN_BUSY) && (status != BTA_SYS_CONN_IDLE))
3194     bta_dm_adjust_roles(false);
3195 }
3196
3197 /*******************************************************************************
3198  *
3199  * Function         bta_dm_delay_role_switch_cback
3200  *
3201  * Description      Callback from btm to delay a role switch
3202  *
3203  * Returns          void
3204  *
3205  ******************************************************************************/
3206 static void bta_dm_delay_role_switch_cback(UNUSED_ATTR void* data) {
3207   APPL_TRACE_EVENT("%s: initiating Delayed RS", __func__);
3208   bta_dm_adjust_roles(false);
3209 }
3210
3211 /*******************************************************************************
3212  *
3213  * Function         bta_dm_reset_sec_dev_pending
3214  *
3215  * Description      Setting the remove device pending status to false from
3216  *                  security device DB, when the link key notification
3217  *                  event comes.
3218  *
3219  * Returns          void
3220  *
3221  ******************************************************************************/
3222 static void bta_dm_reset_sec_dev_pending(const RawAddress& remote_bd_addr) {
3223   for (size_t i = 0; i < bta_dm_cb.device_list.count; i++) {
3224     if (bta_dm_cb.device_list.peer_device[i].peer_bdaddr == remote_bd_addr) {
3225       bta_dm_cb.device_list.peer_device[i].remove_dev_pending = false;
3226       return;
3227     }
3228   }
3229 }
3230
3231 /*******************************************************************************
3232  *
3233  * Function         bta_dm_remove_sec_dev_entry
3234  *
3235  * Description      Removes device entry from Security device DB if ACL
3236  connection with
3237  *                  remtoe device does not exist, else schedule for dev entry
3238  removal upon
3239                      ACL close
3240  *
3241  * Returns          void
3242  *
3243  ******************************************************************************/
3244 static void bta_dm_remove_sec_dev_entry(const RawAddress& remote_bd_addr) {
3245   if (BTM_IsAclConnectionUp(remote_bd_addr, BT_TRANSPORT_LE) ||
3246       BTM_IsAclConnectionUp(remote_bd_addr, BT_TRANSPORT_BR_EDR)) {
3247     APPL_TRACE_DEBUG(
3248         "%s ACL is not down. Schedule for  Dev Removal when ACL closes",
3249         __func__);
3250     BTM_SecClearSecurityFlags(remote_bd_addr);
3251     for (int i = 0; i < bta_dm_cb.device_list.count; i++) {
3252       if (bta_dm_cb.device_list.peer_device[i].peer_bdaddr == remote_bd_addr) {
3253         bta_dm_cb.device_list.peer_device[i].remove_dev_pending = TRUE;
3254         break;
3255       }
3256     }
3257   } else {
3258     BTM_SecDeleteDevice(remote_bd_addr);
3259     /* need to remove all pending background connection */
3260     BTA_GATTC_CancelOpen(0, remote_bd_addr, false);
3261     /* remove all cached GATT information */
3262     BTA_GATTC_Refresh(remote_bd_addr);
3263   }
3264 }
3265
3266 /*******************************************************************************
3267  *
3268  * Function         bta_dm_adjust_roles
3269  *
3270  * Description      Adjust roles
3271  *
3272  *
3273  * Returns          void
3274  *
3275  ******************************************************************************/
3276 static void bta_dm_adjust_roles(bool delay_role_switch) {
3277   uint8_t i;
3278   bool set_master_role = false;
3279   uint8_t br_count =
3280       bta_dm_cb.device_list.count - bta_dm_cb.device_list.le_count;
3281   if (br_count) {
3282     /* the configuration is no scatternet
3283      * or AV connection exists and there are more than one ACL link */
3284     if ((p_bta_dm_rm_cfg[0].cfg == BTA_DM_NO_SCATTERNET) ||
3285         (bta_dm_cb.cur_av_count && br_count > 1)) {
3286       L2CA_SetDesireRole(HCI_ROLE_MASTER);
3287       set_master_role = true;
3288     }
3289
3290     for (i = 0; i < bta_dm_cb.device_list.count; i++) {
3291       if (bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED &&
3292           bta_dm_cb.device_list.peer_device[i].transport ==
3293               BT_TRANSPORT_BR_EDR) {
3294         if (!set_master_role &&
3295             (bta_dm_cb.device_list.peer_device[i].pref_role != BTA_ANY_ROLE) &&
3296             (p_bta_dm_rm_cfg[0].cfg == BTA_DM_PARTIAL_SCATTERNET)) {
3297           L2CA_SetDesireRole(HCI_ROLE_MASTER);
3298           set_master_role = true;
3299         }
3300
3301         if ((bta_dm_cb.device_list.peer_device[i].pref_role ==
3302              BTA_MASTER_ROLE_ONLY) ||
3303             (br_count > 1)) {
3304           /* Initiating immediate role switch with certain remote devices
3305             has caused issues due to role  switch colliding with link encryption
3306             setup and
3307             causing encryption (and in turn the link) to fail .  These device .
3308             Firmware
3309             versions are stored in a blacklist and role switch with these
3310             devices are
3311             delayed to avoid the collision with link encryption setup */
3312
3313           if (bta_dm_cb.device_list.peer_device[i].pref_role !=
3314                   BTA_SLAVE_ROLE_ONLY &&
3315               delay_role_switch == false) {
3316             BTM_SwitchRole(bta_dm_cb.device_list.peer_device[i].peer_bdaddr,
3317                            HCI_ROLE_MASTER, NULL);
3318           } else {
3319             alarm_set_on_mloop(bta_dm_cb.switch_delay_timer,
3320                                BTA_DM_SWITCH_DELAY_TIMER_MS,
3321                                bta_dm_delay_role_switch_cback, NULL);
3322           }
3323         }
3324       }
3325     }
3326
3327     if (!set_master_role) {
3328       L2CA_SetDesireRole(L2CAP_DESIRED_LINK_ROLE);
3329     }
3330
3331   } else {
3332     L2CA_SetDesireRole(L2CAP_DESIRED_LINK_ROLE);
3333   }
3334 }
3335
3336 /*******************************************************************************
3337  *
3338  * Function         bta_dm_get_remname
3339  *
3340  * Description      Returns a pointer to the remote name stored in the DM
3341  *                  control block if it exists, or from the BTM memory.
3342  *
3343  * Returns          char * - Pointer to the remote device name
3344  ******************************************************************************/
3345 static char* bta_dm_get_remname(void) {
3346   char* p_name = (char*)bta_dm_search_cb.peer_name;
3347   char* p_temp;
3348
3349   /* If the name isn't already stored, try retrieving from BTM */
3350   if (*p_name == '\0') {
3351     p_temp = BTM_SecReadDevName(bta_dm_search_cb.peer_bdaddr);
3352     if (p_temp != NULL) p_name = p_temp;
3353   }
3354
3355   return p_name;
3356 }
3357
3358 /*******************************************************************************
3359  *
3360  * Function         bta_dm_bond_cancel_complete_cback
3361  *
3362  * Description      Authentication complete callback from BTM
3363  *
3364  * Returns          void
3365  *
3366  ******************************************************************************/
3367 static void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result) {
3368   tBTA_DM_SEC sec_event;
3369
3370   if (result == BTM_SUCCESS)
3371     sec_event.bond_cancel_cmpl.result = BTA_SUCCESS;
3372   else
3373     sec_event.bond_cancel_cmpl.result = BTA_FAILURE;
3374
3375   if (bta_dm_cb.p_sec_cback) {
3376     bta_dm_cb.p_sec_cback(BTA_DM_BOND_CANCEL_CMPL_EVT, &sec_event);
3377   }
3378 }
3379
3380 /*******************************************************************************
3381  *
3382  * Function         find_utf8_char_boundary
3383  *
3384  * Description      This function checks a UTF8 string |utf8str| starting at
3385  *                  |offset|, moving backwards and returns the offset of the
3386  *                  next valid UTF8 character boundary found.
3387  *
3388  * Returns          Offset of UTF8 character boundary
3389  *
3390  ******************************************************************************/
3391 static size_t find_utf8_char_boundary(const char* utf8str, size_t offset) {
3392   CHECK(utf8str);
3393   CHECK(offset > 0);
3394
3395   while (--offset) {
3396     uint8_t ch = (uint8_t)utf8str[offset];
3397     if ((ch & 0x80) == 0x00)  // ASCII
3398       return offset + 1;
3399     if ((ch & 0xC0) == 0xC0)  // Multi-byte sequence start
3400       return offset;
3401   }
3402
3403   return 0;
3404 }
3405
3406 /*******************************************************************************
3407  *
3408  * Function         bta_dm_set_eir
3409  *
3410  * Description      This function creates EIR tagged data and writes it to
3411  *                  controller.
3412  *
3413  * Returns          None
3414  *
3415  ******************************************************************************/
3416 static void bta_dm_set_eir(char* local_name) {
3417   uint8_t* p;
3418   uint8_t* p_length;
3419 #if (BTA_EIR_CANNED_UUID_LIST != TRUE)
3420   uint8_t* p_type;
3421   uint8_t max_num_uuid;
3422 #if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
3423   uint8_t custom_uuid_idx;
3424 #endif  // BTA_EIR_SERVER_NUM_CUSTOM_UUID
3425 #endif  // BTA_EIR_CANNED_UUID_LIST
3426 #if (BTM_EIR_DEFAULT_FEC_REQUIRED == FALSE)
3427   uint8_t free_eir_length = HCI_EXT_INQ_RESPONSE_LEN;
3428 #else  // BTM_EIR_DEFAULT_FEC_REQUIRED
3429   uint8_t free_eir_length = HCI_DM5_PACKET_SIZE;
3430 #endif  // BTM_EIR_DEFAULT_FEC_REQUIRED
3431   uint8_t num_uuid;
3432   uint8_t data_type;
3433   uint8_t local_name_len;
3434
3435   /* wait until complete to disable */
3436   if (alarm_is_scheduled(bta_dm_cb.disable_timer)) return;
3437
3438 #if (BTA_EIR_CANNED_UUID_LIST != TRUE)
3439   /* if local name is not provided, get it from controller */
3440   if (local_name == NULL) {
3441     if (BTM_ReadLocalDeviceName(&local_name) != BTM_SUCCESS) {
3442       APPL_TRACE_ERROR("Fail to read local device name for EIR");
3443     }
3444   }
3445 #endif  // BTA_EIR_CANNED_UUID_LIST
3446
3447   /* Allocate a buffer to hold HCI command */
3448   BT_HDR* p_buf = (BT_HDR*)osi_malloc(BTM_CMD_BUF_SIZE);
3449   p = (uint8_t*)p_buf + BTM_HCI_EIR_OFFSET;
3450
3451   memset(p, 0x00, HCI_EXT_INQ_RESPONSE_LEN);
3452
3453   APPL_TRACE_DEBUG("BTA is generating EIR");
3454
3455   if (local_name)
3456     local_name_len = strlen(local_name);
3457   else
3458     local_name_len = 0;
3459
3460   data_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE;
3461   /* if local name is longer than minimum length of shortened name */
3462   /* check whether it needs to be shortened or not */
3463   if (local_name_len > p_bta_dm_eir_cfg->bta_dm_eir_min_name_len) {
3464 /* get number of UUID 16-bit list */
3465 #if (BTA_EIR_CANNED_UUID_LIST == TRUE)
3466     num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len / LEN_UUID_16;
3467 #else   // BTA_EIR_CANNED_UUID_LIST
3468     max_num_uuid = (free_eir_length - 2) / LEN_UUID_16;
3469     data_type = BTM_GetEirSupportedServices(bta_dm_cb.eir_uuid, &p,
3470                                             max_num_uuid, &num_uuid);
3471     p = (uint8_t*)p_buf + BTM_HCI_EIR_OFFSET; /* reset p */
3472 #endif  // BTA_EIR_CANNED_UUID_LIST
3473
3474     /* if UUID doesn't fit remaing space, shorten local name */
3475     if (local_name_len > (free_eir_length - 4 - num_uuid * LEN_UUID_16)) {
3476       local_name_len = find_utf8_char_boundary(
3477           local_name, p_bta_dm_eir_cfg->bta_dm_eir_min_name_len);
3478       APPL_TRACE_WARNING("%s local name is shortened (%d)", __func__,
3479                          local_name_len);
3480       data_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE;
3481     } else {
3482       data_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE;
3483     }
3484   }
3485
3486   UINT8_TO_STREAM(p, local_name_len + 1);
3487   UINT8_TO_STREAM(p, data_type);
3488
3489   if (local_name != NULL) {
3490     memcpy(p, local_name, local_name_len);
3491     p += local_name_len;
3492   }
3493   free_eir_length -= local_name_len + 2;
3494
3495 #if (BTA_EIR_CANNED_UUID_LIST == TRUE)
3496   /* if UUID list is provided as static data in configuration */
3497   if ((p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len > 0) &&
3498       (p_bta_dm_eir_cfg->bta_dm_eir_uuid16)) {
3499     if (free_eir_length > LEN_UUID_16 + 2) {
3500       free_eir_length -= 2;
3501
3502       if (free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len) {
3503         num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len / LEN_UUID_16;
3504         data_type = BTM_EIR_COMPLETE_16BITS_UUID_TYPE;
3505       } else /* not enough room for all UUIDs */
3506       {
3507         APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
3508         num_uuid = free_eir_length / LEN_UUID_16;
3509         data_type = BTM_EIR_MORE_16BITS_UUID_TYPE;
3510       }
3511       UINT8_TO_STREAM(p, num_uuid * LEN_UUID_16 + 1);
3512       UINT8_TO_STREAM(p, data_type);
3513       memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_uuid16, num_uuid * LEN_UUID_16);
3514       p += num_uuid * LEN_UUID_16;
3515       free_eir_length -= num_uuid * LEN_UUID_16;
3516     }
3517   }
3518 #else /* (BTA_EIR_CANNED_UUID_LIST == TRUE) */
3519   /* if UUID list is dynamic */
3520   if (free_eir_length >= 2) {
3521     p_length = p++;
3522     p_type = p++;
3523     num_uuid = 0;
3524
3525     max_num_uuid = (free_eir_length - 2) / LEN_UUID_16;
3526     data_type = BTM_GetEirSupportedServices(bta_dm_cb.eir_uuid, &p,
3527                                             max_num_uuid, &num_uuid);
3528
3529     if (data_type == BTM_EIR_MORE_16BITS_UUID_TYPE) {
3530       APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
3531     }
3532 #if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
3533     else {
3534       for (custom_uuid_idx = 0;
3535            custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID;
3536            custom_uuid_idx++) {
3537         if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_16) {
3538           if (num_uuid < max_num_uuid) {
3539             UINT16_TO_STREAM(p,
3540                              bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid16);
3541             num_uuid++;
3542           } else {
3543             data_type = BTM_EIR_MORE_16BITS_UUID_TYPE;
3544             APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
3545             break;
3546           }
3547         }
3548       }
3549     }
3550 #endif /* (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) */
3551
3552     UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_16 + 1);
3553     UINT8_TO_STREAM(p_type, data_type);
3554     free_eir_length -= num_uuid * LEN_UUID_16 + 2;
3555   }
3556 #endif /* (BTA_EIR_CANNED_UUID_LIST == TRUE) */
3557
3558 #if (BTA_EIR_CANNED_UUID_LIST != TRUE && BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
3559   /* Adding 32-bit UUID list */
3560   if (free_eir_length >= 2) {
3561     p_length = p++;
3562     p_type = p++;
3563     num_uuid = 0;
3564     data_type = BTM_EIR_COMPLETE_32BITS_UUID_TYPE;
3565
3566     max_num_uuid = (free_eir_length - 2) / LEN_UUID_32;
3567
3568     for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID;
3569          custom_uuid_idx++) {
3570       if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_32) {
3571         if (num_uuid < max_num_uuid) {
3572           UINT32_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid32);
3573           num_uuid++;
3574         } else {
3575           data_type = BTM_EIR_MORE_32BITS_UUID_TYPE;
3576           APPL_TRACE_WARNING("BTA EIR: UUID 32-bit list is truncated");
3577           break;
3578         }
3579       }
3580     }
3581
3582     UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_32 + 1);
3583     UINT8_TO_STREAM(p_type, data_type);
3584     free_eir_length -= num_uuid * LEN_UUID_32 + 2;
3585   }
3586
3587   /* Adding 128-bit UUID list */
3588   if (free_eir_length >= 2) {
3589     p_length = p++;
3590     p_type = p++;
3591     num_uuid = 0;
3592     data_type = BTM_EIR_COMPLETE_128BITS_UUID_TYPE;
3593
3594     max_num_uuid = (free_eir_length - 2) / LEN_UUID_128;
3595
3596     for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID;
3597          custom_uuid_idx++) {
3598       if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_128) {
3599         if (num_uuid < max_num_uuid) {
3600           ARRAY16_TO_STREAM(p,
3601                             bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid128);
3602           num_uuid++;
3603         } else {
3604           data_type = BTM_EIR_MORE_128BITS_UUID_TYPE;
3605           APPL_TRACE_WARNING("BTA EIR: UUID 128-bit list is truncated");
3606           break;
3607         }
3608       }
3609     }
3610
3611     UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_128 + 1);
3612     UINT8_TO_STREAM(p_type, data_type);
3613     free_eir_length -= num_uuid * LEN_UUID_128 + 2;
3614   }
3615 #endif /* ( BTA_EIR_CANNED_UUID_LIST != TRUE \
3616           )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) */
3617
3618   /* if Flags are provided in configuration */
3619   if ((p_bta_dm_eir_cfg->bta_dm_eir_flag_len > 0) &&
3620       (p_bta_dm_eir_cfg->bta_dm_eir_flags) &&
3621       (free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 2)) {
3622     UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 1);
3623     UINT8_TO_STREAM(p, BTM_EIR_FLAGS_TYPE);
3624     memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_flags,
3625            p_bta_dm_eir_cfg->bta_dm_eir_flag_len);
3626     p += p_bta_dm_eir_cfg->bta_dm_eir_flag_len;
3627     free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 2;
3628   }
3629
3630   /* if Manufacturer Specific are provided in configuration */
3631   if ((p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len > 0) &&
3632       (p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec) &&
3633       (free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2)) {
3634     p_length = p;
3635
3636     UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 1);
3637     UINT8_TO_STREAM(p, BTM_EIR_MANUFACTURER_SPECIFIC_TYPE);
3638     memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec,
3639            p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len);
3640     p += p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len;
3641     free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2;
3642
3643   } else {
3644     p_length = NULL;
3645   }
3646
3647   /* if Inquiry Tx Resp Power compiled */
3648   if ((p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power) && (free_eir_length >= 3)) {
3649     UINT8_TO_STREAM(p, 2); /* Length field */
3650     UINT8_TO_STREAM(p, BTM_EIR_TX_POWER_LEVEL_TYPE);
3651     UINT8_TO_STREAM(p, *(p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power));
3652     free_eir_length -= 3;
3653   }
3654
3655   if (free_eir_length)
3656     UINT8_TO_STREAM(p, 0); /* terminator of significant part */
3657
3658   BTM_WriteEIR(p_buf);
3659 }
3660
3661 /*******************************************************************************
3662  *
3663  * Function         bta_dm_eir_search_services
3664  *
3665  * Description      This function searches services in received EIR
3666  *
3667  * Returns          None
3668  *
3669  ******************************************************************************/
3670 static void bta_dm_eir_search_services(tBTM_INQ_RESULTS* p_result,
3671                                        tBTA_SERVICE_MASK* p_services_to_search,
3672                                        tBTA_SERVICE_MASK* p_services_found) {
3673   tBTA_SERVICE_MASK service_index = 0;
3674   tBTM_EIR_SEARCH_RESULT result;
3675
3676   VLOG(1) << "BTA searching services in EIR of BDA:"
3677           << p_result->remote_bd_addr;
3678
3679   APPL_TRACE_DEBUG("    with services_to_search=0x%08X", *p_services_to_search);
3680
3681   /* always do GATT based service discovery by SDP instead of from EIR    */
3682   /* if GATT based service is also to be put in EIR, need to modify this  */
3683   while (service_index < (BTA_MAX_SERVICE_ID - 1)) {
3684     if (*p_services_to_search &
3685         (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index))) {
3686       result = BTM_HasInquiryEirService(
3687           p_result, bta_service_id_to_uuid_lkup_tbl[service_index]);
3688
3689       /* Searching for HSP v1.2 only device */
3690       if ((result != BTM_EIR_FOUND) &&
3691           (bta_service_id_to_uuid_lkup_tbl[service_index] ==
3692            UUID_SERVCLASS_HEADSET)) {
3693         result = BTM_HasInquiryEirService(p_result, UUID_SERVCLASS_HEADSET_HS);
3694       }
3695
3696       if (result == BTM_EIR_FOUND) {
3697         /* If Plug and Play service record, need to check to see if Broadcom
3698          * stack */
3699         /* However, EIR data doesn't have EXT_BRCM_VERSION so just skip it */
3700         if (bta_service_id_to_uuid_lkup_tbl[service_index] !=
3701             UUID_SERVCLASS_PNP_INFORMATION) {
3702           *p_services_found |= (tBTA_SERVICE_MASK)(
3703               BTA_SERVICE_ID_TO_SERVICE_MASK(service_index));
3704           /* remove the service from services to be searched  */
3705           *p_services_to_search &= (tBTA_SERVICE_MASK)(
3706               ~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)));
3707         }
3708       } else if (result == BTM_EIR_NOT_FOUND) {
3709         /* remove the service from services to be searched  */
3710         *p_services_to_search &= (tBTA_SERVICE_MASK)(
3711             ~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)));
3712       }
3713     }
3714
3715     service_index++;
3716   }
3717
3718   APPL_TRACE_ERROR(
3719       "BTA EIR search result, services_to_search=0x%08X, services_found=0x%08X",
3720       *p_services_to_search, *p_services_found);
3721 }
3722
3723 #if (BTA_EIR_CANNED_UUID_LIST != TRUE)
3724 /*******************************************************************************
3725  *
3726  * Function         bta_dm_eir_update_uuid
3727  *
3728  * Description      This function adds or removes service UUID in EIR database.
3729  *
3730  * Returns          None
3731  *
3732  ******************************************************************************/
3733 void bta_dm_eir_update_uuid(uint16_t uuid16, bool adding) {
3734   /* if this UUID is not advertised in EIR */
3735   if (!BTM_HasEirService(p_bta_dm_eir_cfg->uuid_mask, uuid16)) return;
3736
3737   if (adding) {
3738     APPL_TRACE_EVENT("Adding UUID=0x%04X into EIR", uuid16);
3739
3740     BTM_AddEirService(bta_dm_cb.eir_uuid, uuid16);
3741   } else {
3742     APPL_TRACE_EVENT("Removing UUID=0x%04X from EIR", uuid16);
3743
3744     BTM_RemoveEirService(bta_dm_cb.eir_uuid, uuid16);
3745   }
3746
3747   bta_dm_set_eir(NULL);
3748
3749   APPL_TRACE_EVENT("bta_dm_eir_update_uuid UUID bit mask=0x%08X %08X",
3750                    bta_dm_cb.eir_uuid[1], bta_dm_cb.eir_uuid[0]);
3751 }
3752 #endif
3753
3754 /*******************************************************************************
3755  *
3756  * Function         bta_dm_enable_test_mode
3757  *
3758  * Description      enable test mode
3759  *
3760  *
3761  * Returns          void
3762  *
3763  ******************************************************************************/
3764 void bta_dm_enable_test_mode(UNUSED_ATTR tBTA_DM_MSG* p_data) {
3765   BTM_EnableTestMode();
3766 }
3767
3768 /*******************************************************************************
3769  *
3770  * Function         bta_dm_disable_test_mode
3771  *
3772  * Description      disable test mode
3773  *
3774  *
3775  * Returns          void
3776  *
3777  ******************************************************************************/
3778 void bta_dm_disable_test_mode(UNUSED_ATTR tBTA_DM_MSG* p_data) {
3779   BTM_DeviceReset(NULL);
3780 }
3781
3782 /*******************************************************************************
3783  *
3784  * Function         bta_dm_execute_callback
3785  *
3786  * Description      Just execute a generic call back in the context of the
3787  *                  BTU/BTA tack
3788  *
3789  *
3790  * Returns          void
3791  *
3792  ******************************************************************************/
3793 void bta_dm_execute_callback(tBTA_DM_MSG* p_data) {
3794   /* sanity check */
3795   if (p_data->exec_cback.p_exec_cback == NULL) {
3796     return;
3797   }
3798
3799   p_data->exec_cback.p_exec_cback(p_data->exec_cback.p_param);
3800 }
3801
3802 /*******************************************************************************
3803  *
3804  * Function         bta_dm_encrypt_cback
3805  *
3806  * Description      link encryption complete callback.
3807  *
3808  * Returns         None
3809  *
3810  ******************************************************************************/
3811 void bta_dm_encrypt_cback(const RawAddress* bd_addr, tBT_TRANSPORT transport,
3812                           UNUSED_ATTR void* p_ref_data, tBTM_STATUS result) {
3813   tBTA_STATUS bta_status = BTA_SUCCESS;
3814   tBTA_DM_ENCRYPT_CBACK* p_callback = NULL;
3815   uint8_t i;
3816
3817   for (i = 0; i < bta_dm_cb.device_list.count; i++) {
3818     if (bta_dm_cb.device_list.peer_device[i].peer_bdaddr == *bd_addr &&
3819         bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED)
3820       break;
3821   }
3822
3823   if (i < bta_dm_cb.device_list.count) {
3824     p_callback = bta_dm_cb.device_list.peer_device[i].p_encrypt_cback;
3825     bta_dm_cb.device_list.peer_device[i].p_encrypt_cback = NULL;
3826   }
3827
3828   switch (result) {
3829     case BTM_SUCCESS:
3830       break;
3831     case BTM_WRONG_MODE:
3832       bta_status = BTA_WRONG_MODE;
3833       break;
3834     case BTM_NO_RESOURCES:
3835       bta_status = BTA_NO_RESOURCES;
3836       break;
3837     case BTM_BUSY:
3838       bta_status = BTA_BUSY;
3839       break;
3840     default:
3841       bta_status = BTA_FAILURE;
3842       break;
3843   }
3844
3845   APPL_TRACE_DEBUG("bta_dm_encrypt_cback status =%d p_callback=0x%x",
3846                    bta_status, p_callback);
3847
3848   if (p_callback) {
3849     (*p_callback)(*bd_addr, transport, bta_status);
3850   }
3851 }
3852
3853 /*******************************************************************************
3854  *
3855  * Function         bta_dm_set_encryption
3856  *
3857  * Description      This function to encrypt the link
3858  *
3859  * Returns          None
3860  *
3861  ******************************************************************************/
3862 void bta_dm_set_encryption(tBTA_DM_MSG* p_data) {
3863   uint8_t i;
3864
3865   APPL_TRACE_DEBUG("bta_dm_set_encryption");  // todo
3866   if (!p_data->set_encryption.p_callback) {
3867     APPL_TRACE_ERROR("bta_dm_set_encryption callback is not provided");
3868     return;
3869   }
3870   for (i = 0; i < bta_dm_cb.device_list.count; i++) {
3871     if (bta_dm_cb.device_list.peer_device[i].peer_bdaddr ==
3872             p_data->set_encryption.bd_addr &&
3873         bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED)
3874       break;
3875   }
3876   if (i < bta_dm_cb.device_list.count) {
3877     if (bta_dm_cb.device_list.peer_device[i].p_encrypt_cback) {
3878       APPL_TRACE_ERROR("earlier enc was not done for same device");
3879       (*p_data->set_encryption.p_callback)(p_data->set_encryption.bd_addr,
3880                                            p_data->set_encryption.transport,
3881                                            BTA_BUSY);
3882       return;
3883     }
3884
3885     if (BTM_SetEncryption(p_data->set_encryption.bd_addr,
3886                           p_data->set_encryption.transport,
3887                           bta_dm_encrypt_cback, NULL,
3888                           p_data->set_encryption.sec_act) == BTM_CMD_STARTED) {
3889       bta_dm_cb.device_list.peer_device[i].p_encrypt_cback =
3890           p_data->set_encryption.p_callback;
3891     }
3892   }
3893 }
3894
3895 bool bta_dm_check_if_only_hd_connected(const RawAddress& peer_addr) {
3896   APPL_TRACE_DEBUG("%s: count(%d)", __func__, bta_dm_conn_srvcs.count);
3897
3898   for (uint8_t j = 0; j < bta_dm_conn_srvcs.count; j++) {
3899     // Check if profiles other than hid are connected
3900     if ((bta_dm_conn_srvcs.conn_srvc[j].id != BTA_ID_HD) &&
3901         bta_dm_conn_srvcs.conn_srvc[j].peer_bdaddr == peer_addr) {
3902       APPL_TRACE_DEBUG("%s: Another profile (id=%d) is connected", __func__,
3903                        bta_dm_conn_srvcs.conn_srvc[j].id);
3904       return false;
3905     }
3906   }
3907
3908   return true;
3909 }
3910
3911 /*******************************************************************************
3912  *
3913  * Function         bta_dm_observe_results_cb
3914  *
3915  * Description      Callback for BLE Observe result
3916  *
3917  *
3918  * Returns          void
3919  *
3920  ******************************************************************************/
3921 static void bta_dm_observe_results_cb(tBTM_INQ_RESULTS* p_inq, uint8_t* p_eir,
3922                                       uint16_t eir_len) {
3923   tBTA_DM_SEARCH result;
3924   tBTM_INQ_INFO* p_inq_info;
3925   APPL_TRACE_DEBUG("bta_dm_observe_results_cb");
3926
3927   result.inq_res.bd_addr = p_inq->remote_bd_addr;
3928   result.inq_res.rssi = p_inq->rssi;
3929   result.inq_res.ble_addr_type = p_inq->ble_addr_type;
3930   result.inq_res.inq_result_type = p_inq->inq_result_type;
3931   result.inq_res.device_type = p_inq->device_type;
3932   result.inq_res.flag = p_inq->flag;
3933   result.inq_res.ble_evt_type = p_inq->ble_evt_type;
3934   result.inq_res.ble_primary_phy = p_inq->ble_primary_phy;
3935   result.inq_res.ble_secondary_phy = p_inq->ble_secondary_phy;
3936   result.inq_res.ble_advertising_sid = p_inq->ble_advertising_sid;
3937   result.inq_res.ble_tx_power = p_inq->ble_tx_power;
3938   result.inq_res.ble_periodic_adv_int = p_inq->ble_periodic_adv_int;
3939
3940   /* application will parse EIR to find out remote device name */
3941   result.inq_res.p_eir = p_eir;
3942   result.inq_res.eir_len = eir_len;
3943
3944   p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr);
3945   if (p_inq_info != NULL) {
3946     /* initialize remt_name_not_required to false so that we get the name by
3947      * default */
3948     result.inq_res.remt_name_not_required = false;
3949   }
3950
3951   if (bta_dm_search_cb.p_scan_cback)
3952     bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_RES_EVT, &result);
3953
3954   if (p_inq_info) {
3955     /* application indicates if it knows the remote name, inside the callback
3956      copy that to the inquiry data base*/
3957     if (result.inq_res.remt_name_not_required)
3958       p_inq_info->appl_knows_rem_name = true;
3959   }
3960 }
3961
3962 /*******************************************************************************
3963  *
3964  * Function         bta_dm_observe_cmpl_cb
3965  *
3966  * Description      Callback for BLE Observe complete
3967  *
3968  *
3969  * Returns          void
3970  *
3971  ******************************************************************************/
3972 static void bta_dm_observe_cmpl_cb(void* p_result) {
3973   tBTA_DM_SEARCH data;
3974
3975   APPL_TRACE_DEBUG("bta_dm_observe_cmpl_cb");
3976
3977   data.inq_cmpl.num_resps = ((tBTM_INQUIRY_CMPL*)p_result)->num_resp;
3978   if (bta_dm_search_cb.p_scan_cback) {
3979     bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_CMPL_EVT, &data);
3980   }
3981 }
3982
3983 /*******************************************************************************
3984  *
3985  * Function         bta_dm_ble_smp_cback
3986  *
3987  * Description      Callback for BLE SMP
3988  *
3989  *
3990  * Returns          void
3991  *
3992  ******************************************************************************/
3993 static uint8_t bta_dm_ble_smp_cback(tBTM_LE_EVT event, const RawAddress& bda,
3994                                     tBTM_LE_EVT_DATA* p_data) {
3995   tBTM_STATUS status = BTM_SUCCESS;
3996   tBTA_DM_SEC sec_event;
3997   char* p_name = NULL;
3998
3999   if (!bta_dm_cb.p_sec_cback) return BTM_NOT_AUTHORIZED;
4000
4001   memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
4002   switch (event) {
4003     case BTM_LE_IO_REQ_EVT:
4004 #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
4005
4006       bta_dm_co_ble_io_req(
4007           bda, &p_data->io_req.io_cap, &p_data->io_req.oob_data,
4008           &p_data->io_req.auth_req, &p_data->io_req.max_key_size,
4009           &p_data->io_req.init_keys, &p_data->io_req.resp_keys);
4010 #endif
4011       APPL_TRACE_EVENT("io mitm: %d oob_data:%d", p_data->io_req.auth_req,
4012                        p_data->io_req.oob_data);
4013
4014       break;
4015
4016     case BTM_LE_SEC_REQUEST_EVT:
4017       sec_event.ble_req.bd_addr = bda;
4018       p_name = BTM_SecReadDevName(bda);
4019       if (p_name != NULL)
4020         strlcpy((char*)sec_event.ble_req.bd_name, p_name, BD_NAME_LEN);
4021       else
4022         sec_event.ble_req.bd_name[0] = 0;
4023       bta_dm_cb.p_sec_cback(BTA_DM_BLE_SEC_REQ_EVT, &sec_event);
4024       break;
4025
4026     case BTM_LE_KEY_NOTIF_EVT:
4027       sec_event.key_notif.bd_addr = bda;
4028       p_name = BTM_SecReadDevName(bda);
4029       if (p_name != NULL)
4030         strlcpy((char*)sec_event.key_notif.bd_name, p_name, BD_NAME_LEN);
4031       else
4032         sec_event.key_notif.bd_name[0] = 0;
4033       sec_event.key_notif.passkey = p_data->key_notif;
4034       bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_NOTIF_EVT, &sec_event);
4035       break;
4036
4037     case BTM_LE_KEY_REQ_EVT:
4038       sec_event.ble_req.bd_addr = bda;
4039       bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_REQ_EVT, &sec_event);
4040       break;
4041
4042     case BTM_LE_OOB_REQ_EVT:
4043       sec_event.ble_req.bd_addr = bda;
4044       bta_dm_cb.p_sec_cback(BTA_DM_BLE_OOB_REQ_EVT, &sec_event);
4045       break;
4046
4047     case BTM_LE_NC_REQ_EVT:
4048       sec_event.key_notif.bd_addr = bda;
4049       strlcpy((char*)sec_event.key_notif.bd_name, bta_dm_get_remname(),
4050               (BD_NAME_LEN));
4051       sec_event.key_notif.passkey = p_data->key_notif;
4052       bta_dm_cb.p_sec_cback(BTA_DM_BLE_NC_REQ_EVT, &sec_event);
4053       break;
4054
4055     case BTM_LE_SC_OOB_REQ_EVT:
4056       sec_event.ble_req.bd_addr = bda;
4057       bta_dm_cb.p_sec_cback(BTA_DM_BLE_SC_OOB_REQ_EVT, &sec_event);
4058       break;
4059
4060     case BTM_LE_KEY_EVT:
4061       sec_event.ble_key.bd_addr = bda;
4062       sec_event.ble_key.key_type = p_data->key.key_type;
4063       sec_event.ble_key.p_key_value = p_data->key.p_key_value;
4064       bta_dm_cb.p_sec_cback(BTA_DM_BLE_KEY_EVT, &sec_event);
4065       break;
4066
4067     case BTM_LE_COMPLT_EVT:
4068       sec_event.auth_cmpl.bd_addr = bda;
4069       BTM_ReadDevInfo(bda, &sec_event.auth_cmpl.dev_type,
4070                       &sec_event.auth_cmpl.addr_type);
4071       p_name = BTM_SecReadDevName(bda);
4072       if (p_name != NULL)
4073         strlcpy((char*)sec_event.auth_cmpl.bd_name, p_name, (BD_NAME_LEN));
4074       else
4075         sec_event.auth_cmpl.bd_name[0] = 0;
4076
4077       if (p_data->complt.reason != 0) {
4078         sec_event.auth_cmpl.fail_reason =
4079             BTA_DM_AUTH_CONVERT_SMP_CODE(((uint8_t)p_data->complt.reason));
4080         /* delete this device entry from Sec Dev DB */
4081         bta_dm_remove_sec_dev_entry(bda);
4082       } else {
4083         sec_event.auth_cmpl.success = true;
4084       }
4085
4086       if (bta_dm_cb.p_sec_cback) {
4087         // bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
4088         bta_dm_cb.p_sec_cback(BTA_DM_BLE_AUTH_CMPL_EVT, &sec_event);
4089       }
4090       break;
4091
4092     default:
4093       status = BTM_NOT_AUTHORIZED;
4094       break;
4095   }
4096   return status;
4097 }
4098
4099 /*******************************************************************************
4100  *
4101  * Function         bta_dm_ble_id_key_cback
4102  *
4103  * Description      Callback for BLE local ID keys
4104  *
4105  *
4106  * Returns          void
4107  *
4108  ******************************************************************************/
4109 static void bta_dm_ble_id_key_cback(uint8_t key_type,
4110                                     tBTM_BLE_LOCAL_KEYS* p_key) {
4111   uint8_t evt;
4112   tBTA_DM_SEC dm_key;
4113
4114   switch (key_type) {
4115     case BTM_BLE_KEY_TYPE_ID:
4116     case BTM_BLE_KEY_TYPE_ER:
4117       if (bta_dm_cb.p_sec_cback) {
4118         memcpy(&dm_key.ble_id_keys, p_key, sizeof(tBTM_BLE_LOCAL_KEYS));
4119
4120         evt = (key_type == BTM_BLE_KEY_TYPE_ID) ? BTA_DM_BLE_LOCAL_IR_EVT
4121                                                 : BTA_DM_BLE_LOCAL_ER_EVT;
4122         bta_dm_cb.p_sec_cback(evt, &dm_key);
4123       }
4124       break;
4125
4126     default:
4127       APPL_TRACE_DEBUG("Unknown key type %d", key_type);
4128       break;
4129   }
4130   return;
4131 }
4132
4133 /*******************************************************************************
4134  *
4135  * Function         bta_dm_add_blekey
4136  *
4137  * Description      This function adds an BLE Key to an security database entry.
4138  *                  This function shall only be called AFTER BTA_DmAddBleDevice
4139  *                  has been called.
4140  *                  It is normally called during host startup to restore all
4141  *                  required information stored in the NVRAM.
4142  *
4143  * Parameters:
4144  *
4145  ******************************************************************************/
4146 void bta_dm_add_blekey(tBTA_DM_MSG* p_data) {
4147   if (!BTM_SecAddBleKey(p_data->add_ble_key.bd_addr,
4148                         (tBTM_LE_KEY_VALUE*)&p_data->add_ble_key.blekey,
4149                         p_data->add_ble_key.key_type)) {
4150     LOG(ERROR) << "BTA_DM: Error adding BLE Key for device "
4151                << p_data->add_ble_key.bd_addr;
4152   }
4153 }
4154
4155 /*******************************************************************************
4156  *
4157  * Function         bta_dm_add_ble_device
4158  *
4159  * Description      This function adds an BLE device to an security database
4160  *                  entry.
4161  *                  It is normally called during host startup to restore all
4162  *                  required information stored in the NVRAM.
4163  *
4164  * Parameters:
4165  *
4166  ******************************************************************************/
4167 void bta_dm_add_ble_device(tBTA_DM_MSG* p_data) {
4168   if (!BTM_SecAddBleDevice(p_data->add_ble_device.bd_addr, NULL,
4169                            p_data->add_ble_device.dev_type,
4170                            p_data->add_ble_device.addr_type)) {
4171     LOG(ERROR) << "BTA_DM: Error adding BLE Device for device "
4172                << p_data->add_ble_device.bd_addr;
4173   }
4174 }
4175
4176 /*******************************************************************************
4177  *
4178  * Function         bta_dm_add_ble_device
4179  *
4180  * Description      This function adds an BLE device to an security database
4181  *                  entry.
4182  *                  It is normally called during host startup to restore all
4183  *                  required information stored in the NVRAM.
4184  *
4185  * Parameters:
4186  *
4187  ******************************************************************************/
4188 void bta_dm_ble_passkey_reply(tBTA_DM_MSG* p_data) {
4189   if (p_data->pin_reply.accept) {
4190     BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_SUCCESS,
4191                         p_data->ble_passkey_reply.passkey);
4192   } else {
4193     BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_NOT_AUTHORIZED,
4194                         p_data->ble_passkey_reply.passkey);
4195   }
4196 }
4197
4198 /*******************************************************************************
4199  *
4200  * Function         bta_dm_ble_confirm_reply
4201  *
4202  * Description      This is response to SM numeric comparison request submitted
4203  *                  to application.
4204  *
4205  * Parameters:
4206  *
4207  ******************************************************************************/
4208 void bta_dm_ble_confirm_reply(tBTA_DM_MSG* p_data) {
4209   if (p_data->confirm.accept) {
4210     BTM_BleConfirmReply(p_data->confirm.bd_addr, BTM_SUCCESS);
4211   } else {
4212     BTM_BleConfirmReply(p_data->ble_passkey_reply.bd_addr, BTM_NOT_AUTHORIZED);
4213   }
4214 }
4215
4216 /*******************************************************************************
4217  *
4218  * Function         bta_dm_security_grant
4219  *
4220  * Description      This function grant SMP security request access.
4221  *
4222  * Parameters:
4223  *
4224  ******************************************************************************/
4225 void bta_dm_security_grant(tBTA_DM_MSG* p_data) {
4226   BTM_SecurityGrant(p_data->ble_sec_grant.bd_addr, p_data->ble_sec_grant.res);
4227 }
4228
4229 /*******************************************************************************
4230  *
4231  * Function         bta_dm_ble_set_bg_conn_type
4232  *
4233  * Description      This function set the BLE background connection type
4234  *
4235  * Parameters:
4236  *
4237  ******************************************************************************/
4238 void bta_dm_ble_set_bg_conn_type(tBTA_DM_MSG* p_data) {
4239   BTM_BleStartAutoConn();
4240 }
4241
4242 /*******************************************************************************
4243  *
4244  * Function         bta_dm_ble_set_conn_params
4245  *
4246  * Description      This function set the preferred connection parameters.
4247  *
4248  * Parameters:
4249  *
4250  ******************************************************************************/
4251 void bta_dm_ble_set_conn_params(tBTA_DM_MSG* p_data) {
4252   BTM_BleSetPrefConnParams(p_data->ble_set_conn_params.peer_bda,
4253                            p_data->ble_set_conn_params.conn_int_min,
4254                            p_data->ble_set_conn_params.conn_int_max,
4255                            p_data->ble_set_conn_params.slave_latency,
4256                            p_data->ble_set_conn_params.supervision_tout);
4257 }
4258
4259 /*******************************************************************************
4260  *
4261  * Function         bta_dm_ble_set_conn_scan_params
4262  *
4263  * Description      This function set the preferred connection scan parameters.
4264  *
4265  * Parameters:
4266  *
4267  ******************************************************************************/
4268 void bta_dm_ble_set_conn_scan_params(tBTA_DM_MSG* p_data) {
4269   BTM_BleSetConnScanParams(p_data->ble_set_conn_scan_params.scan_int,
4270                            p_data->ble_set_conn_scan_params.scan_window);
4271 }
4272 /*******************************************************************************
4273  *
4274  * Function         bta_dm_ble_update_conn_params
4275  *
4276  * Description      This function update LE connection parameters.
4277  *
4278  * Parameters:
4279  *
4280  ******************************************************************************/
4281 void bta_dm_ble_update_conn_params(tBTA_DM_MSG* p_data) {
4282   if (!L2CA_UpdateBleConnParams(p_data->ble_update_conn_params.bd_addr,
4283                                 p_data->ble_update_conn_params.min_int,
4284                                 p_data->ble_update_conn_params.max_int,
4285                                 p_data->ble_update_conn_params.latency,
4286                                 p_data->ble_update_conn_params.timeout)) {
4287     APPL_TRACE_ERROR("Update connection parameters failed!");
4288   }
4289 }
4290
4291 #if (BLE_PRIVACY_SPT == TRUE)
4292 /*******************************************************************************
4293  *
4294  * Function         bta_dm_ble_config_local_privacy
4295  *
4296  * Description      This function set the local device LE privacy settings.
4297  *
4298  * Parameters:
4299  *
4300  ******************************************************************************/
4301 void bta_dm_ble_config_local_privacy(tBTA_DM_MSG* p_data) {
4302   BTM_BleConfigPrivacy(p_data->ble_local_privacy.privacy_enable);
4303 }
4304 #endif
4305
4306 /*******************************************************************************
4307  *
4308  * Function         bta_dm_ble_observe
4309  *
4310  * Description      This function set the preferred connection scan parameters.
4311  *
4312  * Parameters:
4313  *
4314  ******************************************************************************/
4315 void bta_dm_ble_observe(tBTA_DM_MSG* p_data) {
4316   tBTM_STATUS status;
4317   if (p_data->ble_observe.start) {
4318     /*Save the  callback to be called when a scan results are available */
4319     bta_dm_search_cb.p_scan_cback = p_data->ble_observe.p_cback;
4320     status = BTM_BleObserve(true, p_data->ble_observe.duration,
4321                             bta_dm_observe_results_cb, bta_dm_observe_cmpl_cb);
4322     if (status != BTM_CMD_STARTED) {
4323       tBTA_DM_SEARCH data;
4324       APPL_TRACE_WARNING(" %s BTM_BleObserve  failed. status %d", __func__,
4325                          status);
4326       data.inq_cmpl.num_resps = 0;
4327       if (bta_dm_search_cb.p_scan_cback) {
4328         bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_CMPL_EVT, &data);
4329       }
4330     }
4331   } else {
4332     bta_dm_search_cb.p_scan_cback = NULL;
4333     BTM_BleObserve(false, 0, NULL, NULL);
4334   }
4335 }
4336 /*******************************************************************************
4337  *
4338  * Function         bta_dm_ble_set_adv_params
4339  *
4340  * Description      This function set the adv parameters.
4341  *
4342  * Parameters:
4343  *
4344  ******************************************************************************/
4345 void bta_dm_ble_set_adv_params(uint16_t adv_int_min, uint16_t adv_int_max,
4346                                tBLE_BD_ADDR* p_dir_bda) {
4347   BTM_BleSetAdvParams(adv_int_min, adv_int_max, p_dir_bda,
4348                       BTA_DM_BLE_ADV_CHNL_MAP);
4349 }
4350
4351 /*******************************************************************************
4352  *
4353  * Function         bta_dm_ble_set_data_length
4354  *
4355  * Description      This function set the maximum transmission packet size
4356  *
4357  * Parameters
4358  *
4359  ******************************************************************************/
4360 void bta_dm_ble_set_data_length(tBTA_DM_MSG* p_data) {
4361   if (BTM_SetBleDataLength(p_data->ble_set_data_length.remote_bda,
4362                            p_data->ble_set_data_length.tx_data_length) !=
4363       BTM_SUCCESS) {
4364     APPL_TRACE_ERROR("%s failed", __func__);
4365   }
4366 }
4367
4368 /*******************************************************************************
4369  *
4370  * Function         bta_ble_enable_scan_cmpl
4371  *
4372  * Description      ADV payload filtering enable / disable complete callback
4373  *
4374  *
4375  * Returns          None
4376  *
4377  ******************************************************************************/
4378 static void bta_ble_energy_info_cmpl(tBTM_BLE_TX_TIME_MS tx_time,
4379                                      tBTM_BLE_RX_TIME_MS rx_time,
4380                                      tBTM_BLE_IDLE_TIME_MS idle_time,
4381                                      tBTM_BLE_ENERGY_USED energy_used,
4382                                      tBTM_STATUS status) {
4383   tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS : BTA_FAILURE;
4384   tBTA_DM_CONTRL_STATE ctrl_state = 0;
4385
4386   if (BTA_SUCCESS == st) ctrl_state = bta_dm_pm_obtain_controller_state();
4387
4388   if (bta_dm_cb.p_energy_info_cback)
4389     bta_dm_cb.p_energy_info_cback(tx_time, rx_time, idle_time, energy_used,
4390                                   ctrl_state, st);
4391 }
4392
4393 /*******************************************************************************
4394  *
4395  * Function         bta_dm_ble_get_energy_info
4396  *
4397  * Description      This function obtains the energy info
4398  *
4399  * Parameters:
4400  *
4401  ******************************************************************************/
4402 void bta_dm_ble_get_energy_info(tBTA_DM_MSG* p_data) {
4403   tBTM_STATUS btm_status = 0;
4404
4405   bta_dm_cb.p_energy_info_cback = p_data->ble_energy_info.p_energy_info_cback;
4406   btm_status = BTM_BleGetEnergyInfo(bta_ble_energy_info_cmpl);
4407   if (BTM_CMD_STARTED != btm_status)
4408     bta_ble_energy_info_cmpl(0, 0, 0, 0, btm_status);
4409 }
4410
4411 #ifndef BTA_DM_GATT_CLOSE_DELAY_TOUT
4412 #define BTA_DM_GATT_CLOSE_DELAY_TOUT 1000
4413 #endif
4414
4415 /*******************************************************************************
4416  *
4417  * Function         bta_dm_gattc_register
4418  *
4419  * Description      Register with GATTC in DM if BLE is needed.
4420  *
4421  *
4422  * Returns          void
4423  *
4424  ******************************************************************************/
4425 static void bta_dm_gattc_register(void) {
4426   if (bta_dm_search_cb.client_if == BTA_GATTS_INVALID_IF) {
4427     BTA_GATTC_AppRegister(bta_dm_gattc_callback,
4428                           base::Bind([](uint8_t client_id, uint8_t status) {
4429                             if (status == BTA_GATT_OK)
4430                               bta_dm_search_cb.client_if = client_id;
4431                             else
4432                               bta_dm_search_cb.client_if = BTA_GATTS_INVALID_IF;
4433
4434                           }));
4435   }
4436 }
4437
4438 /*******************************************************************************
4439  *
4440  * Function         btm_dm_start_disc_gatt_services
4441  *
4442  * Description      This function starts a GATT service search request.
4443  *
4444  * Parameters:
4445  *
4446  ******************************************************************************/
4447 static void btm_dm_start_disc_gatt_services(uint16_t conn_id) {
4448   tBT_UUID* p_uuid = bta_dm_search_cb.p_srvc_uuid + bta_dm_search_cb.num_uuid -
4449                      bta_dm_search_cb.uuid_to_search;
4450
4451   p_uuid = bta_dm_search_cb.p_srvc_uuid + bta_dm_search_cb.num_uuid -
4452            bta_dm_search_cb.uuid_to_search;
4453
4454   /* always search for all services */
4455   BTA_GATTC_ServiceSearchRequest(conn_id, p_uuid);
4456 }
4457
4458 /*******************************************************************************
4459  *
4460  * Function         bta_dm_gatt_disc_result
4461  *
4462  * Description      This function process the GATT service search result.
4463  *
4464  * Parameters:
4465  *
4466  ******************************************************************************/
4467 static void bta_dm_gatt_disc_result(tBTA_GATT_ID service_id) {
4468   tBTA_DM_SEARCH result;
4469
4470   /*
4471    * This logic will not work for gatt case.  We are checking against the
4472    * bluetooth profiles here
4473    * just copy the GATTID in raw data field and send it across.
4474    */
4475
4476   if (bta_dm_search_cb.ble_raw_used + sizeof(tBTA_GATT_ID) <
4477       bta_dm_search_cb.ble_raw_size) {
4478     APPL_TRACE_DEBUG(
4479         "ADDING BLE SERVICE uuid=0x%x, ble_ptr = 0x%x, ble_raw_used = 0x%x",
4480         service_id.uuid.uu.uuid16, bta_dm_search_cb.p_ble_rawdata,
4481         bta_dm_search_cb.ble_raw_used);
4482
4483     if (bta_dm_search_cb.p_ble_rawdata) {
4484       memcpy((bta_dm_search_cb.p_ble_rawdata + bta_dm_search_cb.ble_raw_used),
4485              &service_id, sizeof(service_id));
4486
4487       bta_dm_search_cb.ble_raw_used += sizeof(service_id);
4488     } else {
4489       APPL_TRACE_ERROR("p_ble_rawdata is NULL");
4490     }
4491
4492   } else {
4493     APPL_TRACE_ERROR(
4494         "%s out of room to accomodate more service ids ble_raw_size = %d "
4495         "ble_raw_used = %d",
4496         __func__, bta_dm_search_cb.ble_raw_size, bta_dm_search_cb.ble_raw_used);
4497   }
4498
4499   LOG_INFO(LOG_TAG, "%s service_id_uuid_len=%d ", __func__,
4500            service_id.uuid.len);
4501   if (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) {
4502     /* send result back to app now, one by one */
4503     result.disc_ble_res.bd_addr = bta_dm_search_cb.peer_bdaddr;
4504     strlcpy((char*)result.disc_ble_res.bd_name, bta_dm_get_remname(),
4505             BD_NAME_LEN);
4506     memcpy(&result.disc_ble_res.service, &service_id.uuid, sizeof(tBT_UUID));
4507
4508     bta_dm_search_cb.p_search_cback(BTA_DM_DISC_BLE_RES_EVT, &result);
4509   }
4510 }
4511
4512 /*******************************************************************************
4513  *
4514  * Function         bta_dm_gatt_disc_complete
4515  *
4516  * Description      This function process the GATT service search complete.
4517  *
4518  * Parameters:
4519  *
4520  ******************************************************************************/
4521 static void bta_dm_gatt_disc_complete(uint16_t conn_id,
4522                                       tBTA_GATT_STATUS status) {
4523   APPL_TRACE_DEBUG("%s conn_id = %d", __func__, conn_id);
4524
4525   if (bta_dm_search_cb.uuid_to_search > 0) bta_dm_search_cb.uuid_to_search--;
4526
4527   if (status == BTA_GATT_OK && bta_dm_search_cb.uuid_to_search > 0) {
4528     btm_dm_start_disc_gatt_services(conn_id);
4529   } else {
4530     tBTA_DM_MSG* p_msg = (tBTA_DM_MSG*)osi_malloc(sizeof(tBTA_DM_MSG));
4531
4532     bta_dm_search_cb.uuid_to_search = 0;
4533
4534     /* no more services to be discovered */
4535     p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
4536     p_msg->disc_result.result.disc_res.result =
4537         (status == BTA_GATT_OK) ? BTA_SUCCESS : BTA_FAILURE;
4538     APPL_TRACE_DEBUG("%s service found: 0x%08x", __func__,
4539                      bta_dm_search_cb.services_found);
4540     p_msg->disc_result.result.disc_res.services =
4541         bta_dm_search_cb.services_found;
4542     p_msg->disc_result.result.disc_res.num_uuids = 0;
4543     p_msg->disc_result.result.disc_res.p_uuid_list = NULL;
4544     p_msg->disc_result.result.disc_res.bd_addr = bta_dm_search_cb.peer_bdaddr;
4545     strlcpy((char*)p_msg->disc_result.result.disc_res.bd_name,
4546             bta_dm_get_remname(), BD_NAME_LEN);
4547
4548     p_msg->disc_result.result.disc_res.device_type |= BT_DEVICE_TYPE_BLE;
4549     if (bta_dm_search_cb.ble_raw_used > 0) {
4550       p_msg->disc_result.result.disc_res.p_raw_data =
4551           (uint8_t*)osi_malloc(bta_dm_search_cb.ble_raw_used);
4552
4553       memcpy(p_msg->disc_result.result.disc_res.p_raw_data,
4554              bta_dm_search_cb.p_ble_rawdata, bta_dm_search_cb.ble_raw_used);
4555
4556       p_msg->disc_result.result.disc_res.raw_data_size =
4557           bta_dm_search_cb.ble_raw_used;
4558     } else {
4559       p_msg->disc_result.result.disc_res.p_raw_data = NULL;
4560       bta_dm_search_cb.p_ble_rawdata = 0;
4561     }
4562
4563     bta_sys_sendmsg(p_msg);
4564
4565     if (conn_id != BTA_GATT_INVALID_CONN_ID) {
4566       /* start a GATT channel close delay timer */
4567       bta_sys_start_timer(bta_dm_search_cb.gatt_close_timer,
4568                           BTA_DM_GATT_CLOSE_DELAY_TOUT,
4569                           BTA_DM_DISC_CLOSE_TOUT_EVT, 0);
4570       bta_dm_search_cb.pending_close_bda = bta_dm_search_cb.peer_bdaddr;
4571     }
4572     bta_dm_search_cb.gatt_disc_active = false;
4573   }
4574 }
4575
4576 /*******************************************************************************
4577  *
4578  * Function         bta_dm_close_gatt_conn
4579  *
4580  * Description      This function close the GATT connection after delay
4581  *timeout.
4582  *
4583  * Parameters:
4584  *
4585  ******************************************************************************/
4586 void bta_dm_close_gatt_conn(UNUSED_ATTR tBTA_DM_MSG* p_data) {
4587   if (bta_dm_search_cb.conn_id != BTA_GATT_INVALID_CONN_ID)
4588     BTA_GATTC_Close(bta_dm_search_cb.conn_id);
4589
4590   bta_dm_search_cb.pending_close_bda = RawAddress::kEmpty;
4591   bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID;
4592 }
4593 /*******************************************************************************
4594  *
4595  * Function         btm_dm_start_gatt_discovery
4596  *
4597  * Description      This is GATT initiate the service search by open a GATT
4598  *                  connection first.
4599  *
4600  * Parameters:
4601  *
4602  ******************************************************************************/
4603 void btm_dm_start_gatt_discovery(const RawAddress& bd_addr) {
4604   bta_dm_search_cb.gatt_disc_active = true;
4605
4606   /* connection is already open */
4607   if (bta_dm_search_cb.pending_close_bda == bd_addr &&
4608       bta_dm_search_cb.conn_id != BTA_GATT_INVALID_CONN_ID) {
4609     bta_dm_search_cb.pending_close_bda = RawAddress::kEmpty;
4610     alarm_cancel(bta_dm_search_cb.gatt_close_timer);
4611     btm_dm_start_disc_gatt_services(bta_dm_search_cb.conn_id);
4612   } else {
4613     if (BTM_IsAclConnectionUp(bd_addr, BT_TRANSPORT_LE)) {
4614       BTA_GATTC_Open(bta_dm_search_cb.client_if, bd_addr, true,
4615                      BTA_GATT_TRANSPORT_LE, true);
4616     } else {
4617       BTA_GATTC_Open(bta_dm_search_cb.client_if, bd_addr, true,
4618                      BTA_GATT_TRANSPORT_LE, false);
4619     }
4620   }
4621 }
4622
4623 /*******************************************************************************
4624  *
4625  * Function         bta_dm_cancel_gatt_discovery
4626  *
4627  * Description      This is GATT cancel the GATT service search.
4628  *
4629  * Parameters:
4630  *
4631  ******************************************************************************/
4632 static void bta_dm_cancel_gatt_discovery(const RawAddress& bd_addr) {
4633   if (bta_dm_search_cb.conn_id == BTA_GATT_INVALID_CONN_ID) {
4634     BTA_GATTC_CancelOpen(bta_dm_search_cb.client_if, bd_addr, true);
4635   }
4636
4637   bta_dm_gatt_disc_complete(bta_dm_search_cb.conn_id,
4638                             (tBTA_GATT_STATUS)BTA_GATT_ERROR);
4639 }
4640
4641 /*******************************************************************************
4642  *
4643  * Function         bta_dm_proc_open_evt
4644  *
4645  * Description      process BTA_GATTC_OPEN_EVT in DM.
4646  *
4647  * Parameters:
4648  *
4649  ******************************************************************************/
4650 void bta_dm_proc_open_evt(tBTA_GATTC_OPEN* p_data) {
4651   VLOG(1) << "DM Search state= " << bta_dm_search_cb.state
4652           << " search_cb.peer_dbaddr:" << bta_dm_search_cb.peer_bdaddr
4653           << " connected_bda=" << p_data->remote_bda.address;
4654
4655   APPL_TRACE_DEBUG("BTA_GATTC_OPEN_EVT conn_id = %d client_if=%d status = %d",
4656                    p_data->conn_id, p_data->client_if, p_data->status);
4657
4658   bta_dm_search_cb.conn_id = p_data->conn_id;
4659
4660   if (p_data->status == BTA_GATT_OK) {
4661     btm_dm_start_disc_gatt_services(p_data->conn_id);
4662   } else {
4663     bta_dm_gatt_disc_complete(BTA_GATT_INVALID_CONN_ID, p_data->status);
4664   }
4665 }
4666
4667 /*******************************************************************************
4668  *
4669  * Function         bta_dm_gattc_callback
4670  *
4671  * Description      This is GATT client callback function used in DM.
4672  *
4673  * Parameters:
4674  *
4675  ******************************************************************************/
4676 static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC* p_data) {
4677   APPL_TRACE_DEBUG("bta_dm_gattc_callback event = %d", event);
4678
4679   switch (event) {
4680     case BTA_GATTC_OPEN_EVT:
4681       bta_dm_proc_open_evt(&p_data->open);
4682       break;
4683
4684     case BTA_GATTC_SEARCH_RES_EVT:
4685       bta_dm_gatt_disc_result(p_data->srvc_res.service_uuid);
4686       break;
4687
4688     case BTA_GATTC_SEARCH_CMPL_EVT:
4689       if (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE)
4690         bta_dm_gatt_disc_complete(p_data->search_cmpl.conn_id,
4691                                   p_data->search_cmpl.status);
4692       break;
4693
4694     case BTA_GATTC_CLOSE_EVT:
4695       APPL_TRACE_DEBUG("BTA_GATTC_CLOSE_EVT reason = %d", p_data->close.reason);
4696       /* in case of disconnect before search is completed */
4697       if ((bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) &&
4698           (bta_dm_search_cb.state != BTA_DM_SEARCH_ACTIVE) &&
4699           p_data->close.remote_bda == bta_dm_search_cb.peer_bdaddr) {
4700         bta_dm_gatt_disc_complete((uint16_t)BTA_GATT_INVALID_CONN_ID,
4701                                   (tBTA_GATT_STATUS)BTA_GATT_ERROR);
4702       }
4703       break;
4704
4705     default:
4706       break;
4707   }
4708 }
4709
4710 #if (BLE_VND_INCLUDED == TRUE)
4711 /*******************************************************************************
4712  *
4713  * Function         bta_dm_ctrl_features_rd_cmpl_cback
4714  *
4715  * Description      callback to handle controller feature read complete
4716  *
4717  * Parameters:
4718  *
4719  ******************************************************************************/
4720 static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result) {
4721   APPL_TRACE_DEBUG("%s  status = %d ", __func__, result);
4722   if (result == BTM_SUCCESS) {
4723     if (bta_dm_cb.p_sec_cback)
4724       bta_dm_cb.p_sec_cback(BTA_DM_LE_FEATURES_READ, NULL);
4725   } else {
4726     APPL_TRACE_ERROR("%s Ctrl BLE feature read failed: status :%d", __func__,
4727                      result);
4728   }
4729 }
4730 #endif /* BLE_VND_INCLUDED */