Loading system/stack/Android.bp +1 −0 Original line number Original line Diff line number Diff line Loading @@ -2067,6 +2067,7 @@ cc_test { ":TestMockMainShimEntry", ":TestMockMainShimEntry", ":TestMockStackAcl", ":TestMockStackAcl", ":TestMockStackBtm", ":TestMockStackBtm", ":TestMockStackGatt", ":TestMockStackHcic", ":TestMockStackHcic", ":TestMockStackSdp", ":TestMockStackSdp", ":TestMockStackSmp", ":TestMockStackSmp", Loading system/stack/acl/btm_acl.cc +0 −44 Original line number Original line Diff line number Diff line Loading @@ -96,7 +96,6 @@ using bluetooth::legacy::hci::GetInterface; void BTM_update_version_info(const RawAddress& bd_addr, void BTM_update_version_info(const RawAddress& bd_addr, const remote_version_info& remote_version_info); const remote_version_info& remote_version_info); static void find_in_device_record(const RawAddress& bd_addr, tBLE_BD_ADDR* address_with_type); void l2c_link_hci_conn_comp(tHCI_STATUS status, uint16_t handle, const RawAddress& p_bda); void l2c_link_hci_conn_comp(tHCI_STATUS status, uint16_t handle, const RawAddress& p_bda); void BTM_db_reset(void); void BTM_db_reset(void); Loading Loading @@ -2462,31 +2461,6 @@ void acl_write_automatic_flush_timeout(const RawAddress& bd_addr, uint16_t flush btsnd_hcic_write_auto_flush_tout(p_acl->hci_handle, flush_timeout_in_ticks); btsnd_hcic_write_auto_flush_tout(p_acl->hci_handle, flush_timeout_in_ticks); } } bool acl_create_le_connection_with_id(uint8_t /* id */, const RawAddress& bd_addr, tBLE_ADDR_TYPE addr_type) { tBLE_BD_ADDR address_with_type{ .type = addr_type, .bda = bd_addr, }; find_in_device_record(bd_addr, &address_with_type); log::debug("Creating le direct connection to:{} type:{} (initial type: {})", address_with_type, AddressTypeText(address_with_type.type), AddressTypeText(addr_type)); if (address_with_type.type == BLE_ADDR_ANONYMOUS) { log::warn( "Creating le direct connection to:{}, address type 'anonymous' is " "invalid", address_with_type); return false; } bluetooth::shim::ACL_AcceptLeConnectionFrom(address_with_type, /* is_direct */ true); return true; } void acl_rcv_acl_data(BT_HDR* p_msg) { void acl_rcv_acl_data(BT_HDR* p_msg) { acl_header_t acl_header{ acl_header_t acl_header{ .handle = HCI_INVALID_HANDLE, .handle = HCI_INVALID_HANDLE, Loading Loading @@ -2583,24 +2557,6 @@ tACL_CONN* btm_acl_for_bda(const RawAddress& bd_addr, tBT_TRANSPORT transport) { return p_acl; return p_acl; } } void find_in_device_record(const RawAddress& bd_addr, tBLE_BD_ADDR* address_with_type) { const tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); if (p_dev_rec == nullptr) { return; } if (p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) { if (p_dev_rec->ble.identity_address_with_type.bda.IsEmpty()) { *address_with_type = {.type = p_dev_rec->ble.AddressType(), .bda = bd_addr}; return; } *address_with_type = p_dev_rec->ble.identity_address_with_type; return; } *address_with_type = {.type = BLE_ADDR_PUBLIC, .bda = bd_addr}; return; } /******************************************************************************* /******************************************************************************* * * * Function btm_acl_flush * Function btm_acl_flush Loading system/stack/fuzzers/l2cap_fuzzer.cc +7 −5 Original line number Original line Diff line number Diff line Loading @@ -95,15 +95,18 @@ void SnoopLogger::SetL2capChannelOpen(uint16_t, uint16_t, uint16_t, uint16_t, bo } // namespace hal } // namespace hal } // namespace bluetooth } // namespace bluetooth namespace connection_manager { bool create_le_connection(uint8_t /* id */, const RawAddress& /* bd_addr */, tBLE_ADDR_TYPE /* addr_type */) { return true; } } // namespace connection_manager namespace { namespace { class FakeBtStack { class FakeBtStack { public: public: FakeBtStack() { FakeBtStack() { test::mock::stack_acl::acl_create_le_connection_with_id.body = [](uint8_t /* id */, const RawAddress& /* bd_addr */, tBLE_ADDR_TYPE /* addr_type */) { return true; }; test::mock::stack_acl::acl_send_data_packet_br_edr.body = [](const RawAddress& /*bd_addr*/, test::mock::stack_acl::acl_send_data_packet_br_edr.body = [](const RawAddress& /*bd_addr*/, BT_HDR* hdr) { BT_HDR* hdr) { ConsumeData((const uint8_t*)hdr, hdr->offset + hdr->len); ConsumeData((const uint8_t*)hdr, hdr->offset + hdr->len); Loading Loading @@ -132,7 +135,6 @@ public: } } ~FakeBtStack() { ~FakeBtStack() { test::mock::stack_acl::acl_create_le_connection_with_id = {}; test::mock::stack_acl::acl_send_data_packet_br_edr = {}; test::mock::stack_acl::acl_send_data_packet_br_edr = {}; test::mock::stack_acl::acl_send_data_packet_ble = {}; test::mock::stack_acl::acl_send_data_packet_ble = {}; bluetooth::hci::testing::mock_controller_ = nullptr; bluetooth::hci::testing::mock_controller_ = nullptr; Loading system/stack/gatt/connection_manager.cc +42 −0 Original line number Original line Diff line number Diff line Loading @@ -440,6 +440,48 @@ void wl_direct_connect_timeout_cb(uint8_t app_id, const RawAddress& address) { direct_connect_remove(app_id, address, true); direct_connect_remove(app_id, address, true); } } static void find_in_device_record(const RawAddress& bd_addr, tBLE_BD_ADDR* address_with_type) { const tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); if (p_dev_rec == nullptr) { return; } if (p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) { if (p_dev_rec->ble.identity_address_with_type.bda.IsEmpty()) { *address_with_type = {.type = p_dev_rec->ble.AddressType(), .bda = bd_addr}; return; } *address_with_type = p_dev_rec->ble.identity_address_with_type; return; } *address_with_type = {.type = BLE_ADDR_PUBLIC, .bda = bd_addr}; return; } bool create_le_connection(uint8_t /* id */, const RawAddress& bd_addr, tBLE_ADDR_TYPE addr_type) { tBLE_BD_ADDR address_with_type{ .type = addr_type, .bda = bd_addr, }; find_in_device_record(bd_addr, &address_with_type); log::debug("Creating le direct connection to:{} type:{} (initial type: {})", address_with_type, AddressTypeText(address_with_type.type), AddressTypeText(addr_type)); if (address_with_type.type == BLE_ADDR_ANONYMOUS) { log::warn( "Creating le direct connection to:{}, address type 'anonymous' is " "invalid", address_with_type); return false; } bluetooth::shim::ACL_AcceptLeConnectionFrom(address_with_type, /* is_direct */ true); return true; } /** Add a device to the direct connection list. Returns true if device /** Add a device to the direct connection list. Returns true if device * added to the list, false otherwise */ * added to the list, false otherwise */ bool direct_connect_add(uint8_t app_id, const RawAddress& address) { bool direct_connect_add(uint8_t app_id, const RawAddress& address) { Loading system/stack/gatt/connection_manager.h +9 −0 Original line number Original line Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <set> #include <set> #include "ble_address_with_type.h" #include "types/raw_address.h" #include "types/raw_address.h" /* connection_manager takes care of all the low-level details of LE connection /* connection_manager takes care of all the low-level details of LE connection Loading Loading @@ -49,6 +50,14 @@ void on_connection_complete(const RawAddress& address); std::set<tAPP_ID> get_apps_connecting_to(const RawAddress& remote_bda); std::set<tAPP_ID> get_apps_connecting_to(const RawAddress& remote_bda); /* create_le_connection is adding device directly to AclManager, and relying on it's "direct * connect" implementation. * direct_connect_add method is doing multiplexing of apps request, and * sending the request to AclManager, but it lacks some extra checks and lookups. Currently these * methods are exclusive, if you try to use both you will get some bad behavior. These should be * merged into one. */ bool create_le_connection(uint8_t /* id */, const RawAddress& bd_addr, tBLE_ADDR_TYPE addr_type = BLE_ADDR_PUBLIC); bool direct_connect_add(tAPP_ID app_id, const RawAddress& address); bool direct_connect_add(tAPP_ID app_id, const RawAddress& address); bool direct_connect_remove(tAPP_ID app_id, const RawAddress& address, bool direct_connect_remove(tAPP_ID app_id, const RawAddress& address, bool connection_timeout = false); bool connection_timeout = false); Loading Loading
system/stack/Android.bp +1 −0 Original line number Original line Diff line number Diff line Loading @@ -2067,6 +2067,7 @@ cc_test { ":TestMockMainShimEntry", ":TestMockMainShimEntry", ":TestMockStackAcl", ":TestMockStackAcl", ":TestMockStackBtm", ":TestMockStackBtm", ":TestMockStackGatt", ":TestMockStackHcic", ":TestMockStackHcic", ":TestMockStackSdp", ":TestMockStackSdp", ":TestMockStackSmp", ":TestMockStackSmp", Loading
system/stack/acl/btm_acl.cc +0 −44 Original line number Original line Diff line number Diff line Loading @@ -96,7 +96,6 @@ using bluetooth::legacy::hci::GetInterface; void BTM_update_version_info(const RawAddress& bd_addr, void BTM_update_version_info(const RawAddress& bd_addr, const remote_version_info& remote_version_info); const remote_version_info& remote_version_info); static void find_in_device_record(const RawAddress& bd_addr, tBLE_BD_ADDR* address_with_type); void l2c_link_hci_conn_comp(tHCI_STATUS status, uint16_t handle, const RawAddress& p_bda); void l2c_link_hci_conn_comp(tHCI_STATUS status, uint16_t handle, const RawAddress& p_bda); void BTM_db_reset(void); void BTM_db_reset(void); Loading Loading @@ -2462,31 +2461,6 @@ void acl_write_automatic_flush_timeout(const RawAddress& bd_addr, uint16_t flush btsnd_hcic_write_auto_flush_tout(p_acl->hci_handle, flush_timeout_in_ticks); btsnd_hcic_write_auto_flush_tout(p_acl->hci_handle, flush_timeout_in_ticks); } } bool acl_create_le_connection_with_id(uint8_t /* id */, const RawAddress& bd_addr, tBLE_ADDR_TYPE addr_type) { tBLE_BD_ADDR address_with_type{ .type = addr_type, .bda = bd_addr, }; find_in_device_record(bd_addr, &address_with_type); log::debug("Creating le direct connection to:{} type:{} (initial type: {})", address_with_type, AddressTypeText(address_with_type.type), AddressTypeText(addr_type)); if (address_with_type.type == BLE_ADDR_ANONYMOUS) { log::warn( "Creating le direct connection to:{}, address type 'anonymous' is " "invalid", address_with_type); return false; } bluetooth::shim::ACL_AcceptLeConnectionFrom(address_with_type, /* is_direct */ true); return true; } void acl_rcv_acl_data(BT_HDR* p_msg) { void acl_rcv_acl_data(BT_HDR* p_msg) { acl_header_t acl_header{ acl_header_t acl_header{ .handle = HCI_INVALID_HANDLE, .handle = HCI_INVALID_HANDLE, Loading Loading @@ -2583,24 +2557,6 @@ tACL_CONN* btm_acl_for_bda(const RawAddress& bd_addr, tBT_TRANSPORT transport) { return p_acl; return p_acl; } } void find_in_device_record(const RawAddress& bd_addr, tBLE_BD_ADDR* address_with_type) { const tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); if (p_dev_rec == nullptr) { return; } if (p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) { if (p_dev_rec->ble.identity_address_with_type.bda.IsEmpty()) { *address_with_type = {.type = p_dev_rec->ble.AddressType(), .bda = bd_addr}; return; } *address_with_type = p_dev_rec->ble.identity_address_with_type; return; } *address_with_type = {.type = BLE_ADDR_PUBLIC, .bda = bd_addr}; return; } /******************************************************************************* /******************************************************************************* * * * Function btm_acl_flush * Function btm_acl_flush Loading
system/stack/fuzzers/l2cap_fuzzer.cc +7 −5 Original line number Original line Diff line number Diff line Loading @@ -95,15 +95,18 @@ void SnoopLogger::SetL2capChannelOpen(uint16_t, uint16_t, uint16_t, uint16_t, bo } // namespace hal } // namespace hal } // namespace bluetooth } // namespace bluetooth namespace connection_manager { bool create_le_connection(uint8_t /* id */, const RawAddress& /* bd_addr */, tBLE_ADDR_TYPE /* addr_type */) { return true; } } // namespace connection_manager namespace { namespace { class FakeBtStack { class FakeBtStack { public: public: FakeBtStack() { FakeBtStack() { test::mock::stack_acl::acl_create_le_connection_with_id.body = [](uint8_t /* id */, const RawAddress& /* bd_addr */, tBLE_ADDR_TYPE /* addr_type */) { return true; }; test::mock::stack_acl::acl_send_data_packet_br_edr.body = [](const RawAddress& /*bd_addr*/, test::mock::stack_acl::acl_send_data_packet_br_edr.body = [](const RawAddress& /*bd_addr*/, BT_HDR* hdr) { BT_HDR* hdr) { ConsumeData((const uint8_t*)hdr, hdr->offset + hdr->len); ConsumeData((const uint8_t*)hdr, hdr->offset + hdr->len); Loading Loading @@ -132,7 +135,6 @@ public: } } ~FakeBtStack() { ~FakeBtStack() { test::mock::stack_acl::acl_create_le_connection_with_id = {}; test::mock::stack_acl::acl_send_data_packet_br_edr = {}; test::mock::stack_acl::acl_send_data_packet_br_edr = {}; test::mock::stack_acl::acl_send_data_packet_ble = {}; test::mock::stack_acl::acl_send_data_packet_ble = {}; bluetooth::hci::testing::mock_controller_ = nullptr; bluetooth::hci::testing::mock_controller_ = nullptr; Loading
system/stack/gatt/connection_manager.cc +42 −0 Original line number Original line Diff line number Diff line Loading @@ -440,6 +440,48 @@ void wl_direct_connect_timeout_cb(uint8_t app_id, const RawAddress& address) { direct_connect_remove(app_id, address, true); direct_connect_remove(app_id, address, true); } } static void find_in_device_record(const RawAddress& bd_addr, tBLE_BD_ADDR* address_with_type) { const tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); if (p_dev_rec == nullptr) { return; } if (p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) { if (p_dev_rec->ble.identity_address_with_type.bda.IsEmpty()) { *address_with_type = {.type = p_dev_rec->ble.AddressType(), .bda = bd_addr}; return; } *address_with_type = p_dev_rec->ble.identity_address_with_type; return; } *address_with_type = {.type = BLE_ADDR_PUBLIC, .bda = bd_addr}; return; } bool create_le_connection(uint8_t /* id */, const RawAddress& bd_addr, tBLE_ADDR_TYPE addr_type) { tBLE_BD_ADDR address_with_type{ .type = addr_type, .bda = bd_addr, }; find_in_device_record(bd_addr, &address_with_type); log::debug("Creating le direct connection to:{} type:{} (initial type: {})", address_with_type, AddressTypeText(address_with_type.type), AddressTypeText(addr_type)); if (address_with_type.type == BLE_ADDR_ANONYMOUS) { log::warn( "Creating le direct connection to:{}, address type 'anonymous' is " "invalid", address_with_type); return false; } bluetooth::shim::ACL_AcceptLeConnectionFrom(address_with_type, /* is_direct */ true); return true; } /** Add a device to the direct connection list. Returns true if device /** Add a device to the direct connection list. Returns true if device * added to the list, false otherwise */ * added to the list, false otherwise */ bool direct_connect_add(uint8_t app_id, const RawAddress& address) { bool direct_connect_add(uint8_t app_id, const RawAddress& address) { Loading
system/stack/gatt/connection_manager.h +9 −0 Original line number Original line Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <set> #include <set> #include "ble_address_with_type.h" #include "types/raw_address.h" #include "types/raw_address.h" /* connection_manager takes care of all the low-level details of LE connection /* connection_manager takes care of all the low-level details of LE connection Loading Loading @@ -49,6 +50,14 @@ void on_connection_complete(const RawAddress& address); std::set<tAPP_ID> get_apps_connecting_to(const RawAddress& remote_bda); std::set<tAPP_ID> get_apps_connecting_to(const RawAddress& remote_bda); /* create_le_connection is adding device directly to AclManager, and relying on it's "direct * connect" implementation. * direct_connect_add method is doing multiplexing of apps request, and * sending the request to AclManager, but it lacks some extra checks and lookups. Currently these * methods are exclusive, if you try to use both you will get some bad behavior. These should be * merged into one. */ bool create_le_connection(uint8_t /* id */, const RawAddress& bd_addr, tBLE_ADDR_TYPE addr_type = BLE_ADDR_PUBLIC); bool direct_connect_add(tAPP_ID app_id, const RawAddress& address); bool direct_connect_add(tAPP_ID app_id, const RawAddress& address); bool direct_connect_remove(tAPP_ID app_id, const RawAddress& address, bool direct_connect_remove(tAPP_ID app_id, const RawAddress& address, bool connection_timeout = false); bool connection_timeout = false); Loading