1 /******************************************************************************
2  *
3  *  Copyright 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 <android_bluetooth_sysprop.h>
29 #include <base/location.h>
30 #include <bluetooth/log.h>
31 #include <com_android_bluetooth_flags.h>
32 
33 #include <cstdint>
34 #include <vector>
35 
36 #include "bta/dm/bta_dm_device_search.h"
37 #include "bta/dm/bta_dm_disc.h"
38 #include "bta/dm/bta_dm_gatt_client.h"
39 #include "bta/dm/bta_dm_int.h"
40 #include "bta/dm/bta_dm_sec_int.h"
41 #include "bta/include/bta_api.h"
42 #include "bta/include/bta_le_audio_api.h"
43 #include "bta/include/bta_sdp_api.h"
44 #include "bta/include/bta_sec_api.h"
45 #include "bta/sys/bta_sys.h"
46 #include "btif/include/btif_dm.h"
47 #include "btif/include/stack_manager_t.h"
48 #include "hci/controller_interface.h"
49 #include "internal_include/bt_target.h"
50 #include "main/shim/acl_api.h"
51 #include "main/shim/btm_api.h"
52 #include "main/shim/entry.h"
53 #include "osi/include/allocator.h"
54 #include "osi/include/properties.h"
55 #include "stack/connection_manager/connection_manager.h"
56 #include "stack/include/acl_api.h"
57 #include "stack/include/bt_hdr.h"
58 #include "stack/include/bt_types.h"
59 #include "stack/include/bt_uuid16.h"
60 #include "stack/include/btm_client_interface.h"
61 #include "stack/include/btm_inq.h"
62 #include "stack/include/btm_status.h"
63 #include "stack/include/gatt_api.h"
64 #include "stack/include/l2cap_interface.h"
65 #include "stack/include/main_thread.h"
66 #include "types/bluetooth/uuid.h"
67 #include "types/raw_address.h"
68 
69 // TODO(b/369381361) Enfore -Wmissing-prototypes
70 #pragma GCC diagnostic ignored "-Wmissing-prototypes"
71 
72 using bluetooth::Uuid;
73 using namespace bluetooth;
74 
75 bool ble_vnd_is_included();
76 void btm_ble_scanner_init(void);
77 
78 static void bta_dm_check_av();
79 
80 void BTA_dm_update_policy(tBTA_SYS_CONN_STATUS status, uint8_t id, uint8_t app_id,
81                           const RawAddress& peer_addr);
82 
83 /* Extended Inquiry Response */
84 static void bta_dm_set_eir(char* local_name);
85 
86 static void bta_dm_disable_conn_down_timer_cback(void* data);
87 static void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, tBTA_SYS_ID id, uint8_t app_id,
88                             const RawAddress& peer_addr);
89 static void bta_dm_adjust_roles(bool delay_role_switch);
90 tBTM_CONTRL_STATE bta_dm_pm_obtain_controller_state(void);
91 static void bta_dm_ctrl_features_rd_cmpl_cback(tHCI_STATUS result);
92 
93 static const char kPropertySniffOffloadEnabled[] = "persist.bluetooth.sniff_offload.enabled";
94 
95 #ifndef BTA_DM_BLE_ADV_CHNL_MAP
96 #define BTA_DM_BLE_ADV_CHNL_MAP (BTM_BLE_ADV_CHNL_37 | BTM_BLE_ADV_CHNL_38 | BTM_BLE_ADV_CHNL_39)
97 #endif
98 
99 /* Disable timer interval (in milliseconds) */
100 #ifndef BTA_DM_DISABLE_TIMER_MS
101 #define BTA_DM_DISABLE_TIMER_MS (2000)
102 #endif
103 
104 /* Disable timer retrial interval (in milliseconds) */
105 #ifndef BTA_DM_DISABLE_TIMER_RETRIAL_MS
106 #define BTA_DM_DISABLE_TIMER_RETRIAL_MS 1500
107 #endif
108 
109 /* Disable connection down timer (in milliseconds) */
110 #ifndef BTA_DM_DISABLE_CONN_DOWN_TIMER_MS
111 #define BTA_DM_DISABLE_CONN_DOWN_TIMER_MS 100
112 #endif
113 
114 /* Switch delay timer (in milliseconds) */
115 #ifndef BTA_DM_SWITCH_DELAY_TIMER_MS
116 #define BTA_DM_SWITCH_DELAY_TIMER_MS 500
117 #endif
118 
119 /* Sysprop path for page timeout */
120 #ifndef PROPERTY_PAGE_TIMEOUT
121 #define PROPERTY_PAGE_TIMEOUT "bluetooth.core.classic.page_timeout"
122 #endif
123 
124 namespace {
125 
126 struct WaitForAllAclConnectionsToDrain {
127   uint64_t time_to_wait_in_ms;
TimeToWaitInMs__anon7bfc47fc0111::WaitForAllAclConnectionsToDrain128   uint64_t TimeToWaitInMs() const { return time_to_wait_in_ms; }
AlarmCallbackData__anon7bfc47fc0111::WaitForAllAclConnectionsToDrain129   void* AlarmCallbackData() const { return const_cast<void*>(static_cast<const void*>(this)); }
130 
131   static const WaitForAllAclConnectionsToDrain* FromAlarmCallbackData(void* data);
132   static bool IsFirstPass(const WaitForAllAclConnectionsToDrain*);
133 } first_pass =
134         {
135                 .time_to_wait_in_ms = static_cast<uint64_t>(BTA_DM_DISABLE_TIMER_MS),
136 },
137   second_pass = {
138           .time_to_wait_in_ms = static_cast<uint64_t>(BTA_DM_DISABLE_TIMER_RETRIAL_MS),
139 };
140 
IsFirstPass(const WaitForAllAclConnectionsToDrain * pass)141 bool WaitForAllAclConnectionsToDrain::IsFirstPass(const WaitForAllAclConnectionsToDrain* pass) {
142   return pass == &first_pass;
143 }
144 
FromAlarmCallbackData(void * data)145 const WaitForAllAclConnectionsToDrain* WaitForAllAclConnectionsToDrain::FromAlarmCallbackData(
146         void* data) {
147   return const_cast<const WaitForAllAclConnectionsToDrain*>(
148           static_cast<WaitForAllAclConnectionsToDrain*>(data));
149 }
150 
151 }  // namespace
152 
153 static void bta_dm_delay_role_switch_cback(void* data);
154 static void bta_dm_wait_for_acl_to_drain_cback(void* data);
155 
156 /** Initialises the BT device manager */
bta_dm_enable(tBTA_DM_SEC_CBACK * p_sec_cback,tBTA_DM_ACL_CBACK * p_acl_cback)157 void bta_dm_enable(tBTA_DM_SEC_CBACK* p_sec_cback, tBTA_DM_ACL_CBACK* p_acl_cback) {
158   if (p_acl_cback != NULL) {
159     bta_dm_acl_cb.p_acl_cback = p_acl_cback;
160   }
161 
162   bta_dm_sec_enable(p_sec_cback);
163 }
164 
165 /*******************************************************************************
166  *
167  * Function         bta_dm_init_cb
168  *
169  * Description      Initializes the bta_dm_cb control block
170  *
171  *
172  * Returns          void
173  *
174  ******************************************************************************/
bta_dm_init_cb(void)175 static void bta_dm_init_cb(void) {
176   bta_dm_cb = {};
177 
178   bta_dm_cb.disable_timer = alarm_new("bta_dm.disable_timer");
179   bta_dm_cb.switch_delay_timer = alarm_new("bta_dm.switch_delay_timer");
180   for (size_t i = 0; i < BTA_DM_NUM_PM_TIMER; i++) {
181     for (size_t j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++) {
182       bta_dm_cb.pm_timer[i].timer[j] = alarm_new("bta_dm.pm_timer");
183     }
184   }
185 }
186 
187 /*******************************************************************************
188  *
189  * Function         bta_dm_deinit_cb
190  *
191  * Description      De-initializes the bta_dm_cb control block
192  *
193  *
194  * Returns          void
195  *
196  ******************************************************************************/
bta_dm_deinit_cb(void)197 static void bta_dm_deinit_cb(void) {
198   /*
199    * TODO: Should alarm_free() the bta_dm_cb timers during graceful
200    * shutdown.
201    */
202   alarm_free(bta_dm_cb.disable_timer);
203   alarm_free(bta_dm_cb.switch_delay_timer);
204   for (size_t i = 0; i < BTA_DM_NUM_PM_TIMER; i++) {
205     for (size_t j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++) {
206       alarm_free(bta_dm_cb.pm_timer[i].timer[j]);
207     }
208   }
209   bta_dm_cb.pending_removals.clear();
210   bta_dm_cb = {};
211 }
212 
BTA_dm_on_hw_off()213 void BTA_dm_on_hw_off() {
214   BTIF_dm_disable();
215 
216   /* reinitialize the control block */
217   bta_dm_deinit_cb();
218 
219   bta_dm_disc_stop();
220   bta_dm_search_stop();
221 }
222 
BTA_dm_on_hw_on()223 void BTA_dm_on_hw_on() {
224   uint8_t key_mask = 0;
225   tBTA_BLE_LOCAL_ID_KEYS id_key;
226 
227   /* make sure the control block is properly initialized */
228   bta_dm_init_cb();
229 
230   bta_dm_disc_start(osi_property_get_bool("bluetooth.gatt.delay_close.enabled", true));
231 
232   memset(&bta_dm_conn_srvcs, 0, sizeof(bta_dm_conn_srvcs));
233   memset(&bta_dm_di_cb, 0, sizeof(tBTA_DM_DI_CB));
234 
235   DEV_CLASS dev_class = btif_dm_get_local_class_of_device();
236   log::info("Read default class of device [0x{:x}, 0x{:x}, 0x{:x}]", dev_class[0], dev_class[1],
237             dev_class[2]);
238 
239   if (get_btm_client_interface().local.BTM_SetDeviceClass(dev_class) != tBTM_STATUS::BTM_SUCCESS) {
240     log::warn("Unable to set local device class:{}", dev_class_text(dev_class));
241   }
242 
243   /* load BLE local information: ID keys, ER if available */
244   Octet16 er;
245   btif_dm_get_ble_local_keys(&key_mask, &er, &id_key);
246 
247   if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ER) {
248     get_btm_client_interface().security.BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ER,
249                                                              (tBTM_BLE_LOCAL_KEYS*)&er);
250   }
251   if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ID) {
252     get_btm_client_interface().security.BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ID,
253                                                              (tBTM_BLE_LOCAL_KEYS*)&id_key);
254   }
255 
256   btm_dm_sec_init();
257   btm_sec_on_hw_on();
258 
259   get_btm_client_interface().link_policy.BTM_WritePageTimeout(
260           osi_property_get_int32(PROPERTY_PAGE_TIMEOUT, p_bta_dm_cfg->page_timeout));
261 
262   if (ble_vnd_is_included()) {
263     get_btm_client_interface().ble.BTM_BleReadControllerFeatures(
264             bta_dm_ctrl_features_rd_cmpl_cback);
265   } else {
266     /* Set controller features even if vendor support is not included */
267     if (bta_dm_acl_cb.p_acl_cback) {
268       bta_dm_acl_cb.p_acl_cback(BTA_DM_LE_FEATURES_READ, NULL);
269     }
270   }
271 
272   if (com::android::bluetooth::flags::socket_settings_api()) {
273     /* Read low power processor offload features */
274     if (bta_dm_acl_cb.p_acl_cback) {
275       bta_dm_acl_cb.p_acl_cback(BTA_DM_LPP_OFFLOAD_FEATURES_READ, NULL);
276     }
277   }
278 
279   btm_ble_scanner_init();
280 
281   // Synchronize with the controller before continuing
282   bta_dm_le_rand(get_main_thread()->BindOnce([](uint64_t /*value*/) { BTIF_dm_enable(); }));
283 
284   bta_sys_rm_register(bta_dm_rm_cback);
285 
286   /* if sniff is offload, no need to handle it in the stack */
287   if (osi_property_get_bool(kPropertySniffOffloadEnabled, false)) {
288     log::info("Sniff offloaded. Skip bta_dm_init_pm.");
289   } else {
290     /* initialize bluetooth low power manager */
291     bta_dm_init_pm();
292   }
293 
294   bta_dm_disc_gattc_register();
295 }
296 
297 /** Disables the BT device manager */
bta_dm_disable()298 void bta_dm_disable() {
299   /* Set l2cap idle timeout to 0 (so BTE immediately disconnects ACL link after
300    * last channel is closed) */
301   if (!stack::l2cap::get_interface().L2CA_SetIdleTimeoutByBdAddr(RawAddress::kAny, 0,
302                                                                  BT_TRANSPORT_BR_EDR)) {
303     log::warn("Unable to set L2CAP idle timeout peer:{} transport:{} timeout:{}", RawAddress::kAny,
304               BT_TRANSPORT_BR_EDR, 0);
305   }
306   if (!stack::l2cap::get_interface().L2CA_SetIdleTimeoutByBdAddr(RawAddress::kAny, 0,
307                                                                  BT_TRANSPORT_LE)) {
308     log::warn("Unable to set L2CAP idle timeout peer:{} transport:{} timeout:{}", RawAddress::kAny,
309               BT_TRANSPORT_LE, 0);
310   }
311 
312   /* disable all active subsystems */
313   bta_sys_disable();
314 
315   if (BTM_SetDiscoverability(BTM_NON_DISCOVERABLE) != tBTM_STATUS::BTM_SUCCESS) {
316     log::warn("Unable to disable classic BR/EDR discoverability");
317   }
318   if (BTM_SetConnectability(BTM_NON_CONNECTABLE) != tBTM_STATUS::BTM_SUCCESS) {
319     log::warn("Unable to disable classic BR/EDR connectability");
320   }
321 
322   /* if sniff is offload, no need to handle it in the stack */
323   if (osi_property_get_bool(kPropertySniffOffloadEnabled, false)) {
324     log::info("Sniff offloaded. Skip bta_dm_disable_pm.");
325   } else {
326     /* Disable bluetooth low power manager */
327     bta_dm_disable_pm();
328   }
329 
330   bta_dm_disc_disable_search();
331   bta_dm_disc_disable_disc();
332 
333   bta_dm_cb.disabling = true;
334 
335   connection_manager::reset(false);
336 
337   // We can shut down faster if there are no ACL links
338   if (BTM_GetNumAclLinks() == 0) {
339     // Time to wait after receiving shutdown request to delay the actual
340     // shutdown process. This time may be zero which invokes immediate shutdown.
341     const uint64_t disable_delay_ms =
342             android::sysprop::bluetooth::Bta::disable_delay().value_or(200);
343     switch (disable_delay_ms) {
344       case 0:
345         log::debug("Immediately disabling device manager");
346         bta_dm_disable_conn_down_timer_cback(nullptr);
347         break;
348       default:
349         log::debug("Set timer to delay disable initiation:{} ms", disable_delay_ms);
350         alarm_set_on_mloop(bta_dm_cb.disable_timer, disable_delay_ms,
351                            bta_dm_disable_conn_down_timer_cback, nullptr);
352     }
353   } else {
354     log::debug("Set timer to wait for all ACL connections to close:{} ms",
355                first_pass.TimeToWaitInMs());
356     alarm_set_on_mloop(bta_dm_cb.disable_timer, first_pass.time_to_wait_in_ms,
357                        bta_dm_wait_for_acl_to_drain_cback, first_pass.AlarmCallbackData());
358   }
359 }
360 
361 /*******************************************************************************
362  *
363  * Function         bta_dm_wait_for_all_acl_to_drain
364  *
365  * Description      Called if the disable timer expires
366  *                  Used to close ACL connections which are still active
367  *
368  * Returns          true if there is a device being forcefully disconnected
369  *
370  ******************************************************************************/
force_disconnect_all_acl_connections()371 static bool force_disconnect_all_acl_connections() {
372   const bool is_force_disconnect_needed = (bta_dm_cb.device_list.count > 0);
373 
374   for (auto i = 0; i < bta_dm_cb.device_list.count; i++) {
375     btm_remove_acl(bta_dm_cb.device_list.peer_device[i].peer_bdaddr,
376                    bta_dm_cb.device_list.peer_device[i].transport);
377   }
378   return is_force_disconnect_needed;
379 }
380 
bta_dm_wait_for_acl_to_drain_cback(void * data)381 static void bta_dm_wait_for_acl_to_drain_cback(void* data) {
382   log::assert_that(data != nullptr, "assert failed: data != nullptr");
383   const WaitForAllAclConnectionsToDrain* pass =
384           WaitForAllAclConnectionsToDrain::FromAlarmCallbackData(data);
385 
386   if (BTM_GetNumAclLinks() && force_disconnect_all_acl_connections() &&
387       WaitForAllAclConnectionsToDrain::IsFirstPass(pass)) {
388     /* DISABLE_EVT still need to be sent out to avoid java layer disable timeout
389      */
390     log::debug("Set timer for second pass to wait for all ACL connections to close:{} ms",
391                second_pass.TimeToWaitInMs());
392     alarm_set_on_mloop(bta_dm_cb.disable_timer, second_pass.time_to_wait_in_ms,
393                        bta_dm_wait_for_acl_to_drain_cback, second_pass.AlarmCallbackData());
394   } else {
395     // No ACL links to close were up or is second pass at ACL closure
396     log::info("Ensuring all ACL connections have been properly flushed");
397     bluetooth::shim::ACL_Shutdown();
398 
399     bta_dm_cb.disabling = false;
400 
401     bta_sys_remove_uuid(UUID_SERVCLASS_PNP_INFORMATION);
402     BTIF_dm_disable();
403   }
404 }
405 
406 /** Sets local device name */
bta_dm_set_dev_name(const std::vector<uint8_t> & name)407 void bta_dm_set_dev_name(const std::vector<uint8_t>& name) {
408   if (get_btm_client_interface().local.BTM_SetLocalDeviceName((const char*)name.data()) !=
409       tBTM_STATUS::BTM_CMD_STARTED) {
410     log::warn("Unable to set local device name");
411   }
412   bta_dm_set_eir((char*)name.data());
413 }
414 
415 /** Sets discoverability, connectability and pairability */
BTA_DmSetVisibility(bt_scan_mode_t mode)416 bool BTA_DmSetVisibility(bt_scan_mode_t mode) {
417   tBTA_DM_DISC disc_mode_param;
418   tBTA_DM_CONN conn_mode_param;
419 
420   switch (mode) {
421     case BT_SCAN_MODE_NONE:
422       disc_mode_param = BTM_NON_DISCOVERABLE;
423       conn_mode_param = BTM_NON_CONNECTABLE;
424       break;
425 
426     case BT_SCAN_MODE_CONNECTABLE:
427       disc_mode_param = BTM_NON_DISCOVERABLE;
428       conn_mode_param = BTM_CONNECTABLE;
429       break;
430 
431     case BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE:
432       disc_mode_param = BTM_GENERAL_DISCOVERABLE;
433       conn_mode_param = BTM_CONNECTABLE;
434       break;
435 
436     case BT_SCAN_MODE_CONNECTABLE_LIMITED_DISCOVERABLE:
437       disc_mode_param = BTM_LIMITED_DISCOVERABLE;
438       conn_mode_param = BTM_CONNECTABLE;
439       break;
440 
441     default:
442       return false;
443   }
444 
445   if (BTM_SetDiscoverability(disc_mode_param) != tBTM_STATUS::BTM_SUCCESS) {
446     log::warn("Unable to set classic BR/EDR discoverability 0x{:04x}", disc_mode_param);
447   }
448   if (BTM_SetConnectability(conn_mode_param) != tBTM_STATUS::BTM_SUCCESS) {
449     log::warn("Unable to set classic BR/EDR connectability 0x{:04x}", conn_mode_param);
450   }
451   return true;
452 }
bta_dm_process_remove_device_no_callback(const RawAddress & bd_addr)453 void bta_dm_process_remove_device_no_callback(const RawAddress& bd_addr) {
454   /* need to remove all pending background connection before unpair */
455   bta_dm_disc_gatt_cancel_open(bd_addr);
456 
457   get_btm_client_interface().security.BTM_SecDeleteDevice(bd_addr);
458 
459   /* remove all cached GATT information */
460   bta_dm_disc_gatt_refresh(bd_addr);
461 }
462 
bta_dm_process_remove_device(const RawAddress & bd_addr)463 void bta_dm_process_remove_device(const RawAddress& bd_addr) {
464   bta_dm_process_remove_device_no_callback(bd_addr);
465 
466   /* Conclude service search if it was pending */
467   bta_dm_disc_remove_device(bd_addr);
468 
469   if (bta_dm_sec_cb.p_sec_cback) {
470     tBTA_DM_SEC sec_event;
471     sec_event.dev_unpair.bd_addr = bd_addr;
472     bta_dm_sec_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &sec_event);
473   }
474 }
475 
476 // TODO: Remove when flag wait_for_disconnect_before_unbond is shipped
bta_dm_remove_device_(const RawAddress & bd_addr)477 static void bta_dm_remove_device_(const RawAddress& bd_addr) {
478   /* If ACL exists for the device in the remove_bond message*/
479   bool is_bd_addr_connected =
480           get_btm_client_interface().peer.BTM_IsAclConnectionUp(bd_addr, BT_TRANSPORT_LE) ||
481           get_btm_client_interface().peer.BTM_IsAclConnectionUp(bd_addr, BT_TRANSPORT_BR_EDR);
482 
483   tBT_TRANSPORT other_transport = BT_TRANSPORT_AUTO;
484   if (is_bd_addr_connected) {
485     log::verbose("ACL Up count: {}", bta_dm_cb.device_list.count);
486 
487     /* Take the link down first, and mark the device for removal when
488      * disconnected */
489     for (int i = 0; i < bta_dm_cb.device_list.count; i++) {
490       auto& peer_device = bta_dm_cb.device_list.peer_device[i];
491       if (peer_device.peer_bdaddr == bd_addr) {
492         peer_device.conn_state = tBTA_DM_CONN_STATE::BTA_DM_UNPAIRING;
493 
494         /* Make sure device is not in acceptlist before we disconnect */
495         if (!GATT_CancelConnect(0, bd_addr, false)) {
496           log::warn("Unable to cancel GATT connect peer:{} is_direct:{}", bd_addr, false);
497         }
498 
499         btm_remove_acl(bd_addr, peer_device.transport);
500         log::verbose("transport: {}", peer_device.transport);
501 
502         /* save the other transport to check if device is connected on
503          * other_transport */
504         if (peer_device.transport == BT_TRANSPORT_LE) {
505           other_transport = BT_TRANSPORT_BR_EDR;
506         } else {
507           other_transport = BT_TRANSPORT_LE;
508         }
509 
510         break;
511       }
512     }
513   }
514 
515   RawAddress other_address = bd_addr;
516   RawAddress other_address2 = bd_addr;
517 
518   // If it is DUMO device and device is paired as different address, unpair that
519   // device
520   bool other_address_connected =
521           (other_transport) ? get_btm_client_interface().peer.BTM_ReadConnectedTransportAddress(
522                                       &other_address, other_transport)
523                             : (get_btm_client_interface().peer.BTM_ReadConnectedTransportAddress(
524                                        &other_address, BT_TRANSPORT_BR_EDR) ||
525                                get_btm_client_interface().peer.BTM_ReadConnectedTransportAddress(
526                                        &other_address2, BT_TRANSPORT_LE));
527   if (other_address == bd_addr) {
528     other_address = other_address2;
529   }
530 
531   if (other_address_connected) {
532     // Get real transport
533     if (other_transport == BT_TRANSPORT_AUTO) {
534       bool connected_with_br_edr = get_btm_client_interface().peer.BTM_IsAclConnectionUp(
535               other_address, BT_TRANSPORT_BR_EDR);
536       other_transport = connected_with_br_edr ? BT_TRANSPORT_BR_EDR : BT_TRANSPORT_LE;
537     }
538     log::info("other_address {} with transport {} connected", other_address, other_transport);
539     /* Take the link down first, and mark the device for removal when
540      * disconnected */
541     for (int i = 0; i < bta_dm_cb.device_list.count; i++) {
542       auto& peer_device = bta_dm_cb.device_list.peer_device[i];
543       if (peer_device.peer_bdaddr == other_address && peer_device.transport == other_transport) {
544         peer_device.conn_state = tBTA_DM_CONN_STATE::BTA_DM_UNPAIRING;
545         log::info("Remove ACL of address {}", other_address);
546 
547         /* Make sure device is not in acceptlist before we disconnect */
548         if (!GATT_CancelConnect(0, bd_addr, false)) {
549           log::warn("Unable to cancel GATT connect peer:{} is_direct:{}", bd_addr, false);
550         }
551 
552         btm_remove_acl(other_address, peer_device.transport);
553         break;
554       }
555     }
556   }
557 
558   /* Delete the device mentioned in the msg */
559   if (!is_bd_addr_connected) {
560     bta_dm_process_remove_device(bd_addr);
561   }
562 
563   /* Delete the other paired device too */
564   if (!other_address_connected && !other_address.IsEmpty()) {
565     bta_dm_process_remove_device(other_address);
566   }
567 }
568 
569 /** Removes device, disconnects ACL link if required */
bta_dm_remove_device(const RawAddress & target)570 void bta_dm_remove_device(const RawAddress& target) {
571   if (!com::android::bluetooth::flags::wait_for_disconnect_before_unbond()) {
572     bta_dm_remove_device_(target);
573     return;
574   }
575 
576   if (bta_dm_removal_pending(target)) {
577     log::warn("{} already getting removed", target);
578     return;
579   }
580 
581   // Find all aliases and connection status on all transports
582   RawAddress pseudo_addr = target;
583   RawAddress identity_addr = target;
584   bool le_connected = get_btm_client_interface().peer.BTM_ReadConnectedTransportAddress(
585           &pseudo_addr, BT_TRANSPORT_LE);
586   if (pseudo_addr.IsEmpty()) {
587     pseudo_addr = target;
588   }
589 
590   bool bredr_connected = get_btm_client_interface().peer.BTM_ReadConnectedTransportAddress(
591           &identity_addr, BT_TRANSPORT_BR_EDR);
592   /* If connection not found with identity address, check with pseudo address if different */
593   if (!bredr_connected && identity_addr != pseudo_addr) {
594     identity_addr = pseudo_addr;
595     bredr_connected = get_btm_client_interface().peer.BTM_ReadConnectedTransportAddress(
596             &identity_addr, BT_TRANSPORT_BR_EDR);
597   }
598   if (identity_addr.IsEmpty()) {
599     identity_addr = target;
600   }
601 
602   // Remove from LE allowlist
603   if (!GATT_CancelConnect(0, pseudo_addr, false)) {
604     if (identity_addr != pseudo_addr && !GATT_CancelConnect(0, identity_addr, false)) {
605       log::warn("Unable to cancel GATT connect peer:{}", pseudo_addr);
606     }
607   }
608 
609   // Disconnect LE transport
610   if (le_connected) {
611     tBTM_STATUS status = btm_remove_acl(pseudo_addr, BT_TRANSPORT_LE);
612     if (status != tBTM_STATUS::BTM_SUCCESS && identity_addr != pseudo_addr) {
613       status = btm_remove_acl(identity_addr, BT_TRANSPORT_LE);
614     }
615 
616     if (status != tBTM_STATUS::BTM_SUCCESS) {
617       le_connected = false;
618       log::error("Unable to disconnect LE connection {}", pseudo_addr);
619     }
620   }
621 
622   // Disconnect BR/EDR transport
623   if (bredr_connected) {
624     tBTM_STATUS status = btm_remove_acl(identity_addr, BT_TRANSPORT_BR_EDR);
625     if (status != tBTM_STATUS::BTM_SUCCESS && identity_addr != pseudo_addr) {
626       status = btm_remove_acl(pseudo_addr, BT_TRANSPORT_BR_EDR);
627     }
628 
629     if (status != tBTM_STATUS::BTM_SUCCESS) {
630       bredr_connected = false;
631       log::error("Unable to disconnect BR/EDR connection {}", identity_addr);
632     }
633   }
634 
635   if (le_connected || bredr_connected) {
636     // Wait for all transports to be disconnected
637     tBTA_DM_REMOVE_PENDNIG node = {pseudo_addr, identity_addr, le_connected, bredr_connected};
638     bta_dm_cb.pending_removals.push_back(node);
639     log::info(
640             "Waiting for disconnection over LE:{}, BR/EDR:{} for pseudo address: {}, identity "
641             "address: {}",
642             le_connected, bredr_connected, pseudo_addr, identity_addr);
643   } else {
644     // No existing connection, remove the device right away
645     log::verbose("Not connected, remove the device {}", target);
646     bta_dm_process_remove_device(identity_addr);
647     if (identity_addr != pseudo_addr) {
648       bta_dm_process_remove_device(pseudo_addr);
649     }
650   }
651 }
652 
bta_dm_remove_on_disconnect(const RawAddress & bd_addr,tBT_TRANSPORT transport)653 static void bta_dm_remove_on_disconnect(const RawAddress& bd_addr, tBT_TRANSPORT transport) {
654   for (auto it = bta_dm_cb.pending_removals.begin(); it != bta_dm_cb.pending_removals.end(); it++) {
655     if (bd_addr == it->identity_addr || bd_addr == it->pseudo_addr) {
656       if (transport == BT_TRANSPORT_BR_EDR) {
657         it->bredr_connected = false;
658       } else {
659         it->le_connected = false;
660       }
661 
662       if (!it->bredr_connected && !it->le_connected) {
663         log::info("All transports disconnected, remove the device {}", bd_addr);
664         bta_dm_process_remove_device(it->identity_addr);
665         if (it->identity_addr != it->pseudo_addr) {
666           bta_dm_process_remove_device(it->pseudo_addr);
667         }
668         bta_dm_cb.pending_removals.erase(it);
669       } else {
670         log::info("Awaiting {} disconnection over {}", it->le_connected ? "LE" : "BR/EDR", bd_addr);
671       }
672       break;
673     }
674   }
675 }
676 
bta_dm_removal_pending(const RawAddress & bd_addr)677 bool bta_dm_removal_pending(const RawAddress& bd_addr) {
678   for (auto it : bta_dm_cb.pending_removals) {
679     if (bd_addr == it.pseudo_addr || bd_addr == it.identity_addr) {
680       return true;
681     }
682   }
683 
684   return false;
685 }
686 
handle_role_change(const RawAddress & bd_addr,tHCI_ROLE new_role,tHCI_STATUS hci_status)687 static void handle_role_change(const RawAddress& bd_addr, tHCI_ROLE new_role,
688                                tHCI_STATUS hci_status) {
689   tBTA_DM_PEER_DEVICE* p_dev = bta_dm_find_peer_device(bd_addr);
690   if (!p_dev) {
691     log::warn("Unable to find device for role change peer:{} new_role:{} hci_status:{}", bd_addr,
692               RoleText(new_role), hci_error_code_text(hci_status));
693     return;
694   }
695 
696   log::info("Role change callback peer:{} info:{} new_role:{} dev count:{} hci_status:{}", bd_addr,
697             p_dev->info_text(), RoleText(new_role), bta_dm_cb.device_list.count,
698             hci_error_code_text(hci_status));
699 
700   if (p_dev->is_av_active()) {
701     bool need_policy_change = false;
702 
703     /* there's AV activity on this link */
704     if (new_role == HCI_ROLE_PERIPHERAL && bta_dm_cb.device_list.count > 1 &&
705         hci_status == HCI_SUCCESS) {
706       /* more than one connections and the AV connection is role switched
707        * to peripheral
708        * switch it back to central and remove the switch policy */
709       const tBTM_STATUS status =
710               get_btm_client_interface().link_policy.BTM_SwitchRoleToCentral(bd_addr);
711       switch (status) {
712         case tBTM_STATUS::BTM_SUCCESS:
713           log::debug("Role policy already set to central peer:{}", bd_addr);
714           break;
715         case tBTM_STATUS::BTM_CMD_STARTED:
716           log::debug("Role policy started to central peer:{}", bd_addr);
717           break;
718         default:
719           log::warn("Unable to set role policy to central peer:{}", bd_addr);
720           break;
721       }
722       need_policy_change = true;
723     } else if (p_bta_dm_cfg->avoid_scatter && (new_role == HCI_ROLE_CENTRAL)) {
724       /* if the link updated to be central include AV activities, remove
725        * the switch policy */
726       need_policy_change = true;
727     }
728 
729     if (need_policy_change) {
730       get_btm_client_interface().link_policy.BTM_block_role_switch_for(p_dev->peer_bdaddr);
731     }
732   } else {
733     /* there's AV no activity on this link and role switch happened
734      * check if AV is active
735      * if so, make sure the AV link is central */
736     bta_dm_check_av();
737   }
738   bta_sys_notify_role_chg(bd_addr, new_role, hci_status);
739 }
740 
BTA_dm_report_role_change(const RawAddress bd_addr,tHCI_ROLE new_role,tHCI_STATUS hci_status)741 void BTA_dm_report_role_change(const RawAddress bd_addr, tHCI_ROLE new_role,
742                                tHCI_STATUS hci_status) {
743   do_in_main_thread(base::BindOnce(handle_role_change, bd_addr, new_role, hci_status));
744 }
745 
handle_remote_features_complete(const RawAddress & bd_addr)746 void handle_remote_features_complete(const RawAddress& bd_addr) {
747   tBTA_DM_PEER_DEVICE* p_dev = bta_dm_find_peer_device(bd_addr);
748   if (!p_dev) {
749     log::warn("Unable to find device peer:{}", bd_addr);
750     return;
751   }
752 
753   if (bluetooth::shim::GetController()->SupportsSniffSubrating() &&
754       acl_peer_supports_sniff_subrating(bd_addr)) {
755     log::debug("Device supports sniff subrating peer:{}", bd_addr);
756     p_dev->set_both_device_ssr_capable();
757   } else {
758     log::debug("Device does NOT support sniff subrating peer:{}", bd_addr);
759   }
760 }
761 
BTA_dm_notify_remote_features_complete(const RawAddress bd_addr)762 void BTA_dm_notify_remote_features_complete(const RawAddress bd_addr) {
763   do_in_main_thread(base::BindOnce(handle_remote_features_complete, bd_addr));
764 }
765 
allocate_device_for(const RawAddress & bd_addr,tBT_TRANSPORT transport)766 static tBTA_DM_PEER_DEVICE* allocate_device_for(const RawAddress& bd_addr,
767                                                 tBT_TRANSPORT transport) {
768   for (uint8_t i = 0; i < bta_dm_cb.device_list.count; i++) {
769     auto device = &bta_dm_cb.device_list.peer_device[i];
770     if (device->peer_bdaddr == bd_addr && device->transport == transport) {
771       return device;
772     }
773   }
774 
775   if (bta_dm_cb.device_list.count < BTA_DM_NUM_PEER_DEVICE) {
776     auto device = &bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count];
777     device->peer_bdaddr = bd_addr;
778     bta_dm_cb.device_list.count++;
779     if (transport == BT_TRANSPORT_LE) {
780       bta_dm_cb.device_list.le_count++;
781     }
782     return device;
783   }
784   return nullptr;
785 }
786 
bta_dm_acl_up(const RawAddress & bd_addr,tBT_TRANSPORT transport,uint16_t acl_handle)787 static void bta_dm_acl_up(const RawAddress& bd_addr, tBT_TRANSPORT transport, uint16_t acl_handle) {
788   if (com::android::bluetooth::flags::wait_for_disconnect_before_unbond()) {
789     // Disconnect if the device is being removed
790     for (auto& it : bta_dm_cb.pending_removals) {
791       if (bd_addr == it.identity_addr || bd_addr == it.pseudo_addr) {
792         log::warn("ACL connected while removing the device {} transport: {}", bd_addr, transport);
793         if (transport == BT_TRANSPORT_BR_EDR) {
794           it.bredr_connected = true;
795         } else {
796           it.le_connected = true;
797         }
798 
799         btm_remove_acl(bd_addr, transport);
800         return;
801       }
802     }
803   }
804 
805   auto device = allocate_device_for(bd_addr, transport);
806   if (device == nullptr) {
807     log::warn("Unable to allocate device resources for new connection");
808     return;
809   }
810   log::info("Acl connected peer:{} transport:{} handle:{}", bd_addr, bt_transport_text(transport),
811             acl_handle);
812   device->pref_role = BTA_ANY_ROLE;
813   device->reset_device_info();
814   device->transport = transport;
815 
816   if (bluetooth::shim::GetController()->SupportsSniffSubrating() &&
817       acl_peer_supports_sniff_subrating(bd_addr)) {
818     // NOTE: This callback assumes upon ACL connection that
819     // the read remote features has completed and is valid.
820     // The only guaranteed contract for valid read remote features
821     // data is when the BTA_dm_notify_remote_features_complete()
822     // callback has completed.  The below assignment is kept for
823     // transitional informational purposes only.
824     device->set_both_device_ssr_capable();
825   }
826 
827   if (bta_dm_acl_cb.p_acl_cback) {
828     tBTA_DM_ACL conn{};
829     conn.link_up.bd_addr = bd_addr;
830     conn.link_up.transport_link_type = transport;
831     conn.link_up.acl_handle = acl_handle;
832 
833     bta_dm_acl_cb.p_acl_cback(BTA_DM_LINK_UP_EVT, &conn);
834     log::debug("Executed security callback for new connection available");
835   }
836   bta_dm_adjust_roles(true);
837 }
838 
BTA_dm_acl_up(const RawAddress bd_addr,tBT_TRANSPORT transport,uint16_t acl_handle)839 void BTA_dm_acl_up(const RawAddress bd_addr, tBT_TRANSPORT transport, uint16_t acl_handle) {
840   do_in_main_thread(base::BindOnce(bta_dm_acl_up, bd_addr, transport, acl_handle));
841 }
842 
bta_dm_acl_up_failed(const RawAddress bd_addr,tBT_TRANSPORT transport,tHCI_STATUS status)843 static void bta_dm_acl_up_failed(const RawAddress bd_addr, tBT_TRANSPORT transport,
844                                  tHCI_STATUS status) {
845   if (bta_dm_acl_cb.p_acl_cback) {
846     tBTA_DM_ACL conn = {};
847     conn.link_up_failed.bd_addr = bd_addr;
848     conn.link_up_failed.transport_link_type = transport;
849     conn.link_up_failed.status = status;
850     bta_dm_acl_cb.p_acl_cback(BTA_DM_LINK_UP_FAILED_EVT, &conn);
851   }
852 }
853 
BTA_dm_acl_up_failed(const RawAddress bd_addr,tBT_TRANSPORT transport,tHCI_STATUS status)854 void BTA_dm_acl_up_failed(const RawAddress bd_addr, tBT_TRANSPORT transport, tHCI_STATUS status) {
855   do_in_main_thread(base::BindOnce(bta_dm_acl_up_failed, bd_addr, transport, status));
856 }
857 
858 // TODO: Remove when flag wait_for_disconnect_before_unbond is shipped
bta_dm_acl_down_(const RawAddress & bd_addr,tBT_TRANSPORT transport)859 static void bta_dm_acl_down_(const RawAddress& bd_addr, tBT_TRANSPORT transport) {
860   bool issue_unpair_cb = false;
861   bool remove_device = false;
862 
863   for (uint8_t i = 0; i < bta_dm_cb.device_list.count; i++) {
864     auto device = &bta_dm_cb.device_list.peer_device[i];
865     if (device->peer_bdaddr != bd_addr || device->transport != transport) {
866       continue;
867     }
868 
869     if (device->conn_state == tBTA_DM_CONN_STATE::BTA_DM_UNPAIRING) {
870       issue_unpair_cb =
871               get_btm_client_interface().security.BTM_SecDeleteDevice(device->peer_bdaddr);
872 
873       /* remove all cached GATT information */
874       get_gatt_interface().BTA_GATTC_Refresh(bd_addr);
875 
876       log::verbose("Unpairing: issue unpair CB = {}", issue_unpair_cb);
877     }
878 
879     remove_device = device->remove_dev_pending;
880 
881     // Iterate to the one before the last when shrinking the list,
882     // otherwise we memcpy garbage data into the record.
883     // Then clear out the last item in the list since we are shrinking.
884     for (; i < bta_dm_cb.device_list.count - 1; i++) {
885       memcpy(&bta_dm_cb.device_list.peer_device[i], &bta_dm_cb.device_list.peer_device[i + 1],
886              sizeof(bta_dm_cb.device_list.peer_device[i]));
887     }
888     if (bta_dm_cb.device_list.count > 0) {
889       int clear_index = bta_dm_cb.device_list.count - 1;
890       memset(&bta_dm_cb.device_list.peer_device[clear_index], 0,
891              sizeof(bta_dm_cb.device_list.peer_device[clear_index]));
892     }
893     break;
894   }
895   if (bta_dm_cb.device_list.count) {
896     bta_dm_cb.device_list.count--;
897   }
898   if ((transport == BT_TRANSPORT_LE) && (bta_dm_cb.device_list.le_count)) {
899     bta_dm_cb.device_list.le_count--;
900   }
901 
902   if (bta_dm_cb.disabling) {
903     if (!BTM_GetNumAclLinks()) {
904       /*
905        * Start a timer to make sure that the profiles
906        * get the disconnect event.
907        */
908       alarm_set_on_mloop(bta_dm_cb.disable_timer, BTA_DM_DISABLE_CONN_DOWN_TIMER_MS,
909                          bta_dm_disable_conn_down_timer_cback, NULL);
910     }
911   }
912   if (remove_device) {
913     log::info("remove_dev_pending actually removing {}", bd_addr);
914     bta_dm_process_remove_device_no_callback(bd_addr);
915   }
916 
917   if (bta_dm_acl_cb.p_acl_cback) {
918     tBTA_DM_ACL conn{};
919     conn.link_down.bd_addr = bd_addr;
920     conn.link_down.transport_link_type = transport;
921 
922     bta_dm_acl_cb.p_acl_cback(BTA_DM_LINK_DOWN_EVT, &conn);
923   }
924 
925   // TODO: reorganize and factor out the following logic
926   if (issue_unpair_cb && bta_dm_sec_cb.p_sec_cback) {
927     tBTA_DM_SEC conn{};
928     conn.dev_unpair.bd_addr = bd_addr;
929     conn.dev_unpair.transport_link_type = transport;
930 
931     bta_dm_sec_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &conn);
932   }
933 
934   bta_dm_adjust_roles(true);
935 }
936 
bta_dm_acl_down(const RawAddress & bd_addr,tBT_TRANSPORT transport)937 static void bta_dm_acl_down(const RawAddress& bd_addr, tBT_TRANSPORT transport) {
938   log::verbose("Device {} disconnected over transport {}", bd_addr, bt_transport_text(transport));
939   if (!com::android::bluetooth::flags::wait_for_disconnect_before_unbond()) {
940     bta_dm_acl_down_(bd_addr, transport);
941     return;
942   }
943 
944   for (uint8_t i = 0; i < bta_dm_cb.device_list.count; i++) {
945     auto device = &bta_dm_cb.device_list.peer_device[i];
946     if (device->peer_bdaddr == bd_addr && device->transport == transport) {
947       // Move the last item into its place
948       if (i + 1 < bta_dm_cb.device_list.count) {
949         *device = bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count - 1];
950       }
951       bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count - 1] = {};
952       break;
953     }
954   }
955 
956   if (bta_dm_cb.device_list.count > 0) {
957     bta_dm_cb.device_list.count--;
958   }
959   if (transport == BT_TRANSPORT_LE && bta_dm_cb.device_list.le_count > 0) {
960     bta_dm_cb.device_list.le_count--;
961   }
962 
963   if (bta_dm_cb.disabling && !BTM_GetNumAclLinks()) {
964     /*
965      * Start a timer to make sure that the profiles
966      * get the disconnect event.
967      */
968     alarm_set_on_mloop(bta_dm_cb.disable_timer, BTA_DM_DISABLE_CONN_DOWN_TIMER_MS,
969                        bta_dm_disable_conn_down_timer_cback, NULL);
970   }
971 
972   if (bta_dm_acl_cb.p_acl_cback) {
973     tBTA_DM_ACL conn{};
974     conn.link_down.bd_addr = bd_addr;
975     conn.link_down.transport_link_type = transport;
976 
977     bta_dm_acl_cb.p_acl_cback(BTA_DM_LINK_DOWN_EVT, &conn);
978   }
979 
980   bta_dm_adjust_roles(true);
981   bta_dm_remove_on_disconnect(bd_addr, transport);
982 }
983 
BTA_dm_acl_down(const RawAddress bd_addr,tBT_TRANSPORT transport)984 void BTA_dm_acl_down(const RawAddress bd_addr, tBT_TRANSPORT transport) {
985   do_in_main_thread(base::BindOnce(bta_dm_acl_down, bd_addr, transport));
986 }
987 
988 /*******************************************************************************
989  *
990  * Function         bta_dm_check_av
991  *
992  * Description      This function checks if AV is active
993  *                  if yes, make sure the AV link is central
994  *
995  ******************************************************************************/
bta_dm_check_av()996 static void bta_dm_check_av() {
997   uint8_t i;
998   tBTA_DM_PEER_DEVICE* p_dev;
999 
1000   if (bta_dm_cb.cur_av_count) {
1001     log::info("av_count:{}", bta_dm_cb.cur_av_count);
1002     for (i = 0; i < bta_dm_cb.device_list.count; i++) {
1003       p_dev = &bta_dm_cb.device_list.peer_device[i];
1004       log::warn("[{}]: info:{}, pending removal:{}", i, p_dev->info_text(), p_dev->is_connected());
1005       if (p_dev->is_connected() && p_dev->is_av_active()) {
1006         /* make central and take away the role switch policy */
1007         const tBTM_STATUS status =
1008                 get_btm_client_interface().link_policy.BTM_SwitchRoleToCentral(p_dev->peer_bdaddr);
1009         switch (status) {
1010           case tBTM_STATUS::BTM_SUCCESS:
1011             log::debug("Role policy already set to central peer:{}", p_dev->peer_bdaddr);
1012             break;
1013           case tBTM_STATUS::BTM_CMD_STARTED:
1014             log::debug("Role policy started to central peer:{}", p_dev->peer_bdaddr);
1015             break;
1016           default:
1017             log::warn("Unable to set role policy to central peer:{}", p_dev->peer_bdaddr);
1018             break;
1019         }
1020         /* else either already central or can not switch for some reasons */
1021         get_btm_client_interface().link_policy.BTM_block_role_switch_for(p_dev->peer_bdaddr);
1022         break;
1023       }
1024     }
1025   }
1026 }
1027 
1028 /*******************************************************************************
1029  *
1030  * Function         bta_dm_disable_conn_down_timer_cback
1031  *
1032  * Description      Sends disable event to application
1033  *
1034  *
1035  * Returns          void
1036  *
1037  ******************************************************************************/
bta_dm_disable_conn_down_timer_cback(void *)1038 static void bta_dm_disable_conn_down_timer_cback(void* /* data */) {
1039   /* disable the power managment module */
1040   bta_dm_disable_pm();
1041 
1042   bta_dm_cb.disabling = false;
1043   log::info("Stack device manager shutdown completed");
1044   future_ready(stack_manager_get_hack_future(), FUTURE_SUCCESS);
1045 }
1046 
1047 /*******************************************************************************
1048  *
1049  * Function         bta_dm_rm_cback
1050  *
1051  * Description      Role management callback from sys
1052  *
1053  *
1054  * Returns          void
1055  *
1056  ******************************************************************************/
bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status,tBTA_SYS_ID id,uint8_t app_id,const RawAddress & peer_addr)1057 static void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, tBTA_SYS_ID id, uint8_t app_id,
1058                             const RawAddress& peer_addr) {
1059   uint8_t j;
1060   tBTA_PREF_ROLES role;
1061   tBTA_DM_PEER_DEVICE* p_dev;
1062 
1063   log::debug("BTA Role management callback count:{} status:{} peer:{}", bta_dm_cb.cur_av_count,
1064              bta_sys_conn_status_text(status), peer_addr);
1065 
1066   p_dev = bta_dm_find_peer_device(peer_addr);
1067   if (status == BTA_SYS_CONN_OPEN) {
1068     if (p_dev) {
1069       for (j = 1; j <= p_bta_dm_rm_cfg[0].app_id; j++) {
1070         if (((p_bta_dm_rm_cfg[j].app_id == app_id) ||
1071              (p_bta_dm_rm_cfg[j].app_id == BTA_ALL_APP_ID)) &&
1072             (p_bta_dm_rm_cfg[j].id == id)) {
1073           log::assert_that(p_bta_dm_rm_cfg[j].cfg <= BTA_PERIPHERAL_ROLE_ONLY,
1074                            "Passing illegal preferred role:0x{:02x} [0x{:02x}<=>0x{:02x}]",
1075                            p_bta_dm_rm_cfg[j].cfg, BTA_ANY_ROLE, BTA_PERIPHERAL_ROLE_ONLY);
1076           role = static_cast<tBTA_PREF_ROLES>(p_bta_dm_rm_cfg[j].cfg);
1077           if (role > p_dev->pref_role) {
1078             p_dev->pref_role = role;
1079           }
1080           break;
1081         }
1082       }
1083     }
1084   }
1085 
1086   if (BTA_ID_AV == id) {
1087     if (status == BTA_SYS_CONN_BUSY) {
1088       if (p_dev) {
1089         p_dev->set_av_active();
1090       }
1091       /* AV calls bta_sys_conn_open with the A2DP stream count as app_id */
1092       if (BTA_ID_AV == id) {
1093         bta_dm_cb.cur_av_count = bta_dm_get_av_count();
1094       }
1095     } else if (status == BTA_SYS_CONN_IDLE) {
1096       if (p_dev) {
1097         p_dev->reset_av_active();
1098       }
1099 
1100       /* get cur_av_count from connected services */
1101       if (BTA_ID_AV == id) {
1102         bta_dm_cb.cur_av_count = bta_dm_get_av_count();
1103       }
1104     }
1105   }
1106 
1107   /* Don't adjust roles for each busy/idle state transition to avoid
1108      excessive switch requests when individual profile busy/idle status
1109      changes */
1110   if ((status != BTA_SYS_CONN_BUSY) && (status != BTA_SYS_CONN_IDLE)) {
1111     bta_dm_adjust_roles(false);
1112   }
1113 }
1114 
1115 /*******************************************************************************
1116  *
1117  * Function         bta_dm_delay_role_switch_cback
1118  *
1119  * Description      Callback from btm to delay a role switch
1120  *
1121  * Returns          void
1122  *
1123  ******************************************************************************/
bta_dm_delay_role_switch_cback(void *)1124 static void bta_dm_delay_role_switch_cback(void* /* data */) {
1125   log::verbose("initiating Delayed RS");
1126   bta_dm_adjust_roles(false);
1127 }
1128 
1129 /*******************************************************************************
1130  *
1131  * Function         bta_dm_adjust_roles
1132  *
1133  * Description      Adjust roles
1134  *
1135  *
1136  * Returns          void
1137  *
1138  ******************************************************************************/
bta_dm_adjust_roles(bool delay_role_switch)1139 static void bta_dm_adjust_roles(bool delay_role_switch) {
1140   uint8_t i;
1141   uint8_t link_count = bta_dm_cb.device_list.count;
1142   if (link_count) {
1143     for (i = 0; i < bta_dm_cb.device_list.count; i++) {
1144       if (bta_dm_cb.device_list.peer_device[i].is_connected() &&
1145           bta_dm_cb.device_list.peer_device[i].transport == BT_TRANSPORT_BR_EDR) {
1146         if ((bta_dm_cb.device_list.peer_device[i].pref_role == BTA_CENTRAL_ROLE_ONLY) ||
1147             (link_count > 1)) {
1148           /* Initiating immediate role switch with certain remote devices
1149             has caused issues due to role  switch colliding with link encryption
1150             setup and
1151             causing encryption (and in turn the link) to fail .  These device .
1152             Firmware
1153             versions are stored in a rejectlist and role switch with these
1154             devices are
1155             delayed to avoid the collision with link encryption setup */
1156 
1157           if (bta_dm_cb.device_list.peer_device[i].pref_role != BTA_PERIPHERAL_ROLE_ONLY &&
1158               !delay_role_switch) {
1159             const tBTM_STATUS status =
1160                     get_btm_client_interface().link_policy.BTM_SwitchRoleToCentral(
1161                             bta_dm_cb.device_list.peer_device[i].peer_bdaddr);
1162             switch (status) {
1163               case tBTM_STATUS::BTM_SUCCESS:
1164                 log::debug("Role policy already set to central peer:{}",
1165                            bta_dm_cb.device_list.peer_device[i].peer_bdaddr);
1166                 break;
1167               case tBTM_STATUS::BTM_CMD_STARTED:
1168                 log::debug("Role policy started to central peer:{}",
1169                            bta_dm_cb.device_list.peer_device[i].peer_bdaddr);
1170                 break;
1171               default:
1172                 log::warn("Unable to set role policy to central peer:{}",
1173                           bta_dm_cb.device_list.peer_device[i].peer_bdaddr);
1174                 break;
1175             }
1176           } else {
1177             alarm_set_on_mloop(bta_dm_cb.switch_delay_timer, BTA_DM_SWITCH_DELAY_TIMER_MS,
1178                                bta_dm_delay_role_switch_cback, NULL);
1179           }
1180         }
1181       }
1182     }
1183   }
1184 }
1185 
1186 /*******************************************************************************
1187  *
1188  * Function         find_utf8_char_boundary
1189  *
1190  * Description      This function checks a UTF8 string |utf8str| starting at
1191  *                  |offset|, moving backwards and returns the offset of the
1192  *                  next valid UTF8 character boundary found.
1193  *
1194  * Returns          Offset of UTF8 character boundary
1195  *
1196  ******************************************************************************/
find_utf8_char_boundary(const char * utf8str,size_t offset)1197 static size_t find_utf8_char_boundary(const char* utf8str, size_t offset) {
1198   log::assert_that(utf8str != nullptr, "assert failed: utf8str != nullptr");
1199   log::assert_that(offset > 0, "assert failed: offset > 0");
1200 
1201   while (--offset) {
1202     uint8_t ch = (uint8_t)utf8str[offset];
1203     if ((ch & 0x80) == 0x00) {  // ASCII
1204       return offset + 1;
1205     }
1206     if ((ch & 0xC0) == 0xC0) {  // Multi-byte sequence start
1207       return offset;
1208     }
1209   }
1210 
1211   return 0;
1212 }
1213 
1214 /*******************************************************************************
1215  *
1216  * Function         bta_dm_set_eir
1217  *
1218  * Description      This function creates EIR tagged data and writes it to
1219  *                  controller.
1220  *
1221  * Returns          None
1222  *
1223  ******************************************************************************/
bta_dm_set_eir(char * local_name)1224 static void bta_dm_set_eir(char* local_name) {
1225   uint8_t* p;
1226   uint8_t* p_length;
1227   uint8_t* p_type;
1228   uint8_t max_num_uuid;
1229 #if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
1230   uint8_t custom_uuid_idx;
1231 #endif  // BTA_EIR_SERVER_NUM_CUSTOM_UUID
1232   uint8_t free_eir_length = HCI_DM5_PACKET_SIZE;
1233   uint8_t num_uuid;
1234   uint8_t data_type;
1235   uint8_t local_name_len;
1236 
1237   /* wait until complete to disable */
1238   if (alarm_is_scheduled(bta_dm_cb.disable_timer)) {
1239     return;
1240   }
1241 
1242   /* if local name is not provided, get it from controller */
1243   if (local_name == NULL) {
1244     if (get_btm_client_interface().local.BTM_ReadLocalDeviceName((const char**)&local_name) !=
1245         tBTM_STATUS::BTM_SUCCESS) {
1246       log::error("Fail to read local device name for EIR");
1247     }
1248   }
1249 
1250   /* Allocate a buffer to hold HCI command */
1251   BT_HDR* p_buf = (BT_HDR*)osi_malloc(BTM_CMD_BUF_SIZE);
1252   log::assert_that(p_buf != nullptr, "assert failed: p_buf != nullptr");
1253   p = (uint8_t*)p_buf + BTM_HCI_EIR_OFFSET;
1254 
1255   memset(p, 0x00, HCI_EXT_INQ_RESPONSE_LEN);
1256 
1257   log::info("Generating extended inquiry response packet EIR");
1258 
1259   if (local_name) {
1260     local_name_len = strlen(local_name);
1261   } else {
1262     local_name_len = 0;
1263   }
1264 
1265   data_type = HCI_EIR_COMPLETE_LOCAL_NAME_TYPE;
1266   /* if local name is longer than minimum length of shortened name */
1267   /* check whether it needs to be shortened or not */
1268   if (local_name_len > p_bta_dm_eir_cfg->bta_dm_eir_min_name_len) {
1269     /* get number of UUID 16-bit list */
1270     max_num_uuid = (free_eir_length - 2) / Uuid::kNumBytes16;
1271     data_type = get_btm_client_interface().eir.BTM_GetEirSupportedServices(bta_dm_cb.eir_uuid, &p,
1272                                                                            max_num_uuid, &num_uuid);
1273     p = (uint8_t*)p_buf + BTM_HCI_EIR_OFFSET; /* reset p */
1274 
1275     /* if UUID doesn't fit remaing space, shorten local name */
1276     if (local_name_len > (free_eir_length - 4 - num_uuid * Uuid::kNumBytes16)) {
1277       local_name_len =
1278               find_utf8_char_boundary(local_name, p_bta_dm_eir_cfg->bta_dm_eir_min_name_len);
1279       log::warn("local name is shortened ({})", local_name_len);
1280       data_type = HCI_EIR_SHORTENED_LOCAL_NAME_TYPE;
1281     } else {
1282       data_type = HCI_EIR_COMPLETE_LOCAL_NAME_TYPE;
1283     }
1284   }
1285 
1286   UINT8_TO_STREAM(p, local_name_len + 1);
1287   UINT8_TO_STREAM(p, data_type);
1288 
1289   if (local_name != NULL) {
1290     memcpy(p, local_name, local_name_len);
1291     p += local_name_len;
1292   }
1293   free_eir_length -= local_name_len + 2;
1294 
1295   /* if UUID list is dynamic */
1296   if (free_eir_length >= 2) {
1297     p_length = p++;
1298     p_type = p++;
1299     num_uuid = 0;
1300 
1301     max_num_uuid = (free_eir_length - 2) / Uuid::kNumBytes16;
1302     data_type = get_btm_client_interface().eir.BTM_GetEirSupportedServices(bta_dm_cb.eir_uuid, &p,
1303                                                                            max_num_uuid, &num_uuid);
1304 
1305     if (data_type == HCI_EIR_MORE_16BITS_UUID_TYPE) {
1306       log::warn("BTA EIR: UUID 16-bit list is truncated");
1307     }
1308 #if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
1309     else {
1310       for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID;
1311            custom_uuid_idx++) {
1312         const Uuid& curr = bta_dm_cb.bta_custom_uuid[custom_uuid_idx].custom_uuid;
1313         if (curr.GetShortestRepresentationSize() == Uuid::kNumBytes16) {
1314           if (num_uuid < max_num_uuid) {
1315             UINT16_TO_STREAM(p, curr.As16Bit());
1316             num_uuid++;
1317           } else {
1318             data_type = HCI_EIR_MORE_16BITS_UUID_TYPE;
1319             log::warn("BTA EIR: UUID 16-bit list is truncated");
1320             break;
1321           }
1322         }
1323       }
1324     }
1325 #endif /* (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) */
1326 
1327     UINT8_TO_STREAM(p_length, num_uuid * Uuid::kNumBytes16 + 1);
1328     UINT8_TO_STREAM(p_type, data_type);
1329     free_eir_length -= num_uuid * Uuid::kNumBytes16 + 2;
1330   }
1331 
1332 #if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
1333   /* Adding 32-bit UUID list */
1334   if (free_eir_length >= 2) {
1335     p_length = p++;
1336     p_type = p++;
1337     num_uuid = 0;
1338     data_type = HCI_EIR_COMPLETE_32BITS_UUID_TYPE;
1339 
1340     max_num_uuid = (free_eir_length - 2) / Uuid::kNumBytes32;
1341 
1342     for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++) {
1343       const Uuid& curr = bta_dm_cb.bta_custom_uuid[custom_uuid_idx].custom_uuid;
1344       if (curr.GetShortestRepresentationSize() == Uuid::kNumBytes32) {
1345         if (num_uuid < max_num_uuid) {
1346           UINT32_TO_STREAM(p, curr.As32Bit());
1347           num_uuid++;
1348         } else {
1349           data_type = HCI_EIR_MORE_32BITS_UUID_TYPE;
1350           log::warn("BTA EIR: UUID 32-bit list is truncated");
1351           break;
1352         }
1353       }
1354     }
1355 
1356     UINT8_TO_STREAM(p_length, num_uuid * Uuid::kNumBytes32 + 1);
1357     UINT8_TO_STREAM(p_type, data_type);
1358     free_eir_length -= num_uuid * Uuid::kNumBytes32 + 2;
1359   }
1360 
1361   /* Adding 128-bit UUID list */
1362   if (free_eir_length >= 2) {
1363     p_length = p++;
1364     p_type = p++;
1365     num_uuid = 0;
1366     data_type = HCI_EIR_COMPLETE_128BITS_UUID_TYPE;
1367 
1368     max_num_uuid = (free_eir_length - 2) / Uuid::kNumBytes128;
1369 
1370     for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++) {
1371       const Uuid& curr = bta_dm_cb.bta_custom_uuid[custom_uuid_idx].custom_uuid;
1372       if (curr.GetShortestRepresentationSize() == Uuid::kNumBytes128) {
1373         if (num_uuid < max_num_uuid) {
1374           ARRAY16_TO_STREAM(p, curr.To128BitBE().data());
1375           num_uuid++;
1376         } else {
1377           data_type = HCI_EIR_MORE_128BITS_UUID_TYPE;
1378           log::warn("BTA EIR: UUID 128-bit list is truncated");
1379           break;
1380         }
1381       }
1382     }
1383 
1384     UINT8_TO_STREAM(p_length, num_uuid * Uuid::kNumBytes128 + 1);
1385     UINT8_TO_STREAM(p_type, data_type);
1386     free_eir_length -= num_uuid * Uuid::kNumBytes128 + 2;
1387   }
1388 #endif /* BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0 */
1389 
1390   /* if Flags are provided in configuration */
1391   if ((p_bta_dm_eir_cfg->bta_dm_eir_flag_len > 0) && (p_bta_dm_eir_cfg->bta_dm_eir_flags) &&
1392       (free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 2)) {
1393     UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 1);
1394     UINT8_TO_STREAM(p, HCI_EIR_FLAGS_TYPE);
1395     memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_flags, p_bta_dm_eir_cfg->bta_dm_eir_flag_len);
1396     p += p_bta_dm_eir_cfg->bta_dm_eir_flag_len;
1397     free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 2;
1398   }
1399 
1400   /* if Manufacturer Specific are provided in configuration */
1401   if ((p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len > 0) &&
1402       (p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec) &&
1403       (free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2)) {
1404     p_length = p;
1405 
1406     UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 1);
1407     UINT8_TO_STREAM(p, HCI_EIR_MANUFACTURER_SPECIFIC_TYPE);
1408     memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec,
1409            p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len);
1410     p += p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len;
1411     free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2;
1412 
1413   } else {
1414     p_length = NULL;
1415   }
1416 
1417   /* if Inquiry Tx Resp Power compiled */
1418   if ((p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power) && (free_eir_length >= 3)) {
1419     UINT8_TO_STREAM(p, 2); /* Length field */
1420     UINT8_TO_STREAM(p, HCI_EIR_TX_POWER_LEVEL_TYPE);
1421     UINT8_TO_STREAM(p, *(p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power));
1422     free_eir_length -= 3;
1423   }
1424 
1425   if (free_eir_length) {
1426     UINT8_TO_STREAM(p, 0); /* terminator of significant part */
1427   }
1428 
1429   if (get_btm_client_interface().eir.BTM_WriteEIR(p_buf) != tBTM_STATUS::BTM_SUCCESS) {
1430     log::warn("Unable to write EIR data");
1431   }
1432 }
1433 
1434 /*******************************************************************************
1435  *
1436  * Function         bta_dm_get_cust_uuid_index
1437  *
1438  * Description      Get index of custom uuid from list
1439  *                  Note, handle equals to 0 means to find a vacant
1440  *                  from list.
1441  *
1442  * Returns          Index of array
1443  *                  bta_dm_cb.bta_custom_uuid[BTA_EIR_SERVER_NUM_CUSTOM_UUID]
1444  *
1445  ******************************************************************************/
bta_dm_get_cust_uuid_index(uint32_t handle)1446 static uint8_t bta_dm_get_cust_uuid_index(uint32_t handle) {
1447 #if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
1448   uint8_t c_uu_idx = 0;
1449 
1450   while (c_uu_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID &&
1451          bta_dm_cb.bta_custom_uuid[c_uu_idx].handle != handle) {
1452     c_uu_idx++;
1453   }
1454 
1455   return c_uu_idx;
1456 #else
1457   return 0;
1458 #endif
1459 }
1460 
1461 /*******************************************************************************
1462  *
1463  * Function         bta_dm_update_cust_uuid
1464  *
1465  * Description      Update custom uuid with given value
1466  *
1467  * Returns          None
1468  *
1469  ******************************************************************************/
bta_dm_update_cust_uuid(uint8_t c_uu_idx,const Uuid & uuid,uint32_t handle)1470 static void bta_dm_update_cust_uuid(uint8_t c_uu_idx, const Uuid& uuid, uint32_t handle) {
1471 #if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
1472   if (c_uu_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID) {
1473     tBTA_CUSTOM_UUID& curr = bta_dm_cb.bta_custom_uuid[c_uu_idx];
1474     curr.custom_uuid.UpdateUuid(uuid);
1475     curr.handle = handle;
1476   } else {
1477     log::error("invalid uuid index {}", c_uu_idx);
1478   }
1479 #endif
1480 }
1481 
1482 /*******************************************************************************
1483  *
1484  * Function         bta_dm_eir_update_cust_uuid
1485  *
1486  * Description      This function adds or removes custom service UUID in EIR database.
1487  *
1488  * Returns          None
1489  *
1490  ******************************************************************************/
bta_dm_eir_update_cust_uuid(const tBTA_CUSTOM_UUID & curr,bool adding)1491 void bta_dm_eir_update_cust_uuid(const tBTA_CUSTOM_UUID& curr, bool adding) {
1492   log::verbose("");
1493 #if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
1494   uint8_t c_uu_idx = 0;
1495   if (adding) {
1496     c_uu_idx = bta_dm_get_cust_uuid_index(0); /* find a vacant from uuid list */
1497     bta_dm_update_cust_uuid(c_uu_idx, curr.custom_uuid, curr.handle);
1498   } else {
1499     c_uu_idx = bta_dm_get_cust_uuid_index(curr.handle); /* find the uuid from uuid list */
1500     bta_dm_update_cust_uuid(c_uu_idx, curr.custom_uuid, 0);
1501   }
1502 
1503   /* Update EIR when UUIDs are changed */
1504   if (c_uu_idx <= BTA_EIR_SERVER_NUM_CUSTOM_UUID) {
1505     bta_dm_set_eir(NULL);
1506   }
1507 #endif
1508 }
1509 
1510 /*******************************************************************************
1511  *
1512  * Function         bta_dm_eir_update_uuid
1513  *
1514  * Description      This function adds or removes service UUID in EIR database.
1515  *
1516  * Returns          None
1517  *
1518  ******************************************************************************/
bta_dm_eir_update_uuid(uint16_t uuid16,bool adding)1519 void bta_dm_eir_update_uuid(uint16_t uuid16, bool adding) {
1520   /* if this UUID is not advertised in EIR */
1521   if (!BTM_HasEirService(p_bta_dm_eir_cfg->uuid_mask, uuid16)) {
1522     return;
1523   }
1524 
1525   if (adding) {
1526     log::info("EIR Adding UUID=0x{:04X} into extended inquiry response", uuid16);
1527 
1528     get_btm_client_interface().eir.BTM_AddEirService(bta_dm_cb.eir_uuid, uuid16);
1529   } else {
1530     log::info("EIR Removing UUID=0x{:04X} from extended inquiry response", uuid16);
1531 
1532     get_btm_client_interface().eir.BTM_RemoveEirService(bta_dm_cb.eir_uuid, uuid16);
1533   }
1534 
1535   bta_dm_set_eir(NULL);
1536 }
1537 
find_connected_device(const RawAddress & bd_addr,tBT_TRANSPORT)1538 tBTA_DM_PEER_DEVICE* find_connected_device(const RawAddress& bd_addr,
1539                                            tBT_TRANSPORT /* transport */) {
1540   for (uint8_t i = 0; i < bta_dm_cb.device_list.count; i++) {
1541     if (bta_dm_cb.device_list.peer_device[i].peer_bdaddr == bd_addr &&
1542         bta_dm_cb.device_list.peer_device[i].is_connected()) {
1543       return &bta_dm_cb.device_list.peer_device[i];
1544     }
1545   }
1546   return nullptr;
1547 }
1548 
bta_dm_check_if_only_hd_connected(const RawAddress & peer_addr)1549 bool bta_dm_check_if_only_hd_connected(const RawAddress& peer_addr) {
1550   log::verbose("count({})", bta_dm_conn_srvcs.count);
1551 
1552   for (uint8_t j = 0; j < bta_dm_conn_srvcs.count; j++) {
1553     // Check if profiles other than hid are connected
1554     if ((bta_dm_conn_srvcs.conn_srvc[j].id != BTA_ID_HD) &&
1555         bta_dm_conn_srvcs.conn_srvc[j].peer_bdaddr == peer_addr) {
1556       log::verbose("Another profile (id={}) is connected", bta_dm_conn_srvcs.conn_srvc[j].id);
1557       return false;
1558     }
1559   }
1560 
1561   return true;
1562 }
1563 
1564 /** This function set the preferred connection parameters */
bta_dm_ble_set_conn_params(const RawAddress & bd_addr,uint16_t conn_int_min,uint16_t conn_int_max,uint16_t peripheral_latency,uint16_t supervision_tout)1565 void bta_dm_ble_set_conn_params(const RawAddress& bd_addr, uint16_t conn_int_min,
1566                                 uint16_t conn_int_max, uint16_t peripheral_latency,
1567                                 uint16_t supervision_tout) {
1568   stack::l2cap::get_interface().L2CA_AdjustConnectionIntervals(&conn_int_min, &conn_int_max,
1569                                                                BTM_BLE_CONN_INT_MIN);
1570 
1571   get_btm_client_interface().ble.BTM_BleSetPrefConnParams(bd_addr, conn_int_min, conn_int_max,
1572                                                           peripheral_latency, supervision_tout);
1573 }
1574 
1575 /** This function update LE connection parameters */
bta_dm_ble_update_conn_params(const RawAddress & bd_addr,uint16_t min_int,uint16_t max_int,uint16_t latency,uint16_t timeout,uint16_t min_ce_len,uint16_t max_ce_len)1576 void bta_dm_ble_update_conn_params(const RawAddress& bd_addr, uint16_t min_int, uint16_t max_int,
1577                                    uint16_t latency, uint16_t timeout, uint16_t min_ce_len,
1578                                    uint16_t max_ce_len) {
1579   stack::l2cap::get_interface().L2CA_AdjustConnectionIntervals(&min_int, &max_int,
1580                                                                BTM_BLE_CONN_INT_MIN);
1581 
1582   if (!stack::l2cap::get_interface().L2CA_UpdateBleConnParams(bd_addr, min_int, max_int, latency,
1583                                                               timeout, min_ce_len, max_ce_len)) {
1584     log::error("Update connection parameters failed!");
1585   }
1586 }
1587 
1588 /** This function set the maximum transmission packet size */
bta_dm_ble_set_data_length(const RawAddress & bd_addr)1589 void bta_dm_ble_set_data_length(const RawAddress& bd_addr) {
1590   uint16_t max_len =
1591           bluetooth::shim::GetController()->GetLeMaximumDataLength().supported_max_tx_octets_;
1592 
1593   if (get_btm_client_interface().ble.BTM_SetBleDataLength(bd_addr, max_len) !=
1594       tBTM_STATUS::BTM_SUCCESS) {
1595     log::info("Unable to set ble data length:{}", max_len);
1596   }
1597 }
1598 
1599 /** This function returns system context info */
bta_dm_obtain_system_context()1600 static tBTM_CONTRL_STATE bta_dm_obtain_system_context() {
1601   uint32_t total_acl_num = bta_dm_cb.device_list.count;
1602   uint32_t sniff_acl_num = BTM_PM_ReadSniffLinkCount();
1603   uint32_t le_acl_num = BTM_PM_ReadBleLinkCount();
1604   uint32_t active_acl_num = total_acl_num - sniff_acl_num - le_acl_num;
1605   uint32_t le_adv_num = bluetooth::shim::BTM_BleGetNumberOfAdvertisingInstancesInUse();
1606   uint32_t le_scan_duty_cycle = BTM_PM_ReadBleScanDutyCycle();
1607   bool is_inquiry_active = BTM_PM_DeviceInScanState();
1608   bool is_le_audio_active = LeAudioClient::IsLeAudioClientInStreaming();
1609   bool is_av_active = false;
1610   bool is_sco_active = false;
1611 
1612   for (int i = 0; i < bta_dm_cb.device_list.count; i++) {
1613     tBTA_DM_PEER_DEVICE* p_dev = &bta_dm_cb.device_list.peer_device[i];
1614     if (p_dev->is_connected() && p_dev->is_av_active()) {
1615       is_av_active = true;
1616       break;
1617     }
1618   }
1619   for (int j = 0; j < bta_dm_conn_srvcs.count; j++) {
1620     /* check for SCO connected index */
1621     if (bta_dm_conn_srvcs.conn_srvc[j].id == BTA_ID_AG ||
1622         bta_dm_conn_srvcs.conn_srvc[j].id == BTA_ID_HS) {
1623       if (bta_dm_conn_srvcs.conn_srvc[j].state == BTA_SYS_SCO_OPEN) {
1624         is_sco_active = true;
1625         break;
1626       }
1627     }
1628   }
1629 
1630   tBTM_CONTRL_STATE ctrl_state = 0;
1631   set_num_acl_active_to_ctrl_state(active_acl_num, ctrl_state);
1632   set_num_acl_sniff_to_ctrl_state(sniff_acl_num, ctrl_state);
1633   set_num_acl_le_to_ctrl_state(le_acl_num, ctrl_state);
1634   set_num_le_adv_to_ctrl_state(le_adv_num, ctrl_state);
1635   set_le_scan_mode_to_ctrl_state(le_scan_duty_cycle, ctrl_state);
1636 
1637   if (is_inquiry_active) {
1638     ctrl_state |= BTM_CONTRL_INQUIRY;
1639   }
1640   if (is_sco_active) {
1641     ctrl_state |= BTM_CONTRL_SCO;
1642   }
1643   if (is_av_active) {
1644     ctrl_state |= BTM_CONTRL_A2DP;
1645   }
1646   if (is_le_audio_active) {
1647     ctrl_state |= BTM_CONTRL_LE_AUDIO;
1648   }
1649   log::debug(
1650           "active_acl_num {} sniff_acl_num {} le_acl_num {} le_adv_num {} "
1651           "le_scan_duty {} inquiry {} sco {} a2dp {} le_audio {} ctrl_state 0x{:x}",
1652           active_acl_num, sniff_acl_num, le_acl_num, le_adv_num, le_scan_duty_cycle,
1653           is_inquiry_active, is_sco_active, is_av_active, is_le_audio_active, ctrl_state);
1654   return ctrl_state;
1655 }
1656 
1657 /*******************************************************************************
1658  *
1659  * Function         bta_ble_enable_scan_cmpl
1660  *
1661  * Description      ADV payload filtering enable / disable complete callback
1662  *
1663  *
1664  * Returns          None
1665  *
1666  ******************************************************************************/
bta_ble_energy_info_cmpl(tBTM_BLE_TX_TIME_MS tx_time,tBTM_BLE_RX_TIME_MS rx_time,tBTM_BLE_IDLE_TIME_MS idle_time,tBTM_BLE_ENERGY_USED energy_used,tHCI_STATUS status)1667 static void bta_ble_energy_info_cmpl(tBTM_BLE_TX_TIME_MS tx_time, tBTM_BLE_RX_TIME_MS rx_time,
1668                                      tBTM_BLE_IDLE_TIME_MS idle_time,
1669                                      tBTM_BLE_ENERGY_USED energy_used, tHCI_STATUS status) {
1670   tBTA_STATUS st = (status == HCI_SUCCESS) ? BTA_SUCCESS : BTA_FAILURE;
1671   tBTM_CONTRL_STATE ctrl_state = BTM_CONTRL_UNKNOWN;
1672 
1673   if (BTA_SUCCESS == st) {
1674     ctrl_state = com::android::bluetooth::flags::bt_system_context_report()
1675                          ? bta_dm_obtain_system_context()
1676                          : bta_dm_pm_obtain_controller_state();
1677   }
1678 
1679   if (bta_dm_cb.p_energy_info_cback) {
1680     bta_dm_cb.p_energy_info_cback(tx_time, rx_time, idle_time, energy_used, ctrl_state, st);
1681   }
1682 }
1683 
1684 /** This function obtains the energy info */
bta_dm_ble_get_energy_info(tBTA_BLE_ENERGY_INFO_CBACK * p_energy_info_cback)1685 void bta_dm_ble_get_energy_info(tBTA_BLE_ENERGY_INFO_CBACK* p_energy_info_cback) {
1686   bta_dm_cb.p_energy_info_cback = p_energy_info_cback;
1687   tBTM_STATUS btm_status =
1688           get_btm_client_interface().ble.BTM_BleGetEnergyInfo(bta_ble_energy_info_cmpl);
1689   if (btm_status != tBTM_STATUS::BTM_CMD_STARTED) {
1690     bta_ble_energy_info_cmpl(0, 0, 0, 0, HCI_ERR_UNSPECIFIED);
1691   }
1692 }
1693 
1694 /*******************************************************************************
1695  *
1696  * Function         bta_dm_clear_event_filter
1697  *
1698  * Description      clears out the event filter.
1699  *
1700  * Parameters:
1701  *
1702  ******************************************************************************/
bta_dm_clear_event_filter(void)1703 void bta_dm_clear_event_filter(void) {
1704   log::verbose("bta_dm_clear_event_filter in bta_dm_act");
1705   bluetooth::shim::BTM_ClearEventFilter();
1706 }
1707 
1708 /*******************************************************************************
1709  *
1710  * Function         bta_dm_clear_event_mask
1711  *
1712  * Description      Clears out the event mask in the controller.
1713  *
1714  ******************************************************************************/
bta_dm_clear_event_mask(void)1715 void bta_dm_clear_event_mask(void) {
1716   log::verbose("bta_dm_clear_event_mask in bta_dm_act");
1717   bluetooth::shim::BTM_ClearEventMask();
1718 }
1719 
1720 /*******************************************************************************
1721  *
1722  * Function         bta_dm_clear_filter_accept_list
1723  *
1724  * Description      Clears out the connect list in the controller.
1725  *
1726  ******************************************************************************/
bta_dm_clear_filter_accept_list(void)1727 void bta_dm_clear_filter_accept_list(void) {
1728   log::verbose("bta_dm_clear_filter_accept_list in bta_dm_act");
1729   bluetooth::shim::BTM_ClearFilterAcceptList();
1730 }
1731 
1732 /*******************************************************************************
1733  *
1734  * Function         bta_dm_disconnect_all_acls
1735  *
1736  * Description      Disconnects all ACL connections.
1737  *
1738  ******************************************************************************/
bta_dm_disconnect_all_acls(void)1739 void bta_dm_disconnect_all_acls(void) {
1740   log::verbose("bta_dm_disconnect_all_acls in bta_dm_act");
1741   bluetooth::shim::BTM_DisconnectAllAcls();
1742 }
1743 
1744 /*******************************************************************************
1745  *
1746  * Function         bta_dm_le_rand
1747  *
1748  * Description      Generates a random number from the controller.
1749  *
1750  * Parameters:      |cb| Callback to receive the random number.
1751  *
1752  ******************************************************************************/
bta_dm_le_rand(bluetooth::hci::LeRandCallback cb)1753 void bta_dm_le_rand(bluetooth::hci::LeRandCallback cb) {
1754   log::verbose("bta_dm_le_rand in bta_dm_act");
1755   bluetooth::shim::GetController()->LeRand(std::move(cb));
1756 }
1757 
1758 /*******************************************************************************
1759  *
1760  * Function        BTA_DmSetEventFilterConnectionSetupAllDevices
1761  *
1762  * Description    Tell the controller to allow all devices
1763  *
1764  * Parameters
1765  *
1766  *******************************************************************************/
bta_dm_set_event_filter_connection_setup_all_devices()1767 void bta_dm_set_event_filter_connection_setup_all_devices() {
1768   // Autoplumbed
1769   bluetooth::shim::BTM_SetEventFilterConnectionSetupAllDevices();
1770 }
1771 
1772 /*******************************************************************************
1773  *
1774  * Function        BTA_DmAllowWakeByHid
1775  *
1776  * Description     Allow the device to be woken by HID devices
1777  *
1778  * Parameters      std::vector of Classic Address and LE (Address, Address Type)
1779  *
1780  *******************************************************************************/
bta_dm_allow_wake_by_hid(std::vector<RawAddress> classic_hid_devices,std::vector<std::pair<RawAddress,uint8_t>> le_hid_devices)1781 void bta_dm_allow_wake_by_hid(std::vector<RawAddress> classic_hid_devices,
1782                               std::vector<std::pair<RawAddress, uint8_t>> le_hid_devices) {
1783   // If there are any entries in the classic hid list, we should also make
1784   // the adapter connectable for classic.
1785   if (classic_hid_devices.size() > 0) {
1786     if (BTM_SetConnectability(BTM_CONNECTABLE) != tBTM_STATUS::BTM_SUCCESS) {
1787       log::warn("Unable to enable classic BR/EDR connectability");
1788     }
1789   }
1790 
1791   bluetooth::shim::BTM_AllowWakeByHid(std::move(classic_hid_devices), std::move(le_hid_devices));
1792 }
1793 
1794 /*******************************************************************************
1795  *
1796  * Function        BTA_DmRestoreFilterAcceptList
1797  *
1798  * Description    Floss: Restore the state of the for the filter accept list
1799  *
1800  * Parameters
1801  *
1802  *******************************************************************************/
bta_dm_restore_filter_accept_list(std::vector<std::pair<RawAddress,uint8_t>> le_devices)1803 void bta_dm_restore_filter_accept_list(std::vector<std::pair<RawAddress, uint8_t>> le_devices) {
1804   // Autoplumbed
1805   bluetooth::shim::BTM_RestoreFilterAcceptList(le_devices);
1806 }
1807 
1808 /*******************************************************************************
1809  *
1810  * Function       BTA_DmSetDefaultEventMaskExcept
1811  *
1812  * Description    Floss: Set the default event mask for Classic and LE except
1813  *                the given values (they will be disabled in the final set
1814  *                mask).
1815  *
1816  * Parameters     Bits set for event mask and le event mask that should be
1817  *                disabled in the final value.
1818  *
1819  *******************************************************************************/
bta_dm_set_default_event_mask_except(uint64_t mask,uint64_t le_mask)1820 void bta_dm_set_default_event_mask_except(uint64_t mask, uint64_t le_mask) {
1821   // Autoplumbed
1822   bluetooth::shim::BTM_SetDefaultEventMaskExcept(mask, le_mask);
1823 }
1824 
1825 /*******************************************************************************
1826  *
1827  * Function        BTA_DmSetEventFilterInquiryResultAllDevices
1828  *
1829  * Description    Floss: Set the event filter to inquiry result device all
1830  *
1831  * Parameters
1832  *
1833  *******************************************************************************/
bta_dm_set_event_filter_inquiry_result_all_devices()1834 void bta_dm_set_event_filter_inquiry_result_all_devices() {
1835   // Autoplumbed
1836   bluetooth::shim::BTM_SetEventFilterInquiryResultAllDevices();
1837 }
1838 
1839 /*******************************************************************************
1840  *
1841  * Function         bta_dm_ble_reset_id
1842  *
1843  * Description      Reset the local adapter BLE keys.
1844  *
1845  * Parameters:
1846  *
1847  ******************************************************************************/
bta_dm_ble_reset_id(void)1848 void bta_dm_ble_reset_id(void) {
1849   log::verbose("bta_dm_ble_reset_id in bta_dm_act");
1850   bluetooth::shim::BTM_BleResetId();
1851 }
1852 
1853 /*******************************************************************************
1854  *
1855  * Function         bta_dm_ctrl_features_rd_cmpl_cback
1856  *
1857  * Description      callback to handle controller feature read complete
1858  *
1859  * Parameters:
1860  *
1861  ******************************************************************************/
bta_dm_ctrl_features_rd_cmpl_cback(tHCI_STATUS result)1862 static void bta_dm_ctrl_features_rd_cmpl_cback(tHCI_STATUS result) {
1863   log::verbose("status = {}", result);
1864   if (result == HCI_SUCCESS) {
1865     if (bta_dm_acl_cb.p_acl_cback) {
1866       bta_dm_acl_cb.p_acl_cback(BTA_DM_LE_FEATURES_READ, NULL);
1867     }
1868   } else {
1869     log::error("Ctrl BLE feature read failed: status :{}", result);
1870   }
1871 }
1872 
1873 /*******************************************************************************
1874  *
1875  * Function         bta_dm_ble_subrate_request
1876  *
1877  * Description      This function requests BLE subrate procedure.
1878  *
1879  * Parameters:
1880  *
1881  ******************************************************************************/
bta_dm_ble_subrate_request(const RawAddress & bd_addr,uint16_t subrate_min,uint16_t subrate_max,uint16_t max_latency,uint16_t cont_num,uint16_t timeout)1882 void bta_dm_ble_subrate_request(const RawAddress& bd_addr, uint16_t subrate_min,
1883                                 uint16_t subrate_max, uint16_t max_latency, uint16_t cont_num,
1884                                 uint16_t timeout) {
1885   // Logging done in l2c_ble.cc
1886   if (!stack::l2cap::get_interface().L2CA_SubrateRequest(bd_addr, subrate_min, subrate_max,
1887                                                          max_latency, cont_num, timeout)) {
1888     log::warn("Unable to set L2CAP ble subrating peer:{}", bd_addr);
1889   }
1890 }
1891 
1892 namespace bluetooth {
1893 namespace legacy {
1894 namespace testing {
allocate_device_for(const RawAddress & bd_addr,tBT_TRANSPORT transport)1895 tBTA_DM_PEER_DEVICE* allocate_device_for(const RawAddress& bd_addr, tBT_TRANSPORT transport) {
1896   return ::allocate_device_for(bd_addr, transport);
1897 }
1898 
bta_dm_acl_up(const RawAddress & bd_addr,tBT_TRANSPORT transport,uint16_t acl_handle)1899 void bta_dm_acl_up(const RawAddress& bd_addr, tBT_TRANSPORT transport, uint16_t acl_handle) {
1900   ::bta_dm_acl_up(bd_addr, transport, acl_handle);
1901 }
bta_dm_acl_down(const RawAddress & bd_addr,tBT_TRANSPORT transport)1902 void bta_dm_acl_down(const RawAddress& bd_addr, tBT_TRANSPORT transport) {
1903   ::bta_dm_acl_down(bd_addr, transport);
1904 }
bta_dm_init_cb()1905 void bta_dm_init_cb() { ::bta_dm_init_cb(); }
bta_dm_deinit_cb()1906 void bta_dm_deinit_cb() { ::bta_dm_deinit_cb(); }
BTA_dm_on_hw_on()1907 void BTA_dm_on_hw_on() { ::BTA_dm_on_hw_on(); }
1908 
1909 }  // namespace testing
1910 }  // namespace legacy
1911 }  // namespace bluetooth
1912