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