diff options
Diffstat (limited to 'system')
489 files changed, 2288 insertions, 3718 deletions
diff --git a/system/BUILD.gn b/system/BUILD.gn index b86ca5f392..48b6207a60 100644 --- a/system/BUILD.gn +++ b/system/BUILD.gn @@ -76,7 +76,6 @@ config("target_defaults") { "//bt/system", "//bt/flags/exported_include", "//bt/sysprop/exported_include", - "//bt/system/linux_include", "//bt/system/include", "//bt/system/gd", "//bt/system/pdl/hci/include", diff --git a/system/audio_hal_interface/aidl/le_audio_software_aidl.cc b/system/audio_hal_interface/aidl/le_audio_software_aidl.cc index be7cf3a6b2..e0b96475d3 100644 --- a/system/audio_hal_interface/aidl/le_audio_software_aidl.cc +++ b/system/audio_hal_interface/aidl/le_audio_software_aidl.cc @@ -30,6 +30,7 @@ #include "common/strings.h" #include "hal_version_manager.h" #include "le_audio_utils.h" +#include "osi/include/properties.h" namespace bluetooth { namespace audio { @@ -694,6 +695,14 @@ bluetooth::audio::le_audio::OffloadCapabilities get_offload_capabilities() { return {offload_capabilities, broadcast_offload_capabilities}; } +static bool IsUsingCodecExtensibility() { + auto codec_ext_status = + osi_property_get_bool("bluetooth.core.le_audio.codec_extension_aidl.enabled", false); + + log::debug("Using codec extensibility AIDL: {}", codec_ext_status); + return codec_ext_status; +} + AudioConfiguration stream_config_to_hal_audio_config( const ::bluetooth::le_audio::stream_config& offload_config) { LeAudioConfiguration ucast_config = { @@ -726,6 +735,7 @@ AudioConfiguration stream_config_to_hal_audio_config( .blocksPerSdu = static_cast<int8_t>(offload_config.codec_frames_blocks_per_sdu), }; ucast_config.leAudioCodecConfig = LeAudioCodecConfiguration(lc3_config); + ucast_config.codecType = CodecType::LC3; lc3_codec_config_found = true; } @@ -741,14 +751,20 @@ AudioConfiguration stream_config_to_hal_audio_config( BLE_ADDRESS_RANDOM; } - ucast_config.streamMap.push_back({ + LeAudioConfiguration::StreamMap map_entry = { .streamHandle = info.stream_handle, .audioChannelAllocation = static_cast<int32_t>(info.audio_channel_allocation), .isStreamActive = info.is_stream_active, - .aseConfiguration = GetAidlLeAudioAseConfigurationFromStackFormat( - info.codec_config, info.target_latency, info.target_phy, info.metadata), - .bluetoothDeviceAddress = aidl_device_address, - }); + }; + + // Add the additional codec extensibility data fields + if (IsUsingCodecExtensibility()) { + map_entry.aseConfiguration = GetAidlLeAudioAseConfigurationFromStackFormat( + info.codec_config, info.target_latency, info.target_phy, info.metadata); + map_entry.bluetoothDeviceAddress = aidl_device_address; + } + + ucast_config.streamMap.push_back(map_entry); } if (!lc3_codec_config_found) { diff --git a/system/bta/Android.bp b/system/bta/Android.bp index 52d34d59cc..5a8f721ebd 100644 --- a/system/bta/Android.bp +++ b/system/bta/Android.bp @@ -231,6 +231,7 @@ cc_test { ":TestMockBtif", ":TestMockDevice", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockStackA2dp", ":TestMockStackAcl", @@ -243,7 +244,6 @@ cc_test { ":TestMockStackGatt", ":TestMockStackHid", ":TestMockStackL2cap", - ":TestMockStackMetrics", ":TestMockStackPan", ":TestMockStackRfcomm", ":TestMockStackRnr", @@ -339,10 +339,10 @@ cc_test { ":TestMockBtif", ":TestMockDevice", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockStackBtm", ":TestMockStackL2cap", - ":TestMockStackMetrics", "test/gatt/database_builder_sample_device_test.cc", "test/gatt/database_builder_test.cc", "test/gatt/database_test.cc", diff --git a/system/bta/BUILD.gn b/system/bta/BUILD.gn index 9c28016617..f621539151 100644 --- a/system/bta/BUILD.gn +++ b/system/bta/BUILD.gn @@ -143,7 +143,6 @@ static_library("bta") { "sys", "//bt/system/", "//bt/system/include", - "//bt/system/linux_include", "//bt/system/bta", "//bt/system/bta/aics/include", "//bt/system/gd", diff --git a/system/bta/gatt/bta_gattc_utils.cc b/system/bta/gatt/bta_gattc_utils.cc index 23b150b829..1541f391ca 100644 --- a/system/bta/gatt/bta_gattc_utils.cc +++ b/system/bta/gatt/bta_gattc_utils.cc @@ -142,7 +142,7 @@ tBTA_GATTC_CLCB* bta_gattc_find_clcb_by_cif(uint8_t client_if, const RawAddress& tBTA_GATTC_CLCB* bta_gattc_find_clcb_by_conn_id(tCONN_ID conn_id) { if (com::android::bluetooth::flags::gatt_client_dynamic_allocation()) { for (auto& p_clcb : bta_gattc_cb.clcb_set) { - if (p_clcb->in_use && p_clcb->bta_conn_id == conn_id) { + if (p_clcb != NULL && p_clcb->in_use && p_clcb->bta_conn_id == conn_id) { return p_clcb.get(); } } diff --git a/system/bta/le_audio/broadcaster/broadcaster_test.cc b/system/bta/le_audio/broadcaster/broadcaster_test.cc index a211a810ad..16177230d1 100644 --- a/system/bta/le_audio/broadcaster/broadcaster_test.cc +++ b/system/bta/le_audio/broadcaster/broadcaster_test.cc @@ -63,6 +63,8 @@ using testing::Test; using namespace bluetooth::le_audio; using namespace bluetooth; +using bluetooth::hci::testing::mock_controller_; + using bluetooth::le_audio::DsaMode; using bluetooth::le_audio::LeAudioCodecConfiguration; using bluetooth::le_audio::LeAudioSourceAudioHalClient; @@ -287,8 +289,8 @@ protected: init_message_loop_thread(); reset_mock_function_count_map(); - bluetooth::hci::testing::mock_controller_ = &mock_controller_; - ON_CALL(mock_controller_, SupportsBleIsochronousBroadcaster).WillByDefault(Return(true)); + mock_controller_ = std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); + ON_CALL(*mock_controller_, SupportsBleIsochronousBroadcaster).WillByDefault(Return(true)); iso_manager_ = bluetooth::hci::IsoManager::GetInstance(); ASSERT_NE(iso_manager_, nullptr); @@ -366,7 +368,7 @@ protected: ContentControlIdKeeper::GetInstance()->Stop(); - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.release(); delete mock_audio_source_; iso_active_callback = nullptr; delete mock_audio_source_; @@ -436,7 +438,6 @@ protected: protected: MockLeAudioBroadcasterCallbacks mock_broadcaster_callbacks_; - bluetooth::hci::testing::MockControllerInterface mock_controller_; bluetooth::hci::IsoManager* iso_manager_; MockIsoManager* mock_iso_manager_; bluetooth::hci::iso_manager::BigCallbacks* big_callbacks_ = nullptr; diff --git a/system/bta/le_audio/codec_manager.cc b/system/bta/le_audio/codec_manager.cc index 9452218c5d..104d397833 100644 --- a/system/bta/le_audio/codec_manager.cc +++ b/system/bta/le_audio/codec_manager.cc @@ -733,11 +733,11 @@ public: bool AppendStreamMapExtension(const std::vector<struct types::cis>& cises, const stream_parameters& stream_params, uint8_t direction) { - // In the legacy mode we are already done - if (!IsUsingCodecExtensibility()) { - log::verbose("Codec Extensibility is disabled"); - return true; - } + /* Without the codec extensibility enabled, we still need the BT stack structure to + * have the valid extended codec configuration entries, as these are used for codec type + * matching. The extended data fields of the AIDL API data structures are filed + * right before the AIDL call, only if the codec extensibility is enabled + */ const std::string tag = types::BidirectionalPair<std::string>({.sink = "Sink", .source = "Source"}) diff --git a/system/bta/le_audio/codec_manager_test.cc b/system/bta/le_audio/codec_manager_test.cc index b8f79a609b..c69464b72e 100644 --- a/system/bta/le_audio/codec_manager_test.cc +++ b/system/bta/le_audio/codec_manager_test.cc @@ -300,10 +300,12 @@ public: bluetooth::legacy::hci::testing::SetMock(legacy_hci_mock_); - ON_CALL(controller_interface, SupportsBleIsochronousBroadcaster).WillByDefault(Return(true)); - ON_CALL(controller_interface, IsSupported(OpCode::CONFIGURE_DATA_PATH)) + bluetooth::hci::testing::mock_controller_ = + std::make_unique<NiceMock<bluetooth::hci::testing::MockControllerInterface>>(); + ON_CALL(*bluetooth::hci::testing::mock_controller_, SupportsBleIsochronousBroadcaster) + .WillByDefault(Return(true)); + ON_CALL(*bluetooth::hci::testing::mock_controller_, IsSupported(OpCode::CONFIGURE_DATA_PATH)) .WillByDefault(Return(true)); - bluetooth::hci::testing::mock_controller_ = &controller_interface; codec_manager = CodecManager::GetInstance(); @@ -311,9 +313,11 @@ public: RegisterSinkHalClientMock(); } - virtual void TearDown() override { codec_manager->Stop(); } + virtual void TearDown() override { + codec_manager->Stop(); + bluetooth::hci::testing::mock_controller_.release(); + } - NiceMock<bluetooth::hci::testing::MockControllerInterface> controller_interface; CodecManager* codec_manager; bluetooth::legacy::hci::testing::MockInterface legacy_hci_mock_; @@ -559,15 +563,16 @@ TEST_F(CodecManagerTestAdsp, testStreamConfigurationMono) { }; // Stream parameters + auto stream_map_entry_mono_bidir = + stream_map_info(97, codec_spec_conf::kLeAudioLocationMonoAudio, true); + stream_map_entry_mono_bidir.codec_config.id = kLeAudioCodecIdLc3; types::BidirectionalPair<stream_parameters> stream_params{ .sink = { .audio_channel_allocation = codec_spec_conf::kLeAudioLocationMonoAudio, .stream_config = { - .stream_map = {stream_map_info( - 97, codec_spec_conf::kLeAudioLocationMonoAudio, - true)}, + .stream_map = {stream_map_entry_mono_bidir}, .bits_per_sample = 16, .sampling_frequency_hz = 16000, .frame_duration_us = 10000, @@ -583,9 +588,7 @@ TEST_F(CodecManagerTestAdsp, testStreamConfigurationMono) { .audio_channel_allocation = codec_spec_conf::kLeAudioLocationMonoAudio, .stream_config = { - .stream_map = {stream_map_info( - 97, codec_spec_conf::kLeAudioLocationMonoAudio, - true)}, + .stream_map = {stream_map_entry_mono_bidir}, .bits_per_sample = 16, .sampling_frequency_hz = 16000, .frame_duration_us = 10000, @@ -628,6 +631,7 @@ TEST_F(CodecManagerTestAdsp, testStreamConfigurationMono) { ASSERT_EQ(codec_spec_conf::kLeAudioLocationMonoAudio, info.audio_channel_allocation); // The connected should be active ASSERT_TRUE(info.is_stream_active); + ASSERT_EQ(info.codec_config.id.coding_format, kLeAudioCodecIdLc3.coding_format); } else { ASSERT_EQ(97, info.stream_handle); diff --git a/system/bta/le_audio/devices_test.cc b/system/bta/le_audio/devices_test.cc index adc90e5213..cd711065c4 100644 --- a/system/bta/le_audio/devices_test.cc +++ b/system/bta/le_audio/devices_test.cc @@ -514,7 +514,9 @@ protected: desired_group_size_ = -1; bluetooth::manager::SetMockBtmInterface(&btm_interface_); - bluetooth::hci::testing::mock_controller_ = &controller_interface_; + + bluetooth::hci::testing::mock_controller_ = + std::make_unique<NiceMock<bluetooth::hci::testing::MockControllerInterface>>(); auto codec_location = ::bluetooth::le_audio::types::CodecLocation::HOST; bluetooth::le_audio::AudioSetConfigurationProvider::Initialize(codec_location); @@ -740,6 +742,8 @@ protected: if (codec_manager_) { codec_manager_->Stop(); } + + bluetooth::hci::testing::mock_controller_.reset(); } LeAudioDevice* AddTestDevice(int snk_ase_num, int src_ase_num, int snk_ase_num_cached = 0, @@ -1417,7 +1421,6 @@ protected: LeAudioDeviceGroup* group_ = nullptr; bluetooth::manager::MockBtmInterface btm_interface_; MockCsisClient mock_csis_client_module_; - NiceMock<bluetooth::hci::testing::MockControllerInterface> controller_interface_; bluetooth::le_audio::CodecManager* codec_manager_; MockCodecManager* mock_codec_manager_; diff --git a/system/bta/le_audio/le_audio_client_test.cc b/system/bta/le_audio/le_audio_client_test.cc index a3c52dc9e6..02104518d2 100644 --- a/system/bta/le_audio/le_audio_client_test.cc +++ b/system/bta/le_audio/le_audio_client_test.cc @@ -1477,11 +1477,13 @@ protected: init_message_loop_thread(); reset_mock_function_count_map(); - ON_CALL(controller_, SupportsBleConnectedIsochronousStreamCentral).WillByDefault(Return(true)); - ON_CALL(controller_, SupportsBleConnectedIsochronousStreamPeripheral) + hci::testing::mock_controller_ = + std::make_unique<NiceMock<bluetooth::hci::testing::MockControllerInterface>>(); + ON_CALL(*hci::testing::mock_controller_, SupportsBleConnectedIsochronousStreamCentral) .WillByDefault(Return(true)); - ON_CALL(controller_, SupportsBle2mPhy).WillByDefault(Return(true)); - bluetooth::hci::testing::mock_controller_ = &controller_; + ON_CALL(*hci::testing::mock_controller_, SupportsBleConnectedIsochronousStreamPeripheral) + .WillByDefault(Return(true)); + ON_CALL(*hci::testing::mock_controller_, SupportsBle2mPhy).WillByDefault(Return(true)); bluetooth::manager::SetMockBtmInterface(&mock_btm_interface_); gatt::SetMockBtaGattInterface(&mock_gatt_interface_); gatt::SetMockBtaGattQueue(&mock_gatt_queue_); @@ -1595,7 +1597,7 @@ protected: } iso_manager_->Stop(); - bluetooth::hci::testing::mock_controller_ = nullptr; + hci::testing::mock_controller_.reset(); } protected: @@ -2761,7 +2763,6 @@ protected: /* Audio track metadata */ char* test_tags_ptr_ = nullptr; - NiceMock<bluetooth::hci::testing::MockControllerInterface> controller_; }; class UnicastTest : public UnicastTestNoInit { diff --git a/system/bta/le_audio/state_machine_test.cc b/system/bta/le_audio/state_machine_test.cc index d17bfda188..e0860515fb 100644 --- a/system/bta/le_audio/state_machine_test.cc +++ b/system/bta/le_audio/state_machine_test.cc @@ -261,7 +261,9 @@ protected: bluetooth::manager::SetMockBtmInterface(&btm_interface); gatt::SetMockBtaGattInterface(&gatt_interface); gatt::SetMockBtaGattQueue(&gatt_queue); - bluetooth::hci::testing::mock_controller_ = &controller_; + + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); overwrite_cis_status_idx_ = 0; use_cis_retry_cnt_ = false; @@ -649,7 +651,7 @@ protected: cached_remote_qos_configuration_for_ase_.clear(); LeAudioGroupStateMachine::Cleanup(); ::bluetooth::le_audio::AudioSetConfigurationProvider::Cleanup(); - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.release(); } std::shared_ptr<LeAudioDevice> PrepareConnectedDevice(uint8_t id, @@ -1714,7 +1716,6 @@ protected: std::vector<RawAddress> addresses_; std::map<uint8_t, std::unique_ptr<LeAudioDeviceGroup>> le_audio_device_groups_; bool group_create_command_disallowed_ = false; - bluetooth::hci::testing::MockControllerInterface controller_; }; class StateMachineTest : public StateMachineTestBase { diff --git a/system/bta/test/bta_ag_sco_test.cc b/system/bta/test/bta_ag_sco_test.cc index 16caac7665..a90198c54a 100644 --- a/system/bta/test/bta_ag_sco_test.cc +++ b/system/bta/test/bta_ag_sco_test.cc @@ -43,14 +43,14 @@ protected: this->codec = codec; return enh_esco_params_t{}; }; - bluetooth::hci::testing::mock_controller_ = &controller_; + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); } void TearDown() override { test::mock::device_esco_parameters::esco_parameters_for_codec = {}; - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); } esco_codec_t codec; - bluetooth::hci::testing::MockControllerInterface controller_; }; TEST_P(BtaAgScoParameterSelectionTest, create_sco_cvsd) { diff --git a/system/bta/test/bta_ag_test.cc b/system/bta/test/bta_ag_test.cc index 5fa3884669..2114f7e773 100644 --- a/system/bta/test/bta_ag_test.cc +++ b/system/bta/test/bta_ag_test.cc @@ -65,7 +65,8 @@ protected: void SetUp() override { reset_mock_function_count_map(); fake_osi_ = std::make_unique<test::fake::FakeOsi>(); - bluetooth::hci::testing::mock_controller_ = &controller_; + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); main_thread_start_up(); post_on_bt_main([]() { log::info("Main thread started up"); }); @@ -85,7 +86,7 @@ protected: bta_sys_deregister(BTA_ID_AG); post_on_bt_main([]() { log::info("Main thread shutting down"); }); main_thread_shut_down(); - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); } std::unique_ptr<test::fake::FakeOsi> fake_osi_; @@ -93,7 +94,6 @@ protected: uint32_t tmp_num = 0xFFFF; RawAddress addr; esco_codec_t codec; - bluetooth::hci::testing::MockControllerInterface controller_; }; class BtaAgSwbTest : public BtaAgTest { diff --git a/system/bta/test/bta_dm_test.cc b/system/bta/test/bta_dm_test.cc index 90d41d5e6f..b49008b739 100644 --- a/system/bta/test/bta_dm_test.cc +++ b/system/bta/test/bta_dm_test.cc @@ -65,10 +65,10 @@ class BtaDmTest : public BtaWithContextTest { protected: void SetUp() override { BtaWithContextTest::SetUp(); - ON_CALL(controller_, LeRand).WillByDefault([](bluetooth::hci::LeRandCallback cb) { - cb(0x1234); - }); - bluetooth::hci::testing::mock_controller_ = &controller_; + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); + ON_CALL(*bluetooth::hci::testing::mock_controller_, LeRand) + .WillByDefault([](bluetooth::hci::LeRandCallback cb) { cb(0x1234); }); BTA_dm_init(); bluetooth::legacy::testing::bta_dm_init_cb(); @@ -82,9 +82,8 @@ protected: void TearDown() override { bluetooth::legacy::testing::bta_dm_deinit_cb(); BtaWithContextTest::TearDown(); - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); } - bluetooth::hci::testing::MockControllerInterface controller_; }; class BtaDmCustomAlarmTest : public BtaDmTest { diff --git a/system/bta/test/bta_sdp_test.cc b/system/bta/test/bta_sdp_test.cc index 06e8ff86aa..77f1762cc0 100644 --- a/system/bta/test/bta_sdp_test.cc +++ b/system/bta/test/bta_sdp_test.cc @@ -30,17 +30,16 @@ class BtaSdpTest : public BtaWithHwOnTest { protected: void SetUp() override { BtaWithHwOnTest::SetUp(); - ON_CALL(controller_, LeRand).WillByDefault([](bluetooth::hci::LeRandCallback cb) { - cb(0x1234); - }); - bluetooth::hci::testing::mock_controller_ = &controller_; + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); + ON_CALL(*bluetooth::hci::testing::mock_controller_, LeRand) + .WillByDefault([](bluetooth::hci::LeRandCallback cb) { cb(0x1234); }); } void TearDown() override { BtaWithHwOnTest::TearDown(); - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); } - bluetooth::hci::testing::MockControllerInterface controller_; }; class BtaSdpRegisteredTest : public BtaSdpTest { diff --git a/system/bta/test/bta_test_fixtures.h b/system/bta/test/bta_test_fixtures.h index c259d0b916..e41e64d496 100644 --- a/system/bta/test/bta_test_fixtures.h +++ b/system/bta/test/bta_test_fixtures.h @@ -60,7 +60,8 @@ protected: ASSERT_NE(get_btm_client_interface().lifecycle.btm_init, nullptr); ASSERT_NE(get_btm_client_interface().lifecycle.btm_free, nullptr); - bluetooth::hci::testing::mock_controller_ = &mock_controller_; + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); bluetooth::testing::stack::rnr::set_interface(&mock_stack_rnr_interface_); test::mock::stack_gatt_api::GATT_Register.body = @@ -85,12 +86,11 @@ protected: mock_btm_client_interface.eir.BTM_WriteEIR = {}; bluetooth::testing::stack::rnr::reset_interface(); - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); BtaWithFakesTest::TearDown(); } - bluetooth::hci::testing::MockControllerInterface mock_controller_; bluetooth::testing::stack::rnr::Mock mock_stack_rnr_interface_; }; diff --git a/system/btif/Android.bp b/system/btif/Android.bp index 0eb097dca7..82544f36ba 100644 --- a/system/btif/Android.bp +++ b/system/btif/Android.bp @@ -122,7 +122,6 @@ cc_library_static { "src/btif_keystore.cc", "src/btif_le_audio.cc", "src/btif_le_audio_broadcaster.cc", - "src/btif_metrics_logging.cc", "src/btif_pan.cc", "src/btif_profile_queue.cc", "src/btif_profile_queue.cc", diff --git a/system/btif/BUILD.gn b/system/btif/BUILD.gn index ea6a0f6fbc..9def60989b 100644 --- a/system/btif/BUILD.gn +++ b/system/btif/BUILD.gn @@ -64,7 +64,6 @@ static_library("btif") { "src/btif_jni_task.cc", "src/btif_keystore.cc", "src/btif_le_audio.cc", - "src/btif_metrics_logging.cc", "src/btif_pan.cc", "src/btif_profile_queue.cc", "src/btif_profile_storage.cc", diff --git a/system/btif/include/btif_metrics_logging.h b/system/btif/include/btif_metrics_logging.h deleted file mode 100644 index d68eddce5e..0000000000 --- a/system/btif/include/btif_metrics_logging.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include <frameworks/proto_logging/stats/enums/bluetooth/enums.pb.h> -#include <frameworks/proto_logging/stats/enums/bluetooth/hci/enums.pb.h> - -#include "main/shim/metric_id_api.h" -#include "types/raw_address.h" - -void log_a2dp_audio_underrun_event(const RawAddress& address, uint64_t encoding_interval_millis, - int num_missing_pcm_bytes); - -void log_a2dp_audio_overrun_event(const RawAddress& address, uint64_t encoding_interval_millis, - int num_dropped_buffers, int num_dropped_encoded_frames, - int num_dropped_encoded_bytes); - -void log_a2dp_playback_event(const RawAddress& address, int playback_state, int audio_coding_mode); - -void log_a2dp_session_metrics_event(const RawAddress& address, int64_t audio_duration_ms, - int media_timer_min_ms, int media_timer_max_ms, - int media_timer_avg_ms, int total_scheduling_count, - int buffer_overruns_max_count, int buffer_overruns_total, - float buffer_underruns_average, int buffer_underruns_count, - int64_t codec_index, bool is_a2dp_offload); - -void log_read_rssi_result(const RawAddress& address, uint16_t handle, uint32_t cmd_status, - int8_t rssi); - -void log_read_failed_contact_counter_result(const RawAddress& address, uint16_t handle, - uint32_t cmd_status, int32_t failed_contact_counter); - -void log_read_tx_power_level_result(const RawAddress& address, uint16_t handle, uint32_t cmd_status, - int32_t transmit_power_level); - -void log_counter_metrics_btif(android::bluetooth::CodePathCounterKeyEnum key, int64_t value); - -void log_socket_connection_state(const RawAddress& address, int port, int type, - android::bluetooth::SocketConnectionstateEnum connection_state, - int64_t tx_bytes, int64_t rx_bytes, int uid, int server_port, - android::bluetooth::SocketRoleEnum socket_role); - -bool init_metric_id_allocator(const std::unordered_map<RawAddress, int>& paired_device_map, - bluetooth::shim::CallbackLegacy save_id_callback, - bluetooth::shim::CallbackLegacy forget_device_callback); - -bool close_metric_id_allocator(); - -int allocate_metric_id_from_metric_id_allocator(const RawAddress&); - -int save_metric_id_from_metric_id_allocator(const RawAddress&); - -void forget_device_from_metric_id_allocator(const RawAddress&); - -bool is_valid_id_from_metric_id_allocator(const int id); diff --git a/system/btif/include/btif_sock_logging.h b/system/btif/include/btif_sock_logging.h index 7cd30f6396..38dfe3e302 100644 --- a/system/btif/include/btif_sock_logging.h +++ b/system/btif/include/btif_sock_logging.h @@ -16,9 +16,11 @@ #pragma once +#include "hardware/bt_sock.h" #include "types/raw_address.h" void btif_sock_connection_logger(const RawAddress& address, int port, int type, int state, int role, int uid, int server_port, int64_t tx_bytes, int64_t rx_bytes, - const char* server_name); + const char* server_name, uint64_t connection_start_time_ms, + btsock_error_code_t error_code, btsock_data_path_t data_path); void btif_sock_dump(int fd); diff --git a/system/btif/src/bluetooth.cc b/system/btif/src/bluetooth.cc index 5741b05c4f..9badbc9ab6 100644 --- a/system/btif/src/bluetooth.cc +++ b/system/btif/src/bluetooth.cc @@ -71,7 +71,6 @@ #include "btif/include/btif_hh.h" #include "btif/include/btif_keystore.h" #include "btif/include/btif_le_audio.h" -#include "btif/include/btif_metrics_logging.h" #include "btif/include/btif_pan.h" #include "btif/include/btif_profile_storage.h" #include "btif/include/btif_rc.h" @@ -99,6 +98,7 @@ #include "hardware/bt_vc.h" #include "internal_include/bt_target.h" #include "main/shim/dumpsys.h" +#include "main/shim/metric_id_api.h" #include "os/parameter_provider.h" #include "osi/include/alarm.h" #include "osi/include/allocator.h" @@ -1099,7 +1099,7 @@ static std::string obfuscate_address(const RawAddress& address) { } static int get_metric_id(const RawAddress& address) { - return allocate_metric_id_from_metric_id_allocator(address); + return bluetooth::shim::AllocateIdFromMetricIdAllocator(address); } static int set_dynamic_audio_buffer_size(int codec, int size) { diff --git a/system/btif/src/btif_a2dp_source.cc b/system/btif/src/btif_a2dp_source.cc index b8ace80b07..20805a92bd 100644 --- a/system/btif/src/btif_a2dp_source.cc +++ b/system/btif/src/btif_a2dp_source.cc @@ -46,13 +46,13 @@ #include "btif_av_co.h" #include "btif_common.h" #include "btif_hf.h" -#include "btif_metrics_logging.h" #include "btm_iso_api.h" #include "common/message_loop_thread.h" #include "common/metrics.h" #include "common/repeating_timer.h" #include "common/time_util.h" #include "hardware/bt_av.h" +#include "main/shim/metrics_api.h" #include "osi/include/allocator.h" #include "osi/include/fixed_queue.h" #include "osi/include/wakelock.h" @@ -253,8 +253,6 @@ static bool btif_a2dp_source_startup(void); static void btif_a2dp_source_startup_delayed(void); static void btif_a2dp_source_start_session_delayed(const RawAddress& peer_address, std::promise<void> start_session_promise); -static void btif_a2dp_source_end_session_delayed(const RawAddress& peer_address); -static void btif_a2dp_source_shutdown_delayed(std::promise<void>); static void btif_a2dp_source_audio_tx_start_event(void); static void btif_a2dp_source_audio_tx_stop_event(void); static void btif_a2dp_source_audio_tx_flush_event(void); @@ -262,7 +260,6 @@ static void btif_a2dp_source_audio_tx_flush_event(void); // The peer address is |peer_addr|. // This function should be called prior to starting A2DP streaming. static void btif_a2dp_source_setup_codec(const RawAddress& peer_addr); -static void btif_a2dp_source_cleanup_codec(); static void btif_a2dp_source_cleanup_codec_delayed(); static void btif_a2dp_source_encoder_user_config_update_event( const RawAddress& peer_address, @@ -329,19 +326,13 @@ static void btif_a2dp_source_accumulate_stats(BtifMediaStats* src, BtifMediaStat src->Reset(); } -/// Select the thread to run a2dp source actions on (a2dp encoder excluded). -static bluetooth::common::MessageLoopThread* local_thread() { - return com::android::bluetooth::flags::a2dp_source_threading_fix() ? get_main_thread() - : &btif_a2dp_source_thread; -} - bool btif_a2dp_source_init(void) { log::info(""); // Start A2DP Source media task btif_a2dp_source_thread.StartUp(); - local_thread()->DoInThread(base::BindOnce(&btif_a2dp_source_init_delayed)); + do_in_main_thread(base::BindOnce(&btif_a2dp_source_init_delayed)); return true; } @@ -422,7 +413,7 @@ static void btif_a2dp_source_init_delayed(void) { // the provider needs to be initialized earlier in order to ensure // get_a2dp_configuration and parse_a2dp_configuration can be // invoked before the stream is started. - bluetooth::audio::a2dp::init(local_thread(), &a2dp_stream_callbacks, + bluetooth::audio::a2dp::init(get_main_thread(), &a2dp_stream_callbacks, btif_av_is_a2dp_offload_enabled()); } @@ -439,7 +430,7 @@ static bool btif_a2dp_source_startup(void) { btif_a2dp_source_cb.tx_audio_queue = fixed_queue_new(SIZE_MAX); // Schedule the rest of the operations - local_thread()->DoInThread(base::BindOnce(&btif_a2dp_source_startup_delayed)); + do_in_main_thread(base::BindOnce(&btif_a2dp_source_startup_delayed)); return true; } @@ -451,7 +442,7 @@ static void btif_a2dp_source_startup_delayed() { log::fatal("unable to enable real time scheduling"); #endif } - if (!bluetooth::audio::a2dp::init(local_thread(), &a2dp_stream_callbacks, + if (!bluetooth::audio::a2dp::init(get_main_thread(), &a2dp_stream_callbacks, btif_av_is_a2dp_offload_enabled())) { log::warn("Failed to setup the bluetooth audio HAL"); } @@ -464,15 +455,14 @@ bool btif_a2dp_source_start_session(const RawAddress& peer_address, btif_a2dp_source_audio_tx_flush_req(); - if (local_thread()->DoInThread(base::BindOnce(&btif_a2dp_source_start_session_delayed, - peer_address, std::move(peer_ready_promise)))) { - return true; - } else { - // cannot set promise but triggers crash + if (do_in_main_thread(base::BindOnce(&btif_a2dp_source_start_session_delayed, peer_address, + std::move(peer_ready_promise))) != BT_STATUS_SUCCESS) { log::fatal("peer_address={} state={} fails to context switch", peer_address, btif_a2dp_source_cb.StateStr()); return false; } + + return true; } static void btif_a2dp_source_start_session_delayed(const RawAddress& peer_address, @@ -503,7 +493,7 @@ bool btif_a2dp_source_restart_session(const RawAddress& old_peer_address, log::assert_that(!new_peer_address.IsEmpty(), "assert failed: !new_peer_address.IsEmpty()"); - // Must stop first the audio streaming + // Must stop first the audio streaming. btif_a2dp_source_stop_audio_req(); // If the old active peer was valid, end the old session. @@ -523,33 +513,30 @@ bool btif_a2dp_source_restart_session(const RawAddress& old_peer_address, bool btif_a2dp_source_end_session(const RawAddress& peer_address) { log::info("peer_address={} state={}", peer_address, btif_a2dp_source_cb.StateStr()); - if (com::android::bluetooth::flags::a2dp_source_threading_fix()) { - btif_a2dp_source_cleanup_codec(); - btif_a2dp_source_end_session_delayed(peer_address); - } else { - local_thread()->DoInThread(base::BindOnce(&btif_a2dp_source_end_session_delayed, peer_address)); - btif_a2dp_source_cleanup_codec(); - } - return true; -} -static void btif_a2dp_source_end_session_delayed(const RawAddress& peer_address) { - log::info("peer_address={} state={}", peer_address, btif_a2dp_source_cb.StateStr()); + // Must stop first the audio streaming. + btif_a2dp_source_stop_audio_req(); + + do_in_main_thread(base::BindOnce(&btif_a2dp_source_cleanup_codec_delayed)); + if ((btif_a2dp_source_cb.State() == BtifA2dpSource::kStateRunning) || (btif_a2dp_source_cb.State() == BtifA2dpSource::kStateShuttingDown)) { btif_av_stream_stop(peer_address); } else { log::error("A2DP Source media task is not running"); } + if (bluetooth::audio::a2dp::is_hal_enabled()) { bluetooth::audio::a2dp::end_session(); } + + return true; } void btif_a2dp_source_allow_low_latency_audio(bool allowed) { log::info("allowed={}", allowed); - local_thread()->DoInThread( + do_in_main_thread( base::BindOnce(bluetooth::audio::a2dp::set_audio_low_latency_mode_allowed, allowed)); } @@ -561,22 +548,10 @@ void btif_a2dp_source_shutdown(std::promise<void> shutdown_complete_promise) { return; } - /* Make sure no channels are restarted while shutting down */ + // Make sure no channels are restarted while shutting down. btif_a2dp_source_cb.SetState(BtifA2dpSource::kStateShuttingDown); - // TODO(b/374166531) Remove the check for get_main_thread. - if (local_thread() != get_main_thread()) { - local_thread()->DoInThread(base::BindOnce(&btif_a2dp_source_shutdown_delayed, - std::move(shutdown_complete_promise))); - } else { - btif_a2dp_source_shutdown_delayed(std::move(shutdown_complete_promise)); - } -} - -static void btif_a2dp_source_shutdown_delayed(std::promise<void> shutdown_complete_promise) { - log::info("state={}", btif_a2dp_source_cb.StateStr()); - - // Stop the timer + // Stop the timer. btif_a2dp_source_cb.media_alarm.CancelAndWait(); wakelock_release(); @@ -676,13 +651,6 @@ static void btif_a2dp_source_setup_codec(const RawAddress& peer_address) { } } -static void btif_a2dp_source_cleanup_codec() { - log::info("state={}", btif_a2dp_source_cb.StateStr()); - // Must stop media task first before cleaning up the encoder - btif_a2dp_source_stop_audio_req(); - local_thread()->DoInThread(base::BindOnce(&btif_a2dp_source_cleanup_codec_delayed)); -} - static void btif_a2dp_source_cleanup_codec_delayed() { log::info("state={}", btif_a2dp_source_cb.StateStr()); if (btif_a2dp_source_cb.encoder_interface != nullptr) { @@ -694,13 +662,13 @@ static void btif_a2dp_source_cleanup_codec_delayed() { void btif_a2dp_source_start_audio_req(void) { log::info("state={}", btif_a2dp_source_cb.StateStr()); - local_thread()->DoInThread(base::BindOnce(&btif_a2dp_source_audio_tx_start_event)); + do_in_main_thread(base::BindOnce(&btif_a2dp_source_audio_tx_start_event)); } void btif_a2dp_source_stop_audio_req(void) { log::info("state={}", btif_a2dp_source_cb.StateStr()); - local_thread()->DoInThread(base::BindOnce(&btif_a2dp_source_audio_tx_stop_event)); + do_in_main_thread(base::BindOnce(&btif_a2dp_source_audio_tx_stop_event)); } void btif_a2dp_source_encoder_user_config_update_req( @@ -710,9 +678,9 @@ void btif_a2dp_source_encoder_user_config_update_req( log::info("peer_address={} state={} {} codec_preference(s)", peer_address, btif_a2dp_source_cb.StateStr(), codec_user_preferences.size()); - if (!local_thread()->DoInThread( - base::BindOnce(&btif_a2dp_source_encoder_user_config_update_event, peer_address, - codec_user_preferences, std::move(peer_ready_promise)))) { + if (do_in_main_thread(base::BindOnce(&btif_a2dp_source_encoder_user_config_update_event, + peer_address, codec_user_preferences, + std::move(peer_ready_promise))) != BT_STATUS_SUCCESS) { // cannot set promise but triggers crash log::fatal("peer_address={} state={} fails to context switch", peer_address, btif_a2dp_source_cb.StateStr()); @@ -755,7 +723,7 @@ static void btif_a2dp_source_encoder_user_config_update_event( void btif_a2dp_source_feeding_update_req(const btav_a2dp_codec_config_t& codec_audio_config) { log::info("state={}", btif_a2dp_source_cb.StateStr()); - local_thread()->DoInThread( + do_in_main_thread( base::BindOnce(&btif_a2dp_source_audio_feeding_update_event, codec_audio_config)); } @@ -963,8 +931,9 @@ static uint32_t btif_a2dp_source_read_callback(uint8_t* p_buf, uint32_t len) { btif_a2dp_source_cb.stats.media_read_total_underflow_count++; btif_a2dp_source_cb.stats.media_read_last_underflow_us = bluetooth::common::time_get_os_boottime_us(); - log_a2dp_audio_underrun_event(btif_av_source_active_peer(), - btif_a2dp_source_cb.encoder_interval_ms, len - bytes_read); + bluetooth::shim::LogMetricA2dpAudioUnderrunEvent(btif_av_source_active_peer(), + btif_a2dp_source_cb.encoder_interval_ms, + len - bytes_read); } return bytes_read; @@ -1016,9 +985,9 @@ static bool btif_a2dp_source_enqueue_callback(BT_HDR* p_buf, size_t frames_n, osi_free(p_data); } } - log_a2dp_audio_overrun_event(btif_av_source_active_peer(), - btif_a2dp_source_cb.encoder_interval_ms, drop_n, - num_dropped_encoded_frames, num_dropped_encoded_bytes); + bluetooth::shim::LogMetricA2dpAudioOverrunEvent( + btif_av_source_active_peer(), btif_a2dp_source_cb.encoder_interval_ms, drop_n, + num_dropped_encoded_frames, num_dropped_encoded_bytes); // Request additional debug info if we had to flush buffers RawAddress peer_bda = btif_av_source_active_peer(); @@ -1069,7 +1038,7 @@ static void btif_a2dp_source_audio_tx_flush_event(void) { static bool btif_a2dp_source_audio_tx_flush_req(void) { log::info("state={}", btif_a2dp_source_cb.StateStr()); - local_thread()->DoInThread(base::BindOnce(&btif_a2dp_source_audio_tx_flush_event)); + do_in_main_thread(base::BindOnce(&btif_a2dp_source_audio_tx_flush_event)); return true; } @@ -1308,12 +1277,12 @@ static void btif_a2dp_source_update_metrics(void) { } if (metrics.audio_duration_ms != -1) { - log_a2dp_session_metrics_event(btif_av_source_active_peer(), metrics.audio_duration_ms, - metrics.media_timer_min_ms, metrics.media_timer_max_ms, - metrics.media_timer_avg_ms, metrics.total_scheduling_count, - metrics.buffer_overruns_max_count, metrics.buffer_overruns_total, - metrics.buffer_underruns_average, metrics.buffer_underruns_count, - metrics.codec_index, metrics.is_a2dp_offload); + bluetooth::shim::LogMetricA2dpSessionMetricsEvent( + btif_av_source_active_peer(), metrics.audio_duration_ms, metrics.media_timer_min_ms, + metrics.media_timer_max_ms, metrics.media_timer_avg_ms, metrics.total_scheduling_count, + metrics.buffer_overruns_max_count, metrics.buffer_overruns_total, + metrics.buffer_underruns_average, metrics.buffer_underruns_count, metrics.codec_index, + metrics.is_a2dp_offload); } } @@ -1333,8 +1302,9 @@ static void btm_read_rssi_cb(void* data) { return; } - log_read_rssi_result(result->rem_bda, bluetooth::common::kUnknownConnectionHandle, - result->hci_status, result->rssi); + bluetooth::shim::LogMetricReadRssiResult(result->rem_bda, + bluetooth::common::kUnknownConnectionHandle, + result->hci_status, result->rssi); log::warn("device: {}, rssi: {}", result->rem_bda, result->rssi); } @@ -1350,9 +1320,9 @@ static void btm_read_failed_contact_counter_cb(void* data) { log::error("unable to read Failed Contact Counter (status {})", result->status); return; } - log_read_failed_contact_counter_result(result->rem_bda, - bluetooth::common::kUnknownConnectionHandle, - result->hci_status, result->failed_contact_counter); + bluetooth::shim::LogMetricReadFailedContactCounterResult( + result->rem_bda, bluetooth::common::kUnknownConnectionHandle, result->hci_status, + result->failed_contact_counter); log::warn("device: {}, Failed Contact Counter: {}", result->rem_bda, result->failed_contact_counter); @@ -1369,8 +1339,9 @@ static void btm_read_tx_power_cb(void* data) { log::error("unable to read Tx Power (status {})", result->status); return; } - log_read_tx_power_level_result(result->rem_bda, bluetooth::common::kUnknownConnectionHandle, - result->hci_status, result->tx_power); + bluetooth::shim::LogMetricReadTxPowerLevelResult(result->rem_bda, + bluetooth::common::kUnknownConnectionHandle, + result->hci_status, result->tx_power); log::warn("device: {}, Tx Power: {}", result->rem_bda, result->tx_power); } diff --git a/system/btif/src/btif_av.cc b/system/btif/src/btif_av.cc index e4f784a39c..2ee3be4c88 100644 --- a/system/btif/src/btif_av.cc +++ b/system/btif/src/btif_av.cc @@ -52,18 +52,17 @@ #include "btif/include/btif_a2dp_source.h" #include "btif/include/btif_av_co.h" #include "btif/include/btif_common.h" -#include "btif/include/btif_metrics_logging.h" #include "btif/include/btif_profile_queue.h" #include "btif/include/btif_rc.h" #include "btif/include/btif_util.h" #include "btif/include/stack_manager_t.h" -#include "btif_metrics_logging.h" #include "common/state_machine.h" #include "device/include/device_iot_conf_defs.h" #include "device/include/device_iot_config.h" #include "hardware/bluetooth.h" #include "hardware/bt_av.h" #include "include/hardware/bt_rc.h" +#include "main/shim/metrics_api.h" #include "osi/include/alarm.h" #include "osi/include/allocator.h" #include "osi/include/properties.h" @@ -1985,7 +1984,7 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event, void* p_data // incoming/outgoing connect/disconnect requests. log::warn("Peer {} : event={}: transitioning to Idle due to ACL Disconnect", peer_.PeerAddress(), BtifAvEvent::EventName(event)); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_ACL_DISCONNECTED, 1); btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_DISCONNECTED, bt_status_t::BT_STATUS_FAIL, BTA_AV_FAIL, @@ -1998,7 +1997,7 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event, void* p_data case BTA_AV_REJECT_EVT: log::warn("Peer {} : event={} flags={}", peer_.PeerAddress(), BtifAvEvent::EventName(event), peer_.FlagsToString()); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_REJECT_EVT, 1); btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_DISCONNECTED, bt_status_t::BT_STATUS_AUTH_REJECTED, BTA_AV_FAIL, @@ -2080,7 +2079,7 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event, void* p_data btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_CONNECTED, bt_status_t::BT_STATUS_SUCCESS, BTA_AV_SUCCESS, peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_SUCCESS, 1); } else { if (btif_rc_is_connected_peer(peer_.PeerAddress())) { @@ -2099,7 +2098,7 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event, void* p_data btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_DISCONNECTED, bt_status_t::BT_STATUS_FAIL, status, peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_FAILURE, 1); } @@ -2139,8 +2138,8 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event, void* p_data "Peer {} : event={} : device is already connecting, ignore Connect " "request", peer_.PeerAddress(), BtifAvEvent::EventName(event)); - log_counter_metrics_btif(android::bluetooth::CodePathCounterKeyEnum::A2DP_ALREADY_CONNECTING, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::A2DP_ALREADY_CONNECTING, 1); btif_queue_advance(); } break; @@ -2151,15 +2150,15 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event, void* p_data "Peer {} : event={} : device is already connecting, ignore incoming " "request", peer_.PeerAddress(), BtifAvEvent::EventName(event)); - log_counter_metrics_btif(android::bluetooth::CodePathCounterKeyEnum::A2DP_ALREADY_CONNECTING, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::A2DP_ALREADY_CONNECTING, 1); } break; case BTIF_AV_OFFLOAD_START_REQ_EVT: log::error("Peer {} : event={}: stream is not Opened", peer_.PeerAddress(), BtifAvEvent::EventName(event)); btif_a2dp_on_offload_started(peer_.PeerAddress(), BTA_AV_FAIL); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::A2DP_OFFLOAD_START_REQ_FAILURE, 1); break; @@ -2169,8 +2168,8 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event, void* p_data bt_status_t::BT_STATUS_FAIL, BTA_AV_FAIL, peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource); peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle); - log_counter_metrics_btif(android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_CLOSE, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_CLOSE, 1); DEVICE_IOT_CONFIG_ADDR_INT_ADD_ONE(peer_.PeerAddress(), IOT_CONF_KEY_A2DP_CONN_FAIL_COUNT); if (peer_.SelfInitiatedConnection()) { btif_queue_advance(); @@ -2184,7 +2183,7 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event, void* p_data peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource); peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle); DEVICE_IOT_CONFIG_ADDR_INT_ADD_ONE(peer_.PeerAddress(), IOT_CONF_KEY_A2DP_CONN_FAIL_COUNT); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_DISCONNECTED, 1); if (peer_.SelfInitiatedConnection()) { btif_queue_advance(); @@ -2203,7 +2202,7 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event, void* p_data CHECK_RC_EVENT(event, reinterpret_cast<tBTA_AV*>(p_data)); default: - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_UNKNOWN_EVENT, 1); log::warn("Peer {} : Unhandled event={}", peer_.PeerAddress(), BtifAvEvent::EventName(event)); return false; @@ -2400,12 +2399,10 @@ bool BtifAvStateMachine::StateOpened::ProcessEvent(uint32_t event, void* p_data) std::promise<void> peer_ready_promise; std::future<void> peer_ready_future = peer_ready_promise.get_future(); - if (com::android::bluetooth::flags::a2dp_clear_pending_start_on_session_restart()) { - // The stream may not be restarted without an explicit request from the - // Bluetooth Audio HAL. Any start request that was pending before the - // reconfiguration is invalidated when the session is ended. - peer_.ClearFlags(BtifAvPeer::kFlagPendingStart); - } + // The stream may not be restarted without an explicit request from the + // Bluetooth Audio HAL. Any start request that was pending before the + // reconfiguration is invalidated when the session is ended. + peer_.ClearFlags(BtifAvPeer::kFlagPendingStart); btif_a2dp_source_start_session(peer_.PeerAddress(), std::move(peer_ready_promise)); } @@ -2935,7 +2932,7 @@ static void btif_report_audio_state(const RawAddress& peer_address, btav_audio_s ? AudioCodingModeEnum::AUDIO_CODING_MODE_HARDWARE : AudioCodingModeEnum::AUDIO_CODING_MODE_SOFTWARE; - log_a2dp_playback_event(peer_address, playback_state, audio_coding_mode); + bluetooth::shim::LogMetricA2dpPlaybackEvent(peer_address, playback_state, audio_coding_mode); } void btif_av_report_source_codec_state( diff --git a/system/btif/src/btif_config.cc b/system/btif/src/btif_config.cc index 2ee8fe494d..9a0e50dea1 100644 --- a/system/btif/src/btif_config.cc +++ b/system/btif/src/btif_config.cc @@ -32,9 +32,10 @@ #include <unordered_map> #include "btif_keystore.h" -#include "btif_metrics_logging.h" #include "common/address_obfuscator.h" #include "main/shim/config.h" +#include "main/shim/metric_id_api.h" +#include "main/shim/metrics_api.h" #include "main/shim/shim.h" #include "storage/config_keys.h" #include "types/raw_address.h" @@ -111,7 +112,7 @@ static void init_metric_id_allocator() { // there is one metric id under this mac_address int id = 0; btif_config_get_int(addr_str, BTIF_STORAGE_KEY_METRICS_ID_KEY, &id); - if (is_valid_id_from_metric_id_allocator(id)) { + if (bluetooth::shim::IsValidIdFromMetricIdAllocator(id)) { paired_device_map[mac_address] = id; is_valid_id_found = true; } @@ -128,15 +129,15 @@ static void init_metric_id_allocator() { auto forget_device_callback = [](const RawAddress& address, const int /* id */) { return btif_config_remove(address.ToString(), BTIF_STORAGE_KEY_METRICS_ID_KEY); }; - if (!init_metric_id_allocator(paired_device_map, std::move(save_device_callback), - std::move(forget_device_callback))) { + if (!bluetooth::shim::InitMetricIdAllocator(paired_device_map, std::move(save_device_callback), + std::move(forget_device_callback))) { log::fatal("Failed to initialize MetricIdAllocator"); } // Add device_without_id for (auto& address : addresses_without_id) { - allocate_metric_id_from_metric_id_allocator(address); - save_metric_id_from_metric_id_allocator(address); + bluetooth::shim::AllocateIdFromMetricIdAllocator(address); + bluetooth::shim::SaveDeviceOnMetricIdAllocator(address); } } @@ -160,7 +161,7 @@ static future_t* clean_up(void) { "assert failed: bluetooth::shim::is_gd_stack_started_up()"); // GD storage module cleanup by itself std::unique_lock<std::recursive_mutex> lock(config_lock); - close_metric_id_allocator(); + bluetooth::shim::CloseMetricIdAllocator(); return future_new_immediate(FUTURE_SUCCESS); } diff --git a/system/btif/src/btif_dm.cc b/system/btif/src/btif_dm.cc index 96ed5848b1..e10606b9dd 100644 --- a/system/btif/src/btif_dm.cc +++ b/system/btif/src/btif_dm.cc @@ -57,7 +57,6 @@ #include "btif_api.h" #include "btif_bqr.h" #include "btif_config.h" -#include "btif_metrics_logging.h" #include "btif_sdp.h" #include "btif_storage.h" #include "btif_util.h" @@ -72,6 +71,8 @@ #include "main/shim/entry.h" #include "main/shim/helpers.h" #include "main/shim/le_advertising_manager.h" +#include "main/shim/metric_id_api.h" +#include "main/shim/metrics_api.h" #include "main_thread.h" #include "metrics/bluetooth_event.h" #include "os/system_properties.h" @@ -582,11 +583,11 @@ static void bond_state_changed(bt_status_t status, const RawAddress& bd_addr, state, pairing_cb.state, pairing_cb.sdp_attempts); if (state == BT_BOND_STATE_NONE) { - forget_device_from_metric_id_allocator(bd_addr); + bluetooth::shim::ForgetDeviceFromMetricIdAllocator(bd_addr); btif_config_remove_device(bd_addr.ToString()); } else if (state == BT_BOND_STATE_BONDED) { - allocate_metric_id_from_metric_id_allocator(bd_addr); - if (!save_metric_id_from_metric_id_allocator(bd_addr)) { + bluetooth::shim::AllocateIdFromMetricIdAllocator(bd_addr); + if (!bluetooth::shim::SaveDeviceOnMetricIdAllocator(bd_addr)) { log::error("Fail to save metric id for device:{}", bd_addr); } } @@ -1485,7 +1486,7 @@ static void btif_dm_search_devices_evt(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH* auto triple = eir_uuids_cache.try_emplace(bdaddr, std::set<Uuid>{}); uuid_iter = std::get<0>(triple); } - log::info("EIR UUIDs for {}:", bdaddr); + log::info("EIR UUIDs for {}", bdaddr); for (int i = 0; i < num_uuids; ++i) { Uuid uuid = Uuid::From16Bit(p_uuid16[i]); log::info("{}", uuid.ToString()); @@ -1608,7 +1609,7 @@ static void btif_on_service_discovery_results(RawAddress bd_addr, if (results_for_bonding_device) { // success for SDP bluetooth::metrics::LogSDPComplete(bd_addr, tBTA_STATUS::BTA_SUCCESS); - log::info("SDP finished for {}:", bd_addr); + log::info("SDP finished for {}", bd_addr); pairing_cb.sdp_over_classic = btif_dm_pairing_cb_t::ServiceDiscoveryState::FINISHED; } @@ -1619,7 +1620,7 @@ static void btif_on_service_discovery_results(RawAddress bd_addr, bt_property_t& le_prop = uuid_props[1]; if ((result == BTA_SUCCESS) && !uuids_param.empty()) { - log::info("New UUIDs for {}:", bd_addr); + log::info("New UUIDs for {}", bd_addr); for (const auto& uuid : uuids_param) { if (btif_should_ignore_uuid(uuid)) { continue; @@ -1757,7 +1758,7 @@ static void btif_on_gatt_results(RawAddress bd_addr, std::vector<bluetooth::Uuid bool lea_supported = is_le_audio_capable_during_service_discovery(bd_addr); if (is_transport_le) { - log::info("New GATT over LE UUIDs for {}:", bd_addr); + log::info("New GATT over LE UUIDs for {}", bd_addr); BTM_LogHistory(kBtmLogTag, bd_addr, "Discovered GATT services using LE transport"); if (btif_is_gatt_service_discovery_post_pairing(bd_addr)) { pairing_cb.gatt_over_le = btif_dm_pairing_cb_t::ServiceDiscoveryState::FINISHED; @@ -1785,7 +1786,7 @@ static void btif_on_gatt_results(RawAddress bd_addr, std::vector<bluetooth::Uuid } } } else { - log::debug("New GATT over SDP UUIDs for {}:", bd_addr); + log::debug("New GATT over SDP UUIDs for {}", bd_addr); BTM_LogHistory(kBtmLogTag, bd_addr, "Discovered GATT services using SDP transport"); } diff --git a/system/btif/src/btif_hf.cc b/system/btif/src/btif_hf.cc index 33fb900e07..178a1672e6 100644 --- a/system/btif/src/btif_hf.cc +++ b/system/btif/src/btif_hf.cc @@ -51,7 +51,6 @@ #include "bta/include/utl.h" #include "bta_ag_swb_aptx.h" #include "btif/include/btif_common.h" -#include "btif/include/btif_metrics_logging.h" #include "btif/include/btif_profile_queue.h" #include "btif/include/btif_util.h" #include "btm_api_types.h" @@ -390,7 +389,7 @@ static void btif_hf_upstreams_evt(uint16_t event, char* p_param) { p_data->open.status, btif_hf_cb[idx].connected_bda, p_data->open.bd_addr); bt_hf_callbacks->ConnectionStateCallback(BTHF_CONNECTION_STATE_DISCONNECTED, &(p_data->open.bd_addr)); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HFP_COLLISON_AT_AG_OPEN, 1); } break; @@ -412,7 +411,7 @@ static void btif_hf_upstreams_evt(uint16_t event, char* p_param) { btif_hf_cb[idx].connected_bda, p_data->open.bd_addr); bt_hf_callbacks->ConnectionStateCallback(BTHF_CONNECTION_STATE_DISCONNECTED, &(btif_hf_cb[idx].connected_bda)); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HFP_COLLISON_AT_CONNECTING, 1); reset_control_block(&btif_hf_cb[idx]); btif_queue_advance(); @@ -472,7 +471,7 @@ static void btif_hf_upstreams_evt(uint16_t event, char* p_param) { bt_hf_callbacks->ConnectionStateCallback(btif_hf_cb[idx].state, &connected_bda); } - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HFP_SELF_INITIATED_AG_FAILED, 1); btif_queue_advance(); if (btm_sec_is_a_bonded_dev(connected_bda)) { @@ -496,8 +495,8 @@ static void btif_hf_upstreams_evt(uint16_t event, char* p_param) { bt_hf_callbacks->ConnectionStateCallback(btif_hf_cb[idx].state, &connected_bda); if (failed_to_setup_slc) { log::error("failed to setup SLC for {}", connected_bda); - log_counter_metrics_btif(android::bluetooth::CodePathCounterKeyEnum::HFP_SLC_SETUP_FAILED, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HFP_SLC_SETUP_FAILED, 1); btif_queue_advance(); LogMetricHfpSlcFail(ToGdAddress(p_data->open.bd_addr)); DEVICE_IOT_CONFIG_ADDR_INT_ADD_ONE(btif_hf_cb[idx].connected_bda, @@ -881,7 +880,7 @@ public: bt_status_t DisconnectAudio(RawAddress* bd_addr) override; bt_status_t isNoiseReductionSupported(RawAddress* bd_addr) override; bt_status_t isVoiceRecognitionSupported(RawAddress* bd_addr) override; - bt_status_t StartVoiceRecognition(RawAddress* bd_addr) override; + bt_status_t StartVoiceRecognition(RawAddress* bd_addr, bool sendResult) override; bt_status_t StopVoiceRecognition(RawAddress* bd_addr) override; bt_status_t VolumeControl(bthf_volume_type_t type, int volume, RawAddress* bd_addr) override; bt_status_t DeviceStatusNotification(bthf_network_state_t ntk_state, bthf_service_type_t svc_type, @@ -1024,7 +1023,7 @@ bt_status_t HeadsetInterface::isVoiceRecognitionSupported(RawAddress* bd_addr) { return BT_STATUS_SUCCESS; } -bt_status_t HeadsetInterface::StartVoiceRecognition(RawAddress* bd_addr) { +bt_status_t HeadsetInterface::StartVoiceRecognition(RawAddress* bd_addr, bool sendResult) { CHECK_BTHF_INIT(); int idx = btif_hf_idx_by_bdaddr(bd_addr); if ((idx < 0) || (idx >= BTA_AG_MAX_NUM_CLIENTS)) { @@ -1040,9 +1039,11 @@ bt_status_t HeadsetInterface::StartVoiceRecognition(RawAddress* bd_addr) { return BT_STATUS_UNSUPPORTED; } btif_hf_cb[idx].is_during_voice_recognition = true; - tBTA_AG_RES_DATA ag_res = {}; - ag_res.state = true; - BTA_AgResult(btif_hf_cb[idx].handle, BTA_AG_BVRA_RES, ag_res); + if (sendResult) { + tBTA_AG_RES_DATA ag_res = {}; + ag_res.state = true; + BTA_AgResult(btif_hf_cb[idx].handle, BTA_AG_BVRA_RES, ag_res); + } return BT_STATUS_SUCCESS; } diff --git a/system/btif/src/btif_hh.cc b/system/btif/src/btif_hh.cc index 7288abe98c..36ad3d148e 100644 --- a/system/btif/src/btif_hh.cc +++ b/system/btif/src/btif_hh.cc @@ -48,7 +48,6 @@ #include "btif/include/btif_common.h" #include "btif/include/btif_dm.h" #include "btif/include/btif_hd.h" -#include "btif/include/btif_metrics_logging.h" #include "btif/include/btif_profile_storage.h" #include "btif/include/btif_storage.h" #include "btif/include/btif_util.h" @@ -56,6 +55,7 @@ #include "include/hardware/bt_hh.h" #include "internal_include/bt_target.h" #include "main/shim/dumpsys.h" +#include "main/shim/metrics_api.h" #include "osi/include/alarm.h" #include "osi/include/allocator.h" #include "stack/include/bt_hdr.h" @@ -468,7 +468,7 @@ static void btif_hh_incoming_connection_timeout(void* data) { handle); } log::warn("Reject unexpected incoming HID Connection, device: {}", conn.link_spec); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_COUNT_INCOMING_CONNECTION_REJECTED, 1); btif_hh_device_t* p_dev = btif_hh_find_dev_by_link_spec(conn.link_spec); @@ -529,7 +529,7 @@ static bool hh_add_device(const tAclLinkSpec& link_spec, tBTA_HH_ATTR_MASK attr_ } log::error("Out of space to add device"); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_COUNT_MAX_ADDED_DEVICE_LIMIT_REACHED, 1); return false; } @@ -633,7 +633,7 @@ static void hh_open_handler(tBTA_HH_CONN& conn) { log::warn("Reject Incoming HID Connection, device: {}, state: {}", conn.link_spec, bthh_connection_state_text(dev_status)); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_COUNT_INCOMING_CONNECTION_REJECTED, 1); if (p_dev != nullptr) { @@ -910,9 +910,10 @@ static void hh_vc_unplug_handler(tBTA_HH_CBDATA& dev_status) { BTHH_STATE_UPDATE(p_dev->link_spec, p_dev->dev_status); if (!p_dev->local_vup) { - log_counter_metrics_btif(android::bluetooth::CodePathCounterKeyEnum:: - HIDH_COUNT_VIRTUAL_UNPLUG_REQUESTED_BY_REMOTE_DEVICE, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum:: + HIDH_COUNT_VIRTUAL_UNPLUG_REQUESTED_BY_REMOTE_DEVICE, + 1); } // Remove the HID device @@ -1193,9 +1194,10 @@ bt_status_t btif_hh_connect(const tAclLinkSpec& link_spec) { if (!p_dev && btif_hh_cb.device_num >= BTIF_HH_MAX_HID) { // No space for more HID device now. log::warn("Error, exceeded the maximum supported HID device number {}", BTIF_HH_MAX_HID); - log_counter_metrics_btif(android::bluetooth::CodePathCounterKeyEnum:: - HIDH_COUNT_CONNECT_REQ_WHEN_MAX_DEVICE_LIMIT_REACHED, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum:: + HIDH_COUNT_CONNECT_REQ_WHEN_MAX_DEVICE_LIMIT_REACHED, + 1); return BT_STATUS_NOMEM; } @@ -2030,7 +2032,7 @@ static bt_status_t get_report(RawAddress* bd_addr, tBLE_ADDR_TYPE addr_type, return BT_STATUS_DEVICE_NOT_FOUND; } else if (((int)reportType) <= BTA_HH_RPTT_RESRV || ((int)reportType) > BTA_HH_RPTT_FEATURE) { log::error("report type={} not supported", reportType); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_COUNT_WRONG_REPORT_TYPE, 1); return BT_STATUS_UNSUPPORTED; } else { @@ -2102,7 +2104,7 @@ static bt_status_t set_report(RawAddress* bd_addr, tBLE_ADDR_TYPE addr_type, return BT_STATUS_DEVICE_NOT_FOUND; } else if (((int)reportType) <= BTA_HH_RPTT_RESRV || ((int)reportType) > BTA_HH_RPTT_FEATURE) { log::error("report type={} not supported", reportType); - log_counter_metrics_btif( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_COUNT_WRONG_REPORT_TYPE, 1); return BT_STATUS_UNSUPPORTED; } else { diff --git a/system/btif/src/btif_metrics_logging.cc b/system/btif/src/btif_metrics_logging.cc deleted file mode 100644 index e116cebe28..0000000000 --- a/system/btif/src/btif_metrics_logging.cc +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "btif/include/btif_metrics_logging.h" - -#include <frameworks/proto_logging/stats/enums/bluetooth/enums.pb.h> -#include <frameworks/proto_logging/stats/enums/bluetooth/hci/enums.pb.h> - -#include "main/shim/metrics_api.h" -#include "types/raw_address.h" - -void log_a2dp_audio_underrun_event(const RawAddress& address, uint64_t encoding_interval_millis, - int num_missing_pcm_bytes) { - bluetooth::shim::LogMetricA2dpAudioUnderrunEvent(address, encoding_interval_millis, - num_missing_pcm_bytes); -} - -void log_a2dp_audio_overrun_event(const RawAddress& address, uint64_t encoding_interval_millis, - int num_dropped_buffers, int num_dropped_encoded_frames, - int num_dropped_encoded_bytes) { - bluetooth::shim::LogMetricA2dpAudioOverrunEvent(address, encoding_interval_millis, - num_dropped_buffers, num_dropped_encoded_frames, - num_dropped_encoded_bytes); -} - -void log_a2dp_playback_event(const RawAddress& address, int playback_state, int audio_coding_mode) { - bluetooth::shim::LogMetricA2dpPlaybackEvent(address, playback_state, audio_coding_mode); -} - -void log_a2dp_session_metrics_event(const RawAddress& address, int64_t audio_duration_ms, - int media_timer_min_ms, int media_timer_max_ms, - int media_timer_avg_ms, int total_scheduling_count, - int buffer_overruns_max_count, int buffer_overruns_total, - float buffer_underruns_average, int buffer_underruns_count, - int64_t codec_index, bool is_a2dp_offload) { - bluetooth::shim::LogMetricA2dpSessionMetricsEvent( - address, audio_duration_ms, media_timer_min_ms, media_timer_max_ms, media_timer_avg_ms, - total_scheduling_count, buffer_overruns_max_count, buffer_overruns_total, - buffer_underruns_average, buffer_underruns_count, codec_index, is_a2dp_offload); -} - -void log_read_rssi_result(const RawAddress& address, uint16_t handle, uint32_t cmd_status, - int8_t rssi) { - bluetooth::shim::LogMetricReadRssiResult(address, handle, cmd_status, rssi); -} - -void log_read_failed_contact_counter_result(const RawAddress& address, uint16_t handle, - uint32_t cmd_status, int32_t failed_contact_counter) { - bluetooth::shim::LogMetricReadFailedContactCounterResult(address, handle, cmd_status, - failed_contact_counter); -} - -void log_read_tx_power_level_result(const RawAddress& address, uint16_t handle, uint32_t cmd_status, - int32_t transmit_power_level) { - bluetooth::shim::LogMetricReadTxPowerLevelResult(address, handle, cmd_status, - transmit_power_level); -} - -void log_socket_connection_state(const RawAddress& address, int port, int type, - android::bluetooth::SocketConnectionstateEnum connection_state, - int64_t tx_bytes, int64_t rx_bytes, int uid, int server_port, - android::bluetooth::SocketRoleEnum socket_role) { - bluetooth::shim::LogMetricSocketConnectionState(address, port, type, connection_state, tx_bytes, - rx_bytes, uid, server_port, socket_role); -} - -void log_counter_metrics_btif(android::bluetooth::CodePathCounterKeyEnum key, int64_t value) { - bluetooth::shim::CountCounterMetrics(key, value); -} - -bool init_metric_id_allocator(const std::unordered_map<RawAddress, int>& paired_device_map, - bluetooth::shim::CallbackLegacy save_device_callback, - bluetooth::shim::CallbackLegacy forget_device_callback) { - return bluetooth::shim::InitMetricIdAllocator(paired_device_map, std::move(save_device_callback), - std::move(forget_device_callback)); -} - -bool close_metric_id_allocator() { return bluetooth::shim::CloseMetricIdAllocator(); } - -int allocate_metric_id_from_metric_id_allocator(const RawAddress& address) { - return bluetooth::shim::AllocateIdFromMetricIdAllocator(address); -} - -int save_metric_id_from_metric_id_allocator(const RawAddress& address) { - return bluetooth::shim::SaveDeviceOnMetricIdAllocator(address); -} - -void forget_device_from_metric_id_allocator(const RawAddress& address) { - bluetooth::shim::ForgetDeviceFromMetricIdAllocator(address); -} - -bool is_valid_id_from_metric_id_allocator(const int id) { - return bluetooth::shim::IsValidIdFromMetricIdAllocator(id); -} diff --git a/system/btif/src/btif_sock.cc b/system/btif/src/btif_sock.cc index d58326e571..dae8f745c2 100644 --- a/system/btif/src/btif_sock.cc +++ b/system/btif/src/btif_sock.cc @@ -177,7 +177,8 @@ static bt_status_t btsock_listen(btsock_type_t type, const char* service_name, RawAddress::kEmpty, type, channel, app_uid, data_path, hub_id, endpoint_id, max_rx_packet_size); btif_sock_connection_logger(RawAddress::kEmpty, 0, type, SOCKET_CONNECTION_STATE_LISTENING, - SOCKET_ROLE_LISTEN, app_uid, channel, 0, 0, service_name); + SOCKET_ROLE_LISTEN, app_uid, channel, 0, 0, service_name, 0, + BTSOCK_ERROR_NONE, data_path); switch (type) { case BTSOCK_RFCOMM: status = btsock_rfc_listen(service_name, service_uuid, channel, sock_fd, flags, app_uid, @@ -207,7 +208,8 @@ static bt_status_t btsock_listen(btsock_type_t type, const char* service_name, "channel: {}, app_uid: {}", RawAddress::kEmpty, type, channel, app_uid); btif_sock_connection_logger(RawAddress::kEmpty, 0, type, SOCKET_CONNECTION_STATE_DISCONNECTED, - SOCKET_ROLE_LISTEN, app_uid, channel, 0, 0, service_name); + SOCKET_ROLE_LISTEN, app_uid, channel, 0, 0, service_name, 0, + BTSOCK_ERROR_LISTEN_FAILURE, data_path); } return status; } @@ -227,9 +229,9 @@ static bt_status_t btsock_connect(const RawAddress* bd_addr, btsock_type_t type, *sock_fd = INVALID_FD; bt_status_t status = BT_STATUS_SOCKET_ERROR; - btif_sock_connection_logger(*bd_addr, 0, type, SOCKET_CONNECTION_STATE_CONNECTING, - SOCKET_ROLE_CONNECTION, app_uid, channel, 0, 0, - uuid ? uuid->ToString().c_str() : ""); + btif_sock_connection_logger( + *bd_addr, 0, type, SOCKET_CONNECTION_STATE_CONNECTING, SOCKET_ROLE_CONNECTION, app_uid, + channel, 0, 0, uuid ? uuid->ToString().c_str() : "", 0, BTSOCK_ERROR_NONE, data_path); switch (type) { case BTSOCK_RFCOMM: status = btsock_rfc_connect(bd_addr, uuid, channel, sock_fd, flags, app_uid, data_path, @@ -261,7 +263,8 @@ static bt_status_t btsock_connect(const RawAddress* bd_addr, btsock_type_t type, *bd_addr, type, channel, app_uid); btif_sock_connection_logger(*bd_addr, 0, type, SOCKET_CONNECTION_STATE_DISCONNECTED, SOCKET_ROLE_CONNECTION, app_uid, channel, 0, 0, - uuid ? uuid->ToString().c_str() : ""); + uuid ? uuid->ToString().c_str() : "", 0, + BTSOCK_ERROR_CONNECTION_FAILURE, data_path); } return status; } diff --git a/system/btif/src/btif_sock_l2cap.cc b/system/btif/src/btif_sock_l2cap.cc index d607ff3b74..3867727cdb 100644 --- a/system/btif/src/btif_sock_l2cap.cc +++ b/system/btif/src/btif_sock_l2cap.cc @@ -35,6 +35,7 @@ #include "btif/include/btif_sock_thread.h" #include "btif/include/btif_sock_util.h" #include "btif/include/btif_uid.h" +#include "common/time_util.h" #include "gd/os/rand.h" #include "include/hardware/bluetooth.h" #include "internal_include/bt_target.h" @@ -92,6 +93,7 @@ typedef struct l2cap_socket { uint64_t hub_id; // ID of the hub to which the end point belongs uint64_t endpoint_id; // ID of the hub end point bool is_accepting; // is app accepting on server socket? + uint64_t connection_start_time_ms; // Timestamp when the connection state started } l2cap_socket; static void btsock_l2cap_server_listen(l2cap_socket* sock); @@ -238,7 +240,7 @@ static l2cap_socket* btsock_l2cap_find_by_conn_uuid_l(Uuid& conn_uuid) { return nullptr; } -static void btsock_l2cap_free_l(l2cap_socket* sock) { +static void btsock_l2cap_free_l(l2cap_socket* sock, btsock_error_code_t error_code) { uint8_t* buf; l2cap_socket* t = socks; @@ -258,7 +260,8 @@ static void btsock_l2cap_free_l(l2cap_socket* sock) { sock->addr, sock->id, sock->is_le_coc ? BTSOCK_L2CAP_LE : BTSOCK_L2CAP, SOCKET_CONNECTION_STATE_DISCONNECTED, sock->server ? SOCKET_ROLE_LISTEN : SOCKET_ROLE_CONNECTION, sock->app_uid, sock->channel, - sock->tx_bytes, sock->rx_bytes, sock->name); + sock->tx_bytes, sock->rx_bytes, sock->name, sock->connection_start_time_ms, error_code, + sock->data_path); if (com::android::bluetooth::flags::socket_settings_api()) { if (sock->data_path == BTSOCK_DATA_PATH_HARDWARE_OFFLOAD && !sock->server && sock->socket_id != 0) { @@ -359,6 +362,7 @@ static l2cap_socket* btsock_l2cap_alloc_l(const char* name, const RawAddress* ad sock->hub_id = 0; sock->endpoint_id = 0; sock->is_accepting = false; + sock->connection_start_time_ms = 0; if (name) { strncpy(sock->name, name, sizeof(sock->name) - 1); @@ -418,7 +422,7 @@ bt_status_t btsock_l2cap_cleanup() { std::unique_lock<std::mutex> lock(state_lock); pth = -1; while (socks) { - btsock_l2cap_free_l(socks); + btsock_l2cap_free_l(socks, BTSOCK_ERROR_NONE); } return BT_STATUS_SUCCESS; } @@ -500,7 +504,7 @@ static void on_srv_l2cap_listen_started(tBTA_JV_L2CAP_START* p_start, uint32_t i if (p_start->status != tBTA_JV_STATUS::SUCCESS) { log::error("Unable to start l2cap server socket_id:{}", sock->id); - btsock_l2cap_free_l(sock); + btsock_l2cap_free_l(sock, BTSOCK_ERROR_SERVER_START_FAILURE); return; } @@ -510,17 +514,17 @@ static void on_srv_l2cap_listen_started(tBTA_JV_L2CAP_START* p_start, uint32_t i "Listening for L2CAP connection for device: {}, channel: {}, app_uid: " "{}, id: {}, is_le: {}", sock->addr, sock->channel, sock->app_uid, sock->id, sock->is_le_coc); - btif_sock_connection_logger(sock->addr, sock->id, - sock->is_le_coc ? BTSOCK_L2CAP_LE : BTSOCK_L2CAP, - SOCKET_CONNECTION_STATE_LISTENING, - sock->server ? SOCKET_ROLE_LISTEN : SOCKET_ROLE_CONNECTION, - sock->app_uid, sock->channel, 0, 0, sock->name); + btif_sock_connection_logger( + sock->addr, sock->id, sock->is_le_coc ? BTSOCK_L2CAP_LE : BTSOCK_L2CAP, + SOCKET_CONNECTION_STATE_LISTENING, + sock->server ? SOCKET_ROLE_LISTEN : SOCKET_ROLE_CONNECTION, sock->app_uid, sock->channel, + 0, 0, sock->name, 0, BTSOCK_ERROR_NONE, sock->data_path); if (!sock->server_psm_sent) { if (!send_app_psm_or_chan_l(sock)) { // closed log::info("Unable to send socket to application socket_id:{}", sock->id); - btsock_l2cap_free_l(sock); + btsock_l2cap_free_l(sock, BTSOCK_ERROR_SEND_TO_APP_FAILURE); } else { sock->server_psm_sent = true; } @@ -539,7 +543,7 @@ static void on_cl_l2cap_init(tBTA_JV_L2CAP_CL_INIT* p_init, uint32_t id) { if (p_init->status != tBTA_JV_STATUS::SUCCESS) { log::error("Initialization status failed socket_id:{}", id); - btsock_l2cap_free_l(sock); + btsock_l2cap_free_l(sock, BTSOCK_ERROR_CLIENT_INIT_FAILURE); return; } @@ -589,11 +593,12 @@ static void on_srv_l2cap_psm_connect_l(tBTA_JV_L2CAP_OPEN* p_open, l2cap_socket* "id: {}, is_le: {}, socket_id: {}, rx_mtu: {}", accept_rs->addr, accept_rs->channel, accept_rs->app_uid, accept_rs->id, accept_rs->is_le_coc, accept_rs->socket_id, accept_rs->rx_mtu); - btif_sock_connection_logger(accept_rs->addr, accept_rs->id, - accept_rs->is_le_coc ? BTSOCK_L2CAP_LE : BTSOCK_L2CAP, - SOCKET_CONNECTION_STATE_CONNECTED, - accept_rs->server ? SOCKET_ROLE_LISTEN : SOCKET_ROLE_CONNECTION, - accept_rs->app_uid, accept_rs->channel, 0, 0, accept_rs->name); + btif_sock_connection_logger( + accept_rs->addr, accept_rs->id, accept_rs->is_le_coc ? BTSOCK_L2CAP_LE : BTSOCK_L2CAP, + SOCKET_CONNECTION_STATE_CONNECTED, + accept_rs->server ? SOCKET_ROLE_LISTEN : SOCKET_ROLE_CONNECTION, accept_rs->app_uid, + accept_rs->channel, 0, 0, accept_rs->name, 0, BTSOCK_ERROR_NONE, accept_rs->data_path); + accept_rs->connection_start_time_ms = common::time_gettimeofday_us() / 1000; // start monitor the socket btsock_thread_add_fd(pth, sock->our_fd, BTSOCK_L2CAP, SOCK_THREAD_FD_EXCEPTION, sock->id); @@ -638,11 +643,12 @@ static void on_cl_l2cap_psm_connect_l(tBTA_JV_L2CAP_OPEN* p_open, l2cap_socket* "id: {}, is_le: {}, socket_id: {}, rx_mtu: {}", sock->addr, sock->channel, sock->app_uid, sock->id, sock->is_le_coc, sock->socket_id, sock->rx_mtu); - btif_sock_connection_logger(sock->addr, sock->id, - sock->is_le_coc ? BTSOCK_L2CAP_LE : BTSOCK_L2CAP, - SOCKET_CONNECTION_STATE_CONNECTED, - sock->server ? SOCKET_ROLE_LISTEN : SOCKET_ROLE_CONNECTION, - sock->app_uid, sock->channel, 0, 0, sock->name); + btif_sock_connection_logger( + sock->addr, sock->id, sock->is_le_coc ? BTSOCK_L2CAP_LE : BTSOCK_L2CAP, + SOCKET_CONNECTION_STATE_CONNECTED, + sock->server ? SOCKET_ROLE_LISTEN : SOCKET_ROLE_CONNECTION, sock->app_uid, sock->channel, + 0, 0, sock->name, 0, BTSOCK_ERROR_NONE, sock->data_path); + sock->connection_start_time_ms = common::time_gettimeofday_us() / 1000; // start monitoring the socketpair to get call back when app writing data btsock_thread_add_fd(pth, sock->our_fd, BTSOCK_L2CAP, SOCK_THREAD_FD_RD, sock->id); @@ -679,7 +685,7 @@ static void on_l2cap_connect(tBTA_JV* p_data, uint32_t id) { } } else { log::error("Unable to open socket after receiving connection socket_id:{}", sock->id); - btsock_l2cap_free_l(sock); + btsock_l2cap_free_l(sock, BTSOCK_ERROR_OPEN_FAILURE); } } @@ -697,11 +703,11 @@ static void on_l2cap_close(tBTA_JV_L2CAP_CLOSE* p_close, uint32_t id) { "Disconnecting from L2CAP connection for device: {}, channel: {}, " "app_uid: {}, id: {}, is_le: {}", sock->addr, sock->channel, sock->app_uid, sock->id, sock->is_le_coc); - btif_sock_connection_logger(sock->addr, sock->id, - sock->is_le_coc ? BTSOCK_L2CAP_LE : BTSOCK_L2CAP, - SOCKET_CONNECTION_STATE_DISCONNECTING, - sock->server ? SOCKET_ROLE_LISTEN : SOCKET_ROLE_CONNECTION, - sock->app_uid, sock->channel, 0, 0, sock->name); + btif_sock_connection_logger( + sock->addr, sock->id, sock->is_le_coc ? BTSOCK_L2CAP_LE : BTSOCK_L2CAP, + SOCKET_CONNECTION_STATE_DISCONNECTING, + sock->server ? SOCKET_ROLE_LISTEN : SOCKET_ROLE_CONNECTION, sock->app_uid, sock->channel, + 0, 0, sock->name, 0, BTSOCK_ERROR_NONE, sock->data_path); if (com::android::bluetooth::flags::donot_push_error_code_to_app_when_connected()) { if (!sock->connected) { if (!send_app_err_code(sock, p_close->reason)) { @@ -720,7 +726,7 @@ static void on_l2cap_close(tBTA_JV_L2CAP_CLOSE* p_close, uint32_t id) { if (sock->server) { BTA_JvFreeChannel(sock->channel, tBTA_JV_CONN_TYPE::L2CAP); } - btsock_l2cap_free_l(sock); + btsock_l2cap_free_l(sock, BTSOCK_ERROR_NONE); } static void on_l2cap_outgoing_congest(tBTA_JV_L2CAP_CONG* p, uint32_t id) { @@ -786,7 +792,7 @@ static void on_l2cap_data_ind(tBTA_JV* /* evt */, uint32_t id) { } else { // connection must be dropped log::warn("Closing socket as unable to push data to socket socket_id:{}", sock->id); BTA_JvL2capClose(sock->handle); - btsock_l2cap_free_l(sock); + btsock_l2cap_free_l(sock, BTSOCK_ERROR_RECEIVE_DATA_FAILURE); return; } } @@ -1151,6 +1157,7 @@ static bool btsock_l2cap_read_signaled_on_listen_socket(int fd, int /* flags */, static void btsock_l2cap_signaled_flagged(int fd, int flags, uint32_t user_id) { char drop_it = false; + btsock_error_code_t error_code = BTSOCK_ERROR_NONE; /* We use MSG_DONTWAIT when sending data to JAVA, hence it can be accepted to * hold the lock. */ @@ -1163,11 +1170,13 @@ static void btsock_l2cap_signaled_flagged(int fd, int flags, uint32_t user_id) { if (!sock->server) { // app sending data on connection socket if (!btsock_l2cap_read_signaled_on_connected_socket(fd, flags, user_id, sock)) { + error_code = BTSOCK_ERROR_READ_SIGNALED_FAILURE; drop_it = true; } } else { // app sending signal on listen socket if (!btsock_l2cap_read_signaled_on_listen_socket(fd, flags, user_id, sock)) { + error_code = BTSOCK_ERROR_READ_SIGNALED_FAILURE; drop_it = true; } } @@ -1181,7 +1190,7 @@ static void btsock_l2cap_signaled_flagged(int fd, int flags, uint32_t user_id) { if (drop_it || (flags & SOCK_THREAD_FD_EXCEPTION)) { int size = 0; if (drop_it || ioctl(sock->our_fd, FIONREAD, &size) != 0 || size == 0) { - btsock_l2cap_free_l(sock); + btsock_l2cap_free_l(sock, error_code); } } } @@ -1192,6 +1201,7 @@ void btsock_l2cap_signaled(int fd, int flags, uint32_t user_id) { return; } char drop_it = false; + btsock_error_code_t error_code = BTSOCK_ERROR_NONE; /* We use MSG_DONTWAIT when sending data to JAVA, hence it can be accepted to * hold the lock. */ @@ -1238,6 +1248,7 @@ void btsock_l2cap_signaled(int fd, int flags, uint32_t user_id) { BTA_JvL2capWrite(sock->handle, PTR_TO_UINT(buffer), buffer, user_id); } } else { + error_code = BTSOCK_ERROR_READ_SIGNALED_FAILURE; drop_it = true; } } @@ -1250,7 +1261,7 @@ void btsock_l2cap_signaled(int fd, int flags, uint32_t user_id) { if (drop_it || (flags & SOCK_THREAD_FD_EXCEPTION)) { int size = 0; if (drop_it || ioctl(sock->our_fd, FIONREAD, &size) != 0 || size == 0) { - btsock_l2cap_free_l(sock); + btsock_l2cap_free_l(sock, error_code); } } } @@ -1269,7 +1280,7 @@ bt_status_t btsock_l2cap_disconnect(const RawAddress* bd_addr) { while (sock) { l2cap_socket* next = sock->next; if (sock->addr == *bd_addr) { - btsock_l2cap_free_l(sock); + btsock_l2cap_free_l(sock, BTSOCK_ERROR_NONE); } sock = next; } @@ -1343,7 +1354,7 @@ void on_btsocket_l2cap_opened_complete(uint64_t socket_id, bool success) { } if (!success) { log::error("L2CAP opened complete failed with socket_id:{}", socket_id); - btsock_l2cap_free_l(sock); + btsock_l2cap_free_l(sock, BTSOCK_ERROR_OPEN_FAILURE); return; } // If the socket was accepted from listen socket, use listen_fd. @@ -1368,11 +1379,12 @@ void on_btsocket_l2cap_opened_complete(uint64_t socket_id, bool success) { "is_le: {}, socket_id: {}, rx_mtu: {}", sock->addr, sock->channel, sock->app_uid, sock->id, sock->is_le_coc, sock->socket_id, sock->rx_mtu); - btif_sock_connection_logger(sock->addr, sock->id, - sock->is_le_coc ? BTSOCK_L2CAP_LE : BTSOCK_L2CAP, - SOCKET_CONNECTION_STATE_CONNECTED, - sock->server ? SOCKET_ROLE_LISTEN : SOCKET_ROLE_CONNECTION, - sock->app_uid, sock->channel, 0, 0, sock->name); + btif_sock_connection_logger( + sock->addr, sock->id, sock->is_le_coc ? BTSOCK_L2CAP_LE : BTSOCK_L2CAP, + SOCKET_CONNECTION_STATE_CONNECTED, + sock->server ? SOCKET_ROLE_LISTEN : SOCKET_ROLE_CONNECTION, sock->app_uid, + sock->channel, 0, 0, sock->name, 0, BTSOCK_ERROR_NONE, sock->data_path); + sock->connection_start_time_ms = common::time_gettimeofday_us() / 1000; log::info("Connected l2cap socket socket_id:{}", sock->id); sock->connected = true; @@ -1389,7 +1401,7 @@ void on_btsocket_l2cap_close(uint64_t socket_id) { return; } log::info("L2CAP close request for socket_id:{}", socket_id); - btsock_l2cap_free_l(sock); + btsock_l2cap_free_l(sock, BTSOCK_ERROR_NONE); } static void on_cl_l2cap_psm_connect_offload_l(tBTA_JV_L2CAP_OPEN* p_open, l2cap_socket* sock) { @@ -1407,11 +1419,12 @@ static void on_cl_l2cap_psm_connect_offload_l(tBTA_JV_L2CAP_OPEN* p_open, l2cap_ "id: {}, is_le: {}, socket_id: {}, rx_mtu: {}", sock->addr, sock->channel, sock->app_uid, sock->id, sock->is_le_coc, sock->socket_id, sock->rx_mtu); - btif_sock_connection_logger(sock->addr, sock->id, - sock->is_le_coc ? BTSOCK_L2CAP_LE : BTSOCK_L2CAP, - SOCKET_CONNECTION_STATE_CONNECTED, - sock->server ? SOCKET_ROLE_LISTEN : SOCKET_ROLE_CONNECTION, - sock->app_uid, sock->channel, 0, 0, sock->name); + btif_sock_connection_logger( + sock->addr, sock->id, sock->is_le_coc ? BTSOCK_L2CAP_LE : BTSOCK_L2CAP, + SOCKET_CONNECTION_STATE_CONNECTED, + sock->server ? SOCKET_ROLE_LISTEN : SOCKET_ROLE_CONNECTION, sock->app_uid, sock->channel, + 0, 0, sock->name, 0, BTSOCK_ERROR_NONE, sock->data_path); + sock->connection_start_time_ms = common::time_gettimeofday_us() / 1000; bluetooth::hal::SocketContext socket_context = { .socket_id = sock->socket_id, @@ -1426,7 +1439,7 @@ static void on_cl_l2cap_psm_connect_offload_l(tBTA_JV_L2CAP_OPEN* p_open, l2cap_ }; if (!bluetooth::shim::GetLppOffloadManager()->SocketOpened(socket_context)) { log::warn("L2CAP socket opened failed. Disconnect the incoming connection."); - btsock_l2cap_free_l(sock); + btsock_l2cap_free_l(sock, BTSOCK_ERROR_OFFLOAD_HAL_OPEN_FAILURE); } else { log::info( "L2CAP socket opened successful. Will send connect signal in " @@ -1470,11 +1483,12 @@ static void on_srv_l2cap_psm_connect_offload_l(tBTA_JV_L2CAP_OPEN* p_open, l2cap "id: {}, is_le: {}, socket_id: {}, rx_mtu: {}", accept_rs->addr, accept_rs->channel, accept_rs->app_uid, accept_rs->id, accept_rs->is_le_coc, accept_rs->socket_id, accept_rs->rx_mtu); - btif_sock_connection_logger(accept_rs->addr, accept_rs->id, - accept_rs->is_le_coc ? BTSOCK_L2CAP_LE : BTSOCK_L2CAP, - SOCKET_CONNECTION_STATE_CONNECTED, - accept_rs->server ? SOCKET_ROLE_LISTEN : SOCKET_ROLE_CONNECTION, - accept_rs->app_uid, accept_rs->channel, 0, 0, accept_rs->name); + btif_sock_connection_logger( + accept_rs->addr, accept_rs->id, accept_rs->is_le_coc ? BTSOCK_L2CAP_LE : BTSOCK_L2CAP, + SOCKET_CONNECTION_STATE_CONNECTED, + accept_rs->server ? SOCKET_ROLE_LISTEN : SOCKET_ROLE_CONNECTION, accept_rs->app_uid, + accept_rs->channel, 0, 0, accept_rs->name, 0, BTSOCK_ERROR_NONE, accept_rs->data_path); + accept_rs->connection_start_time_ms = common::time_gettimeofday_us() / 1000; bluetooth::hal::SocketContext socket_context = { .socket_id = accept_rs->socket_id, @@ -1489,10 +1503,10 @@ static void on_srv_l2cap_psm_connect_offload_l(tBTA_JV_L2CAP_OPEN* p_open, l2cap }; if (!sock->is_accepting) { log::warn("Server socket is not accepting. Disconnect the incoming connection."); - btsock_l2cap_free_l(accept_rs); + btsock_l2cap_free_l(accept_rs, BTSOCK_ERROR_OFFLOAD_SERVER_NOT_ACCEPTING); } else if (!bluetooth::shim::GetLppOffloadManager()->SocketOpened(socket_context)) { log::warn("L2CAP socket opened failed. Disconnect the incoming connection."); - btsock_l2cap_free_l(accept_rs); + btsock_l2cap_free_l(accept_rs, BTSOCK_ERROR_OFFLOAD_HAL_OPEN_FAILURE); } else { log::info("L2CAP socket opened successful. Will send connect signal in async callback."); } diff --git a/system/btif/src/btif_sock_logging.cc b/system/btif/src/btif_sock_logging.cc index acb38f7de5..8847daa7f1 100644 --- a/system/btif/src/btif_sock_logging.cc +++ b/system/btif/src/btif_sock_logging.cc @@ -23,8 +23,9 @@ #include <atomic> -#include "btif/include/btif_metrics_logging.h" #include "btif/include/btif_sock.h" +#include "common/time_util.h" +#include "main/shim/metrics_api.h" #include "types/raw_address.h" #define SOCK_LOGGER_SIZE_MAX 16 @@ -50,11 +51,15 @@ static SockConnectionEvent connection_logger[SOCK_LOGGER_SIZE_MAX]; static android::bluetooth::SocketConnectionstateEnum toConnectionStateEnum(int state); static android::bluetooth::SocketRoleEnum toSocketRoleEnum(int role); +static android::bluetooth::SocketErrorEnum toSocketErrorEnum(btsock_error_code_t error_code); +static uint64_t getConnectionDuration(uint64_t start_time_ms); void btif_sock_connection_logger(const RawAddress& address, int port, int type, int state, int role, int uid, int server_port, int64_t tx_bytes, int64_t rx_bytes, - const char* server_name) { - log::verbose("bd_addr: {}, port: {}, role: {}, state: {}", address, port, role, state); + const char* server_name, uint64_t connection_start_time_ms, + btsock_error_code_t error_code, btsock_data_path_t data_path) { + log::verbose("bd_addr: {}, port: {}, role: {}, state: {}, data_path: {}", address, port, role, + state, data_path); uint8_t index = logger_index++ % SOCK_LOGGER_SIZE_MAX; @@ -74,8 +79,10 @@ void btif_sock_connection_logger(const RawAddress& address, int port, int type, } clock_gettime(CLOCK_REALTIME, &connection_logger[index].timestamp); - log_socket_connection_state(address, port, type, toConnectionStateEnum(state), tx_bytes, rx_bytes, - uid, server_port, toSocketRoleEnum(role)); + bluetooth::shim::LogMetricSocketConnectionState( + address, port, type, toConnectionStateEnum(state), tx_bytes, rx_bytes, uid, server_port, + toSocketRoleEnum(role), getConnectionDuration(connection_start_time_ms), + toSocketErrorEnum(error_code), data_path == BTSOCK_DATA_PATH_HARDWARE_OFFLOAD); } void btif_sock_dump(int fd) { @@ -192,3 +199,54 @@ static android::bluetooth::SocketRoleEnum toSocketRoleEnum(int role) { } return android::bluetooth::SOCKET_ROLE_UNKNOWN; } + +static android::bluetooth::SocketErrorEnum toSocketErrorEnum(btsock_error_code_t error_code) { + switch (error_code) { + case BTSOCK_ERROR_NONE: + return android::bluetooth::SocketErrorEnum::SOCKET_ERROR_NONE; + case BTSOCK_ERROR_SERVER_START_FAILURE: + return android::bluetooth::SocketErrorEnum::SOCKET_ERROR_SERVER_START_FAILURE; + case BTSOCK_ERROR_CLIENT_INIT_FAILURE: + return android::bluetooth::SocketErrorEnum::SOCKET_ERROR_CLIENT_INIT_FAILURE; + case BTSOCK_ERROR_LISTEN_FAILURE: + return android::bluetooth::SocketErrorEnum::SOCKET_ERROR_LISTEN_FAILURE; + case BTSOCK_ERROR_CONNECTION_FAILURE: + return android::bluetooth::SocketErrorEnum::SOCKET_ERROR_CONNECTION_FAILURE; + case BTSOCK_ERROR_OPEN_FAILURE: + return android::bluetooth::SocketErrorEnum::SOCKET_ERROR_OPEN_FAILURE; + case BTSOCK_ERROR_OFFLOAD_SERVER_NOT_ACCEPTING: + return android::bluetooth::SocketErrorEnum::SOCKET_ERROR_OFFLOAD_SERVER_NOT_ACCEPTING; + case BTSOCK_ERROR_OFFLOAD_HAL_OPEN_FAILURE: + return android::bluetooth::SocketErrorEnum::SOCKET_ERROR_OFFLOAD_HAL_OPEN_FAILURE; + case BTSOCK_ERROR_SEND_TO_APP_FAILURE: + return android::bluetooth::SocketErrorEnum::SOCKET_ERROR_SEND_TO_APP_FAILURE; + case BTSOCK_ERROR_RECEIVE_DATA_FAILURE: + return android::bluetooth::SocketErrorEnum::SOCKET_ERROR_RECEIVE_DATA_FAILURE; + case BTSOCK_ERROR_READ_SIGNALED_FAILURE: + return android::bluetooth::SocketErrorEnum::SOCKET_ERROR_READ_SIGNALED_FAILURE; + case BTSOCK_ERROR_WRITE_SIGNALED_FAILURE: + return android::bluetooth::SocketErrorEnum::SOCKET_ERROR_WRITE_SIGNALED_FAILURE; + case BTSOCK_ERROR_SEND_SCN_FAILURE: + return android::bluetooth::SocketErrorEnum::SOCKET_ERROR_SEND_SCN_FAILURE; + case BTSOCK_ERROR_SCN_ALLOCATION_FAILURE: + return android::bluetooth::SocketErrorEnum::SOCKET_ERROR_SCN_ALLOCATION_FAILURE; + case BTSOCK_ERROR_ADD_SDP_FAILURE: + return android::bluetooth::SocketErrorEnum::SOCKET_ERROR_ADD_SDP_FAILURE; + case BTSOCK_ERROR_SDP_DISCOVERY_FAILURE: + return android::bluetooth::SocketErrorEnum::SOCKET_ERROR_SDP_DISCOVERY_FAILURE; + } + return android::bluetooth::SocketErrorEnum::SOCKET_ERROR_NONE; +} + +static uint64_t getConnectionDuration(uint64_t start_time_ms) { + // start time is 0 before the connection state, use 0 for duration + if (start_time_ms == 0) { + return 0; + } + uint64_t current_time_ms = common::time_gettimeofday_us() / 1000; + if (current_time_ms <= start_time_ms) { + log::warn("Socket connection end time is not greater than start time, logging 0 ms instead"); + return 0; + } + return current_time_ms - start_time_ms; +} diff --git a/system/btif/src/btif_sock_rfc.cc b/system/btif/src/btif_sock_rfc.cc index 929ce8a3cc..1ea4bf9981 100644 --- a/system/btif/src/btif_sock_rfc.cc +++ b/system/btif/src/btif_sock_rfc.cc @@ -33,7 +33,6 @@ #include "bta/include/bta_jv_co.h" #include "bta/include/bta_rfcomm_metrics.h" #include "bta/include/bta_rfcomm_scn.h" -#include "btif/include/btif_metrics_logging.h" #include "btif/include/btif_sock.h" #include "btif/include/btif_sock_l2cap.h" #include "btif/include/btif_sock_logging.h" @@ -45,6 +44,7 @@ #include "include/hardware/bt_sock.h" #include "lpp/lpp_offload_interface.h" #include "main/shim/entry.h" +#include "main/shim/metrics_api.h" #include "osi/include/allocator.h" #include "osi/include/compat.h" #include "osi/include/list.h" @@ -106,6 +106,7 @@ typedef struct { uint64_t hub_id; // ID of the hub to which the end point belongs uint64_t endpoint_id; // ID of the hub end point bool is_accepting; // is app accepting on server socket? + uint64_t connection_start_time_ms; // Timestamp when the connection state started } rfc_slot_t; static rfc_slot_t rfc_slots[MAX_RFC_CHANNEL]; @@ -115,7 +116,7 @@ static std::recursive_mutex slot_lock; static uid_set_t* uid_set = NULL; static rfc_slot_t* find_free_slot(void); -static void cleanup_rfc_slot(rfc_slot_t* rs); +static void cleanup_rfc_slot(rfc_slot_t* rs, btsock_error_code_t error_code); static void jv_dm_cback(tBTA_JV_EVT event, tBTA_JV* p_data, uint32_t id); static uint32_t rfcomm_cback(tBTA_JV_EVT event, tBTA_JV* p_data, uint32_t rfcomm_slot_id); static bool send_app_scn(rfc_slot_t* rs); @@ -152,7 +153,7 @@ void btsock_rfc_cleanup(void) { std::unique_lock<std::recursive_mutex> lock(slot_lock); for (size_t i = 0; i < ARRAY_SIZE(rfc_slots); ++i) { if (rfc_slots[i].id) { - cleanup_rfc_slot(&rfc_slots[i]); + cleanup_rfc_slot(&rfc_slots[i], BTSOCK_ERROR_NONE); } list_free(rfc_slots[i].incoming_queue); rfc_slots[i].incoming_queue = NULL; @@ -251,6 +252,7 @@ static rfc_slot_t* alloc_rfc_slot(const RawAddress* addr, const char* name, cons slot->hub_id = 0; slot->endpoint_id = 0; slot->is_accepting = false; + slot->connection_start_time_ms = 0; slot->is_service_uuid_valid = !uuid.IsEmpty(); slot->service_uuid = uuid; @@ -466,13 +468,13 @@ bt_status_t btsock_rfc_connect(const RawAddress* bd_addr, const Uuid* service_uu if (ret != tBTA_JV_STATUS::SUCCESS) { log::error("unable to initiate RFCOMM connection. status:{}, scn:{}, bd_addr:{}", bta_jv_status_text(ret), slot->scn, slot->addr); - cleanup_rfc_slot(slot); + cleanup_rfc_slot(slot, BTSOCK_ERROR_CONNECTION_FAILURE); return BT_STATUS_SOCKET_ERROR; } if (!send_app_scn(slot)) { log::error("send_app_scn() failed, closing slot_id:{}", slot->id); - cleanup_rfc_slot(slot); + cleanup_rfc_slot(slot, BTSOCK_ERROR_SEND_SCN_FAILURE); return BT_STATUS_SOCKET_ERROR; } } else { @@ -535,7 +537,7 @@ static void free_rfc_slot_scn(rfc_slot_t* slot) { slot->scn = 0; } -static void cleanup_rfc_slot(rfc_slot_t* slot) { +static void cleanup_rfc_slot(rfc_slot_t* slot, btsock_error_code_t error_code) { if (slot->fd != INVALID_FD) { shutdown(slot->fd, SHUT_RDWR); close(slot->fd); @@ -547,7 +549,8 @@ static void cleanup_rfc_slot(rfc_slot_t* slot) { slot->addr, slot->id, BTSOCK_RFCOMM, SOCKET_CONNECTION_STATE_DISCONNECTED, slot->f.server ? SOCKET_ROLE_LISTEN : SOCKET_ROLE_CONNECTION, slot->app_uid, slot->scn, slot->tx_bytes, slot->rx_bytes, - slot->role ? slot->service_name : slot->service_uuid.ToString().c_str()); + slot->role ? slot->service_name : slot->service_uuid.ToString().c_str(), + slot->connection_start_time_ms, error_code, slot->data_path); slot->fd = INVALID_FD; @@ -625,7 +628,7 @@ static void on_cl_rfc_init(tBTA_JV_RFCOMM_CL_INIT* p_init, uint32_t id) { } else if (p_init->status != tBTA_JV_STATUS::SUCCESS) { log::warn("INIT unsuccessful, status {}. Cleaning up slot_id {}", bta_jv_status_text(p_init->status), slot->id); - cleanup_rfc_slot(slot); + cleanup_rfc_slot(slot, BTSOCK_ERROR_CLIENT_INIT_FAILURE); } else { slot->rfc_handle = p_init->handle; } @@ -640,7 +643,7 @@ static void on_srv_rfc_listen_started(tBTA_JV_RFCOMM_START* p_start, uint32_t id } else if (p_start->status != tBTA_JV_STATUS::SUCCESS) { log::warn("START unsuccessful, status {}. Cleaning up slot_id {}", bta_jv_status_text(p_start->status), slot->id); - cleanup_rfc_slot(slot); + cleanup_rfc_slot(slot, BTSOCK_ERROR_SERVER_START_FAILURE); return; } @@ -649,10 +652,10 @@ static void on_srv_rfc_listen_started(tBTA_JV_RFCOMM_START* p_start, uint32_t id "listening for RFCOMM socket connections for device: {}, scn: {}, " "app_uid: {}, id: {}", slot->addr, slot->scn, slot->app_uid, id); - btif_sock_connection_logger(slot->addr, slot->id, BTSOCK_RFCOMM, - SOCKET_CONNECTION_STATE_LISTENING, - slot->f.server ? SOCKET_ROLE_LISTEN : SOCKET_ROLE_CONNECTION, - slot->app_uid, slot->scn, 0, 0, slot->service_name); + btif_sock_connection_logger( + slot->addr, slot->id, BTSOCK_RFCOMM, SOCKET_CONNECTION_STATE_LISTENING, + slot->f.server ? SOCKET_ROLE_LISTEN : SOCKET_ROLE_CONNECTION, slot->app_uid, slot->scn, 0, + 0, slot->service_name, 0, BTSOCK_ERROR_NONE, slot->data_path); } static uint32_t on_srv_rfc_connect_offload(tBTA_JV_RFCOMM_SRV_OPEN* p_open, rfc_slot_t* srv_rs) { @@ -670,7 +673,9 @@ static uint32_t on_srv_rfc_connect_offload(tBTA_JV_RFCOMM_SRV_OPEN* p_open, rfc_ btif_sock_connection_logger(accept_rs->addr, accept_rs->id, BTSOCK_RFCOMM, SOCKET_CONNECTION_STATE_CONNECTED, accept_rs->f.server ? SOCKET_ROLE_LISTEN : SOCKET_ROLE_CONNECTION, - accept_rs->app_uid, accept_rs->scn, 0, 0, accept_rs->service_name); + accept_rs->app_uid, accept_rs->scn, 0, 0, accept_rs->service_name, 0, + BTSOCK_ERROR_NONE, accept_rs->data_path); + accept_rs->connection_start_time_ms = common::time_gettimeofday_us() / 1000; bluetooth::hal::SocketContext socket_context = { .socket_id = accept_rs->socket_id, @@ -685,10 +690,10 @@ static uint32_t on_srv_rfc_connect_offload(tBTA_JV_RFCOMM_SRV_OPEN* p_open, rfc_ }; if (!srv_rs->is_accepting) { log::warn("Server socket is not accepting. Disconnect the incoming connection."); - cleanup_rfc_slot(accept_rs); + cleanup_rfc_slot(accept_rs, BTSOCK_ERROR_OFFLOAD_SERVER_NOT_ACCEPTING); } else if (!bluetooth::shim::GetLppOffloadManager()->SocketOpened(socket_context)) { log::warn("RFCOMM socket opened failed. Disconnect the incoming connection."); - cleanup_rfc_slot(accept_rs); + cleanup_rfc_slot(accept_rs, BTSOCK_ERROR_OFFLOAD_HAL_OPEN_FAILURE); } else { log::info("RFCOMM socket opened successful. Will send connect signal in async callback."); } @@ -728,7 +733,9 @@ static uint32_t on_srv_rfc_connect(tBTA_JV_RFCOMM_SRV_OPEN* p_open, uint32_t id) btif_sock_connection_logger(accept_rs->addr, accept_rs->id, BTSOCK_RFCOMM, SOCKET_CONNECTION_STATE_CONNECTED, accept_rs->f.server ? SOCKET_ROLE_LISTEN : SOCKET_ROLE_CONNECTION, - accept_rs->app_uid, accept_rs->scn, 0, 0, accept_rs->service_name); + accept_rs->app_uid, accept_rs->scn, 0, 0, accept_rs->service_name, 0, + BTSOCK_ERROR_NONE, accept_rs->data_path); + accept_rs->connection_start_time_ms = common::time_gettimeofday_us() / 1000; // Start monitoring the socket. btsock_thread_add_fd(pth, srv_rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_EXCEPTION, srv_rs->id); @@ -755,7 +762,8 @@ static void on_cli_rfc_connect_offload(tBTA_JV_RFCOMM_OPEN* p_open, rfc_slot_t* btif_sock_connection_logger( slot->addr, slot->id, BTSOCK_RFCOMM, SOCKET_CONNECTION_STATE_CONNECTED, slot->f.server ? SOCKET_ROLE_LISTEN : SOCKET_ROLE_CONNECTION, slot->app_uid, slot->scn, 0, - 0, slot->service_uuid.ToString().c_str()); + 0, slot->service_uuid.ToString().c_str(), 0, BTSOCK_ERROR_NONE, slot->data_path); + slot->connection_start_time_ms = common::time_gettimeofday_us() / 1000; bluetooth::hal::SocketContext socket_context = { .socket_id = slot->socket_id, @@ -770,7 +778,7 @@ static void on_cli_rfc_connect_offload(tBTA_JV_RFCOMM_OPEN* p_open, rfc_slot_t* }; if (!bluetooth::shim::GetLppOffloadManager()->SocketOpened(socket_context)) { log::warn("RFCOMM socket opened failed. Disconnect the incoming connection."); - cleanup_rfc_slot(slot); + cleanup_rfc_slot(slot, BTSOCK_ERROR_OFFLOAD_HAL_OPEN_FAILURE); } else { log::info( "RFCOMM socket opened successful. Will send connect signal in " @@ -790,7 +798,7 @@ static void on_cli_rfc_connect(tBTA_JV_RFCOMM_OPEN* p_open, uint32_t id) { if (p_open->status != tBTA_JV_STATUS::SUCCESS) { log::warn("CONNECT unsuccessful, status {}. Cleaning up slot_id {}", bta_jv_status_text(p_open->status), slot->id); - cleanup_rfc_slot(slot); + cleanup_rfc_slot(slot, BTSOCK_ERROR_CONNECTION_FAILURE); return; } @@ -811,7 +819,8 @@ static void on_cli_rfc_connect(tBTA_JV_RFCOMM_OPEN* p_open, uint32_t id) { btif_sock_connection_logger( slot->addr, slot->id, BTSOCK_RFCOMM, SOCKET_CONNECTION_STATE_CONNECTED, slot->f.server ? SOCKET_ROLE_LISTEN : SOCKET_ROLE_CONNECTION, slot->app_uid, slot->scn, 0, - 0, slot->service_uuid.ToString().c_str()); + 0, slot->service_uuid.ToString().c_str(), 0, BTSOCK_ERROR_NONE, slot->data_path); + slot->connection_start_time_ms = common::time_gettimeofday_us() / 1000; if (send_app_connect_signal(slot->fd, &slot->addr, slot->scn, 0, -1, slot->socket_id)) { slot->f.connected = true; @@ -847,7 +856,7 @@ void on_btsocket_rfc_opened_complete(uint64_t socket_id, bool success) { } if (!success) { log::error("RFCOMM opened complete failed with socket_id: {}", socket_id); - cleanup_rfc_slot(slot); + cleanup_rfc_slot(slot, BTSOCK_ERROR_OPEN_FAILURE); return; } // If the socket was accepted from listen socket, use listen_fd. @@ -877,7 +886,7 @@ void on_btsocket_rfc_close(uint64_t socket_id) { return; } log::info("RFCOMM close request for socket_id: {}", socket_id); - cleanup_rfc_slot(slot); + cleanup_rfc_slot(slot, BTSOCK_ERROR_NONE); } // TODO(b/380189525): Replace the randomized socket ID with static counter when we don't have @@ -900,12 +909,13 @@ static void on_rfc_close(tBTA_JV_RFCOMM_CLOSE* /* p_close */, uint32_t id) { log::warn("RFCOMM slot with id {} not found.", id); return; } - log_socket_connection_state(slot->addr, slot->id, BTSOCK_RFCOMM, - android::bluetooth::SOCKET_CONNECTION_STATE_DISCONNECTING, 0, 0, - slot->app_uid, slot->scn, - slot->f.server ? android::bluetooth::SOCKET_ROLE_LISTEN - : android::bluetooth::SOCKET_ROLE_CONNECTION); - cleanup_rfc_slot(slot); + bluetooth::shim::LogMetricSocketConnectionState( + slot->addr, slot->id, BTSOCK_RFCOMM, + android::bluetooth::SOCKET_CONNECTION_STATE_DISCONNECTING, 0, 0, slot->app_uid, slot->scn, + slot->f.server ? android::bluetooth::SOCKET_ROLE_LISTEN + : android::bluetooth::SOCKET_ROLE_CONNECTION, + 0, android::bluetooth::SOCKET_ERROR_NONE, slot->data_path); + cleanup_rfc_slot(slot, BTSOCK_ERROR_NONE); } static void on_rfc_write_done(tBTA_JV_RFCOMM_WRITE* p, uint32_t id) { @@ -1010,7 +1020,7 @@ static void jv_dm_cback(tBTA_JV_EVT event, tBTA_JV* p_data, uint32_t id) { if (p_data->scn == 0) { log::error("Unable to allocate scn: all resources exhausted. slot found: {}", std::format_ptr(rs)); - cleanup_rfc_slot(rs); + cleanup_rfc_slot(rs, BTSOCK_ERROR_SCN_ALLOCATION_FAILURE); break; } @@ -1018,7 +1028,7 @@ static void jv_dm_cback(tBTA_JV_EVT event, tBTA_JV* p_data, uint32_t id) { // Send channel ID to java layer if (!send_app_scn(rs)) { log::warn("send_app_scn() failed, closing rs->id:{}", rs->id); - cleanup_rfc_slot(rs); + cleanup_rfc_slot(rs, BTSOCK_ERROR_SEND_SCN_FAILURE); break; } @@ -1071,7 +1081,7 @@ static void jv_dm_cback(tBTA_JV_EVT event, tBTA_JV* p_data, uint32_t id) { if (!create_server_sdp_record(slot)) { log::error("cannot start server, slot found: {}", std::format_ptr(slot)); - cleanup_rfc_slot(slot); + cleanup_rfc_slot(slot, BTSOCK_ERROR_ADD_SDP_FAILURE); break; } @@ -1137,7 +1147,7 @@ static void handle_discovery_comp(tBTA_JV_STATUS status, int scn, uint32_t id) { id, bta_jv_status_text(status), scn); bta_collect_rfc_metrics_after_sdp_fail(status, slot->addr, slot->app_uid, slot->security, static_cast<bool>(slot->f.server), sdp_duration_ms); - cleanup_rfc_slot(slot); + cleanup_rfc_slot(slot, BTSOCK_ERROR_SDP_DISCOVERY_FAILURE); return; } @@ -1159,7 +1169,7 @@ static void handle_discovery_comp(tBTA_JV_STATUS status, int scn, uint32_t id) { if (BTA_JvRfcommConnect(slot->security, scn, slot->addr, rfcomm_cback, slot->id, cfg, slot->app_uid, sdp_duration_ms) != tBTA_JV_STATUS::SUCCESS) { log::warn("BTA_JvRfcommConnect() returned BTA_JV_FAILURE for RFCOMM slot_id:{}", id); - cleanup_rfc_slot(slot); + cleanup_rfc_slot(slot, BTSOCK_ERROR_CONNECTION_FAILURE); return; } // Establish connection if successfully found channel number to connect. @@ -1168,7 +1178,7 @@ static void handle_discovery_comp(tBTA_JV_STATUS status, int scn, uint32_t id) { if (!send_app_scn(slot)) { log::warn("send_app_scn() failed, closing slot_id {}", slot->id); - cleanup_rfc_slot(slot); + cleanup_rfc_slot(slot, BTSOCK_ERROR_SEND_SCN_FAILURE); return; } } @@ -1276,6 +1286,7 @@ static bool btsock_rfc_read_signaled_on_listen_socket(int fd, int /* flags */, u static void btsock_rfc_signaled_flagged(int fd, int flags, uint32_t id) { bool need_close = false; + btsock_error_code_t error_code = BTSOCK_ERROR_NONE; std::unique_lock<std::recursive_mutex> lock(slot_lock); rfc_slot_t* slot = find_rfc_slot_by_id(id); if (!slot) { @@ -1289,11 +1300,13 @@ static void btsock_rfc_signaled_flagged(int fd, int flags, uint32_t id) { // app sending data on connection socket if (!btsock_rfc_read_signaled_on_connected_socket(fd, flags, id, slot)) { need_close = true; + error_code = BTSOCK_ERROR_READ_SIGNALED_FAILURE; } } else { // app sending signal on listen socket if (!btsock_rfc_read_signaled_on_listen_socket(fd, flags, id, slot)) { need_close = true; + error_code = BTSOCK_ERROR_READ_SIGNALED_FAILURE; } } } @@ -1306,6 +1319,7 @@ static void btsock_rfc_signaled_flagged(int fd, int flags, uint32_t id) { "slot_id: {}, channel: {}", slot->id, slot->scn); need_close = true; + error_code = BTSOCK_ERROR_WRITE_SIGNALED_FAILURE; } } @@ -1317,7 +1331,7 @@ static void btsock_rfc_signaled_flagged(int fd, int flags, uint32_t id) { slot->f.doing_sdp_request) { BTA_JvCancelDiscovery(slot->id); } - cleanup_rfc_slot(slot); + cleanup_rfc_slot(slot, error_code); } } } @@ -1328,6 +1342,7 @@ void btsock_rfc_signaled(int fd, int flags, uint32_t id) { return; } bool need_close = false; + btsock_error_code_t error_code = BTSOCK_ERROR_NONE; std::unique_lock<std::recursive_mutex> lock(slot_lock); rfc_slot_t* slot = find_rfc_slot_by_id(id); if (!slot) { @@ -1346,6 +1361,7 @@ void btsock_rfc_signaled(int fd, int flags, uint32_t id) { } else { log::error("socket signaled for read while disconnected, slot_id: {}, channel: {}", slot->id, slot->scn); + error_code = BTSOCK_ERROR_READ_SIGNALED_FAILURE; need_close = true; } } @@ -1357,6 +1373,7 @@ void btsock_rfc_signaled(int fd, int flags, uint32_t id) { "socket signaled for write while disconnected (or write failure), " "slot_id: {}, channel: {}", slot->id, slot->scn); + error_code = BTSOCK_ERROR_WRITE_SIGNALED_FAILURE; need_close = true; } } @@ -1369,7 +1386,7 @@ void btsock_rfc_signaled(int fd, int flags, uint32_t id) { slot->f.doing_sdp_request) { BTA_JvCancelDiscovery(slot->id); } - cleanup_rfc_slot(slot); + cleanup_rfc_slot(slot, error_code); } } } @@ -1403,7 +1420,7 @@ int bta_co_rfc_data_incoming(uint32_t id, BT_HDR* p_buf) { case SENT_FAILED: osi_free(p_buf); - cleanup_rfc_slot(slot); + cleanup_rfc_slot(slot, BTSOCK_ERROR_SEND_TO_APP_FAILURE); break; } } else { @@ -1428,7 +1445,7 @@ int bta_co_rfc_data_outgoing_size(uint32_t id, int* size) { if (ioctl(slot->fd, FIONREAD, size) != 0) { log::error("unable to determine bytes remaining to be read on fd {}: {}", slot->fd, strerror(errno)); - cleanup_rfc_slot(slot); + cleanup_rfc_slot(slot, BTSOCK_ERROR_RECEIVE_DATA_FAILURE); return false; } @@ -1448,7 +1465,7 @@ int bta_co_rfc_data_outgoing(uint32_t id, uint8_t* buf, uint16_t size) { if (received != size) { log::error("error receiving RFCOMM data from app: {}", strerror(errno)); - cleanup_rfc_slot(slot); + cleanup_rfc_slot(slot, BTSOCK_ERROR_RECEIVE_DATA_FAILURE); return false; } @@ -1465,7 +1482,7 @@ bt_status_t btsock_rfc_disconnect(const RawAddress* bd_addr) { std::unique_lock<std::recursive_mutex> lock(slot_lock); for (size_t i = 0; i < ARRAY_SIZE(rfc_slots); ++i) { if (rfc_slots[i].id && rfc_slots[i].addr == *bd_addr) { - cleanup_rfc_slot(&rfc_slots[i]); + cleanup_rfc_slot(&rfc_slots[i], BTSOCK_ERROR_NONE); } } diff --git a/system/btif/test/btif_core_test.cc b/system/btif/test/btif_core_test.cc index 7342a17b99..3073bd194c 100644 --- a/system/btif/test/btif_core_test.cc +++ b/system/btif/test/btif_core_test.cc @@ -207,7 +207,8 @@ class BtifCoreTest : public ::testing::Test { protected: void SetUp() override { callback_map_.clear(); - bluetooth::hci::testing::mock_controller_ = &controller_; + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); bluetooth::testing::set_hal_cbacks(&callbacks); auto promise = std::promise<void>(); auto future = promise.get_future(); @@ -223,17 +224,17 @@ protected: callback_map_["callback_thread_event"] = [&promise]() { promise.set_value(); }; CleanCoreInterface(); ASSERT_EQ(std::future_status::ready, future.wait_for(timeout_time)); - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); callback_map_.erase("callback_thread_event"); } - bluetooth::hci::testing::MockControllerInterface controller_; }; class BtifCoreWithControllerTest : public BtifCoreTest { protected: void SetUp() override { BtifCoreTest::SetUp(); - ON_CALL(controller_, SupportsSniffSubrating).WillByDefault(Return(true)); + ON_CALL(*bluetooth::hci::testing::mock_controller_, SupportsSniffSubrating) + .WillByDefault(Return(true)); } void TearDown() override { BtifCoreTest::TearDown(); } @@ -761,12 +762,13 @@ class BtifCoreWithVendorSupportTest : public BtifCoreWithControllerTest { protected: void SetUp() override { BtifCoreWithControllerTest::SetUp(); - bluetooth::hci::testing::mock_hci_layer_ = &hci_; + bluetooth::hci::testing::mock_hci_layer_ = + std::make_unique<bluetooth::hci::testing::MockHciLayer>(); test::mock::osi_properties::osi_property_get.body = get_properties; std::promise<void> configuration_promise; auto configuration_done = configuration_promise.get_future(); - EXPECT_CALL(hci_, + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, EnqueueCommand(_, Matcher<ContextualOnceCallback<void(CommandCompleteView)>>(_))) .WillOnce( // Replace with real PDL for 0xfc17 @@ -784,7 +786,7 @@ protected: configuration_promise.set_value(); }) .RetiresOnSaturation(); - EXPECT_CALL(hci_, + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, EnqueueCommand(_, Matcher<ContextualOnceCallback<void(CommandCompleteView)>>(_))) .WillOnce([](std::unique_ptr<CommandBuilder> cmd, ContextualOnceCallback<void(CommandCompleteView)> callback) { @@ -798,7 +800,8 @@ protected: callback(response); }) .RetiresOnSaturation(); - EXPECT_CALL(hci_, RegisterVendorSpecificEventHandler(VseSubeventCode::BQR_EVENT, _)) + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, + RegisterVendorSpecificEventHandler(VseSubeventCode::BQR_EVENT, _)) .WillOnce(SaveArg<1>(&this->vse_callback_)); do_in_main_thread(BindOnce([]() { bluetooth::bqr::EnableBtQualityReport(get_main()); })); ASSERT_EQ(std::future_status::ready, configuration_done.wait_for(std::chrono::seconds(1))); @@ -808,18 +811,18 @@ protected: std::promise<void> disable_promise; auto disable_future = disable_promise.get_future(); auto set_promise = [&disable_promise]() { disable_promise.set_value(); }; - EXPECT_CALL(hci_, UnregisterVendorSpecificEventHandler(VseSubeventCode::BQR_EVENT)); - EXPECT_CALL(hci_, + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, + UnregisterVendorSpecificEventHandler(VseSubeventCode::BQR_EVENT)); + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, EnqueueCommand(_, Matcher<ContextualOnceCallback<void(CommandCompleteView)>>(_))) .WillOnce(Invoke(set_promise)) .RetiresOnSaturation(); do_in_main_thread(BindOnce([]() { bluetooth::bqr::DisableBtQualityReport(); })); ASSERT_EQ(std::future_status::ready, disable_future.wait_for(std::chrono::seconds(1))); - bluetooth::hci::testing::mock_hci_layer_ = nullptr; + bluetooth::hci::testing::mock_hci_layer_.reset(); BtifCoreWithControllerTest::TearDown(); } - bluetooth::hci::testing::MockHciLayer hci_; ContextualCallback<void(VendorSpecificEventView)> vse_callback_; }; diff --git a/system/common/Android.bp b/system/common/Android.bp index 98e99e6d7b..c192613dbc 100644 --- a/system/common/Android.bp +++ b/system/common/Android.bp @@ -77,9 +77,7 @@ cc_test { srcs: [ "address_obfuscator_unittest.cc", "base_bind_unittest.cc", - "id_generator_unittest.cc", "leaky_bonded_queue_unittest.cc", - "lru_unittest.cc", "message_loop_thread_unittest.cc", "repeating_timer_unittest.cc", "state_machine_unittest.cc", diff --git a/system/common/BUILD.gn b/system/common/BUILD.gn index a1884973dd..50ec9c1dd0 100644 --- a/system/common/BUILD.gn +++ b/system/common/BUILD.gn @@ -30,7 +30,6 @@ static_library("common") { include_dirs = [ "//bt/system/", "//bt/system/stack/include", - "//bt/system/linux_include", ] deps = [ diff --git a/system/common/id_generator.h b/system/common/id_generator.h deleted file mode 100644 index 7c6425aeef..0000000000 --- a/system/common/id_generator.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include <array> - -/* Helper class generating N unique ids, from 0 to N-1 */ -template <std::size_t N> -class IdGenerator { -public: - static int ALL_USED; - - IdGenerator() : in_use_{} {} - - /* Returns next free id, or ALL_USED if no ids left */ - int GetNext() { - for (std::size_t i = 0; i < N; i++) { - if (!in_use_[i]) { - in_use_[i] = true; - return i; - } - } - return ALL_USED; - } - - /* Release given ID */ - void Release(int id) { in_use_[id] = false; } - -private: - std::array<bool, N> in_use_; -}; - -template <std::size_t N> -int IdGenerator<N>::ALL_USED = -1; diff --git a/system/common/id_generator_unittest.cc b/system/common/id_generator_unittest.cc deleted file mode 100644 index 7b090cf365..0000000000 --- a/system/common/id_generator_unittest.cc +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "common/id_generator.h" - -#include <gtest/gtest.h> - -TEST(IdGeneratorTest, sanity_test) { - IdGenerator<5> generator; - ASSERT_EQ(0, generator.GetNext()); - ASSERT_EQ(1, generator.GetNext()); - ASSERT_EQ(2, generator.GetNext()); - ASSERT_EQ(3, generator.GetNext()); - ASSERT_EQ(4, generator.GetNext()); - ASSERT_EQ(generator.ALL_USED, generator.GetNext()); - - generator.Release(3); - ASSERT_EQ(3, generator.GetNext()); - - generator.Release(0); - generator.Release(2); - ASSERT_EQ(0, generator.GetNext()); - ASSERT_EQ(2, generator.GetNext()); -} diff --git a/system/common/lru.h b/system/common/lru.h deleted file mode 100644 index ca0a5a1c35..0000000000 --- a/system/common/lru.h +++ /dev/null @@ -1,187 +0,0 @@ -/****************************************************************************** - * - * Copyright 2020 Google, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -#pragma once - -#include <bluetooth/log.h> - -#include <functional> -#include <iterator> -#include <list> -#include <mutex> -#include <optional> -#include <thread> -#include <unordered_map> - -namespace bluetooth { - -namespace common { - -template <typename K, typename V> -class LegacyLruCache { -public: - using Node = std::pair<K, V>; - /** - * Constructor of the cache - * - * @param capacity maximum size of the cache - * @param log_tag, keyword to put at the head of log. - */ - LegacyLruCache(const size_t& capacity, const std::string& log_tag) : capacity_(capacity) { - if (capacity_ == 0) { - // don't allow invalid capacity - log::fatal("{} unable to have 0 LRU Cache capacity", log_tag); - } - } - - // delete copy constructor - LegacyLruCache(LegacyLruCache const&) = delete; - LegacyLruCache& operator=(LegacyLruCache const&) = delete; - - ~LegacyLruCache() { Clear(); } - - /** - * Clear the cache - */ - void Clear() { - std::lock_guard<std::recursive_mutex> lock(lru_mutex_); - lru_map_.clear(); - node_list_.clear(); - } - - /** - * Same as Get, but return an iterator to the accessed element - * - * Modifying the returned iterator does not warm up the cache - * - * @param key - * @return pointer to the underlying value to allow in-place modification - * nullptr when not found, will be invalidated when the key is evicted - */ - V* Find(const K& key) { - std::lock_guard<std::recursive_mutex> lock(lru_mutex_); - auto map_iterator = lru_map_.find(key); - if (map_iterator == lru_map_.end()) { - return nullptr; - } - node_list_.splice(node_list_.begin(), node_list_, map_iterator->second); - return &(map_iterator->second->second); - } - - /** - * Get the value of a key, and move the key to the head of cache, if there is - * one - * - * @param key - * @param value, output parameter of value of the key - * @return true if the cache has the key - */ - bool Get(const K& key, V* value) { - log::assert_that(value != nullptr, "assert failed: value != nullptr"); - std::lock_guard<std::recursive_mutex> lock(lru_mutex_); - auto value_ptr = Find(key); - if (value_ptr == nullptr) { - return false; - } - *value = *value_ptr; - return true; - } - - /** - * Check if the cache has the input key, move the key to the head - * if there is one - * - * @param key - * @return true if the cache has the key - */ - bool HasKey(const K& key) { - std::lock_guard<std::recursive_mutex> lock(lru_mutex_); - return Find(key) != nullptr; - } - - /** - * Put a key-value pair to the head of cache - * - * @param key - * @param value - * @return evicted node if tail value is popped, std::nullopt if no value - * is popped. std::optional can be treated as a boolean as well - */ - std::optional<Node> Put(const K& key, V value) { - std::lock_guard<std::recursive_mutex> lock(lru_mutex_); - auto value_ptr = Find(key); - if (value_ptr != nullptr) { - // hasKey() calls get(), therefore already move the node to the head - *value_ptr = std::move(value); - return std::nullopt; - } - - // remove tail - std::optional<Node> ret = std::nullopt; - if (lru_map_.size() == capacity_) { - lru_map_.erase(node_list_.back().first); - ret = std::move(node_list_.back()); - node_list_.pop_back(); - } - // insert to dummy next; - node_list_.emplace_front(key, std::move(value)); - lru_map_.emplace(key, node_list_.begin()); - return ret; - } - - /** - * Delete a key from cache - * - * @param key - * @return true if deleted successfully - */ - bool Remove(const K& key) { - std::lock_guard<std::recursive_mutex> lock(lru_mutex_); - auto map_iterator = lru_map_.find(key); - if (map_iterator == lru_map_.end()) { - return false; - } - - // remove from the list - node_list_.erase(map_iterator->second); - - // delete key from map - lru_map_.erase(map_iterator); - - return true; - } - - /** - * Return size of the cache - * - * @return size of the cache - */ - int Size() const { - std::lock_guard<std::recursive_mutex> lock(lru_mutex_); - return lru_map_.size(); - } - -private: - std::list<Node> node_list_; - size_t capacity_; - std::unordered_map<K, typename std::list<Node>::iterator> lru_map_; - mutable std::recursive_mutex lru_mutex_; -}; - -} // namespace common -} // namespace bluetooth diff --git a/system/common/lru_unittest.cc b/system/common/lru_unittest.cc deleted file mode 100644 index 7b41143ec5..0000000000 --- a/system/common/lru_unittest.cc +++ /dev/null @@ -1,250 +0,0 @@ -/****************************************************************************** - * - * Copyright 2020 Google, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -#include "common/lru.h" - -#include <gmock/gmock.h> -#include <gtest/gtest.h> - -#include <chrono> -#include <limits> - -namespace testing { - -using bluetooth::common::LegacyLruCache; - -TEST(BluetoothLegacyLruCacheTest, LegacyLruCacheMainTest1) { - int* value = new int(0); - LegacyLruCache<int, int> cache(3, "testing"); // capacity = 3; - cache.Put(1, 10); - EXPECT_EQ(cache.Size(), 1); - EXPECT_FALSE(cache.Put(2, 20)); - EXPECT_FALSE(cache.Put(3, 30)); - EXPECT_EQ(cache.Size(), 3); - - // 1, 2, 3 should be in cache - EXPECT_TRUE(cache.Get(1, value)); - EXPECT_EQ(*value, 10); - EXPECT_TRUE(cache.Get(2, value)); - EXPECT_EQ(*value, 20); - EXPECT_TRUE(cache.Get(3, value)); - EXPECT_EQ(*value, 30); - EXPECT_EQ(cache.Size(), 3); - - EXPECT_THAT(cache.Put(4, 40), Optional(Pair(1, 10))); - // 2, 3, 4 should be in cache, 1 is evicted - EXPECT_FALSE(cache.Get(1, value)); - EXPECT_TRUE(cache.Get(4, value)); - EXPECT_EQ(*value, 40); - EXPECT_TRUE(cache.Get(2, value)); - EXPECT_EQ(*value, 20); - EXPECT_TRUE(cache.Get(3, value)); - EXPECT_EQ(*value, 30); - - EXPECT_THAT(cache.Put(5, 50), Optional(Pair(4, 40))); - EXPECT_EQ(cache.Size(), 3); - // 2, 3, 5 should be in cache, 4 is evicted - - EXPECT_TRUE(cache.Remove(3)); - EXPECT_FALSE(cache.Put(6, 60)); - // 2, 5, 6 should be in cache - - EXPECT_FALSE(cache.Get(3, value)); - EXPECT_FALSE(cache.Get(4, value)); - EXPECT_TRUE(cache.Get(2, value)); - EXPECT_EQ(*value, 20); - EXPECT_TRUE(cache.Get(5, value)); - EXPECT_EQ(*value, 50); - EXPECT_TRUE(cache.Get(6, value)); - EXPECT_EQ(*value, 60); -} - -TEST(BluetoothLegacyLruCacheTest, LegacyLruCacheMainTest2) { - int* value = new int(0); - LegacyLruCache<int, int> cache(2, "testing"); // size = 2; - EXPECT_FALSE(cache.Put(1, 10)); - EXPECT_FALSE(cache.Put(2, 20)); - EXPECT_THAT(cache.Put(3, 30), Optional(Pair(1, 10))); - EXPECT_FALSE(cache.Put(2, 200)); - EXPECT_EQ(cache.Size(), 2); - // 3, 2 should be in cache - - EXPECT_FALSE(cache.HasKey(1)); - EXPECT_TRUE(cache.Get(2, value)); - EXPECT_EQ(*value, 200); - EXPECT_TRUE(cache.Get(3, value)); - EXPECT_EQ(*value, 30); - - EXPECT_THAT(cache.Put(4, 40), Optional(Pair(2, 200))); - // 3, 4 should be in cache - - EXPECT_FALSE(cache.HasKey(2)); - EXPECT_TRUE(cache.Get(3, value)); - EXPECT_EQ(*value, 30); - EXPECT_TRUE(cache.Get(4, value)); - EXPECT_EQ(*value, 40); - - EXPECT_TRUE(cache.Remove(4)); - EXPECT_EQ(cache.Size(), 1); - cache.Put(2, 2000); - // 3, 2 should be in cache - - EXPECT_FALSE(cache.HasKey(4)); - EXPECT_TRUE(cache.Get(3, value)); - EXPECT_EQ(*value, 30); - EXPECT_TRUE(cache.Get(2, value)); - EXPECT_EQ(*value, 2000); - - EXPECT_TRUE(cache.Remove(2)); - EXPECT_TRUE(cache.Remove(3)); - cache.Put(5, 50); - cache.Put(1, 100); - cache.Put(1, 1000); - EXPECT_EQ(cache.Size(), 2); - // 1, 5 should be in cache - - EXPECT_FALSE(cache.HasKey(2)); - EXPECT_FALSE(cache.HasKey(3)); - EXPECT_TRUE(cache.Get(1, value)); - EXPECT_EQ(*value, 1000); - EXPECT_TRUE(cache.Get(5, value)); - EXPECT_EQ(*value, 50); -} - -TEST(BluetoothLegacyLruCacheTest, LegacyLruCacheFindTest) { - LegacyLruCache<int, int> cache(10, "testing"); - cache.Put(1, 10); - cache.Put(2, 20); - int value = 0; - EXPECT_TRUE(cache.Get(1, &value)); - EXPECT_EQ(value, 10); - auto value_ptr = cache.Find(1); - EXPECT_NE(value_ptr, nullptr); - *value_ptr = 20; - EXPECT_TRUE(cache.Get(1, &value)); - EXPECT_EQ(value, 20); - cache.Put(1, 40); - EXPECT_EQ(*value_ptr, 40); - EXPECT_EQ(cache.Find(10), nullptr); -} - -TEST(BluetoothLegacyLruCacheTest, LegacyLruCacheGetTest) { - LegacyLruCache<int, int> cache(10, "testing"); - cache.Put(1, 10); - cache.Put(2, 20); - int value = 0; - EXPECT_TRUE(cache.Get(1, &value)); - EXPECT_EQ(value, 10); - EXPECT_TRUE(cache.HasKey(1)); - EXPECT_TRUE(cache.HasKey(2)); - EXPECT_FALSE(cache.HasKey(3)); - EXPECT_FALSE(cache.Get(3, &value)); - EXPECT_EQ(value, 10); -} - -TEST(BluetoothLegacyLruCacheTest, LegacyLruCacheRemoveTest) { - LegacyLruCache<int, int> cache(10, "testing"); - for (int key = 0; key <= 30; key++) { - cache.Put(key, key * 100); - } - for (int key = 0; key <= 20; key++) { - EXPECT_FALSE(cache.HasKey(key)); - } - for (int key = 21; key <= 30; key++) { - EXPECT_TRUE(cache.HasKey(key)); - } - for (int key = 21; key <= 30; key++) { - EXPECT_TRUE(cache.Remove(key)); - } - for (int key = 21; key <= 30; key++) { - EXPECT_FALSE(cache.HasKey(key)); - } -} - -TEST(BluetoothLegacyLruCacheTest, LegacyLruCacheClearTest) { - LegacyLruCache<int, int> cache(10, "testing"); - for (int key = 0; key < 10; key++) { - cache.Put(key, key * 100); - } - for (int key = 0; key < 10; key++) { - EXPECT_TRUE(cache.HasKey(key)); - } - cache.Clear(); - for (int key = 0; key < 10; key++) { - EXPECT_FALSE(cache.HasKey(key)); - } - - for (int key = 0; key < 10; key++) { - cache.Put(key, key * 1000); - } - for (int key = 0; key < 10; key++) { - EXPECT_TRUE(cache.HasKey(key)); - } -} - -TEST(BluetoothLegacyLruCacheTest, LegacyLruCachePressureTest) { - int max_size = 0xFFFFF; // 2^20 = 1M - LegacyLruCache<int, int> cache(static_cast<size_t>(max_size), "testing"); - - // fill the cache - for (int key = 0; key < max_size; key++) { - cache.Put(key, key); - } - - // make sure the cache is full - for (int key = 0; key < max_size; key++) { - EXPECT_TRUE(cache.HasKey(key)); - } - - // refresh the entire cache - for (int key = 0; key < max_size; key++) { - int new_key = key + max_size; - cache.Put(new_key, new_key); - EXPECT_FALSE(cache.HasKey(key)); - EXPECT_TRUE(cache.HasKey(new_key)); - } - - // clear the entire cache - int* value = new int(0); - for (int key = max_size; key < 2 * max_size; key++) { - EXPECT_TRUE(cache.Get(key, value)); - EXPECT_EQ(*value, key); - EXPECT_TRUE(cache.Remove(key)); - } - EXPECT_EQ(cache.Size(), 0); -} - -TEST(BluetoothLegacyLruCacheTest, BluetoothLruMultiThreadPressureTest) { - LegacyLruCache<int, int> cache(100, "testing"); - auto pointer = &cache; - // make sure no deadlock - std::vector<std::thread> workers; - for (int key = 0; key < 100; key++) { - workers.push_back(std::thread([key, pointer]() { - pointer->Put(key, key); - EXPECT_TRUE(pointer->HasKey(key)); - EXPECT_TRUE(pointer->Remove(key)); - })); - } - for (auto& worker : workers) { - worker.join(); - } - EXPECT_EQ(cache.Size(), 0); -} - -} // namespace testing diff --git a/system/common/metrics.cc b/system/common/metrics.cc index 45b11acf46..c6c0977115 100644 --- a/system/common/metrics.cc +++ b/system/common/metrics.cc @@ -18,84 +18,19 @@ #include "common/metrics.h" -#include <base/base64.h> #include <bluetooth/log.h> #include <frameworks/proto_logging/stats/enums/bluetooth/le/enums.pb.h> -#include <include/hardware/bt_av.h> #include <statslog_bt.h> -#include <unistd.h> -#include <algorithm> -#include <cerrno> #include <cstdint> -#include <cstring> -#include <memory> -#include <mutex> // NOLINT -#include <utility> +#include <vector> -#include "common/address_obfuscator.h" -#include "common/leaky_bonded_queue.h" -#include "common/time_util.h" -#include "hci/address.h" #include "main/shim/metric_id_api.h" -#include "osi/include/osi.h" #include "types/raw_address.h" -namespace std { -template <> -struct formatter<android::bluetooth::DirectionEnum> - : enum_formatter<android::bluetooth::DirectionEnum> {}; -template <> -struct formatter<android::bluetooth::SocketConnectionstateEnum> - : enum_formatter<android::bluetooth::SocketConnectionstateEnum> {}; -template <> -struct formatter<android::bluetooth::SocketRoleEnum> - : enum_formatter<android::bluetooth::SocketRoleEnum> {}; -template <> -struct formatter<android::bluetooth::AddressTypeEnum> - : enum_formatter<android::bluetooth::AddressTypeEnum> {}; -template <> -struct formatter<android::bluetooth::DeviceInfoSrcEnum> - : enum_formatter<android::bluetooth::DeviceInfoSrcEnum> {}; -} // namespace std - namespace bluetooth { namespace common { -using bluetooth::hci::Address; - -void LogLinkLayerConnectionEvent(const RawAddress* address, uint32_t connection_handle, - android::bluetooth::DirectionEnum direction, uint16_t link_type, - uint32_t hci_cmd, uint16_t hci_event, uint16_t hci_ble_event, - uint16_t cmd_status, uint16_t reason_code) { - std::string obfuscated_id; - int metric_id = 0; - if (address != nullptr) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(*address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(*address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField bytes_field(address != nullptr ? obfuscated_id.c_str() : nullptr, - address != nullptr ? obfuscated_id.size() : 0); - int ret = stats_write(BLUETOOTH_LINK_LAYER_CONNECTION_EVENT, bytes_field, connection_handle, - direction, link_type, hci_cmd, hci_event, hci_ble_event, cmd_status, - reason_code, metric_id); - if (ret < 0) { - log::warn( - "failed to log status 0x{:x}, reason 0x{:x} from cmd 0x{:x}, event " - "0x{:x}, ble_event 0x{:x} for {}, handle {}, type 0x{:x}, error {}", - cmd_status, reason_code, hci_cmd, hci_event, hci_ble_event, *address, connection_handle, - link_type, ret); - } -} - -void LogHciTimeoutEvent(uint32_t hci_cmd) { - int ret = stats_write(BLUETOOTH_HCI_TIMEOUT_REPORTED, static_cast<int64_t>(hci_cmd)); - if (ret < 0) { - log::warn("failed for opcode 0x{:x}, error {}", hci_cmd, ret); - } -} - void LogRemoteVersionInfo(uint16_t handle, uint8_t status, uint8_t version, uint16_t manufacturer_name, uint16_t subversion) { int ret = stats_write(BLUETOOTH_REMOTE_VERSION_INFO_REPORTED, handle, status, version, @@ -108,271 +43,6 @@ void LogRemoteVersionInfo(uint16_t handle, uint8_t status, uint8_t version, } } -void LogA2dpAudioUnderrunEvent(const RawAddress& address, uint64_t encoding_interval_millis, - int num_missing_pcm_bytes) { - std::string obfuscated_id; - int metric_id = 0; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField bytes_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - int64_t encoding_interval_nanos = encoding_interval_millis * 1000000; - int ret = stats_write(BLUETOOTH_A2DP_AUDIO_UNDERRUN_REPORTED, bytes_field, - encoding_interval_nanos, num_missing_pcm_bytes, metric_id); - if (ret < 0) { - log::warn( - "failed for {}, encoding_interval_nanos {}, num_missing_pcm_bytes {}, " - "error {}", - address, encoding_interval_nanos, num_missing_pcm_bytes, ret); - } -} - -void LogA2dpAudioOverrunEvent(const RawAddress& address, uint64_t encoding_interval_millis, - int num_dropped_buffers, int num_dropped_encoded_frames, - int num_dropped_encoded_bytes) { - std::string obfuscated_id; - int metric_id = 0; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField bytes_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - int64_t encoding_interval_nanos = encoding_interval_millis * 1000000; - int ret = stats_write(BLUETOOTH_A2DP_AUDIO_OVERRUN_REPORTED, bytes_field, encoding_interval_nanos, - num_dropped_buffers, num_dropped_encoded_frames, num_dropped_encoded_bytes, - metric_id); - if (ret < 0) { - log::warn( - "failed to log for {}, encoding_interval_nanos {}, num_dropped_buffers " - "{}, num_dropped_encoded_frames {}, num_dropped_encoded_bytes {}, " - "error {}", - address, encoding_interval_nanos, num_dropped_buffers, num_dropped_encoded_frames, - num_dropped_encoded_bytes, ret); - } -} - -void LogA2dpPlaybackEvent(const RawAddress& address, int playback_state, int audio_coding_mode) { - std::string obfuscated_id; - int metric_id = 0; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField bytes_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - int ret = stats_write(BLUETOOTH_A2DP_PLAYBACK_STATE_CHANGED, bytes_field, playback_state, - audio_coding_mode, metric_id); - if (ret < 0) { - log::warn( - "failed to log for {}, playback_state {}, audio_coding_mode {}, error " - "{}", - address, playback_state, audio_coding_mode, ret); - } -} - -void LogReadRssiResult(const RawAddress& address, uint16_t handle, uint32_t cmd_status, - int8_t rssi) { - std::string obfuscated_id; - int metric_id = 0; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField bytes_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - int ret = stats_write(BLUETOOTH_DEVICE_RSSI_REPORTED, bytes_field, handle, cmd_status, rssi, - metric_id); - if (ret < 0) { - log::warn("failed for {}, handle {}, status 0x{:x}, rssi {} dBm, error {}", address, handle, - cmd_status, rssi, ret); - } -} - -void LogReadFailedContactCounterResult(const RawAddress& address, uint16_t handle, - uint32_t cmd_status, int32_t failed_contact_counter) { - std::string obfuscated_id; - int metric_id = 0; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField bytes_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - int ret = stats_write(BLUETOOTH_DEVICE_FAILED_CONTACT_COUNTER_REPORTED, bytes_field, handle, - cmd_status, failed_contact_counter, metric_id); - if (ret < 0) { - log::warn( - "failed for {}, handle {}, status 0x{:x}, failed_contact_counter {} " - "packets, error {}", - address, handle, cmd_status, failed_contact_counter, ret); - } -} - -void LogReadTxPowerLevelResult(const RawAddress& address, uint16_t handle, uint32_t cmd_status, - int32_t transmit_power_level) { - std::string obfuscated_id; - int metric_id = 0; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField bytes_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - int ret = stats_write(BLUETOOTH_DEVICE_TX_POWER_LEVEL_REPORTED, bytes_field, handle, cmd_status, - transmit_power_level, metric_id); - if (ret < 0) { - log::warn( - "failed for {}, handle {}, status 0x{:x}, transmit_power_level {} " - "packets, error {}", - address, handle, cmd_status, transmit_power_level, ret); - } -} - -void LogSmpPairingEvent(const RawAddress& address, uint8_t smp_cmd, - android::bluetooth::DirectionEnum direction, uint8_t smp_fail_reason) { - std::string obfuscated_id; - int metric_id = 0; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField obfuscated_id_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - int ret = stats_write(BLUETOOTH_SMP_PAIRING_EVENT_REPORTED, obfuscated_id_field, smp_cmd, - direction, smp_fail_reason, metric_id); - if (ret < 0) { - log::warn( - "failed for {}, smp_cmd 0x{:x}, direction {}, smp_fail_reason 0x{:x}, " - "error {}", - address, smp_cmd, direction, smp_fail_reason, ret); - } -} - -void LogClassicPairingEvent(const RawAddress& address, uint16_t handle, uint32_t hci_cmd, - uint16_t hci_event, uint16_t cmd_status, uint16_t reason_code, - int64_t event_value) { - std::string obfuscated_id; - int metric_id = 0; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField obfuscated_id_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - int ret = stats_write(BLUETOOTH_CLASSIC_PAIRING_EVENT_REPORTED, obfuscated_id_field, handle, - hci_cmd, hci_event, cmd_status, reason_code, event_value, metric_id); - if (ret < 0) { - log::warn( - "failed for {}, handle {}, hci_cmd 0x{:x}, hci_event 0x{:x}, " - "cmd_status 0x{:x}, reason 0x{:x}, event_value {}, error {}", - address, handle, hci_cmd, hci_event, cmd_status, reason_code, event_value, ret); - } -} - -void LogSdpAttribute(const RawAddress& address, uint16_t protocol_uuid, uint16_t attribute_id, - size_t attribute_size, const char* attribute_value) { - std::string obfuscated_id; - int metric_id = 0; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField obfuscated_id_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - BytesField attribute_field(attribute_value, attribute_size); - int ret = stats_write(BLUETOOTH_SDP_ATTRIBUTE_REPORTED, obfuscated_id_field, protocol_uuid, - attribute_id, attribute_field, metric_id); - if (ret < 0) { - log::warn("failed for {}, protocol_uuid 0x{:x}, attribute_id 0x{:x}, error {}", address, - protocol_uuid, attribute_id, ret); - } -} - -void LogSocketConnectionState(const RawAddress& address, int port, int type, - android::bluetooth::SocketConnectionstateEnum connection_state, - int64_t tx_bytes, int64_t rx_bytes, int uid, int server_port, - android::bluetooth::SocketRoleEnum socket_role) { - std::string obfuscated_id; - int metric_id = 0; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField obfuscated_id_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - int ret = stats_write(BLUETOOTH_SOCKET_CONNECTION_STATE_CHANGED, obfuscated_id_field, port, type, - connection_state, tx_bytes, rx_bytes, uid, server_port, socket_role, - metric_id, 0 /* connection_duration_ms */, 1 /* error_code */, - 0 /* is_hardware_offload */); - if (ret < 0) { - log::warn( - "failed for {}, port {}, type {}, state {}, tx_bytes {}, rx_bytes {}, " - "uid {}, server_port {}, socket_role {}, error {}", - address, port, type, connection_state, tx_bytes, rx_bytes, uid, server_port, - socket_role, ret); - } -} - -void LogManufacturerInfo(const RawAddress& address, - android::bluetooth::AddressTypeEnum address_type, - android::bluetooth::DeviceInfoSrcEnum source_type, - const std::string& source_name, const std::string& manufacturer, - const std::string& model, const std::string& hardware_version, - const std::string& software_version) { - std::string obfuscated_id; - int metric_id = 0; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - metric_id = bluetooth::shim::AllocateIdFromMetricIdAllocator(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField obfuscated_id_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - int ret = stats_write(BLUETOOTH_DEVICE_INFO_REPORTED, obfuscated_id_field, source_type, - source_name.c_str(), manufacturer.c_str(), model.c_str(), - hardware_version.c_str(), software_version.c_str(), metric_id, address_type, - address.address[5], address.address[4], address.address[3]); - if (ret < 0) { - log::warn( - "failed for {}, source_type {}, source_name {}, manufacturer {}, model " - "{}, hardware_version {}, software_version {} MAC address type {} MAC " - "address prefix {} {} {}, error {}", - address, source_type, source_name, manufacturer, model, hardware_version, - software_version, address_type, address.address[5], address.address[4], - address.address[3], ret); - } -} - -void LogBluetoothHalCrashReason(const RawAddress& address, uint32_t error_code, - uint32_t vendor_error_code) { - std::string obfuscated_id; - if (!address.IsEmpty()) { - obfuscated_id = AddressObfuscator::GetInstance()->Obfuscate(address); - } - // nullptr and size 0 represent missing value for obfuscated_id - BytesField obfuscated_id_field(address.IsEmpty() ? nullptr : obfuscated_id.c_str(), - address.IsEmpty() ? 0 : obfuscated_id.size()); - int ret = stats_write(BLUETOOTH_HAL_CRASH_REASON_REPORTED, 0, obfuscated_id_field, error_code, - vendor_error_code); - if (ret < 0) { - log::warn("failed for {}, error_code 0x{:x}, vendor_error_code 0x{:x}, error {}", address, - error_code, vendor_error_code, ret); - } -} - void LogLeAudioConnectionSessionReported( int32_t group_size, int32_t group_metric_id, int64_t connection_duration_nanos, const std::vector<int64_t>& device_connecting_offset_nanos, @@ -421,5 +91,4 @@ void LogLeAudioBroadcastSessionReported(int64_t duration_nanos) { } } // namespace common - } // namespace bluetooth diff --git a/system/common/metrics.h b/system/common/metrics.h index 0aad20819e..4d5a234ce5 100644 --- a/system/common/metrics.h +++ b/system/common/metrics.h @@ -18,22 +18,12 @@ #pragma once -#include <bta/include/bta_api.h> -#include <frameworks/proto_logging/stats/enums/bluetooth/enums.pb.h> -#include <frameworks/proto_logging/stats/enums/bluetooth/hci/enums.pb.h> -#include <frameworks/proto_logging/stats/enums/bluetooth/le/enums.pb.h> -#include <stdint.h> - -#include <memory> -#include <string> +#include <cstdint> #include <vector> -#include "hci/address.h" -#include "os/metrics.h" #include "types/raw_address.h" namespace bluetooth { - namespace common { /** @@ -42,34 +32,6 @@ namespace common { static const uint32_t kUnknownConnectionHandle = 0xFFFF; /** - * Log link layer connection event - * - * @param address Stack wide consistent Bluetooth address of this event, - * nullptr if unknown - * @param connection_handle connection handle of this event, - * {@link kUnknownConnectionHandle} if unknown - * @param direction direction of this connection - * @param link_type type of the link - * @param hci_cmd HCI command opecode associated with this event, if any - * @param hci_event HCI event code associated with this event, if any - * @param hci_ble_event HCI BLE event code associated with this event, if any - * @param cmd_status Command status associated with this event, if any - * @param reason_code Reason code associated with this event, if any - */ -void LogLinkLayerConnectionEvent(const RawAddress* address, uint32_t connection_handle, - android::bluetooth::DirectionEnum direction, uint16_t link_type, - uint32_t hci_cmd, uint16_t hci_event, uint16_t hci_ble_event, - uint16_t cmd_status, uint16_t reason_code); - -/** - * Logs when Bluetooth controller failed to reply with command status within - * a timeout period after receiving an HCI command from the host - * - * @param hci_cmd opcode of HCI command that caused this timeout - */ -void LogHciTimeoutEvent(uint32_t hci_cmd); - -/** * Logs when we receive Bluetooth Read Remote Version Information Complete * Event from the remote device, as documented by the Bluetooth Core HCI * specification @@ -86,167 +48,6 @@ void LogHciTimeoutEvent(uint32_t hci_cmd); void LogRemoteVersionInfo(uint16_t handle, uint8_t status, uint8_t version, uint16_t manufacturer_name, uint16_t subversion); -/** - * Log A2DP audio buffer underrun event - * - * @param address A2DP device associated with this event - * @param encoding_interval_millis encoding interval in milliseconds - * @param num_missing_pcm_bytes number of PCM bytes that cannot be read from - * the source - */ -void LogA2dpAudioUnderrunEvent(const RawAddress& address, uint64_t encoding_interval_millis, - int num_missing_pcm_bytes); - -/** - * Log A2DP audio buffer overrun event - * - * @param address A2DP device associated with this event - * @param encoding_interval_millis encoding interval in milliseconds - * @param num_dropped_buffers number of encoded buffers dropped from Tx queue - * @param num_dropped_encoded_frames number of encoded frames dropped from Tx - * queue - * @param num_dropped_encoded_bytes number of encoded bytes dropped from Tx - * queue - */ -void LogA2dpAudioOverrunEvent(const RawAddress& address, uint64_t encoding_interval_millis, - int num_dropped_buffers, int num_dropped_encoded_frames, - int num_dropped_encoded_bytes); - -/** - * Log A2DP playback state changed event - * - * @param address A2DP device associated with this event - * @param playback_state audio playback state - * @param audio_coding_mode audio codec encoding mode - */ -void LogA2dpPlaybackEvent(const RawAddress& address, int playback_state, int audio_coding_mode); - -/** - * Log read RSSI result - * - * @param address device associated with this event - * @param handle connection handle of this event, - * {@link kUnknownConnectionHandle} if unknown - * @param cmd_status command status from read RSSI command - * @param rssi rssi value in dBm - */ -void LogReadRssiResult(const RawAddress& address, uint16_t handle, uint32_t cmd_status, - int8_t rssi); - -/** - * Log failed contact counter report - * - * @param address device associated with this event - * @param handle connection handle of this event, - * {@link kUnknownConnectionHandle} if unknown - * @param cmd_status command status from read failed contact counter command - * @param failed_contact_counter Number of consecutive failed contacts for a - * connection corresponding to the Handle - */ -void LogReadFailedContactCounterResult(const RawAddress& address, uint16_t handle, - uint32_t cmd_status, int32_t failed_contact_counter); - -/** - * Log transmit power level for a particular device after read - * - * @param address device associated with this event - * @param handle connection handle of this event, - * {@link kUnknownConnectionHandle} if unknown - * @param cmd_status command status from read failed contact counter command - * @param transmit_power_level transmit power level for connection to this - * device - */ -void LogReadTxPowerLevelResult(const RawAddress& address, uint16_t handle, uint32_t cmd_status, - int32_t transmit_power_level); - -/** - * Logs when there is an event related to Bluetooth Security Manager Protocol - * - * @param address address of associated device - * @param smp_cmd SMP command code associated with this event - * @param direction direction of this SMP command - * @param smp_fail_reason SMP pairing failure reason code from SMP spec - */ -void LogSmpPairingEvent(const RawAddress& address, uint8_t smp_cmd, - android::bluetooth::DirectionEnum direction, uint8_t smp_fail_reason); - -/** - * Logs there is an event related Bluetooth classic pairing - * - * @param address address of associated device - * @param handle connection handle of this event, - * {@link kUnknownConnectionHandle} if unknown - * @param hci_cmd HCI command associated with this event - * @param hci_event HCI event associated with this event - * @param cmd_status Command status associated with this event - * @param reason_code Reason code associated with this event - * @param event_value A status value related to this specific event - */ -void LogClassicPairingEvent(const RawAddress& address, uint16_t handle, uint32_t hci_cmd, - uint16_t hci_event, uint16_t cmd_status, uint16_t reason_code, - int64_t event_value); - -/** - * Logs when certain Bluetooth SDP attributes are discovered - * - * @param address address of associated device - * @param protocol_uuid 16 bit protocol UUID from Bluetooth Assigned Numbers - * @param attribute_id 16 bit attribute ID from Bluetooth Assigned Numbers - * @param attribute_size size of this attribute - * @param attribute_value pointer to the attribute data, must be larger than - * attribute_size - */ -void LogSdpAttribute(const RawAddress& address, uint16_t protocol_uuid, uint16_t attribute_id, - size_t attribute_size, const char* attribute_value); - -/** - * Logs when there is a change in Bluetooth socket connection state - * - * @param address address of associated device, empty if this is a server port - * @param port port of this socket connection - * @param type type of socket - * @param connection_state socket connection state - * @param tx_bytes number of bytes transmitted - * @param rx_bytes number of bytes received - * @param server_port server port of this socket, if any. When both - * |server_port| and |port| fields are populated, |port| must be spawned - * by |server_port| - * @param socket_role role of this socket, server or connection - * @param uid socket owner's uid - */ -void LogSocketConnectionState(const RawAddress& address, int port, int type, - android::bluetooth::SocketConnectionstateEnum connection_state, - int64_t tx_bytes, int64_t rx_bytes, int uid, int server_port, - android::bluetooth::SocketRoleEnum socket_role); - -/** - * Logs when a Bluetooth device's manufacturer information is learnt - * - * @param address address of associated device - * @param source_type where is this device info obtained from - * @param source_name name of the data source, internal or external - * @param manufacturer name of the manufacturer of this device - * @param model model of this device - * @param hardware_version hardware version of this device - * @param software_version software version of this device - */ -void LogManufacturerInfo(const RawAddress& address, - android::bluetooth::AddressTypeEnum address_type, - android::bluetooth::DeviceInfoSrcEnum source_type, - const std::string& source_name, const std::string& manufacturer, - const std::string& model, const std::string& hardware_version, - const std::string& software_version); - -/** - * Logs when received Bluetooth HAL crash reason report. - * - * @param address current connected address. - * @param error_code the crash reason from bluetooth hal - * @param vendor_error_code the vendor crash reason from bluetooth Firmware - */ -void LogBluetoothHalCrashReason(const RawAddress& address, uint32_t error_code, - uint32_t vendor_error_code); - void LogLeAudioConnectionSessionReported( int32_t group_size, int32_t group_metric_id, int64_t connection_duration_nanos, const std::vector<int64_t>& device_connecting_offset_nanos, @@ -262,5 +63,4 @@ void LogLeAudioConnectionSessionReported( void LogLeAudioBroadcastSessionReported(int64_t duration_nanos); } // namespace common - } // namespace bluetooth diff --git a/system/common/metrics_linux.cc b/system/common/metrics_linux.cc index e49dd1d2cf..e886c05bf3 100644 --- a/system/common/metrics_linux.cc +++ b/system/common/metrics_linux.cc @@ -16,78 +16,18 @@ * ******************************************************************************/ -#include <bluetooth/log.h> +#include <cstdint> +#include <vector> #include "common/metrics.h" #include "types/raw_address.h" namespace bluetooth { - namespace common { -void LogClassicPairingEvent(const RawAddress& /* address */, uint16_t /* handle */, - uint32_t /* hci_cmd */, uint16_t /* hci_event */, - uint16_t /* cmd_status */, uint16_t /* reason_code */, - int64_t /* event_value */) {} - -void LogSocketConnectionState(const RawAddress& /* address */, int /* port */, int /* type */, - android::bluetooth::SocketConnectionstateEnum /* connection_state */, - int64_t /* tx_bytes */, int64_t /* rx_bytes */, int /* uid */, - int /* server_port */, - android::bluetooth::SocketRoleEnum /* socket_role */) {} - -void LogHciTimeoutEvent(uint32_t /* hci_cmd */) {} - -void LogA2dpAudioUnderrunEvent(const RawAddress& /* address */, - uint64_t /* encoding_interval_millis */, - int /* num_missing_pcm_bytes */) {} - -void LogA2dpAudioOverrunEvent(const RawAddress& /* address */, - uint64_t /* encoding_interval_millis */, - int /* num_dropped_buffers */, int /* num_dropped_encoded_frames */, - int /* num_dropped_encoded_bytes */) {} - -void LogA2dpPlaybackEvent(const RawAddress& /* address */, int /* playback_state */, - int /* audio_coding_mode */) {} - -void LogBluetoothHalCrashReason(const RawAddress& /* address */, uint32_t /* error_code */, - uint32_t /* vendor_error_code */) {} - -void LogReadRssiResult(const RawAddress& /* address */, uint16_t /* handle */, - uint32_t /* cmd_status */, int8_t /* rssi */) {} - -void LogReadFailedContactCounterResult(const RawAddress& /* address */, uint16_t /* handle */, - uint32_t /* cmd_status */, - int32_t /* failed_contact_counter */) {} - -void LogReadTxPowerLevelResult(const RawAddress& /* address */, uint16_t /* handle */, - uint32_t /* cmd_status */, int32_t /* transmit_power_level */) {} - void LogRemoteVersionInfo(uint16_t /* handle */, uint8_t /* status */, uint8_t /* version */, uint16_t /* manufacturer_name */, uint16_t /* subversion */) {} -void LogLinkLayerConnectionEvent(const RawAddress* /* address */, uint32_t /* connection_handle */, - android::bluetooth::DirectionEnum /* direction */, - uint16_t /* link_type */, uint32_t /* hci_cmd */, - uint16_t /* hci_event */, uint16_t /* hci_ble_event */, - uint16_t /* cmd_status */, uint16_t /* reason_code */) {} - -void LogManufacturerInfo(const RawAddress& /* address */, - android::bluetooth::AddressTypeEnum /* address_type */, - android::bluetooth::DeviceInfoSrcEnum /* source_type */, - const std::string& /* source_name */, - const std::string& /* manufacturer */, const std::string& /* model */, - const std::string& /* hardware_version */, - const std::string& /* software_version */) {} - -void LogSdpAttribute(const RawAddress& /* address */, uint16_t /* protocol_uuid */, - uint16_t /* attribute_id */, size_t /* attribute_size */, - const char* /* attribute_value */) {} - -void LogSmpPairingEvent(const RawAddress& /* address */, uint8_t /* smp_cmd */, - android::bluetooth::DirectionEnum /* direction */, - uint8_t /* smp_fail_reason */) {} - void LogLeAudioConnectionSessionReported( int32_t /* group_size */, int32_t /* group_metric_id */, int64_t /* connection_duration_nanos */, @@ -104,5 +44,4 @@ void LogLeAudioConnectionSessionReported( void LogLeAudioBroadcastSessionReported(int64_t /* duration_nanos */) {} } // namespace common - } // namespace bluetooth diff --git a/system/conf/interop_database.conf b/system/conf/interop_database.conf index ecf3da0b07..d921db421d 100644 --- a/system/conf/interop_database.conf +++ b/system/conf/interop_database.conf @@ -895,3 +895,8 @@ BSK10 = Name_Based [INTEROP_DISABLE_HF_PROFILE] JBL Flip 5 = Name_Based JBL Flip 6 = Name_Based + +# Some devices don't respond to LE appearance read request. +[INTEROP_DISABLE_READ_LE_APPEARANCE] +L1_L = Name_Based +L1_R = Name_Based diff --git a/system/device/include/interop.h b/system/device/include/interop.h index 22233bcd65..d72315d1b0 100644 --- a/system/device/include/interop.h +++ b/system/device/include/interop.h @@ -358,16 +358,20 @@ typedef enum { // Peer can request proper latency based on its power state later. INTEROP_HID_PREF_CONN_ZERO_LATENCY, - // Some HOGP devices have the report map longer than the maximum GATT attribute value length (512 - // bytes). + // Some HOGP devices have the report map longer than the maximum GATT + // attribute value length (512 bytes). INTEROP_HOGP_LONG_REPORT, - // Some HOGP devices requires MTU exchange be part of the initial setup to function. + // Some HOGP devices requires MTU exchange be part of the initial setup to + // function. INTEROP_HOGP_FORCE_MTU_EXCHANGE, // Some devices claim to support HFP in EIR but does not actually support it. INTEROP_DISABLE_HF_PROFILE, + // Some devices don't respond to LE appearance read request. + INTEROP_DISABLE_READ_LE_APPEARANCE, + END_OF_INTEROP_LIST } interop_feature_t; diff --git a/system/device/src/interop.cc b/system/device/src/interop.cc index 60d90cf6d6..44313664ed 100644 --- a/system/device/src/interop.cc +++ b/system/device/src/interop.cc @@ -392,6 +392,7 @@ static const char* interop_feature_string_(const interop_feature_t feature) { CASE_RETURN_STR(INTEROP_HOGP_LONG_REPORT); CASE_RETURN_STR(INTEROP_HOGP_FORCE_MTU_EXCHANGE); CASE_RETURN_STR(INTEROP_DISABLE_HF_PROFILE); + CASE_RETURN_STR(INTEROP_DISABLE_READ_LE_APPEARANCE); } return UNKNOWN_INTEROP_FEATURE; } diff --git a/system/gd/Android.bp b/system/gd/Android.bp index 26f31f0b8e..9a6bd02551 100644 --- a/system/gd/Android.bp +++ b/system/gd/Android.bp @@ -357,8 +357,8 @@ cc_test { srcs: [ ":BluetoothPacketTestSources", ":TestCommonMockFunctions", + ":TestMockMainShim", ":TestMockMainShimEntry", - ":TestMockStackMetrics", "common/bidi_queue_unittest.cc", "common/blocking_queue_unittest.cc", "common/byte_array_test.cc", @@ -414,6 +414,9 @@ cc_test { "storage/mutation_test.cc", "storage/storage_module_test.cc", ], + cflags: [ + "-DUSE_FAKE_TIMERS", + ], static_libs: [ "bluetooth_flags_c_lib_for_test", "libbase", @@ -581,11 +584,12 @@ cc_fuzz { defaults: ["gd_fuzz_defaults"], srcs: [ ":TestCommonMockFunctions", - ":TestMockStackMetrics", + ":TestMockMainShim", "hci/fuzz/acl_manager_fuzz_test.cc", ], include_dirs: [ "packages/modules/Bluetooth/system", + "packages/modules/Bluetooth/system/include", ], static_libs: [ "libbt-platform-protos-lite", diff --git a/system/gd/AndroidTestTemplate.xml b/system/gd/AndroidTestTemplate.xml index 4083baac14..92e0a83ae1 100644 --- a/system/gd/AndroidTestTemplate.xml +++ b/system/gd/AndroidTestTemplate.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- Copyright 2018 The Android Open Source Project +<!-- Copyright (C) 2018 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/system/gd/benchmark.cc b/system/gd/benchmark.cc index 2b11c898d5..923b0c76e7 100644 --- a/system/gd/benchmark.cc +++ b/system/gd/benchmark.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/audit_log.cc b/system/gd/common/audit_log.cc index 36cee3c801..e83c2894f8 100644 --- a/system/gd/common/audit_log.cc +++ b/system/gd/common/audit_log.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/audit_log.h b/system/gd/common/audit_log.h index b129bc7411..70a160870e 100644 --- a/system/gd/common/audit_log.h +++ b/system/gd/common/audit_log.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/bidi_queue.h b/system/gd/common/bidi_queue.h index 98271887eb..4dad186562 100644 --- a/system/gd/common/bidi_queue.h +++ b/system/gd/common/bidi_queue.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/bidi_queue_unittest.cc b/system/gd/common/bidi_queue_unittest.cc index 3505d16cdb..2235c3cc71 100644 --- a/system/gd/common/bidi_queue_unittest.cc +++ b/system/gd/common/bidi_queue_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/bind.h b/system/gd/common/bind.h index 9385c79dc5..fc1c9cdb80 100644 --- a/system/gd/common/bind.h +++ b/system/gd/common/bind.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/blocking_queue.h b/system/gd/common/blocking_queue.h index 4b68e514ab..25b46163d7 100644 --- a/system/gd/common/blocking_queue.h +++ b/system/gd/common/blocking_queue.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/blocking_queue_unittest.cc b/system/gd/common/blocking_queue_unittest.cc index 2b109ffe5f..623dc026bd 100644 --- a/system/gd/common/blocking_queue_unittest.cc +++ b/system/gd/common/blocking_queue_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/byte_array.h b/system/gd/common/byte_array.h index b7183c4d2d..daff291385 100644 --- a/system/gd/common/byte_array.h +++ b/system/gd/common/byte_array.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/byte_array_test.cc b/system/gd/common/byte_array_test.cc index b9a64b3882..29ae26494b 100644 --- a/system/gd/common/byte_array_test.cc +++ b/system/gd/common/byte_array_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/callback.h b/system/gd/common/callback.h index 7bf6f3a4ef..5fa3ee991c 100644 --- a/system/gd/common/callback.h +++ b/system/gd/common/callback.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/circular_buffer.h b/system/gd/common/circular_buffer.h index 6132f2e51c..bfb4b4252a 100644 --- a/system/gd/common/circular_buffer.h +++ b/system/gd/common/circular_buffer.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/circular_buffer_test.cc b/system/gd/common/circular_buffer_test.cc index 618388858b..5b465de723 100644 --- a/system/gd/common/circular_buffer_test.cc +++ b/system/gd/common/circular_buffer_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/contextual_callback.h b/system/gd/common/contextual_callback.h index 548936d68b..6a6602e217 100644 --- a/system/gd/common/contextual_callback.h +++ b/system/gd/common/contextual_callback.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/i_postable_context.h b/system/gd/common/i_postable_context.h index b421579ca8..13ec14db29 100644 --- a/system/gd/common/i_postable_context.h +++ b/system/gd/common/i_postable_context.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/list_map.h b/system/gd/common/list_map.h index 1b63302806..8c1b014753 100644 --- a/system/gd/common/list_map.h +++ b/system/gd/common/list_map.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/list_map_test.cc b/system/gd/common/list_map_test.cc index 991fd25c58..d9a6c149b3 100644 --- a/system/gd/common/list_map_test.cc +++ b/system/gd/common/list_map_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/lru_cache.h b/system/gd/common/lru_cache.h index 303688d55f..6f5c2340f5 100644 --- a/system/gd/common/lru_cache.h +++ b/system/gd/common/lru_cache.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/lru_cache_test.cc b/system/gd/common/lru_cache_test.cc index 555a04edd2..166eb94561 100644 --- a/system/gd/common/lru_cache_test.cc +++ b/system/gd/common/lru_cache_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/multi_priority_queue.h b/system/gd/common/multi_priority_queue.h index d48f0bffb0..9dcc751c8e 100644 --- a/system/gd/common/multi_priority_queue.h +++ b/system/gd/common/multi_priority_queue.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/multi_priority_queue_test.cc b/system/gd/common/multi_priority_queue_test.cc index 435e1ad3cd..5691a7ca7a 100644 --- a/system/gd/common/multi_priority_queue_test.cc +++ b/system/gd/common/multi_priority_queue_test.cc @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/numbers.h b/system/gd/common/numbers.h index e31bebbee3..5256093fa5 100644 --- a/system/gd/common/numbers.h +++ b/system/gd/common/numbers.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/numbers_test.cc b/system/gd/common/numbers_test.cc index bf4159f934..c5afad5cdc 100644 --- a/system/gd/common/numbers_test.cc +++ b/system/gd/common/numbers_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/postable_context.h b/system/gd/common/postable_context.h index 4a9514870f..332952df31 100644 --- a/system/gd/common/postable_context.h +++ b/system/gd/common/postable_context.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/stop_watch.cc b/system/gd/common/stop_watch.cc index b9f95bbcbe..5425ab7ed7 100644 --- a/system/gd/common/stop_watch.cc +++ b/system/gd/common/stop_watch.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/stop_watch.h b/system/gd/common/stop_watch.h index 792229172e..1a33d10770 100644 --- a/system/gd/common/stop_watch.h +++ b/system/gd/common/stop_watch.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/strings.cc b/system/gd/common/strings.cc index db42acfcf4..ba450acf65 100644 --- a/system/gd/common/strings.cc +++ b/system/gd/common/strings.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/strings.h b/system/gd/common/strings.h index 5593715eb2..ab8756e08e 100644 --- a/system/gd/common/strings.h +++ b/system/gd/common/strings.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/strings_test.cc b/system/gd/common/strings_test.cc index 9188eae528..24b4adedc6 100644 --- a/system/gd/common/strings_test.cc +++ b/system/gd/common/strings_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/sync_map_count.h b/system/gd/common/sync_map_count.h index b9cfab3049..10e63cdd08 100644 --- a/system/gd/common/sync_map_count.h +++ b/system/gd/common/sync_map_count.h @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/sync_map_count_test.cc b/system/gd/common/sync_map_count_test.cc index 0e29c32467..04911b87bc 100644 --- a/system/gd/common/sync_map_count_test.cc +++ b/system/gd/common/sync_map_count_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/testing/bind_test_util.h b/system/gd/common/testing/bind_test_util.h index 7db92045f7..d3f8996265 100644 --- a/system/gd/common/testing/bind_test_util.h +++ b/system/gd/common/testing/bind_test_util.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/testing/wired_pair_of_bidi_queues.h b/system/gd/common/testing/wired_pair_of_bidi_queues.h index ca401cb9e0..663727f1df 100644 --- a/system/gd/common/testing/wired_pair_of_bidi_queues.h +++ b/system/gd/common/testing/wired_pair_of_bidi_queues.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/common/type_helper.h b/system/gd/common/type_helper.h index 2f4a9d74fe..7ffd9b7363 100644 --- a/system/gd/common/type_helper.h +++ b/system/gd/common/type_helper.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/crypto_toolbox/crypto_toolbox_test.cc b/system/gd/crypto_toolbox/crypto_toolbox_test.cc index 35ab082d89..382d7035d4 100644 --- a/system/gd/crypto_toolbox/crypto_toolbox_test.cc +++ b/system/gd/crypto_toolbox/crypto_toolbox_test.cc @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/fuzz/helpers.cc b/system/gd/fuzz/helpers.cc index a03f04aab8..1efe175dda 100644 --- a/system/gd/fuzz/helpers.cc +++ b/system/gd/fuzz/helpers.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/fuzz/helpers.h b/system/gd/fuzz/helpers.h index 7b90ff82bc..ed7f3ee852 100644 --- a/system/gd/fuzz/helpers.h +++ b/system/gd/fuzz/helpers.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/fuzz_test.cc b/system/gd/fuzz_test.cc index bdb007b295..73ad2fd65e 100644 --- a/system/gd/fuzz_test.cc +++ b/system/gd/fuzz_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/fuzz/fuzz_hci_hal.cc b/system/gd/hal/fuzz/fuzz_hci_hal.cc index a0db9f01d9..3d9afec3a8 100644 --- a/system/gd/hal/fuzz/fuzz_hci_hal.cc +++ b/system/gd/hal/fuzz/fuzz_hci_hal.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/fuzz/fuzz_hci_hal.h b/system/gd/hal/fuzz/fuzz_hci_hal.h index 07a3593e7c..ab9fc7ee64 100644 --- a/system/gd/hal/fuzz/fuzz_hci_hal.h +++ b/system/gd/hal/fuzz/fuzz_hci_hal.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/hci_backend.h b/system/gd/hal/hci_backend.h index 5c107ef8a1..657d771bbc 100644 --- a/system/gd/hal/hci_backend.h +++ b/system/gd/hal/hci_backend.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/hci_backend_aidl.cc b/system/gd/hal/hci_backend_aidl.cc index 04bd67f992..93994c374d 100644 --- a/system/gd/hal/hci_backend_aidl.cc +++ b/system/gd/hal/hci_backend_aidl.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/hci_backend_hidl.cc b/system/gd/hal/hci_backend_hidl.cc index 0fb2729307..79f69a44f0 100644 --- a/system/gd/hal/hci_backend_hidl.cc +++ b/system/gd/hal/hci_backend_hidl.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/hci_hal.h b/system/gd/hal/hci_hal.h index d016d354f2..2c028c3b6f 100644 --- a/system/gd/hal/hci_hal.h +++ b/system/gd/hal/hci_hal.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -51,6 +51,10 @@ public: // Send an ISO data packet from the controller to the host // @param data the ISO HCI packet to be passed to the host stack virtual void isoDataReceived(HciPacket data) = 0; + + // This function is invoked when the controller encounters an error requiring + // the Bluetooth stack to initiate a reset. + virtual void controllerNeedsReset() {} }; // Mirrors hardware/interfaces/bluetooth/1.0/IBluetoothHci.hal in Android @@ -101,9 +105,6 @@ public: // Get the MSFT opcode (as specified in Microsoft-defined Bluetooth HCI // extensions) virtual uint16_t getMsftOpcode() { return 0; } - - // Mark the controller as broken to prevent further read / write operation. - virtual void markControllerBroken() { return; } }; // LINT.ThenChange(fuzz/fuzz_hci_hal.h) diff --git a/system/gd/hal/hci_hal_android.cc b/system/gd/hal/hci_hal_android.cc index 8f1246d064..f548080d83 100644 --- a/system/gd/hal/hci_hal_android.cc +++ b/system/gd/hal/hci_hal_android.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/hci_hal_android_test.cc b/system/gd/hal/hci_hal_android_test.cc index 471e54bb70..f128f508cf 100644 --- a/system/gd/hal/hci_hal_android_test.cc +++ b/system/gd/hal/hci_hal_android_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ #include <queue> #include <thread> +#include "com_android_bluetooth_flags.h" #include "hal/hci_backend.h" #include "hal/hci_hal.h" #include "os/thread.h" @@ -79,10 +80,13 @@ protected: } void TearDown() override { - fake_registry_.StopAll(); handler_->Clear(); - delete thread_; + if (com::android::bluetooth::flags::same_handler_for_all_modules()) { + handler_->WaitUntilStopped(bluetooth::kHandlerStopTimeout); + } + fake_registry_.StopAll(); delete handler_; + delete thread_; } HciHal* hal; diff --git a/system/gd/hal/hci_hal_fake.cc b/system/gd/hal/hci_hal_fake.cc index 7d396dd571..781dde6749 100644 --- a/system/gd/hal/hci_hal_fake.cc +++ b/system/gd/hal/hci_hal_fake.cc @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/hci_hal_fake.h b/system/gd/hal/hci_hal_fake.h index 1d94f768ce..9d58064297 100644 --- a/system/gd/hal/hci_hal_fake.h +++ b/system/gd/hal/hci_hal_fake.h @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/hci_hal_host.cc b/system/gd/hal/hci_hal_host.cc index 970a2ae48c..bf020a2e02 100644 --- a/system/gd/hal/hci_hal_host.cc +++ b/system/gd/hal/hci_hal_host.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -262,9 +262,6 @@ public: void sendHciCommand(HciPacket command) override { std::lock_guard<std::mutex> lock(api_mutex_); - if (controller_broken_) { - return; - } log::assert_that(sock_fd_ != INVALID_FD, "assert failed: sock_fd_ != INVALID_FD"); std::vector<uint8_t> packet = std::move(command); btsnoop_logger_->Capture(packet, SnoopLogger::Direction::OUTGOING, @@ -275,9 +272,6 @@ public: void sendAclData(HciPacket data) override { std::lock_guard<std::mutex> lock(api_mutex_); - if (controller_broken_) { - return; - } log::assert_that(sock_fd_ != INVALID_FD, "assert failed: sock_fd_ != INVALID_FD"); std::vector<uint8_t> packet = std::move(data); btsnoop_logger_->Capture(packet, SnoopLogger::Direction::OUTGOING, @@ -288,10 +282,6 @@ public: void sendScoData(HciPacket data) override { std::lock_guard<std::mutex> lock(api_mutex_); - if (controller_broken_) { - return; - } - log::assert_that(sock_fd_ != INVALID_FD, "assert failed: sock_fd_ != INVALID_FD"); std::vector<uint8_t> packet = std::move(data); btsnoop_logger_->Capture(packet, SnoopLogger::Direction::OUTGOING, @@ -302,9 +292,6 @@ public: void sendIsoData(HciPacket data) override { std::lock_guard<std::mutex> lock(api_mutex_); - if (controller_broken_) { - return; - } log::assert_that(sock_fd_ != INVALID_FD, "assert failed: sock_fd_ != INVALID_FD"); std::vector<uint8_t> packet = std::move(data); btsnoop_logger_->Capture(packet, SnoopLogger::Direction::OUTGOING, @@ -317,15 +304,6 @@ public: return os::Management::getInstance().getVendorSpecificCode(MGMT_VS_OPCODE_MSFT); } - void markControllerBroken() override { - std::lock_guard<std::mutex> lock(api_mutex_); - if (controller_broken_) { - log::error("Controller already marked as broken!"); - return; - } - controller_broken_ = true; - } - protected: void ListDependencies(ModuleList* list) const { list->add<LinkClocker>(); } @@ -337,8 +315,7 @@ protected: // We don't want to crash when the chipset is broken. if (sock_fd_ == INVALID_FD) { log::error("Failed to connect to HCI socket. Aborting HAL initialization process."); - controller_broken_ = true; - kill(getpid(), SIGTERM); + incoming_packet_callback_->controllerNeedsReset(); return; } @@ -392,7 +369,6 @@ private: std::queue<std::vector<uint8_t>> hci_outgoing_queue_; SnoopLogger* btsnoop_logger_ = nullptr; LinkClocker* link_clocker_ = nullptr; - bool controller_broken_ = false; void write_to_fd(HciPacket packet) { // TODO(chromeos-bt-team@): replace this with new queue when it's ready @@ -414,8 +390,8 @@ private: hci_outgoing_queue_.pop(); if (bytes_written == -1) { log::error("Can't write to socket: {}", strerror(errno)); - markControllerBroken(); - kill(getpid(), SIGTERM); + incoming_packet_callback_->controllerNeedsReset(); + return; } if (hci_outgoing_queue_.empty()) { hci_incoming_thread_.GetReactor()->ModifyRegistration(reactable_, @@ -439,15 +415,13 @@ private: // we don't want crash when the chipset is broken. if (received_size == -1) { log::error("Can't receive from socket: {}", strerror(errno)); - markControllerBroken(); - kill(getpid(), SIGTERM); + incoming_packet_callback_->controllerNeedsReset(); return; } if (received_size == 0) { log::warn("Can't read H4 header. EOF received"); - markControllerBroken(); - kill(getpid(), SIGTERM); + incoming_packet_callback_->controllerNeedsReset(); return; } diff --git a/system/gd/hal/hci_hal_host.h b/system/gd/hal/hci_hal_host.h index 9f1350b265..42712d791a 100644 --- a/system/gd/hal/hci_hal_host.h +++ b/system/gd/hal/hci_hal_host.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/hci_hal_host_rootcanal.cc b/system/gd/hal/hci_hal_host_rootcanal.cc index 612372a962..065711059a 100644 --- a/system/gd/hal/hci_hal_host_rootcanal.cc +++ b/system/gd/hal/hci_hal_host_rootcanal.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/hci_hal_host_test.cc b/system/gd/hal/hci_hal_host_test.cc index 9f50867f59..d4539d6c3b 100644 --- a/system/gd/hal/hci_hal_host_test.cc +++ b/system/gd/hal/hci_hal_host_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,6 +32,7 @@ #include <utility> #include <vector> +#include "com_android_bluetooth_flags.h" #include "hal/hci_hal.h" #include "hal/serialize_packet.h" #include "os/thread.h" @@ -155,12 +156,15 @@ protected: void TearDown() override { hal_->unregisterIncomingPacketCallback(); + handler_->Clear(); + if (com::android::bluetooth::flags::same_handler_for_all_modules()) { + handler_->WaitUntilStopped(bluetooth::kHandlerStopTimeout); + } fake_registry_.StopAll(); + delete handler_; close(fake_server_socket_); - handler_->Clear(); delete fake_server_; delete thread_; - delete handler_; } void SetFakeServerSocketToBlocking() { diff --git a/system/gd/hal/link_clocker.cc b/system/gd/hal/link_clocker.cc index f491e9ee1b..0a7ee8366a 100644 --- a/system/gd/hal/link_clocker.cc +++ b/system/gd/hal/link_clocker.cc @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/link_clocker.h b/system/gd/hal/link_clocker.h index acabf0787b..34286bfd96 100644 --- a/system/gd/hal/link_clocker.h +++ b/system/gd/hal/link_clocker.h @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/ranging_hal.h b/system/gd/hal/ranging_hal.h index b22378970e..6966aedb0a 100644 --- a/system/gd/hal/ranging_hal.h +++ b/system/gd/hal/ranging_hal.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/ranging_hal_android.cc b/system/gd/hal/ranging_hal_android.cc index 033ed789f0..086e651da2 100644 --- a/system/gd/hal/ranging_hal_android.cc +++ b/system/gd/hal/ranging_hal_android.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/ranging_hal_host.cc b/system/gd/hal/ranging_hal_host.cc index 59282dc422..78ce007068 100644 --- a/system/gd/hal/ranging_hal_host.cc +++ b/system/gd/hal/ranging_hal_host.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/ranging_hal_mock.h b/system/gd/hal/ranging_hal_mock.h index 328411353f..84696d3f64 100644 --- a/system/gd/hal/ranging_hal_mock.h +++ b/system/gd/hal/ranging_hal_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2025 The Android Open Source Project + * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/serialize_packet.h b/system/gd/hal/serialize_packet.h index 70466fc164..9c13f4b671 100644 --- a/system/gd/hal/serialize_packet.h +++ b/system/gd/hal/serialize_packet.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/snoop_logger.cc b/system/gd/hal/snoop_logger.cc index a34e70162b..538d13ec3e 100644 --- a/system/gd/hal/snoop_logger.cc +++ b/system/gd/hal/snoop_logger.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/snoop_logger.h b/system/gd/hal/snoop_logger.h index f448eef4db..b009add89c 100644 --- a/system/gd/hal/snoop_logger.h +++ b/system/gd/hal/snoop_logger.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/snoop_logger_socket_test.cc b/system/gd/hal/snoop_logger_socket_test.cc index 85642e37ed..b40f6f5bf3 100644 --- a/system/gd/hal/snoop_logger_socket_test.cc +++ b/system/gd/hal/snoop_logger_socket_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/snoop_logger_socket_thread_test.cc b/system/gd/hal/snoop_logger_socket_thread_test.cc index a967a8d2a2..726f7ab245 100644 --- a/system/gd/hal/snoop_logger_socket_thread_test.cc +++ b/system/gd/hal/snoop_logger_socket_thread_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/snoop_logger_test.cc b/system/gd/hal/snoop_logger_test.cc index de42db5c06..78d9bb54e4 100644 --- a/system/gd/hal/snoop_logger_test.cc +++ b/system/gd/hal/snoop_logger_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/snoop_logger_tracing.cc b/system/gd/hal/snoop_logger_tracing.cc index 415aceab19..38ce3dec33 100644 --- a/system/gd/hal/snoop_logger_tracing.cc +++ b/system/gd/hal/snoop_logger_tracing.cc @@ -1,5 +1,5 @@ /* - * Copyright 2025 The Android Open Source Project + * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/snoop_logger_tracing.h b/system/gd/hal/snoop_logger_tracing.h index 9b4bd7be9d..ccf2a60605 100644 --- a/system/gd/hal/snoop_logger_tracing.h +++ b/system/gd/hal/snoop_logger_tracing.h @@ -1,5 +1,5 @@ /* - * Copyright 2025 The Android Open Source Project + * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/socket_hal.h b/system/gd/hal/socket_hal.h index 3922e29da0..3a6fba43b9 100644 --- a/system/gd/hal/socket_hal.h +++ b/system/gd/hal/socket_hal.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/socket_hal_android.cc b/system/gd/hal/socket_hal_android.cc index bdbf0a8663..4e206e3d35 100644 --- a/system/gd/hal/socket_hal_android.cc +++ b/system/gd/hal/socket_hal_android.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hal/socket_hal_host.cc b/system/gd/hal/socket_hal_host.cc index 292428a821..7ee57731cc 100644 --- a/system/gd/hal/socket_hal_host.cc +++ b/system/gd/hal/socket_hal_host.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_builder_test.cc b/system/gd/hci/acl_builder_test.cc index b23581e36f..6c78f0b1e9 100644 --- a/system/gd/hci/acl_builder_test.cc +++ b/system/gd/hci/acl_builder_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2018 The Android Open Source Project + * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_connection_interface.h b/system/gd/hci/acl_connection_interface.h index f90b9909d1..ba700aca0b 100644 --- a/system/gd/hci/acl_connection_interface.h +++ b/system/gd/hci/acl_connection_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager.cc b/system/gd/hci/acl_manager.cc index 6da8b37a6d..26b0ce70eb 100644 --- a/system/gd/hci/acl_manager.cc +++ b/system/gd/hci/acl_manager.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -260,11 +260,6 @@ void AclManager::CreateLeConnection(AddressWithType address_with_type, bool is_d CallOn(pimpl_->le_impl_, &le_impl::create_le_connection, address_with_type, true, is_direct); } -void AclManager::IsOnBackgroundList(AddressWithType address_with_type, std::promise<bool> promise) { - CallOn(pimpl_->le_impl_, &le_impl::is_on_background_connection_list, address_with_type, - std::move(promise)); -} - void AclManager::SetLeSuggestedDefaultDataParameters(uint16_t octets, uint16_t time) { CallOn(pimpl_->le_impl_, &le_impl::set_le_suggested_default_data_parameters, octets, time); } diff --git a/system/gd/hci/acl_manager.h b/system/gd/hci/acl_manager.h index 8326d479ab..2b3d523b1f 100644 --- a/system/gd/hci/acl_manager.h +++ b/system/gd/hci/acl_manager.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -108,7 +108,6 @@ public: // connected virtual void CancelConnect(Address address); virtual void RemoveFromBackgroundList(AddressWithType address_with_type); - virtual void IsOnBackgroundList(AddressWithType address_with_type, std::promise<bool> promise); virtual void CancelLeConnect(AddressWithType address_with_type); diff --git a/system/gd/hci/acl_manager/acl_connection.cc b/system/gd/hci/acl_manager/acl_connection.cc index e616416f63..28605cc033 100644 --- a/system/gd/hci/acl_manager/acl_connection.cc +++ b/system/gd/hci/acl_manager/acl_connection.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/acl_connection.h b/system/gd/hci/acl_manager/acl_connection.h index 0a7e7d1f07..03fe48755d 100644 --- a/system/gd/hci/acl_manager/acl_connection.h +++ b/system/gd/hci/acl_manager/acl_connection.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/acl_fragmenter.cc b/system/gd/hci/acl_manager/acl_fragmenter.cc index 3264ded78d..af0ced547e 100644 --- a/system/gd/hci/acl_manager/acl_fragmenter.cc +++ b/system/gd/hci/acl_manager/acl_fragmenter.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/acl_fragmenter.h b/system/gd/hci/acl_manager/acl_fragmenter.h index 28d14c1a3a..26fd7ea482 100644 --- a/system/gd/hci/acl_manager/acl_fragmenter.h +++ b/system/gd/hci/acl_manager/acl_fragmenter.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/acl_scheduler.cc b/system/gd/hci/acl_manager/acl_scheduler.cc index f7c47505af..65981d9c23 100644 --- a/system/gd/hci/acl_manager/acl_scheduler.cc +++ b/system/gd/hci/acl_manager/acl_scheduler.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/acl_scheduler.h b/system/gd/hci/acl_manager/acl_scheduler.h index c90ab11983..4c61461be1 100644 --- a/system/gd/hci/acl_manager/acl_scheduler.h +++ b/system/gd/hci/acl_manager/acl_scheduler.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/acl_scheduler_test.cc b/system/gd/hci/acl_manager/acl_scheduler_test.cc index fa5b0fc164..21414c5925 100644 --- a/system/gd/hci/acl_manager/acl_scheduler_test.cc +++ b/system/gd/hci/acl_manager/acl_scheduler_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/assembler.h b/system/gd/hci/acl_manager/assembler.h index d126a980a2..00e63e1e38 100644 --- a/system/gd/hci/acl_manager/assembler.h +++ b/system/gd/hci/acl_manager/assembler.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/classic_acl_connection.cc b/system/gd/hci/acl_manager/classic_acl_connection.cc index 301211c345..4a13a1335a 100644 --- a/system/gd/hci/acl_manager/classic_acl_connection.cc +++ b/system/gd/hci/acl_manager/classic_acl_connection.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/classic_acl_connection.h b/system/gd/hci/acl_manager/classic_acl_connection.h index 75dacf52d1..62c11b3196 100644 --- a/system/gd/hci/acl_manager/classic_acl_connection.h +++ b/system/gd/hci/acl_manager/classic_acl_connection.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/classic_acl_connection_test.cc b/system/gd/hci/acl_manager/classic_acl_connection_test.cc index 32949927e7..e6167285c8 100644 --- a/system/gd/hci/acl_manager/classic_acl_connection_test.cc +++ b/system/gd/hci/acl_manager/classic_acl_connection_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/classic_impl.h b/system/gd/hci/acl_manager/classic_impl.h index ecef1f9414..586b64549c 100644 --- a/system/gd/hci/acl_manager/classic_impl.h +++ b/system/gd/hci/acl_manager/classic_impl.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/classic_impl_test.cc b/system/gd/hci/acl_manager/classic_impl_test.cc index 6b57eac662..11e89bb633 100644 --- a/system/gd/hci/acl_manager/classic_impl_test.cc +++ b/system/gd/hci/acl_manager/classic_impl_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/connection_callbacks.h b/system/gd/hci/acl_manager/connection_callbacks.h index 8804b5ad9d..2998f20724 100644 --- a/system/gd/hci/acl_manager/connection_callbacks.h +++ b/system/gd/hci/acl_manager/connection_callbacks.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/connection_callbacks_mock.h b/system/gd/hci/acl_manager/connection_callbacks_mock.h index 64bd067db2..5018331c42 100644 --- a/system/gd/hci/acl_manager/connection_callbacks_mock.h +++ b/system/gd/hci/acl_manager/connection_callbacks_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/connection_management_callbacks.h b/system/gd/hci/acl_manager/connection_management_callbacks.h index 55d0062c0a..b4546a3a2d 100644 --- a/system/gd/hci/acl_manager/connection_management_callbacks.h +++ b/system/gd/hci/acl_manager/connection_management_callbacks.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/connection_management_callbacks_mock.h b/system/gd/hci/acl_manager/connection_management_callbacks_mock.h index e453ac99fc..eab69fcd39 100644 --- a/system/gd/hci/acl_manager/connection_management_callbacks_mock.h +++ b/system/gd/hci/acl_manager/connection_management_callbacks_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/le_acceptlist_callbacks.h b/system/gd/hci/acl_manager/le_acceptlist_callbacks.h index a7b7dd5f5e..d547a79c3c 100644 --- a/system/gd/hci/acl_manager/le_acceptlist_callbacks.h +++ b/system/gd/hci/acl_manager/le_acceptlist_callbacks.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/le_acl_connection.cc b/system/gd/hci/acl_manager/le_acl_connection.cc index 8e6f93be08..3b40ddc52c 100644 --- a/system/gd/hci/acl_manager/le_acl_connection.cc +++ b/system/gd/hci/acl_manager/le_acl_connection.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/le_acl_connection.h b/system/gd/hci/acl_manager/le_acl_connection.h index 5052be51a7..35ef292708 100644 --- a/system/gd/hci/acl_manager/le_acl_connection.h +++ b/system/gd/hci/acl_manager/le_acl_connection.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/le_acl_connection_test.cc b/system/gd/hci/acl_manager/le_acl_connection_test.cc index 5153fa4d3b..403f3fd9c4 100644 --- a/system/gd/hci/acl_manager/le_acl_connection_test.cc +++ b/system/gd/hci/acl_manager/le_acl_connection_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/le_connection_callbacks.h b/system/gd/hci/acl_manager/le_connection_callbacks.h index 2359c5ac32..c33dbbbe33 100644 --- a/system/gd/hci/acl_manager/le_connection_callbacks.h +++ b/system/gd/hci/acl_manager/le_connection_callbacks.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/le_connection_callbacks_mock.h b/system/gd/hci/acl_manager/le_connection_callbacks_mock.h index fca3e93b89..4866ed8e29 100644 --- a/system/gd/hci/acl_manager/le_connection_callbacks_mock.h +++ b/system/gd/hci/acl_manager/le_connection_callbacks_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/le_connection_management_callbacks.h b/system/gd/hci/acl_manager/le_connection_management_callbacks.h index 6ac56af029..d7b33c64b7 100644 --- a/system/gd/hci/acl_manager/le_connection_management_callbacks.h +++ b/system/gd/hci/acl_manager/le_connection_management_callbacks.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/le_connection_management_callbacks_mock.h b/system/gd/hci/acl_manager/le_connection_management_callbacks_mock.h index bfbd214779..280dd7a860 100644 --- a/system/gd/hci/acl_manager/le_connection_management_callbacks_mock.h +++ b/system/gd/hci/acl_manager/le_connection_management_callbacks_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/le_impl.h b/system/gd/hci/acl_manager/le_impl.h index ac3e7171f9..ce93f46e7e 100644 --- a/system/gd/hci/acl_manager/le_impl.h +++ b/system/gd/hci/acl_manager/le_impl.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,11 +39,11 @@ #include "hci/hci_packets.h" #include "hci/le_address_manager.h" #include "macros.h" +#include "main/shim/metrics_api.h" #include "os/alarm.h" #include "os/handler.h" #include "os/system_properties.h" #include "stack/include/btm_ble_api_types.h" -#include "stack/include/stack_metrics_logging.h" namespace bluetooth { namespace hci { @@ -426,7 +426,7 @@ public: return; } - log_le_connection_status(address, true /* is_connect */, status); + bluetooth::shim::LogMetricLeConnectionStatus(address, true /* is_connect */, status); const bool in_filter_accept_list = is_device_in_accept_list(remote_address); @@ -586,7 +586,8 @@ public: arm_on_resume_ = true; add_device_to_accept_list(remote_address); } - log_le_connection_status(remote_address.GetAddress(), false /* is_connect */, reason); + bluetooth::shim::LogMetricLeConnectionStatus(remote_address.GetAddress(), + false /* is_connect */, reason); } void on_le_connection_update_complete(LeMetaEventView view) { @@ -724,7 +725,8 @@ public: } void add_device_to_accept_list(AddressWithType address_with_type) { - log_le_device_in_accept_list(address_with_type.GetAddress(), true /* is_add */); + bluetooth::shim::LogMetricLeDeviceInAcceptList(address_with_type.GetAddress(), + true /* is_add */); if (connections.alreadyConnected(address_with_type)) { log::info("Device already connected, return"); return; @@ -747,7 +749,8 @@ public: } void remove_device_from_accept_list(AddressWithType address_with_type) { - log_le_device_in_accept_list(address_with_type.GetAddress(), false /* is_add */); + bluetooth::shim::LogMetricLeDeviceInAcceptList(address_with_type.GetAddress(), + false /* is_add */); if (accept_list.find(address_with_type) == accept_list.end()) { log::warn("Device not in acceptlist and cannot be removed: {}", address_with_type); return; @@ -1132,8 +1135,9 @@ public: remove_device_from_accept_list(address_with_type); } // Temporary mapping the error code to PAGE_TIMEOUT - log_le_connection_completion(address_with_type.GetAddress(), ErrorCode::PAGE_TIMEOUT, - true /* is locally initiated */); + bluetooth::shim::LogMetricLeConnectionCompletion(address_with_type.GetAddress(), + ErrorCode::PAGE_TIMEOUT, + true /* is locally initiated */); le_client_handler_->Post(common::BindOnce( &LeConnectionCallbacks::OnLeConnectFail, common::Unretained(le_client_callbacks_), address_with_type, ErrorCode::CONNECTION_ACCEPT_TIMEOUT)); @@ -1249,12 +1253,6 @@ public: background_connections_.erase(address_with_type); } - void is_on_background_connection_list(AddressWithType address_with_type, - std::promise<bool> promise) { - promise.set_value(background_connections_.find(address_with_type) != - background_connections_.end()); - } - void OnPause() override { // bluetooth::hci::LeAddressManagerCallback if (!address_manager_registered) { log::warn("Unregistered!"); diff --git a/system/gd/hci/acl_manager/le_impl_test.cc b/system/gd/hci/acl_manager/le_impl_test.cc index d43d2faca1..66bc16bbd8 100644 --- a/system/gd/hci/acl_manager/le_impl_test.cc +++ b/system/gd/hci/acl_manager/le_impl_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/round_robin_scheduler.cc b/system/gd/hci/acl_manager/round_robin_scheduler.cc index 6abf838728..89897a82e5 100644 --- a/system/gd/hci/acl_manager/round_robin_scheduler.cc +++ b/system/gd/hci/acl_manager/round_robin_scheduler.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ #include "hci/acl_manager/round_robin_scheduler.h" #include <bluetooth/log.h> -#include <com_android_bluetooth_flags.h> #include <memory> #include <utility> @@ -65,10 +64,8 @@ void RoundRobinScheduler::Unregister(uint16_t handle) { log::assert_that(acl_queue_handlers_.count(handle) == 1, "assert failed: acl_queue_handlers_.count(handle) == 1"); - if (com::android::bluetooth::flags::drop_acl_fragment_on_disconnect()) { - // Drop the pending fragments and recalculate number_of_sent_packets_ - drop_packet_fragments(handle); - } + // Drop the pending fragments and recalculate number_of_sent_packets_ + drop_packet_fragments(handle); auto& acl_queue_handler = acl_queue_handlers_.find(handle)->second; log::info("unregistering acl_queue handle={}, sent_packets={}", handle, @@ -94,8 +91,7 @@ void RoundRobinScheduler::Unregister(uint16_t handle) { starting_point_ = acl_queue_handlers_.begin(); // Restart sending packets if we got acl credits - if (com::android::bluetooth::flags::drop_acl_fragment_on_disconnect() && - credits_reclaimed_from_zero) { + if (credits_reclaimed_from_zero) { start_round_robin(); } } diff --git a/system/gd/hci/acl_manager/round_robin_scheduler.h b/system/gd/hci/acl_manager/round_robin_scheduler.h index 61be5f1147..080ce0988f 100644 --- a/system/gd/hci/acl_manager/round_robin_scheduler.h +++ b/system/gd/hci/acl_manager/round_robin_scheduler.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager/round_robin_scheduler_test.cc b/system/gd/hci/acl_manager/round_robin_scheduler_test.cc index f2c9b5528b..b990332c9e 100644 --- a/system/gd/hci/acl_manager/round_robin_scheduler_test.cc +++ b/system/gd/hci/acl_manager/round_robin_scheduler_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ #include "hci/acl_manager/round_robin_scheduler.h" -#include <com_android_bluetooth_flags.h> #include <gtest/gtest.h> #include "common/bidi_queue.h" @@ -422,8 +421,6 @@ TEST_F(RoundRobinSchedulerTest, receive_le_credit_when_next_fragment_is_classic) } TEST_F(RoundRobinSchedulerTest, unregister_reclaim_credits) { - com::android::bluetooth::flags::provider_->drop_acl_fragment_on_disconnect(true); - uint16_t handle = 0x01; auto connection_queue = std::make_shared<AclConnection::Queue>(20); auto new_connection_queue = std::make_shared<AclConnection::Queue>(20); diff --git a/system/gd/hci/acl_manager_mock.h b/system/gd/hci/acl_manager_mock.h index 330b82bdac..75af214e5b 100644 --- a/system/gd/hci/acl_manager_mock.h +++ b/system/gd/hci/acl_manager_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager_test.cc b/system/gd/hci/acl_manager_test.cc index e0a1c6674a..8b33dc723e 100644 --- a/system/gd/hci/acl_manager_test.cc +++ b/system/gd/hci/acl_manager_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/acl_manager_unittest.cc b/system/gd/hci/acl_manager_unittest.cc index bfb132594c..848141da0b 100644 --- a/system/gd/hci/acl_manager_unittest.cc +++ b/system/gd/hci/acl_manager_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/address_unittest.cc b/system/gd/hci/address_unittest.cc index 0254545631..ee81f975f6 100644 --- a/system/gd/hci/address_unittest.cc +++ b/system/gd/hci/address_unittest.cc @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/address_with_type.h b/system/gd/hci/address_with_type.h index 26c35e814d..b2a662bcae 100644 --- a/system/gd/hci/address_with_type.h +++ b/system/gd/hci/address_with_type.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/address_with_type_test.cc b/system/gd/hci/address_with_type_test.cc index c3b8bb0db9..9128bf1f57 100644 --- a/system/gd/hci/address_with_type_test.cc +++ b/system/gd/hci/address_with_type_test.cc @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/class_of_device_unittest.cc b/system/gd/hci/class_of_device_unittest.cc index 1d3f4f8f3a..4bcedfd84d 100644 --- a/system/gd/hci/class_of_device_unittest.cc +++ b/system/gd/hci/class_of_device_unittest.cc @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/command_interface.h b/system/gd/hci/command_interface.h index a6781ef7c5..56b6b5f63f 100644 --- a/system/gd/hci/command_interface.h +++ b/system/gd/hci/command_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/controller.cc b/system/gd/hci/controller.cc index eaba7da848..919643f14d 100644 --- a/system/gd/hci/controller.cc +++ b/system/gd/hci/controller.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -61,9 +61,7 @@ struct Controller::impl { handler->BindOn(this, &Controller::impl::NumberOfCompletedPackets)); set_event_mask(kDefaultEventMask); - if (com::android::bluetooth::flags::encryption_change_v2()) { - set_event_mask_page_2(kDefaultEventMaskPage2); - } + set_event_mask_page_2(kDefaultEventMaskPage2); write_le_host_support(Enable::ENABLED, Enable::DISABLED); hci_->EnqueueCommand( diff --git a/system/gd/hci/controller.h b/system/gd/hci/controller.h index 70609950da..6a35bb691f 100644 --- a/system/gd/hci/controller.h +++ b/system/gd/hci/controller.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/controller_interface.h b/system/gd/hci/controller_interface.h index a9ebecd32a..a2a7b64c18 100644 --- a/system/gd/hci/controller_interface.h +++ b/system/gd/hci/controller_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/controller_interface_mock.h b/system/gd/hci/controller_interface_mock.h index 36bc50a423..8b21585009 100644 --- a/system/gd/hci/controller_interface_mock.h +++ b/system/gd/hci/controller_interface_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/controller_mock.h b/system/gd/hci/controller_mock.h index fd3a7058d1..e39d721126 100644 --- a/system/gd/hci/controller_mock.h +++ b/system/gd/hci/controller_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/controller_test.cc b/system/gd/hci/controller_test.cc index fca2d3e9e2..e680a8598e 100644 --- a/system/gd/hci/controller_test.cc +++ b/system/gd/hci/controller_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/controller_unittest.cc b/system/gd/hci/controller_unittest.cc index 6ab8d4d68b..cb90589637 100644 --- a/system/gd/hci/controller_unittest.cc +++ b/system/gd/hci/controller_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/distance_measurement_interface.h b/system/gd/hci/distance_measurement_interface.h index 9b6e7727c3..055d9e875c 100644 --- a/system/gd/hci/distance_measurement_interface.h +++ b/system/gd/hci/distance_measurement_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/distance_measurement_manager.cc b/system/gd/hci/distance_measurement_manager.cc index 4fe3449b6b..6e57f2c9d5 100644 --- a/system/gd/hci/distance_measurement_manager.cc +++ b/system/gd/hci/distance_measurement_manager.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -337,7 +337,11 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback { } } - void stop() { hci_layer_->UnregisterLeEventHandler(hci::SubeventCode::TRANSMIT_POWER_REPORTING); } + void stop() { + hci_layer_->UnregisterLeEventHandler(hci::SubeventCode::TRANSMIT_POWER_REPORTING); + cs_requester_trackers_.clear(); + cs_responder_trackers_.clear(); + } void register_distance_measurement_callbacks(DistanceMeasurementCallbacks* callbacks) { distance_measurement_callbacks_ = callbacks; @@ -437,6 +441,8 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback { it->second.measurement_ongoing = true; it->second.waiting_for_start_callback = true; it->second.local_hci_role = local_hci_role; + it->second.retry_counter_for_create_config = 0; + it->second.retry_counter_for_cs_enable = 0; return true; } @@ -841,6 +847,7 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback { static void reset_tracker_on_stopped(CsTracker& cs_tracker) { cs_tracker.measurement_ongoing = false; cs_tracker.state = CsTrackerState::STOPPED; + cs_tracker.procedure_data_list.clear(); } void handle_cs_setup_failure(uint16_t connection_handle, DistanceMeasurementErrorCode errorCode) { @@ -902,7 +909,7 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback { if (cs_requester_trackers_.find(connection_handle) != cs_requester_trackers_.end()) { reset_tracker_on_stopped(cs_requester_trackers_[connection_handle]); } - } else if (status_view.GetStatus() != ErrorCode::SUCCESS) { + } else if (enable == Enable::ENABLED && status_view.GetStatus() != ErrorCode::SUCCESS) { if (cs_requester_trackers_.count(connection_handle) == 0) { log::error("Error code {} for connection_handle {}. No request tracker found.", ErrorCodeText(status), connection_handle); @@ -915,6 +922,14 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback { if (cs_requester_trackers_[connection_handle].retry_counter_for_cs_enable++ >= kMaxRetryCounterForCsEnable) { handle_cs_setup_failure(connection_handle, REASON_INTERNAL_ERROR); + } else { + cs_requester_trackers_[connection_handle].procedure_schedule_guard_alarm->Cancel(); + log::info("schedule next procedure enable after {} ms", + cs_requester_trackers_[connection_handle].interval_ms); + cs_requester_trackers_[connection_handle].procedure_schedule_guard_alarm->Schedule( + common::Bind(&impl::send_le_cs_procedure_enable, common::Unretained(this), + connection_handle, Enable::ENABLED), + std::chrono::milliseconds(cs_requester_trackers_[connection_handle].interval_ms)); } } } @@ -1233,25 +1248,8 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback { void on_cs_procedure_enable_complete(LeCsProcedureEnableCompleteView event_view) { log::assert_that(event_view.IsValid(), "assert failed: event_view.IsValid()"); uint16_t connection_handle = event_view.GetConnectionHandle(); - log::debug("on cs procedure enabled complete"); - if (event_view.GetStatus() != ErrorCode::SUCCESS) { - std::string error_code = ErrorCodeText(event_view.GetStatus()); - if (cs_requester_trackers_.count(connection_handle) == 0) { - log::warn( - "Received LeCsProcedureEnableCompleteView with error code {}, No request tracker " - "found", - error_code); - handle_cs_setup_failure(connection_handle, REASON_INTERNAL_ERROR); - return; - } - log::warn("Received LeCsProcedureEnableCompleteView with error code {}. Retry counter {}", - error_code, cs_requester_trackers_[connection_handle].retry_counter_for_cs_enable); - if (cs_requester_trackers_[connection_handle].retry_counter_for_cs_enable++ >= - kMaxRetryCounterForCsEnable) { - handle_cs_setup_failure(connection_handle, REASON_INTERNAL_ERROR); - } - return; - } + log::debug("Procedure enabled, {}", event_view.ToString()); + uint8_t config_id = event_view.GetConfigId(); CsTracker* live_tracker = nullptr; @@ -1268,7 +1266,7 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback { live_tracker = get_live_tracker(connection_handle, config_id, valid_requester_states, valid_responder_states); if (live_tracker == nullptr) { - log::error("no tracker is available for {}", connection_handle); + log::error("enable - no tracker is available for {}", connection_handle); return; } if (live_tracker->used_config_id != config_id) { @@ -1276,7 +1274,22 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback { live_tracker->used_config_id); return; } - log::debug("Procedure enabled, {}", event_view.ToString()); + + if (live_tracker->local_start && event_view.GetStatus() != ErrorCode::SUCCESS) { + log::warn("Received LeCsProcedureEnableCompleteView with error code {}. Retry counter {}", + ErrorCodeText(event_view.GetStatus()), live_tracker->retry_counter_for_cs_enable); + if (live_tracker->retry_counter_for_cs_enable++ >= kMaxRetryCounterForCsEnable) { + handle_cs_setup_failure(connection_handle, REASON_INTERNAL_ERROR); + } else { + live_tracker->procedure_schedule_guard_alarm->Cancel(); + log::info("schedule next procedure enable after {} ms", live_tracker->interval_ms); + live_tracker->procedure_schedule_guard_alarm->Schedule( + common::Bind(&impl::send_le_cs_procedure_enable, common::Unretained(this), + connection_handle, Enable::ENABLED), + std::chrono::milliseconds(live_tracker->interval_ms)); + } + return; + } live_tracker->state = CsTrackerState::STARTED; live_tracker->selected_tx_power = event_view.GetSelectedTxPower(); live_tracker->n_procedure_count = event_view.GetProcedureCount(); @@ -1293,38 +1306,45 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback { if (live_tracker->n_procedure_count >= 1) { live_tracker->procedure_schedule_guard_alarm->Cancel(); log::info("schedule next procedure enable after {} ms", schedule_interval); - cs_requester_trackers_[connection_handle].procedure_schedule_guard_alarm->Schedule( + live_tracker->procedure_schedule_guard_alarm->Schedule( common::Bind(&impl::send_le_cs_procedure_enable, common::Unretained(this), connection_handle, Enable::ENABLED), std::chrono::milliseconds(schedule_interval)); } - } - if (live_tracker->local_start && live_tracker->waiting_for_start_callback) { - live_tracker->waiting_for_start_callback = false; - distance_measurement_callbacks_->OnDistanceMeasurementStarted(live_tracker->address, - METHOD_CS); - } - if (live_tracker->local_start && is_hal_v2()) { - // reset the procedure sequence - live_tracker->procedure_sequence_after_enable = -1; - ranging_hal_->UpdateProcedureEnableConfig(connection_handle, event_view); + if (live_tracker->waiting_for_start_callback) { + live_tracker->waiting_for_start_callback = false; + distance_measurement_callbacks_->OnDistanceMeasurementStarted(live_tracker->address, + METHOD_CS); + } + if (is_hal_v2()) { + // reset the procedure sequence + live_tracker->procedure_sequence_after_enable = -1; + ranging_hal_->UpdateProcedureEnableConfig(connection_handle, event_view); + } } } else if (event_view.GetState() == Enable::DISABLED) { - uint8_t valid_requester_states = static_cast<uint8_t>(CsTrackerState::STARTED); - uint8_t valid_responder_states = static_cast<uint8_t>(CsTrackerState::STARTED); - live_tracker = get_live_tracker(connection_handle, config_id, valid_requester_states, - valid_responder_states); - if (live_tracker == nullptr) { - log::error("no tracker is available for {}", connection_handle); - return; + if (event_view.GetStatus() == ErrorCode::SUCCESS) { + // local or remote host requested it. + uint8_t valid_requester_states = static_cast<uint8_t>(CsTrackerState::STARTED); + uint8_t valid_responder_states = static_cast<uint8_t>(CsTrackerState::STARTED); + live_tracker = get_live_tracker(connection_handle, config_id, valid_requester_states, + valid_responder_states); + if (live_tracker == nullptr) { + log::error("disable - no tracker is available for {}", connection_handle); + return; + } + reset_tracker_on_stopped(*live_tracker); + } else { + // work around, controller may send 'DISABLE' complete with error for 'ENABLE' command + auto req_it = cs_requester_trackers_.find(connection_handle); + if (req_it != cs_requester_trackers_.end() && + req_it->second.state == CsTrackerState::WAIT_FOR_PROCEDURE_ENABLED && + config_id == req_it->second.used_config_id) { + log::warn("expect ENABLE complete, bug got DISABLE complete."); + handle_cs_setup_failure(connection_handle, REASON_INTERNAL_ERROR); + } } - reset_tracker_on_stopped(*live_tracker); - } - // reset the procedure data list. - std::vector<CsProcedureData>& data_list = live_tracker->procedure_data_list; - while (!data_list.empty()) { - data_list.erase(data_list.begin()); } } @@ -2618,17 +2638,17 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback { v1.insert(v1.end(), v2.begin(), v2.end()); } - os::Handler* handler_; - hal::RangingHal* ranging_hal_; - hci::Controller* controller_; - hci::HciLayer* hci_layer_; - hci::AclManager* acl_manager_; - hci::DistanceMeasurementInterface* distance_measurement_interface_; + os::Handler* handler_ = nullptr; + hal::RangingHal* ranging_hal_ = nullptr; + hci::Controller* controller_ = nullptr; + hci::HciLayer* hci_layer_ = nullptr; + hci::AclManager* acl_manager_ = nullptr; + hci::DistanceMeasurementInterface* distance_measurement_interface_ = nullptr; std::unordered_map<Address, RSSITracker> rssi_trackers; std::unordered_map<uint16_t, CsTracker> cs_requester_trackers_; std::unordered_map<uint16_t, CsTracker> cs_responder_trackers_; std::unordered_map<uint16_t, uint16_t> gatt_mtus_; - DistanceMeasurementCallbacks* distance_measurement_callbacks_; + DistanceMeasurementCallbacks* distance_measurement_callbacks_ = nullptr; CsOptionalSubfeaturesSupported cs_subfeature_supported_; uint8_t num_antennas_supported_ = 0x01; bool local_support_phase_based_ranging_ = false; diff --git a/system/gd/hci/distance_measurement_manager.h b/system/gd/hci/distance_measurement_manager.h index c0f3cae654..9d13e50cd1 100644 --- a/system/gd/hci/distance_measurement_manager.h +++ b/system/gd/hci/distance_measurement_manager.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/distance_measurement_manager_mock.h b/system/gd/hci/distance_measurement_manager_mock.h index 827c096670..ba9919af9e 100644 --- a/system/gd/hci/distance_measurement_manager_mock.h +++ b/system/gd/hci/distance_measurement_manager_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,12 +31,22 @@ struct DistanceMeasurementManager::impl : public bluetooth::hci::LeAddressManage namespace testing { class MockDistanceMeasurementCallbacks : public DistanceMeasurementCallbacks { +public: MOCK_METHOD(void, OnDistanceMeasurementStarted, (Address, DistanceMeasurementMethod)); MOCK_METHOD(void, OnDistanceMeasurementStopped, (Address, DistanceMeasurementErrorCode, DistanceMeasurementMethod)); MOCK_METHOD(void, OnDistanceMeasurementResult, (Address, uint32_t, uint32_t, int, int, int, int, uint64_t, int8_t, double, DistanceMeasurementDetectedAttackLevel, double, DistanceMeasurementMethod)); + MOCK_METHOD(void, OnRasFragmentReady, + (Address address, uint16_t procedure_counter, bool is_last, + std::vector<uint8_t> raw_data)); + MOCK_METHOD(void, OnVendorSpecificCharacteristics, + (std::vector<hal::VendorSpecificCharacteristic> vendor_specific_characteristics)); + MOCK_METHOD(void, OnVendorSpecificReply, + (Address address, std::vector<bluetooth::hal::VendorSpecificCharacteristic> + vendor_specific_characteristics)); + MOCK_METHOD(void, OnHandleVendorSpecificReplyComplete, (Address address, bool success)); }; class MockDistanceMeasurementManager : public DistanceMeasurementManager { diff --git a/system/gd/hci/distance_measurement_manager_test.cc b/system/gd/hci/distance_measurement_manager_test.cc index b7f2abe8b3..35a629c53a 100644 --- a/system/gd/hci/distance_measurement_manager_test.cc +++ b/system/gd/hci/distance_measurement_manager_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2025 The Android Open Source Project + * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,17 +21,34 @@ #include <gmock/gmock.h> #include <gtest/gtest.h> +#include "common/bind.h" +#include "common/strings.h" #include "hal/ranging_hal.h" #include "hal/ranging_hal_mock.h" #include "hci/acl_manager_mock.h" +#include "hci/address.h" #include "hci/controller.h" #include "hci/controller_mock.h" +#include "hci/distance_measurement_manager_mock.h" #include "hci/hci_layer.h" #include "hci/hci_layer_fake.h" #include "module.h" +#include "os/fake_timer/fake_timerfd.h" +#include "packet/packet_view.h" +#include "ras/ras_packets.h" +using bluetooth::os::fake_timer::fake_timerfd_advance; +using bluetooth::os::fake_timer::fake_timerfd_reset; +using testing::_; +using testing::AtLeast; using testing::Return; +namespace { +static constexpr auto kTimeout = std::chrono::seconds(1); +static constexpr uint8_t kMaxRetryCounterForCreateConfig = 0x03; +static constexpr uint8_t kMaxRetryCounterForCsEnable = 0x03; +} + namespace bluetooth { namespace hci { namespace { @@ -43,12 +60,113 @@ protected: }; class TestAclManager : public testing::MockAclManager { +public: + void AddDeviceToRelaxedConnectionIntervalList(const Address /*address*/) override {} + protected: void Start() override {} void Stop() override {} void ListDependencies(ModuleList* /* list */) const override {} }; +struct CsReadCapabilitiesCompleteEvent { + ErrorCode error_code = ErrorCode::SUCCESS; + uint8_t num_config_supported = 4; + uint16_t max_consecutive_procedures_supported = 0; + uint8_t num_antennas_supported = 2; + uint8_t max_antenna_paths_supported = 4; + CsRoleSupported roles_supported = {/*initiator=*/1, /*reflector=*/1}; + unsigned char modes_supported = {/*mode_3=*/1}; + CsRttCapability rtt_capability = {/*rtt_aa_only_n=*/1, /*rtt_sounding_n=*/1, + /*rtt_random_payload_n=*/1}; + uint8_t rtt_aa_only_n = 1; + uint8_t rtt_sounding_n = 1; + uint8_t rtt_random_payload_n = 1; + CsOptionalNadmSoundingCapability nadm_sounding_capability = { + /*normalized_attack_detector_metric=*/1}; + CsOptionalNadmRandomCapability nadm_random_capability = {/*normalized_attack_detector_metric=*/1}; + CsOptionalCsSyncPhysSupported cs_sync_phys_supported = {/*le_2m_phy=*/1, /*le_2m_2bt_phy=*/0}; + CsOptionalSubfeaturesSupported subfeatures_supported = {/*no_frequency_actuation_error=*/1, + /*channel_selection_algorithm=*/1, + /*phase_based_ranging=*/1}; + CsOptionalTIp1TimesSupported t_ip1_times_supported = { + /*support_10_microsecond=*/1, /*support_20_microsecond=*/1, + /*support_30_microsecond=*/1, /*support_40_microsecond=*/1, + /*support_50_microsecond=*/1, /*support_60_microsecond=*/1, + /*support_80_microsecond=*/1}; + CsOptionalTIp2TimesSupported t_ip2_times_supported = { + /*support_10_microsecond=*/1, /*support_20_microsecond=*/1, + /*support_30_microsecond=*/1, + /*support_40_microsecond=*/1, /*support_50_microsecond=*/1, + /*support_60_microsecond=*/1, /*support_80_microsecond=*/1}; + CsOptionalTFcsTimesSupported t_fcs_times_supported = { + /*support_15_microsecond=*/1, /*support_20_microsecond=*/1, + /*support_30_microsecond=*/1, /*support_40_microsecond=*/1, + /*support_50_microsecond=*/1, + /*support_60_microsecond=*/1, /*support_80_microsecond=*/1, + /*support_100_microsecond=*/1, + /*support_120_microsecond=*/1}; + CsOptionalTPmTimesSupported t_pm_times_supported = {/*support_10_microsecond=*/1, + /*support_20_microsecond=*/1}; + uint8_t t_sw_time_supported = 1; + uint8_t tx_snr_capability = 1; +}; + +struct CsConfigCompleteEvent { + ErrorCode status = ErrorCode::SUCCESS; + uint8_t config_id = 0; + CsAction action = CsAction::CONFIG_CREATED; + CsMainModeType main_mode_type = CsMainModeType::MODE_2; + CsSubModeType sub_mode_type = CsSubModeType::UNUSED; + uint8_t min_main_mode_steps = 3; // 0x02 to 0xFF + uint8_t max_main_mode_steps = 100; // 0x02 to 0xFF + uint8_t main_mode_repetition = 0; // 0x00 to 0x03 + uint8_t mode_0_steps = 1; // 0x01 to 0x03 + CsRole cs_role = CsRole::INITIATOR; + CsRttType rtt_type = CsRttType::RTT_AA_ONLY; + CsSyncPhy sync_phy = CsSyncPhy::LE_2M_PHY; + std::array<uint8_t, 10> channel_map = GetChannelMap("1FFFFFFFFFFFFC7FFFFC"); + uint8_t channel_map_repetition = 1; // 0x01 to 0xFF + CsChannelSelectionType channel_selection_type = CsChannelSelectionType::TYPE_3C; + CsCh3cShape ch3c_shape = CsCh3cShape::HAT_SHAPE; + uint8_t ch3c_jump = 2; // 0x02 to 0x08 + uint8_t t_ip1_time = 0x0A; // 0x0A, 0x14, 0x1E, 0x28, 0x32, 0x3C, 0x50, or 0x91 + uint8_t t_ip2_time = 0x0A; // 0x0A, 0x14, 0x1E, 0x28, 0x32, 0x3C, 0x50, or 0x91 + uint8_t t_fcs_time = 0x0F; // 0x0F, 0x14, 0x1E, 0x28, 0x32, 0x3C, 0x50, 0x64, 0x78, or 0x96 + uint8_t t_pm_time = 0x0A; // 0x0A, 0x14, or 0x28 + + static const std::array<uint8_t, 10> GetChannelMap(const std::string& hex_string) { + assert(hex_stinrg.length() == 20); + auto channel_vector = common::FromHexString(hex_string); + std::array<uint8_t, 10> channel_map{}; + std::copy(channel_vector->begin(), channel_vector->end(), channel_map.begin()); + std::reverse(channel_map.begin(), channel_map.end()); + return channel_map; + } +}; + +struct CsProcedureEnableCompleteEvent { + ErrorCode status = ErrorCode::SUCCESS; + uint8_t config_id = 0; + uint8_t tone_antenna_config_selection = 0; + uint8_t selected_tx_power = 0; // -127 to 20 dBm + uint32_t subevent_len = 2500; // 1250us to 4s + uint8_t subevents_per_event = 1; // 0x01 to 0x20 + uint16_t subevent_interval = 1; // N x 0.625ms + uint16_t event_interval = 0; // number of acl conn interval + uint16_t procedure_interval = 2; // number of acl conn interval + uint16_t procedure_count = 5; // 0x0001 to 0xFFFF + uint16_t max_procedure_len = 10; // N x 0.625 ms +}; + +struct StartMeasurementParameters { + Address remote_address = Address::FromString("12:34:56:78:9a:bc").value(); + uint16_t connection_handle = 64; + Role local_hci_role = Role::CENTRAL; + uint16_t interval = 200; // 200ms + DistanceMeasurementMethod method = DistanceMeasurementMethod::METHOD_CS; +}; + class DistanceMeasurementManagerTest : public ::testing::Test { protected: void SetUp() override { @@ -65,10 +183,13 @@ protected: ASSERT_NE(client_handler_, nullptr); EXPECT_CALL(*mock_controller_, SupportsBleChannelSounding()).WillOnce(Return(true)); - EXPECT_CALL(*mock_ranging_hal_, IsBound()).WillOnce(Return(true)); + EXPECT_CALL(*mock_ranging_hal_, IsBound()).Times(AtLeast(1)).WillRepeatedly(Return(true)); + EXPECT_CALL(*mock_ranging_hal_, GetRangingHalVersion).WillRepeatedly(Return(hal::V_2)); handler_ = fake_registry_.GetTestHandler(); dm_manager_ = fake_registry_.Start<DistanceMeasurementManager>(&thread_, handler_); + + dm_manager_->RegisterDistanceMeasurementCallbacks(&mock_dm_callbacks_); } void TearDown() override { @@ -77,6 +198,178 @@ protected: fake_registry_.StopAll(); } + std::future<void> GetDmSessionFuture() { + log::assert_that(dm_session_promise_ == nullptr, "Promises promises ... Only one at a time"); + dm_session_promise_ = std::make_unique<std::promise<void>>(); + return dm_session_promise_->get_future(); + } + + std::future<void> fake_timer_advance(uint64_t ms) { + std::promise<void> promise; + auto future = promise.get_future(); + handler_->Post(common::BindOnce( + [](std::promise<void> promise, uint64_t ms) { + fake_timerfd_advance(ms); + promise.set_value(); + }, + common::Passed(std::move(promise)), ms)); + + return future; + } + + void sync_client_handler() { + log::assert_that(thread_.GetReactor()->WaitForIdle(kTimeout), + "assert failed: thread_.GetReactor()->WaitForIdle(kTimeout)"); + } + + static std::unique_ptr<LeCsReadLocalSupportedCapabilitiesCompleteBuilder> + GetLocalSupportedCapabilitiesCompleteEvent( + const CsReadCapabilitiesCompleteEvent& cs_cap_complete_event) { + return LeCsReadLocalSupportedCapabilitiesCompleteBuilder::Create( + /*num_hci_command_packets=*/0xFF, cs_cap_complete_event.error_code, + cs_cap_complete_event.num_config_supported, + cs_cap_complete_event.max_consecutive_procedures_supported, + cs_cap_complete_event.num_antennas_supported, + cs_cap_complete_event.max_antenna_paths_supported, + cs_cap_complete_event.roles_supported, cs_cap_complete_event.modes_supported, + cs_cap_complete_event.rtt_capability, cs_cap_complete_event.rtt_aa_only_n, + cs_cap_complete_event.rtt_sounding_n, cs_cap_complete_event.rtt_random_payload_n, + cs_cap_complete_event.nadm_sounding_capability, + cs_cap_complete_event.nadm_random_capability, + cs_cap_complete_event.cs_sync_phys_supported, + cs_cap_complete_event.subfeatures_supported, + cs_cap_complete_event.t_ip1_times_supported, + cs_cap_complete_event.t_ip2_times_supported, + cs_cap_complete_event.t_fcs_times_supported, cs_cap_complete_event.t_pm_times_supported, + cs_cap_complete_event.t_sw_time_supported, cs_cap_complete_event.tx_snr_capability); + } + + static std::unique_ptr<LeCsReadRemoteSupportedCapabilitiesCompleteBuilder> + GetRemoteSupportedCapabilitiesCompleteEvent( + uint16_t connection_handle, + const CsReadCapabilitiesCompleteEvent& cs_cap_complete_event) { + return LeCsReadRemoteSupportedCapabilitiesCompleteBuilder::Create( + cs_cap_complete_event.error_code, connection_handle, + cs_cap_complete_event.num_config_supported, + cs_cap_complete_event.max_consecutive_procedures_supported, + cs_cap_complete_event.num_antennas_supported, + cs_cap_complete_event.max_antenna_paths_supported, + cs_cap_complete_event.roles_supported, cs_cap_complete_event.modes_supported, + cs_cap_complete_event.rtt_capability, cs_cap_complete_event.rtt_aa_only_n, + cs_cap_complete_event.rtt_sounding_n, cs_cap_complete_event.rtt_random_payload_n, + cs_cap_complete_event.nadm_sounding_capability, + cs_cap_complete_event.nadm_random_capability, + cs_cap_complete_event.cs_sync_phys_supported, + cs_cap_complete_event.subfeatures_supported, + cs_cap_complete_event.t_ip1_times_supported, + cs_cap_complete_event.t_ip2_times_supported, + cs_cap_complete_event.t_fcs_times_supported, cs_cap_complete_event.t_pm_times_supported, + cs_cap_complete_event.t_sw_time_supported, cs_cap_complete_event.tx_snr_capability); + } + + static std::unique_ptr<LeCsConfigCompleteBuilder> GetConfigCompleteEvent( + uint16_t connection_handle, CsConfigCompleteEvent complete_event) { + return LeCsConfigCompleteBuilder::Create( + complete_event.status, connection_handle, complete_event.config_id, + complete_event.action, complete_event.main_mode_type, complete_event.sub_mode_type, + complete_event.min_main_mode_steps, complete_event.max_main_mode_steps, + complete_event.main_mode_repetition, complete_event.mode_0_steps, + complete_event.cs_role, complete_event.rtt_type, complete_event.sync_phy, + complete_event.channel_map, complete_event.channel_map_repetition, + complete_event.channel_selection_type, complete_event.ch3c_shape, + complete_event.ch3c_jump, complete_event.t_ip1_time, complete_event.t_ip2_time, + complete_event.t_fcs_time, complete_event.t_pm_time); + } + + static std::unique_ptr<LeCsProcedureEnableCompleteBuilder> GetProcedureEnableCompleteEvent( + uint16_t connection_handle, Enable enable, + CsProcedureEnableCompleteEvent complete_event) { + return LeCsProcedureEnableCompleteBuilder::Create( + complete_event.status, connection_handle, complete_event.config_id, enable, + complete_event.tone_antenna_config_selection, complete_event.selected_tx_power, + complete_event.subevent_len, complete_event.subevents_per_event, + complete_event.subevent_interval, complete_event.event_interval, + complete_event.procedure_interval, complete_event.procedure_count, + complete_event.max_procedure_len); + } + + void StartMeasurement(const StartMeasurementParameters& params) { + dm_manager_->StartDistanceMeasurement(params.remote_address, params.connection_handle, + params.local_hci_role, params.interval, params.method); + } + + void ReceivedReadLocalCapabilitiesComplete() { + CsReadCapabilitiesCompleteEvent read_cs_complete_event; + test_hci_layer_->IncomingEvent( + GetLocalSupportedCapabilitiesCompleteEvent(read_cs_complete_event)); + } + + void StartMeasurementTillRasConnectedEvent(const StartMeasurementParameters& params) { + ReceivedReadLocalCapabilitiesComplete(); + EXPECT_CALL(*mock_ranging_hal_, OpenSession(_, _, _)) + .WillOnce([this](uint16_t connection_handle, uint16_t /*att_handle*/, + const std::vector<hal::VendorSpecificCharacteristic>& + vendor_specific_data) { + mock_ranging_hal_->GetRangingHalCallback()->OnOpened(connection_handle, + vendor_specific_data); + }); + StartMeasurement(params); + dm_manager_->HandleRasClientConnectedEvent( + params.remote_address, params.connection_handle, + /*att_handle=*/0, + /*vendor_specific_data=*/std::vector<hal::VendorSpecificCharacteristic>(), + /*conn_interval=*/24); + } + + void StartMeasurementTillReadRemoteCaps(const StartMeasurementParameters& params) { + StartMeasurementTillRasConnectedEvent(params); + + test_hci_layer_->GetCommand(OpCode::LE_CS_READ_REMOTE_SUPPORTED_CAPABILITIES); + CsReadCapabilitiesCompleteEvent read_cs_complete_event; + test_hci_layer_->IncomingEvent(LeCsReadRemoteSupportedCapabilitiesStatusBuilder::Create( + /*status=*/ErrorCode::SUCCESS, + /*num_hci_command_packets=*/0xFF)); + test_hci_layer_->IncomingLeMetaEvent(GetRemoteSupportedCapabilitiesCompleteEvent( + params.connection_handle, read_cs_complete_event)); + + test_hci_layer_->GetCommand(OpCode::LE_CS_SET_DEFAULT_SETTINGS); + test_hci_layer_->IncomingEvent(LeCsSetDefaultSettingsCompleteBuilder::Create( + /*num_hci_command_packets=*/static_cast<uint8_t>(0xEE), ErrorCode::SUCCESS, + params.connection_handle)); + } + + void StartMeasurementTillCreateConfig(const StartMeasurementParameters& params) { + StartMeasurementTillReadRemoteCaps(params); + + CsConfigCompleteEvent cs_config_complete_event; + test_hci_layer_->GetCommand(OpCode::LE_CS_CREATE_CONFIG); + test_hci_layer_->IncomingEvent(LeCsCreateConfigStatusBuilder::Create( + /*status=*/ErrorCode::SUCCESS, + /*num_hci_command_packets=*/0xFF)); + test_hci_layer_->IncomingLeMetaEvent( + GetConfigCompleteEvent(params.connection_handle, cs_config_complete_event)); + } + + void StartMeasurementTillSecurityEnable(const StartMeasurementParameters& params) { + StartMeasurementTillCreateConfig(params); + + test_hci_layer_->GetCommand(OpCode::LE_CS_SECURITY_ENABLE); + test_hci_layer_->IncomingEvent(LeCsSecurityEnableStatusBuilder::Create( + /*status=*/ErrorCode::SUCCESS, + /*num_hci_command_packets=*/0xFF)); + test_hci_layer_->IncomingLeMetaEvent(LeCsSecurityEnableCompleteBuilder::Create( + ErrorCode::SUCCESS, params.connection_handle)); + } + + void StartMeasurementTillSetProcedureParameters(const StartMeasurementParameters& params) { + StartMeasurementTillSecurityEnable(params); + + test_hci_layer_->GetCommand(OpCode::LE_CS_SET_PROCEDURE_PARAMETERS); + test_hci_layer_->IncomingEvent(LeCsSetProcedureParametersCompleteBuilder::Create( + /*num_hci_command_packets=*/static_cast<uint8_t>(0xEE), ErrorCode::SUCCESS, + params.connection_handle)); + } + protected: TestModuleRegistry fake_registry_; HciLayerFake* test_hci_layer_ = nullptr; @@ -88,12 +381,249 @@ protected: os::Handler* handler_ = nullptr; DistanceMeasurementManager* dm_manager_ = nullptr; + testing::MockDistanceMeasurementCallbacks mock_dm_callbacks_; + std::unique_ptr<std::promise<void>> dm_session_promise_; }; TEST_F(DistanceMeasurementManagerTest, setup_teardown) { EXPECT_NE(mock_ranging_hal_->GetRangingHalCallback(), nullptr); } +TEST_F(DistanceMeasurementManagerTest, fail_read_local_cs_capabilities) { + StartMeasurementParameters params; + auto dm_session_future = GetDmSessionFuture(); + EXPECT_CALL(mock_dm_callbacks_, + OnDistanceMeasurementStopped(params.remote_address, + DistanceMeasurementErrorCode::REASON_INTERNAL_ERROR, + DistanceMeasurementMethod::METHOD_CS)) + .WillOnce([this](const Address& /*address*/, DistanceMeasurementErrorCode /*error_code*/, + DistanceMeasurementMethod /*method*/) { + ASSERT_NE(dm_session_promise_, nullptr); + dm_session_promise_->set_value(); + dm_session_promise_.reset(); + }); + + CsReadCapabilitiesCompleteEvent read_cs_complete_event; + read_cs_complete_event.error_code = ErrorCode::COMMAND_DISALLOWED; + test_hci_layer_->IncomingEvent( + GetLocalSupportedCapabilitiesCompleteEvent(read_cs_complete_event)); + + StartMeasurement(params); + + dm_session_future.wait_for(kTimeout); + sync_client_handler(); +} + +TEST_F(DistanceMeasurementManagerTest, ras_remote_not_support) { + ReceivedReadLocalCapabilitiesComplete(); + StartMeasurementParameters params; + auto dm_session_future = GetDmSessionFuture(); + EXPECT_CALL(mock_dm_callbacks_, + OnDistanceMeasurementStopped( + params.remote_address, + DistanceMeasurementErrorCode::REASON_FEATURE_NOT_SUPPORTED_REMOTE, + DistanceMeasurementMethod::METHOD_CS)) + .WillOnce([this](const Address& /*address*/, DistanceMeasurementErrorCode /*error_code*/, + DistanceMeasurementMethod /*method*/) { + ASSERT_NE(dm_session_promise_, nullptr); + dm_session_promise_->set_value(); + dm_session_promise_.reset(); + }); + + StartMeasurement(params); + dm_manager_->HandleRasClientDisconnectedEvent(params.remote_address, + ras::RasDisconnectReason::SERVER_NOT_AVAILABLE); + + dm_session_future.wait_for(kTimeout); + sync_client_handler(); +} + +TEST_F(DistanceMeasurementManagerTest, error_read_remote_cs_caps_command) { + auto dm_session_future = GetDmSessionFuture(); + StartMeasurementParameters params; + StartMeasurementTillRasConnectedEvent(params); + + EXPECT_CALL(mock_dm_callbacks_, + OnDistanceMeasurementStopped(params.remote_address, + DistanceMeasurementErrorCode::REASON_INTERNAL_ERROR, + DistanceMeasurementMethod::METHOD_CS)) + .WillOnce([this](const Address& /*address*/, DistanceMeasurementErrorCode /*error_code*/, + DistanceMeasurementMethod /*method*/) { + ASSERT_NE(dm_session_promise_, nullptr); + dm_session_promise_->set_value(); + dm_session_promise_.reset(); + }); + + test_hci_layer_->GetCommand(OpCode::LE_CS_READ_REMOTE_SUPPORTED_CAPABILITIES); + test_hci_layer_->IncomingEvent(LeCsReadRemoteSupportedCapabilitiesStatusBuilder::Create( + /*status=*/ErrorCode::COMMAND_DISALLOWED, + /*num_hci_command_packets=*/0xff)); + sync_client_handler(); +} + +TEST_F(DistanceMeasurementManagerTest, fail_read_remote_cs_caps_complete) { + auto dm_session_future = GetDmSessionFuture(); + StartMeasurementParameters params; + StartMeasurementTillRasConnectedEvent(params); + + EXPECT_CALL(mock_dm_callbacks_, + OnDistanceMeasurementStopped(params.remote_address, + DistanceMeasurementErrorCode::REASON_INTERNAL_ERROR, + DistanceMeasurementMethod::METHOD_CS)) + .WillOnce([this](const Address& /*address*/, DistanceMeasurementErrorCode /*error_code*/, + DistanceMeasurementMethod /*method*/) { + ASSERT_NE(dm_session_promise_, nullptr); + dm_session_promise_->set_value(); + dm_session_promise_.reset(); + }); + + test_hci_layer_->GetCommand(OpCode::LE_CS_READ_REMOTE_SUPPORTED_CAPABILITIES); + CsReadCapabilitiesCompleteEvent read_cs_complete_event; + read_cs_complete_event.error_code = ErrorCode::COMMAND_DISALLOWED; + test_hci_layer_->IncomingLeMetaEvent(GetRemoteSupportedCapabilitiesCompleteEvent( + params.connection_handle, read_cs_complete_event)); + sync_client_handler(); +} + +TEST_F(DistanceMeasurementManagerTest, error_create_config_command) { + auto dm_session_future = GetDmSessionFuture(); + StartMeasurementParameters params; + StartMeasurementTillReadRemoteCaps(params); + + EXPECT_CALL(mock_dm_callbacks_, + OnDistanceMeasurementStopped(params.remote_address, + DistanceMeasurementErrorCode::REASON_INTERNAL_ERROR, + DistanceMeasurementMethod::METHOD_CS)) + .WillOnce([this](const Address& /*address*/, DistanceMeasurementErrorCode /*error_code*/, + DistanceMeasurementMethod /*method*/) { + ASSERT_NE(dm_session_promise_, nullptr); + dm_session_promise_->set_value(); + dm_session_promise_.reset(); + }); + + test_hci_layer_->GetCommand(OpCode::LE_CS_CREATE_CONFIG); + test_hci_layer_->IncomingEvent(LeCsCreateConfigStatusBuilder::Create( + /*status=*/ErrorCode::COMMAND_DISALLOWED, + /*num_hci_command_packets=*/0xff)); + sync_client_handler(); +} + +TEST_F(DistanceMeasurementManagerTest, fail_create_config_complete) { + auto dm_session_future = GetDmSessionFuture(); + StartMeasurementParameters params; + StartMeasurementTillReadRemoteCaps(params); + + EXPECT_CALL(mock_dm_callbacks_, + OnDistanceMeasurementStopped(params.remote_address, + DistanceMeasurementErrorCode::REASON_INTERNAL_ERROR, + DistanceMeasurementMethod::METHOD_CS)) + .WillOnce([this](const Address& /*address*/, DistanceMeasurementErrorCode /*error_code*/, + DistanceMeasurementMethod /*method*/) { + ASSERT_NE(dm_session_promise_, nullptr); + dm_session_promise_->set_value(); + dm_session_promise_.reset(); + }); + + CsConfigCompleteEvent cs_config_complete_event; + cs_config_complete_event.status = ErrorCode::COMMAND_DISALLOWED; + for (int i = 0; i <= kMaxRetryCounterForCreateConfig; i++) { + test_hci_layer_->GetCommand(OpCode::LE_CS_CREATE_CONFIG); + test_hci_layer_->IncomingLeMetaEvent( + GetConfigCompleteEvent(params.connection_handle, cs_config_complete_event)); + } + sync_client_handler(); +} + +TEST_F(DistanceMeasurementManagerTest, retry_fail_procedure_enable_command) { + auto dm_session_future = GetDmSessionFuture(); + StartMeasurementParameters params; + StartMeasurementTillSetProcedureParameters(params); + + EXPECT_CALL(mock_dm_callbacks_, + OnDistanceMeasurementStopped(params.remote_address, + DistanceMeasurementErrorCode::REASON_INTERNAL_ERROR, + DistanceMeasurementMethod::METHOD_CS)) + .WillOnce([this](const Address& /*address*/, DistanceMeasurementErrorCode /*error_code*/, + DistanceMeasurementMethod /*method*/) { + ASSERT_NE(dm_session_promise_, nullptr); + dm_session_promise_->set_value(); + dm_session_promise_.reset(); + }); + + for (int i = 0; i <= kMaxRetryCounterForCsEnable; i++) { + test_hci_layer_->GetCommand(OpCode::LE_CS_PROCEDURE_ENABLE); + test_hci_layer_->IncomingEvent(LeCsProcedureEnableStatusBuilder::Create( + /*status=*/ErrorCode::COMMAND_DISALLOWED, + /*num_hci_command_packets=*/0xff)); + auto future = fake_timer_advance(params.interval + 10); + future.wait_for(kTimeout); + sync_client_handler(); + } + fake_timerfd_reset(); + sync_client_handler(); +} + +TEST_F(DistanceMeasurementManagerTest, retry_fail_procedure_enable_complete) { + auto dm_session_future = GetDmSessionFuture(); + StartMeasurementParameters params; + StartMeasurementTillSetProcedureParameters(params); + + EXPECT_CALL(mock_dm_callbacks_, + OnDistanceMeasurementStopped(params.remote_address, + DistanceMeasurementErrorCode::REASON_INTERNAL_ERROR, + DistanceMeasurementMethod::METHOD_CS)) + .WillOnce([this](const Address& /*address*/, DistanceMeasurementErrorCode /*error_code*/, + DistanceMeasurementMethod /*method*/) { + ASSERT_NE(dm_session_promise_, nullptr); + dm_session_promise_->set_value(); + dm_session_promise_.reset(); + }); + + CsProcedureEnableCompleteEvent complete_event; + complete_event.status = ErrorCode::LINK_LAYER_COLLISION; + for (int i = 0; i <= kMaxRetryCounterForCsEnable; i++) { + test_hci_layer_->GetCommand(OpCode::LE_CS_PROCEDURE_ENABLE); + test_hci_layer_->IncomingEvent(LeCsProcedureEnableStatusBuilder::Create( + /*status=*/ErrorCode::SUCCESS, + /*num_hci_command_packets=*/0xff)); + test_hci_layer_->IncomingLeMetaEvent(GetProcedureEnableCompleteEvent( + params.connection_handle, Enable::ENABLED, complete_event)); + auto future = fake_timer_advance(params.interval + 10); + future.wait_for(kTimeout); + sync_client_handler(); + } + fake_timerfd_reset(); + sync_client_handler(); +} + +TEST_F(DistanceMeasurementManagerTest, unexpected_procedure_enable_complete_as_disable) { + auto dm_session_future = GetDmSessionFuture(); + StartMeasurementParameters params; + StartMeasurementTillSetProcedureParameters(params); + + EXPECT_CALL(mock_dm_callbacks_, + OnDistanceMeasurementStopped(params.remote_address, + DistanceMeasurementErrorCode::REASON_INTERNAL_ERROR, + DistanceMeasurementMethod::METHOD_CS)) + .WillOnce([this](const Address& /*address*/, DistanceMeasurementErrorCode /*error_code*/, + DistanceMeasurementMethod /*method*/) { + ASSERT_NE(dm_session_promise_, nullptr); + dm_session_promise_->set_value(); + dm_session_promise_.reset(); + }); + + test_hci_layer_->GetCommand(OpCode::LE_CS_PROCEDURE_ENABLE); + test_hci_layer_->IncomingEvent(LeCsProcedureEnableStatusBuilder::Create( + /*status=*/ErrorCode::SUCCESS, + /*num_hci_command_packets=*/0xff)); + CsProcedureEnableCompleteEvent complete_event; + complete_event.status = ErrorCode::LINK_LAYER_COLLISION; + test_hci_layer_->IncomingLeMetaEvent(GetProcedureEnableCompleteEvent( + params.connection_handle, Enable::DISABLED, complete_event)); + + sync_client_handler(); +} + } // namespace } // namespace hci } // namespace bluetooth diff --git a/system/gd/hci/enum_helper.h b/system/gd/hci/enum_helper.h index 43ac2f92a1..ad97c318e5 100644 --- a/system/gd/hci/enum_helper.h +++ b/system/gd/hci/enum_helper.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/event_checkers.h b/system/gd/hci/event_checkers.h index a484f5752e..8263f238df 100644 --- a/system/gd/hci/event_checkers.h +++ b/system/gd/hci/event_checkers.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/fuzz/acl_manager_fuzz_test.cc b/system/gd/hci/fuzz/acl_manager_fuzz_test.cc index d9c039415c..6c98e82168 100644 --- a/system/gd/hci/fuzz/acl_manager_fuzz_test.cc +++ b/system/gd/hci/fuzz/acl_manager_fuzz_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/fuzz/fuzz_hci_layer.cc b/system/gd/hci/fuzz/fuzz_hci_layer.cc index 64115ec253..d665655bd3 100644 --- a/system/gd/hci/fuzz/fuzz_hci_layer.cc +++ b/system/gd/hci/fuzz/fuzz_hci_layer.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/fuzz/fuzz_hci_layer.h b/system/gd/hci/fuzz/fuzz_hci_layer.h index d4a69c114e..59a09acfe2 100644 --- a/system/gd/hci/fuzz/fuzz_hci_layer.h +++ b/system/gd/hci/fuzz/fuzz_hci_layer.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/fuzz/hci_layer_fuzz_client.cc b/system/gd/hci/fuzz/hci_layer_fuzz_client.cc index 6ca1b15f99..a76770dd70 100644 --- a/system/gd/hci/fuzz/hci_layer_fuzz_client.cc +++ b/system/gd/hci/fuzz/hci_layer_fuzz_client.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/fuzz/hci_layer_fuzz_client.h b/system/gd/hci/fuzz/hci_layer_fuzz_client.h index 3f9942c48a..3a62de2890 100644 --- a/system/gd/hci/fuzz/hci_layer_fuzz_client.h +++ b/system/gd/hci/fuzz/hci_layer_fuzz_client.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/fuzz/hci_layer_fuzz_test.cc b/system/gd/hci/fuzz/hci_layer_fuzz_test.cc index 1fed31e882..3f362879f5 100644 --- a/system/gd/hci/fuzz/hci_layer_fuzz_test.cc +++ b/system/gd/hci/fuzz/hci_layer_fuzz_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/fuzz/status_vs_complete_commands.cc b/system/gd/hci/fuzz/status_vs_complete_commands.cc index c4cc72ca73..8c21cdeeec 100644 --- a/system/gd/hci/fuzz/status_vs_complete_commands.cc +++ b/system/gd/hci/fuzz/status_vs_complete_commands.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/fuzz/status_vs_complete_commands.h b/system/gd/hci/fuzz/status_vs_complete_commands.h index 57cb9c1174..c2831f2819 100644 --- a/system/gd/hci/fuzz/status_vs_complete_commands.h +++ b/system/gd/hci/fuzz/status_vs_complete_commands.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/hci_interface.h b/system/gd/hci/hci_interface.h index 46c5f400bd..677dead98e 100644 --- a/system/gd/hci/hci_interface.h +++ b/system/gd/hci/hci_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/hci_layer.cc b/system/gd/hci/hci_layer.cc index fd3d4ff278..da370a7564 100644 --- a/system/gd/hci/hci_layer.cc +++ b/system/gd/hci/hci_layer.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -64,6 +64,11 @@ using std::unique_ptr; static std::recursive_mutex life_cycle_guard; static bool life_cycle_stopped = true; +#ifdef TARGET_FLOSS +// Signal to indicate the controller needs to be reset. +const int SIG_RESET_CTRL = SIGUSR1; +#endif + static std::chrono::milliseconds getHciTimeoutMs() { static auto sHciTimeoutMs = std::chrono::milliseconds(bluetooth::os::GetSystemPropertyUint32Base( "bluetooth.hci.timeout_milliseconds", HciLayer::kHciTimeoutMs.count())); @@ -296,12 +301,18 @@ struct HciLayer::impl { void on_hci_timeout(OpCode op_code) { #ifdef TARGET_FLOSS + std::unique_lock<std::recursive_mutex> lock(life_cycle_guard); + if (life_cycle_stopped) { + return; + } + log::warn("Ignoring the timeouted HCI command {}.", OpCodeText(op_code)); - // Terminate the process to trigger controller reset, also mark the controller - // is broken to prevent further error while terminating. - auto hal = module_.GetDependency<hal::HciHal>(); - hal->markControllerBroken(); - kill(getpid(), SIGTERM); + + // Terminate the process to trigger controller reset, also stop sending and + // processing any incoming packet immediately to prevent further error + // while terminating. + module_.LifeCycleStop(); + kill(getpid(), SIG_RESET_CTRL); return; #endif @@ -507,12 +518,11 @@ struct HciLayer::impl { log::assert_that(event_view.IsValid(), "assert failed: event_view.IsValid()"); #ifdef TARGET_FLOSS log::warn("Hardware Error Event with code 0x{:02x}", event_view.GetHardwareCode()); - // Sending SIGTERM to process the exception from BT controller. + // Sending signal to indicate BT controller needs to reset. // The Floss daemon will be restarted. HCI reset during restart will clear the // error state of the BT controller. - auto hal = module_.GetDependency<hal::HciHal>(); - hal->markControllerBroken(); - kill(getpid(), SIGTERM); + module_.LifeCycleStop(); + kill(getpid(), SIG_RESET_CTRL); #else log::fatal("Hardware Error Event with code 0x{:02x}", event_view.GetHardwareCode()); #endif @@ -619,6 +629,14 @@ struct HciLayer::hal_callbacks : public hal::HciHalCallbacks { module_.impl_->incoming_iso_buffer_.Enqueue(std::move(iso), module_.GetHandler()); } +#ifdef TARGET_FLOSS + void controllerNeedsReset() override { + log::info("Controller needs reset!"); + module_.LifeCycleStop(); + kill(getpid(), SIG_RESET_CTRL); + } +#endif + HciLayer& module_; }; @@ -958,6 +976,7 @@ void HciLayer::StartWithNoHalDependencies(Handler* handler) { void HciLayer::Stop() { std::unique_lock<std::recursive_mutex> lock(life_cycle_guard); + life_cycle_stopped = true; auto hal = GetDependency<hal::HciHal>(); hal->unregisterIncomingPacketCallback(); delete hal_callbacks_; @@ -966,7 +985,11 @@ void HciLayer::Stop() { impl_->sco_queue_.GetDownEnd()->UnregisterDequeue(); impl_->iso_queue_.GetDownEnd()->UnregisterDequeue(); delete impl_; +} +// Function to stop sending and handling incoming packets +void HciLayer::LifeCycleStop() { + std::unique_lock<std::recursive_mutex> lock(life_cycle_guard); life_cycle_stopped = true; } diff --git a/system/gd/hci/hci_layer.h b/system/gd/hci/hci_layer.h index d30884a625..94f706cf6b 100644 --- a/system/gd/hci/hci_layer.h +++ b/system/gd/hci/hci_layer.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -149,6 +149,8 @@ protected: void Stop() override; + void LifeCycleStop(); + virtual void Disconnect(uint16_t handle, ErrorCode reason); virtual void ReadRemoteVersion(hci::ErrorCode hci_status, uint16_t handle, uint8_t version, uint16_t manufacturer_name, uint16_t sub_version); diff --git a/system/gd/hci/hci_layer_fake.cc b/system/gd/hci/hci_layer_fake.cc index b09bb5feeb..ffad279ac5 100644 --- a/system/gd/hci/hci_layer_fake.cc +++ b/system/gd/hci/hci_layer_fake.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/hci_layer_fake.h b/system/gd/hci/hci_layer_fake.h index 4743c0c0ff..d5d024ae77 100644 --- a/system/gd/hci/hci_layer_fake.h +++ b/system/gd/hci/hci_layer_fake.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/hci_layer_mock.h b/system/gd/hci/hci_layer_mock.h index f207203251..e272071a4b 100644 --- a/system/gd/hci/hci_layer_mock.h +++ b/system/gd/hci/hci_layer_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/hci_layer_test.cc b/system/gd/hci/hci_layer_test.cc index c30094d292..8ac7f846d9 100644 --- a/system/gd/hci/hci_layer_test.cc +++ b/system/gd/hci/hci_layer_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/hci_layer_unittest.cc b/system/gd/hci/hci_layer_unittest.cc index 86afb1298d..286f9ced19 100644 --- a/system/gd/hci/hci_layer_unittest.cc +++ b/system/gd/hci/hci_layer_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/hci_metrics_logging.cc b/system/gd/hci/hci_metrics_logging.cc index 21f66ee3ba..914f2b637a 100644 --- a/system/gd/hci/hci_metrics_logging.cc +++ b/system/gd/hci/hci_metrics_logging.cc @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/hci_metrics_logging.h b/system/gd/hci/hci_metrics_logging.h index 4e1d9b72f4..d9c67ee771 100644 --- a/system/gd/hci/hci_metrics_logging.h +++ b/system/gd/hci/hci_metrics_logging.h @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/hci_packets_fuzz_test.cc b/system/gd/hci/hci_packets_fuzz_test.cc index 00a053273c..72a0fc9ebf 100644 --- a/system/gd/hci/hci_packets_fuzz_test.cc +++ b/system/gd/hci/hci_packets_fuzz_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/hci_packets_test.cc b/system/gd/hci/hci_packets_test.cc index 017a5dab98..efb7be096b 100644 --- a/system/gd/hci/hci_packets_test.cc +++ b/system/gd/hci/hci_packets_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/inquiry_interface.h b/system/gd/hci/inquiry_interface.h index 322e2da30a..74b254a3c1 100644 --- a/system/gd/hci/inquiry_interface.h +++ b/system/gd/hci/inquiry_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_acl_connection_interface.h b/system/gd/hci/le_acl_connection_interface.h index b3081e30b6..67d1729aec 100644 --- a/system/gd/hci/le_acl_connection_interface.h +++ b/system/gd/hci/le_acl_connection_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_address_manager.cc b/system/gd/hci/le_address_manager.cc index 5073cc1c2c..327ea0f0ca 100644 --- a/system/gd/hci/le_address_manager.cc +++ b/system/gd/hci/le_address_manager.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -165,12 +165,8 @@ void LeAddressManager::SetPrivacyPolicyForInitiatorAddress( min_seconds.count(), max_seconds.count()); enqueue_command_.Run(std::move(packet)); } else { - if (com::android::bluetooth::flags::non_wake_alarm_for_rpa_rotation()) { - address_rotation_wake_alarm_ = std::make_unique<os::Alarm>(handler_, true); - address_rotation_non_wake_alarm_ = std::make_unique<os::Alarm>(handler_, false); - } else { - address_rotation_wake_alarm_ = std::make_unique<os::Alarm>(handler_); - } + address_rotation_wake_alarm_ = std::make_unique<os::Alarm>(handler_, true); + address_rotation_non_wake_alarm_ = std::make_unique<os::Alarm>(handler_, false); } set_random_address(); break; @@ -229,12 +225,8 @@ void LeAddressManager::SetPrivacyPolicyForInitiatorAddressForTest( min_seconds.count(), max_seconds.count()); enqueue_command_.Run(std::move(packet)); } else { - if (com::android::bluetooth::flags::non_wake_alarm_for_rpa_rotation()) { - address_rotation_wake_alarm_ = std::make_unique<os::Alarm>(handler_, true); - address_rotation_non_wake_alarm_ = std::make_unique<os::Alarm>(handler_, false); - } else { - address_rotation_wake_alarm_ = std::make_unique<os::Alarm>(handler_); - } + address_rotation_wake_alarm_ = std::make_unique<os::Alarm>(handler_, true); + address_rotation_non_wake_alarm_ = std::make_unique<os::Alarm>(handler_, false); set_random_address(); } break; @@ -422,31 +414,25 @@ void LeAddressManager::prepare_to_rotate() { } void LeAddressManager::schedule_rotate_random_address() { - if (com::android::bluetooth::flags::non_wake_alarm_for_rpa_rotation()) { - std::string client_name = "LeAddressManager"; - auto privateAddressIntervalRange = GetNextPrivateAddressIntervalRange(client_name); - address_rotation_wake_alarm_->Schedule( - common::BindOnce( - []() { log::info("deadline wakeup in schedule_rotate_random_address"); }), - privateAddressIntervalRange.max); - address_rotation_non_wake_alarm_->Schedule( - common::BindOnce(&LeAddressManager::prepare_to_rotate, common::Unretained(this)), - privateAddressIntervalRange.min); - - auto now = std::chrono::system_clock::now(); - if (address_rotation_interval_min.has_value()) { - CheckAddressRotationHappenedInExpectedTimeInterval( - *address_rotation_interval_min, *address_rotation_interval_max, now, client_name); - } - - // Update the expected range here. - address_rotation_interval_min.emplace(now + privateAddressIntervalRange.min); - address_rotation_interval_max.emplace(now + privateAddressIntervalRange.max); - } else { - address_rotation_wake_alarm_->Schedule( - common::BindOnce(&LeAddressManager::prepare_to_rotate, common::Unretained(this)), - GetNextPrivateAddressIntervalMs()); + std::string client_name = "LeAddressManager"; + auto privateAddressIntervalRange = GetNextPrivateAddressIntervalRange(client_name); + address_rotation_wake_alarm_->Schedule( + common::BindOnce( + []() { log::info("deadline wakeup in schedule_rotate_random_address"); }), + privateAddressIntervalRange.max); + address_rotation_non_wake_alarm_->Schedule( + common::BindOnce(&LeAddressManager::prepare_to_rotate, common::Unretained(this)), + privateAddressIntervalRange.min); + + auto now = std::chrono::system_clock::now(); + if (address_rotation_interval_min.has_value()) { + CheckAddressRotationHappenedInExpectedTimeInterval( + *address_rotation_interval_min, *address_rotation_interval_max, now, client_name); } + + // Update the expected range here. + address_rotation_interval_min.emplace(now + privateAddressIntervalRange.min); + address_rotation_interval_max.emplace(now + privateAddressIntervalRange.max); } void LeAddressManager::set_random_address() { diff --git a/system/gd/hci/le_address_manager.h b/system/gd/hci/le_address_manager.h index a657d8e55c..b985438d4e 100644 --- a/system/gd/hci/le_address_manager.h +++ b/system/gd/hci/le_address_manager.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_address_manager_test.cc b/system/gd/hci/le_address_manager_test.cc index 33efcb51a2..1d5961be50 100644 --- a/system/gd/hci/le_address_manager_test.cc +++ b/system/gd/hci/le_address_manager_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_advertising_interface.h b/system/gd/hci/le_advertising_interface.h index 5fcddc7123..179a70ff4d 100644 --- a/system/gd/hci/le_advertising_interface.h +++ b/system/gd/hci/le_advertising_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_advertising_manager.cc b/system/gd/hci/le_advertising_manager.cc index afa8fd300b..d626b2ee15 100644 --- a/system/gd/hci/le_advertising_manager.cc +++ b/system/gd/hci/le_advertising_manager.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -374,39 +374,29 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb log::info("Reenable advertising"); if (was_rotating_address) { log::info("Scheduling address rotation for advertiser_id={}", advertiser_id); - if (com::android::bluetooth::flags::non_wake_alarm_for_rpa_rotation()) { - advertising_sets_[advertiser_id].address_rotation_wake_alarm_ = - std::make_unique<os::Alarm>(module_handler_, true); - advertising_sets_[advertiser_id].address_rotation_non_wake_alarm_ = - std::make_unique<os::Alarm>(module_handler_, false); - - std::string client_name = "advertising_set_" + std::to_string(advertiser_id); - auto privateAddressIntervalRange = - le_address_manager_->GetNextPrivateAddressIntervalRange(client_name); - - advertising_sets_[advertiser_id].address_rotation_wake_alarm_->Schedule( - common::BindOnce( - []() { log::info("deadline wakeup in handle_set_terminated"); }), - privateAddressIntervalRange.max); - advertising_sets_[advertiser_id].address_rotation_non_wake_alarm_->Schedule( - common::BindOnce(&impl::set_advertising_set_random_address_on_timer, - common::Unretained(this), advertiser_id), - privateAddressIntervalRange.min); - - // Update the expected range here. - auto now = std::chrono::system_clock::now(); - advertising_sets_[advertiser_id].address_rotation_interval_min.emplace( - now + privateAddressIntervalRange.min); - advertising_sets_[advertiser_id].address_rotation_interval_max.emplace( - now + privateAddressIntervalRange.max); - } else { - advertising_sets_[advertiser_id].address_rotation_wake_alarm_ = - std::make_unique<os::Alarm>(module_handler_); - advertising_sets_[advertiser_id].address_rotation_wake_alarm_->Schedule( - common::BindOnce(&impl::set_advertising_set_random_address_on_timer, - common::Unretained(this), advertiser_id), - le_address_manager_->GetNextPrivateAddressIntervalMs()); - } + advertising_sets_[advertiser_id].address_rotation_wake_alarm_ = + std::make_unique<os::Alarm>(module_handler_, true); + advertising_sets_[advertiser_id].address_rotation_non_wake_alarm_ = + std::make_unique<os::Alarm>(module_handler_, false); + + std::string client_name = "advertising_set_" + std::to_string(advertiser_id); + auto privateAddressIntervalRange = + le_address_manager_->GetNextPrivateAddressIntervalRange(client_name); + + advertising_sets_[advertiser_id].address_rotation_wake_alarm_->Schedule( + common::BindOnce([]() { log::info("deadline wakeup in handle_set_terminated"); }), + privateAddressIntervalRange.max); + advertising_sets_[advertiser_id].address_rotation_non_wake_alarm_->Schedule( + common::BindOnce(&impl::set_advertising_set_random_address_on_timer, + common::Unretained(this), advertiser_id), + privateAddressIntervalRange.min); + + // Update the expected range here. + auto now = std::chrono::system_clock::now(); + advertising_sets_[advertiser_id].address_rotation_interval_min.emplace( + now + privateAddressIntervalRange.min); + advertising_sets_[advertiser_id].address_rotation_interval_max.emplace( + now + privateAddressIntervalRange.max); } enable_advertiser(advertiser_id, true, 0, 0); } @@ -673,40 +663,31 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb !leaudio_requested_nrpa && (!controller_->IsRpaGenerationSupported())) { // start timer for random address log::info("Scheduling address rotation for advertiser_id={}", id); - if (com::android::bluetooth::flags::non_wake_alarm_for_rpa_rotation()) { - advertising_sets_[id].address_rotation_wake_alarm_ = - std::make_unique<os::Alarm>(module_handler_, true); - advertising_sets_[id].address_rotation_non_wake_alarm_ = - std::make_unique<os::Alarm>(module_handler_, false); - - std::string client_name = "advertising_set_" + std::to_string(id); - auto privateAddressIntervalRange = - le_address_manager_->GetNextPrivateAddressIntervalRange(client_name); - - advertising_sets_[id].address_rotation_wake_alarm_->Schedule( - common::BindOnce([]() { - log::info("deadline wakeup in create_extended_advertiser_with_id"); - }), - privateAddressIntervalRange.max); - advertising_sets_[id].address_rotation_non_wake_alarm_->Schedule( - common::BindOnce(&impl::set_advertising_set_random_address_on_timer, - common::Unretained(this), id), - privateAddressIntervalRange.min); - - // Update the expected range here. - auto now = std::chrono::system_clock::now(); - advertising_sets_[id].address_rotation_interval_min.emplace( - now + privateAddressIntervalRange.min); - advertising_sets_[id].address_rotation_interval_max.emplace( - now + privateAddressIntervalRange.max); - } else { - advertising_sets_[id].address_rotation_wake_alarm_ = - std::make_unique<os::Alarm>(module_handler_); - advertising_sets_[id].address_rotation_wake_alarm_->Schedule( - common::BindOnce(&impl::set_advertising_set_random_address_on_timer, - common::Unretained(this), id), - le_address_manager_->GetNextPrivateAddressIntervalMs()); - } + advertising_sets_[id].address_rotation_wake_alarm_ = + std::make_unique<os::Alarm>(module_handler_, true); + advertising_sets_[id].address_rotation_non_wake_alarm_ = + std::make_unique<os::Alarm>(module_handler_, false); + + std::string client_name = "advertising_set_" + std::to_string(id); + auto privateAddressIntervalRange = + le_address_manager_->GetNextPrivateAddressIntervalRange(client_name); + + advertising_sets_[id].address_rotation_wake_alarm_->Schedule( + common::BindOnce([]() { + log::info("deadline wakeup in create_extended_advertiser_with_id"); + }), + privateAddressIntervalRange.max); + advertising_sets_[id].address_rotation_non_wake_alarm_->Schedule( + common::BindOnce(&impl::set_advertising_set_random_address_on_timer, + common::Unretained(this), id), + privateAddressIntervalRange.min); + + // Update the expected range here. + auto now = std::chrono::system_clock::now(); + advertising_sets_[id].address_rotation_interval_min.emplace( + now + privateAddressIntervalRange.min); + advertising_sets_[id].address_rotation_interval_max.emplace( + now + privateAddressIntervalRange.max); } } if (config.advertising_type == AdvertisingType::ADV_IND || @@ -859,39 +840,31 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb } log::info("Scheduling address rotation for advertiser_id={}", advertiser_id); - if (com::android::bluetooth::flags::non_wake_alarm_for_rpa_rotation()) { - std::string client_name = "advertising_set_" + std::to_string(advertiser_id); - auto privateAddressIntervalRange = - le_address_manager_->GetNextPrivateAddressIntervalRange(client_name); - advertising_sets_[advertiser_id].address_rotation_wake_alarm_->Schedule( - common::BindOnce([]() { - log::info("deadline wakeup in set_advertising_set_random_address_on_timer"); - }), - privateAddressIntervalRange.max); - advertising_sets_[advertiser_id].address_rotation_non_wake_alarm_->Schedule( - common::BindOnce(&impl::set_advertising_set_random_address_on_timer, - common::Unretained(this), advertiser_id), - privateAddressIntervalRange.min); - - auto now = std::chrono::system_clock::now(); - if (advertising_sets_[advertiser_id].address_rotation_interval_min.has_value()) { - le_address_manager_->CheckAddressRotationHappenedInExpectedTimeInterval( - *(advertising_sets_[advertiser_id].address_rotation_interval_min), - *(advertising_sets_[advertiser_id].address_rotation_interval_max), now, - client_name); - } - - // Update the expected range here. - advertising_sets_[advertiser_id].address_rotation_interval_min.emplace( - now + privateAddressIntervalRange.min); - advertising_sets_[advertiser_id].address_rotation_interval_max.emplace( - now + privateAddressIntervalRange.max); - } else { - advertising_sets_[advertiser_id].address_rotation_wake_alarm_->Schedule( - common::BindOnce(&impl::set_advertising_set_random_address_on_timer, - common::Unretained(this), advertiser_id), - le_address_manager_->GetNextPrivateAddressIntervalMs()); + std::string client_name = "advertising_set_" + std::to_string(advertiser_id); + auto privateAddressIntervalRange = + le_address_manager_->GetNextPrivateAddressIntervalRange(client_name); + advertising_sets_[advertiser_id].address_rotation_wake_alarm_->Schedule( + common::BindOnce([]() { + log::info("deadline wakeup in set_advertising_set_random_address_on_timer"); + }), + privateAddressIntervalRange.max); + advertising_sets_[advertiser_id].address_rotation_non_wake_alarm_->Schedule( + common::BindOnce(&impl::set_advertising_set_random_address_on_timer, + common::Unretained(this), advertiser_id), + privateAddressIntervalRange.min); + + auto now = std::chrono::system_clock::now(); + if (advertising_sets_[advertiser_id].address_rotation_interval_min.has_value()) { + le_address_manager_->CheckAddressRotationHappenedInExpectedTimeInterval( + *(advertising_sets_[advertiser_id].address_rotation_interval_min), + *(advertising_sets_[advertiser_id].address_rotation_interval_max), now, client_name); } + + // Update the expected range here. + advertising_sets_[advertiser_id].address_rotation_interval_min.emplace( + now + privateAddressIntervalRange.min); + advertising_sets_[advertiser_id].address_rotation_interval_max.emplace( + now + privateAddressIntervalRange.max); } void register_advertiser( diff --git a/system/gd/hci/le_advertising_manager.h b/system/gd/hci/le_advertising_manager.h index fe614861e2..b50dd2623c 100644 --- a/system/gd/hci/le_advertising_manager.h +++ b/system/gd/hci/le_advertising_manager.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_advertising_manager_mock.h b/system/gd/hci/le_advertising_manager_mock.h index baf2e263f1..e54e2ae584 100644 --- a/system/gd/hci/le_advertising_manager_mock.h +++ b/system/gd/hci/le_advertising_manager_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_advertising_manager_test.cc b/system/gd/hci/le_advertising_manager_test.cc index 12fa70d263..efe9462137 100644 --- a/system/gd/hci/le_advertising_manager_test.cc +++ b/system/gd/hci/le_advertising_manager_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_iso_interface.h b/system/gd/hci/le_iso_interface.h index 33aa1c4461..ec05320438 100644 --- a/system/gd/hci/le_iso_interface.h +++ b/system/gd/hci/le_iso_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_periodic_sync_manager.h b/system/gd/hci/le_periodic_sync_manager.h index 09c557549a..d600371480 100644 --- a/system/gd/hci/le_periodic_sync_manager.h +++ b/system/gd/hci/le_periodic_sync_manager.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_periodic_sync_manager_test.cc b/system/gd/hci/le_periodic_sync_manager_test.cc index 18a76ae18c..cba8905dfd 100644 --- a/system/gd/hci/le_periodic_sync_manager_test.cc +++ b/system/gd/hci/le_periodic_sync_manager_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_rand_callback.h b/system/gd/hci/le_rand_callback.h index 54db17e4f9..617a7c45a9 100644 --- a/system/gd/hci/le_rand_callback.h +++ b/system/gd/hci/le_rand_callback.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_scanning_callback.h b/system/gd/hci/le_scanning_callback.h index 4bd75dbbc4..6f086a3673 100644 --- a/system/gd/hci/le_scanning_callback.h +++ b/system/gd/hci/le_scanning_callback.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_scanning_interface.h b/system/gd/hci/le_scanning_interface.h index d26cf53604..6f0c456c3e 100644 --- a/system/gd/hci/le_scanning_interface.h +++ b/system/gd/hci/le_scanning_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_scanning_manager.cc b/system/gd/hci/le_scanning_manager.cc index e80caaf23c..439b6241c1 100644 --- a/system/gd/hci/le_scanning_manager.cc +++ b/system/gd/hci/le_scanning_manager.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_scanning_manager.h b/system/gd/hci/le_scanning_manager.h index 90043145a9..e09bf304af 100644 --- a/system/gd/hci/le_scanning_manager.h +++ b/system/gd/hci/le_scanning_manager.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_scanning_manager_mock.h b/system/gd/hci/le_scanning_manager_mock.h index f62012c38c..b72ce45fd2 100644 --- a/system/gd/hci/le_scanning_manager_mock.h +++ b/system/gd/hci/le_scanning_manager_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_scanning_manager_test.cc b/system/gd/hci/le_scanning_manager_test.cc index 134702cb4a..f19ac15862 100644 --- a/system/gd/hci/le_scanning_manager_test.cc +++ b/system/gd/hci/le_scanning_manager_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_scanning_reassembler.cc b/system/gd/hci/le_scanning_reassembler.cc index 8f8ad06b00..80e7be28d2 100644 --- a/system/gd/hci/le_scanning_reassembler.cc +++ b/system/gd/hci/le_scanning_reassembler.cc @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_scanning_reassembler.h b/system/gd/hci/le_scanning_reassembler.h index afc4b9b303..327d0445f7 100644 --- a/system/gd/hci/le_scanning_reassembler.h +++ b/system/gd/hci/le_scanning_reassembler.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_scanning_reassembler_test.cc b/system/gd/hci/le_scanning_reassembler_test.cc index d2461391f9..beaa0a375b 100644 --- a/system/gd/hci/le_scanning_reassembler_test.cc +++ b/system/gd/hci/le_scanning_reassembler_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/le_security_interface.h b/system/gd/hci/le_security_interface.h index 93a2122d8f..7bdfb590e9 100644 --- a/system/gd/hci/le_security_interface.h +++ b/system/gd/hci/le_security_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/link_key.cc b/system/gd/hci/link_key.cc index 78ea1a48ea..6795b904af 100644 --- a/system/gd/hci/link_key.cc +++ b/system/gd/hci/link_key.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/link_key.h b/system/gd/hci/link_key.h index fc55c0cacc..9f1930c1f9 100644 --- a/system/gd/hci/link_key.h +++ b/system/gd/hci/link_key.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/msft.cc b/system/gd/hci/msft.cc index 1c5a700030..c542bb950f 100644 --- a/system/gd/hci/msft.cc +++ b/system/gd/hci/msft.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/msft.h b/system/gd/hci/msft.h index 70b41ee8ce..6e9357d834 100644 --- a/system/gd/hci/msft.h +++ b/system/gd/hci/msft.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/octets.h b/system/gd/hci/octets.h index 0eba1561c0..159dc9df09 100644 --- a/system/gd/hci/octets.h +++ b/system/gd/hci/octets.h @@ -1,5 +1,5 @@ /* - * Copyright 2023 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/remote_name_request.cc b/system/gd/hci/remote_name_request.cc index 2f703feca9..e2f5433f27 100644 --- a/system/gd/hci/remote_name_request.cc +++ b/system/gd/hci/remote_name_request.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/remote_name_request.h b/system/gd/hci/remote_name_request.h index c8553c7c2f..ce6f2a8337 100644 --- a/system/gd/hci/remote_name_request.h +++ b/system/gd/hci/remote_name_request.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/remote_name_request_test.cc b/system/gd/hci/remote_name_request_test.cc index 43367e89be..948d82bc89 100644 --- a/system/gd/hci/remote_name_request_test.cc +++ b/system/gd/hci/remote_name_request_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/security_interface.h b/system/gd/hci/security_interface.h index ad7a628b73..606e2edf01 100644 --- a/system/gd/hci/security_interface.h +++ b/system/gd/hci/security_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/hci/uuid_unittest.cc b/system/gd/hci/uuid_unittest.cc index 3656a13ffd..c148c6b39d 100644 --- a/system/gd/hci/uuid_unittest.cc +++ b/system/gd/hci/uuid_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/lpp/lpp_offload_interface.h b/system/gd/lpp/lpp_offload_interface.h index 388466f2e5..1387423fdb 100644 --- a/system/gd/lpp/lpp_offload_interface.h +++ b/system/gd/lpp/lpp_offload_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/lpp/lpp_offload_interface_mock.h b/system/gd/lpp/lpp_offload_interface_mock.h index 03cd5f4f52..6ac1490830 100644 --- a/system/gd/lpp/lpp_offload_interface_mock.h +++ b/system/gd/lpp/lpp_offload_interface_mock.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/lpp/lpp_offload_manager.cc b/system/gd/lpp/lpp_offload_manager.cc index c5c1fb247e..4518cc96fe 100644 --- a/system/gd/lpp/lpp_offload_manager.cc +++ b/system/gd/lpp/lpp_offload_manager.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/lpp/lpp_offload_manager.h b/system/gd/lpp/lpp_offload_manager.h index 90097f77bd..c8b90a69df 100644 --- a/system/gd/lpp/lpp_offload_manager.h +++ b/system/gd/lpp/lpp_offload_manager.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/bluetooth_event.cc b/system/gd/metrics/bluetooth_event.cc index 4311aeb2e1..6fa3678bec 100644 --- a/system/gd/metrics/bluetooth_event.cc +++ b/system/gd/metrics/bluetooth_event.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/bluetooth_event.h b/system/gd/metrics/bluetooth_event.h index 50c3f88d75..65875bcaa7 100644 --- a/system/gd/metrics/bluetooth_event.h +++ b/system/gd/metrics/bluetooth_event.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/chromeos/metrics.cc b/system/gd/metrics/chromeos/metrics.cc index 87966a379c..ee84dd7095 100644 --- a/system/gd/metrics/chromeos/metrics.cc +++ b/system/gd/metrics/chromeos/metrics.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/chromeos/metrics_allowlist.cc b/system/gd/metrics/chromeos/metrics_allowlist.cc index 33f2bf6dde..67c2e2647b 100644 --- a/system/gd/metrics/chromeos/metrics_allowlist.cc +++ b/system/gd/metrics/chromeos/metrics_allowlist.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/chromeos/metrics_allowlist.h b/system/gd/metrics/chromeos/metrics_allowlist.h index 6bd1530558..799c81b87f 100644 --- a/system/gd/metrics/chromeos/metrics_allowlist.h +++ b/system/gd/metrics/chromeos/metrics_allowlist.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/chromeos/metrics_event.cc b/system/gd/metrics/chromeos/metrics_event.cc index 80f517da56..d7e0d76bb3 100644 --- a/system/gd/metrics/chromeos/metrics_event.cc +++ b/system/gd/metrics/chromeos/metrics_event.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/chromeos/metrics_event.h b/system/gd/metrics/chromeos/metrics_event.h index b4ddb403ba..1b685cf358 100644 --- a/system/gd/metrics/chromeos/metrics_event.h +++ b/system/gd/metrics/chromeos/metrics_event.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/counter_metrics.cc b/system/gd/metrics/counter_metrics.cc index 99ba652bf9..5bafd90599 100644 --- a/system/gd/metrics/counter_metrics.cc +++ b/system/gd/metrics/counter_metrics.cc @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/counter_metrics.h b/system/gd/metrics/counter_metrics.h index e5a63f6394..88c7711f92 100644 --- a/system/gd/metrics/counter_metrics.h +++ b/system/gd/metrics/counter_metrics.h @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/counter_metrics_unittest.cc b/system/gd/metrics/counter_metrics_unittest.cc index cbaf7f0072..eb5545ca19 100644 --- a/system/gd/metrics/counter_metrics_unittest.cc +++ b/system/gd/metrics/counter_metrics_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/linux/metrics.cc b/system/gd/metrics/linux/metrics.cc index 9be10aeec9..f15ebb4695 100644 --- a/system/gd/metrics/linux/metrics.cc +++ b/system/gd/metrics/linux/metrics.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/metrics.h b/system/gd/metrics/metrics.h index e26ded4e17..36fe66ed06 100644 --- a/system/gd/metrics/metrics.h +++ b/system/gd/metrics/metrics.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/utils.cc b/system/gd/metrics/utils.cc index b059bb7133..b39b27f5b7 100644 --- a/system/gd/metrics/utils.cc +++ b/system/gd/metrics/utils.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/metrics/utils.h b/system/gd/metrics/utils.h index 316ffdc74e..05d8d6044b 100644 --- a/system/gd/metrics/utils.h +++ b/system/gd/metrics/utils.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/module.cc b/system/gd/module.cc index d5ea4c4fd3..76b386bbfe 100644 --- a/system/gd/module.cc +++ b/system/gd/module.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -128,10 +128,18 @@ void ModuleRegistry::StopAll() { auto module = Get(*it); last_instance_ = "stopping " + module->ToString(); - // Clear the handler before stopping the module to allow it to shut down gracefully. - log::info("Stopping Handler of Module {}", module->ToString()); - module->handler_->Clear(); - module->handler_->WaitUntilStopped(kModuleStopTimeout); + /* + * b/393449774 since we have now shifted to a single handler for all modules, we don't need + * to clear the handler here, it will be done in the respective teardown. + * Since we have a single handler, we need to make sure that the handler instance is deleted + * only once, otherwise we will see a crash as a handler can only be cleared once. + */ + if (!com::android::bluetooth::flags::same_handler_for_all_modules()) { + // Clear the handler before stopping the module to allow it to shut down gracefully. + log::info("Stopping Handler of Module {}", module->ToString()); + module->handler_->Clear(); + module->handler_->WaitUntilStopped(kModuleStopTimeout); + } log::info("Stopping Module {}", module->ToString()); module->Stop(); } @@ -144,7 +152,9 @@ void ModuleRegistry::StopAll() { auto instance = started_modules_.find(*it); log::assert_that(instance != started_modules_.end(), "assert failed: instance != started_modules_.end()"); - delete instance->second->handler_; + if (!com::android::bluetooth::flags::same_handler_for_all_modules()) { + delete instance->second->handler_; + } delete instance->second; started_modules_.erase(instance); } @@ -165,4 +175,15 @@ os::Handler* ModuleRegistry::GetModuleHandler(const ModuleFactory* module) const return nullptr; } +// Override the StopAll method to use the test thread and handler. +// This function will take care of releasing the handler instances. +void TestModuleRegistry::StopAll() { + os::Handler* handler = GetTestHandler(); + handler->Clear(); + if (com::android::bluetooth::flags::same_handler_for_all_modules()) { + handler->WaitUntilStopped(kHandlerStopTimeout); + } + ModuleRegistry::StopAll(); // call the base class StopAll + delete handler; +} } // namespace bluetooth diff --git a/system/gd/module.h b/system/gd/module.h index b53f992ccf..57e4db7d16 100644 --- a/system/gd/module.h +++ b/system/gd/module.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,6 +32,9 @@ #include "os/thread.h" namespace bluetooth { +// Timeout for waiting for a handler to stop, used in Handler::WaitUntilStopped() +constexpr std::chrono::milliseconds kHandlerStopTimeout = std::chrono::milliseconds(2000); + namespace shim { class Stack; } // namespace shim @@ -191,6 +194,9 @@ public: os::Thread& GetTestThread() { return test_thread; } os::Handler* GetTestHandler() { return test_handler_; } + // Override the StopAll method to use the test thread and handler. + void StopAll(); + bool SynchronizeModuleHandler(const ModuleFactory* module, std::chrono::milliseconds timeout) const { return SynchronizeHandler(GetTestModuleHandler(module), timeout); diff --git a/system/gd/module_unittest.cc b/system/gd/module_unittest.cc index d89be74219..8fb140c229 100644 --- a/system/gd/module_unittest.cc +++ b/system/gd/module_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ #include <sstream> #include <string> +#include "com_android_bluetooth_flags.h" #include "gtest/gtest.h" #include "os/handler.h" #include "os/thread.h" @@ -41,9 +42,12 @@ protected: void TearDown() override { handler_->Clear(); + if (com::android::bluetooth::flags::same_handler_for_all_modules()) { + handler_->WaitUntilStopped(kHandlerStopTimeout); + } delete registry_; - delete thread_; delete handler_; + delete thread_; } ModuleRegistry* registry_; diff --git a/system/gd/os/alarm.h b/system/gd/os/alarm.h index 2eeea77b1f..5f5f21c9c8 100644 --- a/system/gd/os/alarm.h +++ b/system/gd/os/alarm.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/alarm_benchmark.cc b/system/gd/os/alarm_benchmark.cc index cfe3c3db80..3839a1695d 100644 --- a/system/gd/os/alarm_benchmark.cc +++ b/system/gd/os/alarm_benchmark.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/android/metrics.cc b/system/gd/os/android/metrics.cc index 3b6d9602b0..78b12c8d96 100644 --- a/system/gd/os/android/metrics.cc +++ b/system/gd/os/android/metrics.cc @@ -66,6 +66,9 @@ struct formatter<android::bluetooth::rfcomm::SocketConnectionSecurity> : enum_formatter<android::bluetooth::rfcomm::SocketConnectionSecurity> {}; template <> struct formatter<android::bluetooth::BtaStatus> : enum_formatter<android::bluetooth::BtaStatus> {}; +template <> +struct formatter<android::bluetooth::SocketErrorEnum> + : enum_formatter<android::bluetooth::SocketErrorEnum> {}; } // namespace std namespace bluetooth { @@ -332,22 +335,28 @@ void LogMetricSdpAttribute(const Address& address, uint16_t protocol_uuid, uint1 void LogMetricSocketConnectionState(const Address& address, int port, int type, android::bluetooth::SocketConnectionstateEnum connection_state, int64_t tx_bytes, int64_t rx_bytes, int uid, int server_port, - android::bluetooth::SocketRoleEnum socket_role) { + android::bluetooth::SocketRoleEnum socket_role, + uint64_t connection_duration_ms, + android::bluetooth::SocketErrorEnum error_code, + bool is_hardware_offload) { int metric_id = 0; if (!address.IsEmpty()) { metric_id = MetricIdManager::GetInstance().AllocateId(address); } + int ret = stats_write(BLUETOOTH_SOCKET_CONNECTION_STATE_CHANGED, byteField, port, type, connection_state, tx_bytes, rx_bytes, uid, server_port, socket_role, - metric_id, 0 /* connection_duration_ms */, 1 /* error_code */, - 0 /* is_hardware_offload */); + metric_id, static_cast<int64_t>(connection_duration_ms), error_code, + is_hardware_offload); + if (ret < 0) { log::warn( "Failed for {}, port {}, type {}, state {}, tx_bytes {}, rx_bytes {}, uid {}, " "server_port " - "{}, socket_role {}, error {}", + "{}, socket_role {}, error {}, connection_duration_ms {}, socket_error_code {}, " + "is_hardware_offload {}", address, port, type, connection_state, tx_bytes, rx_bytes, uid, server_port, - socket_role, ret); + socket_role, ret, connection_duration_ms, error_code, is_hardware_offload); } } diff --git a/system/gd/os/android/parameter_provider.cc b/system/gd/os/android/parameter_provider.cc index c8507ddf32..06132e677f 100644 --- a/system/gd/os/android/parameter_provider.cc +++ b/system/gd/os/android/parameter_provider.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/android/system_properties.cc b/system/gd/os/android/system_properties.cc index d0f2707173..7b246128b5 100644 --- a/system/gd/os/android/system_properties.cc +++ b/system/gd/os/android/system_properties.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/bt_keystore.h b/system/gd/os/bt_keystore.h index 68005acdea..daff5f8217 100644 --- a/system/gd/os/bt_keystore.h +++ b/system/gd/os/bt_keystore.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/chromeos/metrics.cc b/system/gd/os/chromeos/metrics.cc index 70258d335a..b7921fe308 100644 --- a/system/gd/os/chromeos/metrics.cc +++ b/system/gd/os/chromeos/metrics.cc @@ -35,7 +35,10 @@ void LogMetricClassicPairingEvent(const Address& address, uint16_t handle, uint3 void LogMetricSocketConnectionState(const Address& address, int port, int type, android::bluetooth::SocketConnectionstateEnum connection_state, int64_t tx_bytes, int64_t rx_bytes, int uid, int server_port, - android::bluetooth::SocketRoleEnum socket_role) {} + android::bluetooth::SocketRoleEnum socket_role, + uint64_t /* connection_duration_ms */, + android::bluetooth::SocketErrorEnum /* error_code */, + bool /* is_hardware_offload */) {} void LogMetricHciTimeoutEvent(uint32_t hci_cmd) {} diff --git a/system/gd/os/chromeos/parameter_provider.cc b/system/gd/os/chromeos/parameter_provider.cc index a8ee19c5a6..0cfd60b82a 100644 --- a/system/gd/os/chromeos/parameter_provider.cc +++ b/system/gd/os/chromeos/parameter_provider.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/chromeos/system_properties.cc b/system/gd/os/chromeos/system_properties.cc index 16e474c8d2..07645d3390 100644 --- a/system/gd/os/chromeos/system_properties.cc +++ b/system/gd/os/chromeos/system_properties.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/fake_timer/fake_timerfd.cc b/system/gd/os/fake_timer/fake_timerfd.cc index 400a92743c..cacd37bd7f 100644 --- a/system/gd/os/fake_timer/fake_timerfd.cc +++ b/system/gd/os/fake_timer/fake_timerfd.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/fake_timer/fake_timerfd.h b/system/gd/os/fake_timer/fake_timerfd.h index 31a698aec9..2183edb57c 100644 --- a/system/gd/os/fake_timer/fake_timerfd.h +++ b/system/gd/os/fake_timer/fake_timerfd.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/files.h b/system/gd/os/files.h index 34a9f2f5b9..4efb0afdd4 100644 --- a/system/gd/os/files.h +++ b/system/gd/os/files.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/fuzz/dev_null_queue.h b/system/gd/os/fuzz/dev_null_queue.h index 46f88d3fc4..3ffd2adcca 100644 --- a/system/gd/os/fuzz/dev_null_queue.h +++ b/system/gd/os/fuzz/dev_null_queue.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/fuzz/fuzz_inject_queue.h b/system/gd/os/fuzz/fuzz_inject_queue.h index 322faa0d57..5cd60b1f2b 100644 --- a/system/gd/os/fuzz/fuzz_inject_queue.h +++ b/system/gd/os/fuzz/fuzz_inject_queue.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/handler.cc b/system/gd/os/handler.cc index 388fcd4c72..919bf0be40 100644 --- a/system/gd/os/handler.cc +++ b/system/gd/os/handler.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/handler.h b/system/gd/os/handler.h index 4bb75b86f4..167f475d68 100644 --- a/system/gd/os/handler.h +++ b/system/gd/os/handler.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/handler_unittest.cc b/system/gd/os/handler_unittest.cc index 7306effd30..cca5b955cc 100644 --- a/system/gd/os/handler_unittest.cc +++ b/system/gd/os/handler_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/host/metrics.cc b/system/gd/os/host/metrics.cc index 61734e6a81..a333113238 100644 --- a/system/gd/os/host/metrics.cc +++ b/system/gd/os/host/metrics.cc @@ -32,7 +32,8 @@ void LogMetricSocketConnectionState( const Address& /* address */, int /* port */, int /* type */, android::bluetooth::SocketConnectionstateEnum /* connection_state */, int64_t /* tx_bytes */, int64_t /* rx_bytes */, int /* uid */, int /* server_port */, - android::bluetooth::SocketRoleEnum /* socket_role */) {} + android::bluetooth::SocketRoleEnum /* socket_role */, uint64_t /* connection_duration_ms */, + android::bluetooth::SocketErrorEnum /* error_code */, bool /* is_hardware_offload */) {} void LogMetricHciTimeoutEvent(uint32_t /* hci_cmd */) {} diff --git a/system/gd/os/host/parameter_provider.cc b/system/gd/os/host/parameter_provider.cc index 7b150da4be..e56f82731f 100644 --- a/system/gd/os/host/parameter_provider.cc +++ b/system/gd/os/host/parameter_provider.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/host/system_properties.cc b/system/gd/os/host/system_properties.cc index 5b28659612..2d49810adb 100644 --- a/system/gd/os/host/system_properties.cc +++ b/system/gd/os/host/system_properties.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux/metrics.cc b/system/gd/os/linux/metrics.cc index 45fca1f4ee..7b727f38f2 100644 --- a/system/gd/os/linux/metrics.cc +++ b/system/gd/os/linux/metrics.cc @@ -30,7 +30,10 @@ void LogMetricClassicPairingEvent(const Address& address, uint16_t handle, uint3 void LogMetricSocketConnectionState(const Address& address, int port, int type, android::bluetooth::SocketConnectionstateEnum connection_state, int64_t tx_bytes, int64_t rx_bytes, int uid, int server_port, - android::bluetooth::SocketRoleEnum socket_role) {} + android::bluetooth::SocketRoleEnum socket_role, + uint64_t /* connection_duration_ms */, + android::bluetooth::SocketErrorEnum /* error_code */, + bool /* is_hardware_offload */) {} void LogMetricHciTimeoutEvent(uint32_t hci_cmd) {} diff --git a/system/gd/os/linux/parameter_provider.cc b/system/gd/os/linux/parameter_provider.cc index a8ee19c5a6..0cfd60b82a 100644 --- a/system/gd/os/linux/parameter_provider.cc +++ b/system/gd/os/linux/parameter_provider.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux/system_properties.cc b/system/gd/os/linux/system_properties.cc index 16e474c8d2..07645d3390 100644 --- a/system/gd/os/linux/system_properties.cc +++ b/system/gd/os/linux/system_properties.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/alarm.cc b/system/gd/os/linux_generic/alarm.cc index 9f85016f0b..a378ca93cd 100644 --- a/system/gd/os/linux_generic/alarm.cc +++ b/system/gd/os/linux_generic/alarm.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ #include "os/alarm.h" #include <bluetooth/log.h> -#include <com_android_bluetooth_flags.h> #include <sys/timerfd.h> #include <unistd.h> @@ -41,8 +40,7 @@ using common::OnceClosure; Alarm::Alarm(Handler* handler) : Alarm(handler, true) {} Alarm::Alarm(Handler* handler, bool isWakeAlarm) : handler_(handler) { - int timerfd_flag = - com::android::bluetooth::flags::non_wake_alarm_for_rpa_rotation() ? TFD_NONBLOCK : 0; + int timerfd_flag = TFD_NONBLOCK; fd_ = TIMERFD_CREATE(isWakeAlarm ? ALARM_CLOCK : CLOCK_BOOTTIME, timerfd_flag); @@ -85,7 +83,7 @@ void Alarm::on_fire() { auto bytes_read = read(fd_, ×_invoked, sizeof(uint64_t)); lock.unlock(); - if (com::android::bluetooth::flags::non_wake_alarm_for_rpa_rotation() && bytes_read == -1) { + if (bytes_read == -1) { log::debug("No data to read."); if (errno == EAGAIN || errno == EWOULDBLOCK) { log::debug("Alarm is already canceled or rescheduled."); diff --git a/system/gd/os/linux_generic/alarm_timerfd_unittest.cc b/system/gd/os/linux_generic/alarm_timerfd_unittest.cc index bcf802b86d..5d0698ce31 100644 --- a/system/gd/os/linux_generic/alarm_timerfd_unittest.cc +++ b/system/gd/os/linux_generic/alarm_timerfd_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/alarm_unittest.cc b/system/gd/os/linux_generic/alarm_unittest.cc index f5c14dc410..14b97022b9 100644 --- a/system/gd/os/linux_generic/alarm_unittest.cc +++ b/system/gd/os/linux_generic/alarm_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/files.cc b/system/gd/os/linux_generic/files.cc index a759e1d631..045c02c471 100644 --- a/system/gd/os/linux_generic/files.cc +++ b/system/gd/os/linux_generic/files.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/files_test.cc b/system/gd/os/linux_generic/files_test.cc index 5d85d76fba..5804148c21 100644 --- a/system/gd/os/linux_generic/files_test.cc +++ b/system/gd/os/linux_generic/files_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/linux.h b/system/gd/os/linux_generic/linux.h index b0571355f9..1ef54967ab 100644 --- a/system/gd/os/linux_generic/linux.h +++ b/system/gd/os/linux_generic/linux.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/mgmt.cc b/system/gd/os/linux_generic/mgmt.cc index 8f2fbd0a17..ebb04b5ed5 100644 --- a/system/gd/os/linux_generic/mgmt.cc +++ b/system/gd/os/linux_generic/mgmt.cc @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/queue_unittest.cc b/system/gd/os/linux_generic/queue_unittest.cc index 0e23454c61..f119a8f734 100644 --- a/system/gd/os/linux_generic/queue_unittest.cc +++ b/system/gd/os/linux_generic/queue_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/reactive_semaphore.cc b/system/gd/os/linux_generic/reactive_semaphore.cc index 57fc9d6fe9..76ec29b38b 100644 --- a/system/gd/os/linux_generic/reactive_semaphore.cc +++ b/system/gd/os/linux_generic/reactive_semaphore.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/reactive_semaphore.h b/system/gd/os/linux_generic/reactive_semaphore.h index ac10d76143..6b92200274 100644 --- a/system/gd/os/linux_generic/reactive_semaphore.h +++ b/system/gd/os/linux_generic/reactive_semaphore.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/reactor.cc b/system/gd/os/linux_generic/reactor.cc index 13f14dceb1..e67c1fd388 100644 --- a/system/gd/os/linux_generic/reactor.cc +++ b/system/gd/os/linux_generic/reactor.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/reactor_unittest.cc b/system/gd/os/linux_generic/reactor_unittest.cc index d131f5f74d..326ff1dd33 100644 --- a/system/gd/os/linux_generic/reactor_unittest.cc +++ b/system/gd/os/linux_generic/reactor_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/repeating_alarm.cc b/system/gd/os/linux_generic/repeating_alarm.cc index 20542228d4..f2536ba821 100644 --- a/system/gd/os/linux_generic/repeating_alarm.cc +++ b/system/gd/os/linux_generic/repeating_alarm.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/repeating_alarm_unittest.cc b/system/gd/os/linux_generic/repeating_alarm_unittest.cc index f101f505c9..1868615c84 100644 --- a/system/gd/os/linux_generic/repeating_alarm_unittest.cc +++ b/system/gd/os/linux_generic/repeating_alarm_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/thread.cc b/system/gd/os/linux_generic/thread.cc index 33dfb2a229..5799ec096c 100644 --- a/system/gd/os/linux_generic/thread.cc +++ b/system/gd/os/linux_generic/thread.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/linux_generic/thread_unittest.cc b/system/gd/os/linux_generic/thread_unittest.cc index 9057934845..08160972d4 100644 --- a/system/gd/os/linux_generic/thread_unittest.cc +++ b/system/gd/os/linux_generic/thread_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/metrics.h b/system/gd/os/metrics.h index 9f372b25af..aab82826e6 100644 --- a/system/gd/os/metrics.h +++ b/system/gd/os/metrics.h @@ -260,11 +260,17 @@ void LogMetricSdpAttribute(const hci::Address& address, uint16_t protocol_uuid, * by |server_port| * @param socket_role role of this socket, server or connection * @param uid socket owner's uid + * @param connection_duration_ms duration of socket connection in milliseconds + * @param error_code error code of socket failures + * @param is_hardware_offload whether this is a offload socket */ void LogMetricSocketConnectionState(const hci::Address& address, int port, int type, android::bluetooth::SocketConnectionstateEnum connection_state, int64_t tx_bytes, int64_t rx_bytes, int uid, int server_port, - android::bluetooth::SocketRoleEnum socket_role); + android::bluetooth::SocketRoleEnum socket_role, + uint64_t connection_duration_ms, + android::bluetooth::SocketErrorEnum error_code, + bool is_hardware_offload); /** * Logs when a Bluetooth device's manufacturer information is learnt diff --git a/system/gd/os/mock_queue.h b/system/gd/os/mock_queue.h index 03ede2025b..187911174b 100644 --- a/system/gd/os/mock_queue.h +++ b/system/gd/os/mock_queue.h @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/parameter_provider.h b/system/gd/os/parameter_provider.h index df8a8ee900..e943d9ab37 100644 --- a/system/gd/os/parameter_provider.h +++ b/system/gd/os/parameter_provider.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/queue.h b/system/gd/os/queue.h index fef9073202..1287ad4f39 100644 --- a/system/gd/os/queue.h +++ b/system/gd/os/queue.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/queue_benchmark.cc b/system/gd/os/queue_benchmark.cc index b4c442e7dd..c6dfdc9ec1 100644 --- a/system/gd/os/queue_benchmark.cc +++ b/system/gd/os/queue_benchmark.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/rand.h b/system/gd/os/rand.h index 03f29bc815..d0ab6db36b 100644 --- a/system/gd/os/rand.h +++ b/system/gd/os/rand.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/reactor.h b/system/gd/os/reactor.h index ef286fbb60..41ad1910a9 100644 --- a/system/gd/os/reactor.h +++ b/system/gd/os/reactor.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/repeating_alarm.h b/system/gd/os/repeating_alarm.h index d38e5374d0..4ffbc92cd5 100644 --- a/system/gd/os/repeating_alarm.h +++ b/system/gd/os/repeating_alarm.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/system_properties.h b/system/gd/os/system_properties.h index db31708480..e040119b3e 100644 --- a/system/gd/os/system_properties.h +++ b/system/gd/os/system_properties.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/system_properties_common.cc b/system/gd/os/system_properties_common.cc index 9dfed10da6..9a491d1a4d 100644 --- a/system/gd/os/system_properties_common.cc +++ b/system/gd/os/system_properties_common.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/system_properties_common_test.cc b/system/gd/os/system_properties_common_test.cc index 1550e0ad19..567995336e 100644 --- a/system/gd/os/system_properties_common_test.cc +++ b/system/gd/os/system_properties_common_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/thread.h b/system/gd/os/thread.h index ccab6113cc..d987195b6c 100644 --- a/system/gd/os/thread.h +++ b/system/gd/os/thread.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/thread_benchmark.cc b/system/gd/os/thread_benchmark.cc index 529eb8a662..e0dcb008e4 100644 --- a/system/gd/os/thread_benchmark.cc +++ b/system/gd/os/thread_benchmark.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/os/utils.h b/system/gd/os/utils.h index f768a317d7..d0fa4e7b64 100644 --- a/system/gd/os/utils.h +++ b/system/gd/os/utils.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/base_packet_builder.h b/system/gd/packet/base_packet_builder.h index 766e896f9d..37f0f0e236 100644 --- a/system/gd/packet/base_packet_builder.h +++ b/system/gd/packet/base_packet_builder.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/base_struct.h b/system/gd/packet/base_struct.h index f0461f9ff5..a378a05d22 100644 --- a/system/gd/packet/base_struct.h +++ b/system/gd/packet/base_struct.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/bit_inserter.cc b/system/gd/packet/bit_inserter.cc index d02e1deecf..4206c4a9ec 100644 --- a/system/gd/packet/bit_inserter.cc +++ b/system/gd/packet/bit_inserter.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/bit_inserter.h b/system/gd/packet/bit_inserter.h index f7749d62c6..e0fb8faac4 100644 --- a/system/gd/packet/bit_inserter.h +++ b/system/gd/packet/bit_inserter.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/bit_inserter_unittest.cc b/system/gd/packet/bit_inserter_unittest.cc index 636fa470bd..19fc09191c 100644 --- a/system/gd/packet/bit_inserter_unittest.cc +++ b/system/gd/packet/bit_inserter_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/byte_inserter.cc b/system/gd/packet/byte_inserter.cc index a821477a85..cbe04fb172 100644 --- a/system/gd/packet/byte_inserter.cc +++ b/system/gd/packet/byte_inserter.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/byte_inserter.h b/system/gd/packet/byte_inserter.h index 9cb71b2e36..150bc37d27 100644 --- a/system/gd/packet/byte_inserter.h +++ b/system/gd/packet/byte_inserter.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/byte_observer.cc b/system/gd/packet/byte_observer.cc index 1b294b4bcc..34920b7ac7 100644 --- a/system/gd/packet/byte_observer.cc +++ b/system/gd/packet/byte_observer.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/byte_observer.h b/system/gd/packet/byte_observer.h index f5c32f3d66..c700aa18ef 100644 --- a/system/gd/packet/byte_observer.h +++ b/system/gd/packet/byte_observer.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/checksum_type_checker.h b/system/gd/packet/checksum_type_checker.h index 380c4d3240..9aeb215c68 100644 --- a/system/gd/packet/checksum_type_checker.h +++ b/system/gd/packet/checksum_type_checker.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/custom_field_fixed_size_interface.h b/system/gd/packet/custom_field_fixed_size_interface.h index 1bf1335d27..ce27438948 100644 --- a/system/gd/packet/custom_field_fixed_size_interface.h +++ b/system/gd/packet/custom_field_fixed_size_interface.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/custom_type_checker.h b/system/gd/packet/custom_type_checker.h index ea1b59f801..0f6a271789 100644 --- a/system/gd/packet/custom_type_checker.h +++ b/system/gd/packet/custom_type_checker.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/endian_inserter.h b/system/gd/packet/endian_inserter.h index 6490ed257c..670d13af15 100644 --- a/system/gd/packet/endian_inserter.h +++ b/system/gd/packet/endian_inserter.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/fragmenting_inserter.cc b/system/gd/packet/fragmenting_inserter.cc index a0230c5218..1f552b4eac 100644 --- a/system/gd/packet/fragmenting_inserter.cc +++ b/system/gd/packet/fragmenting_inserter.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/fragmenting_inserter.h b/system/gd/packet/fragmenting_inserter.h index 282b6cc228..2073ea967a 100644 --- a/system/gd/packet/fragmenting_inserter.h +++ b/system/gd/packet/fragmenting_inserter.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/fragmenting_inserter_unittest.cc b/system/gd/packet/fragmenting_inserter_unittest.cc index 5d90a5a075..b4aa6f573d 100644 --- a/system/gd/packet/fragmenting_inserter_unittest.cc +++ b/system/gd/packet/fragmenting_inserter_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/iterator.cc b/system/gd/packet/iterator.cc index 3b4d48ea4c..0394641335 100644 --- a/system/gd/packet/iterator.cc +++ b/system/gd/packet/iterator.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/iterator.h b/system/gd/packet/iterator.h index d1ea14b687..bd724dd96c 100644 --- a/system/gd/packet/iterator.h +++ b/system/gd/packet/iterator.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/packet_builder.h b/system/gd/packet/packet_builder.h index 19a0be1183..b772770a9d 100644 --- a/system/gd/packet/packet_builder.h +++ b/system/gd/packet/packet_builder.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/packet_builder_unittest.cc b/system/gd/packet/packet_builder_unittest.cc index edb978d7de..8626b86d6e 100644 --- a/system/gd/packet/packet_builder_unittest.cc +++ b/system/gd/packet/packet_builder_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/packet_struct.h b/system/gd/packet/packet_struct.h index 92ab83e4db..cb972f6b1c 100644 --- a/system/gd/packet/packet_struct.h +++ b/system/gd/packet/packet_struct.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/packet_view.cc b/system/gd/packet/packet_view.cc index d9d4b86683..e4f44122e5 100644 --- a/system/gd/packet/packet_view.cc +++ b/system/gd/packet/packet_view.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/packet_view.h b/system/gd/packet/packet_view.h index 3c495f3755..c9dafb931b 100644 --- a/system/gd/packet/packet_view.h +++ b/system/gd/packet/packet_view.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/packet_view_unittest.cc b/system/gd/packet/packet_view_unittest.cc index 108275f94a..3842107fea 100644 --- a/system/gd/packet/packet_view_unittest.cc +++ b/system/gd/packet/packet_view_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/checksum_def.cc b/system/gd/packet/parser/checksum_def.cc index 0ad6ec6f90..6d34e5a581 100644 --- a/system/gd/packet/parser/checksum_def.cc +++ b/system/gd/packet/parser/checksum_def.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/checksum_def.h b/system/gd/packet/parser/checksum_def.h index ee8ea1b909..32a57d9eb7 100644 --- a/system/gd/packet/parser/checksum_def.h +++ b/system/gd/packet/parser/checksum_def.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/custom_field_def.cc b/system/gd/packet/parser/custom_field_def.cc index 1ffde0522e..22b3ceaf49 100644 --- a/system/gd/packet/parser/custom_field_def.cc +++ b/system/gd/packet/parser/custom_field_def.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/custom_field_def.h b/system/gd/packet/parser/custom_field_def.h index f605fe559b..10eee4af81 100644 --- a/system/gd/packet/parser/custom_field_def.h +++ b/system/gd/packet/parser/custom_field_def.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/declarations.h b/system/gd/packet/parser/declarations.h index ff89d8aaf1..e18b47666d 100644 --- a/system/gd/packet/parser/declarations.h +++ b/system/gd/packet/parser/declarations.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/enum_def.cc b/system/gd/packet/parser/enum_def.cc index 8b36572b3a..999ce9cedc 100644 --- a/system/gd/packet/parser/enum_def.cc +++ b/system/gd/packet/parser/enum_def.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/enum_def.h b/system/gd/packet/parser/enum_def.h index 1150da86c7..03c0017669 100644 --- a/system/gd/packet/parser/enum_def.h +++ b/system/gd/packet/parser/enum_def.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/enum_gen.cc b/system/gd/packet/parser/enum_gen.cc index b7db3d6b29..f70e8ad449 100644 --- a/system/gd/packet/parser/enum_gen.cc +++ b/system/gd/packet/parser/enum_gen.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/enum_gen.h b/system/gd/packet/parser/enum_gen.h index 7dcb7b76a3..d0909f3f4d 100644 --- a/system/gd/packet/parser/enum_gen.h +++ b/system/gd/packet/parser/enum_gen.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/field_list.h b/system/gd/packet/parser/field_list.h index 2eaeffa1cb..49cdb23755 100644 --- a/system/gd/packet/parser/field_list.h +++ b/system/gd/packet/parser/field_list.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/all_fields.h b/system/gd/packet/parser/fields/all_fields.h index 8c0aeee02f..f750098a1d 100644 --- a/system/gd/packet/parser/fields/all_fields.h +++ b/system/gd/packet/parser/fields/all_fields.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/array_field.cc b/system/gd/packet/parser/fields/array_field.cc index b3612a089b..3d6869234e 100644 --- a/system/gd/packet/parser/fields/array_field.cc +++ b/system/gd/packet/parser/fields/array_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/array_field.h b/system/gd/packet/parser/fields/array_field.h index 80c08e3b97..144feebb4d 100644 --- a/system/gd/packet/parser/fields/array_field.h +++ b/system/gd/packet/parser/fields/array_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/body_field.cc b/system/gd/packet/parser/fields/body_field.cc index b0a093d7d4..16608d4496 100644 --- a/system/gd/packet/parser/fields/body_field.cc +++ b/system/gd/packet/parser/fields/body_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/body_field.h b/system/gd/packet/parser/fields/body_field.h index 7f44d001e1..0777f80903 100644 --- a/system/gd/packet/parser/fields/body_field.h +++ b/system/gd/packet/parser/fields/body_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/checksum_field.cc b/system/gd/packet/parser/fields/checksum_field.cc index 729266ae9d..6a64143bb6 100644 --- a/system/gd/packet/parser/fields/checksum_field.cc +++ b/system/gd/packet/parser/fields/checksum_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/checksum_field.h b/system/gd/packet/parser/fields/checksum_field.h index c54439b343..c3753382a9 100644 --- a/system/gd/packet/parser/fields/checksum_field.h +++ b/system/gd/packet/parser/fields/checksum_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/checksum_start_field.cc b/system/gd/packet/parser/fields/checksum_start_field.cc index 3634b45c0f..c5b90f577d 100644 --- a/system/gd/packet/parser/fields/checksum_start_field.cc +++ b/system/gd/packet/parser/fields/checksum_start_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/checksum_start_field.h b/system/gd/packet/parser/fields/checksum_start_field.h index d0d29ca517..d873c3e889 100644 --- a/system/gd/packet/parser/fields/checksum_start_field.h +++ b/system/gd/packet/parser/fields/checksum_start_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/count_field.cc b/system/gd/packet/parser/fields/count_field.cc index 0c5c1ace85..7dd2a6a322 100644 --- a/system/gd/packet/parser/fields/count_field.cc +++ b/system/gd/packet/parser/fields/count_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/count_field.h b/system/gd/packet/parser/fields/count_field.h index d5e3927e95..c145c481fb 100644 --- a/system/gd/packet/parser/fields/count_field.h +++ b/system/gd/packet/parser/fields/count_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/custom_field.cc b/system/gd/packet/parser/fields/custom_field.cc index c01d5a15eb..a33a86c7f5 100644 --- a/system/gd/packet/parser/fields/custom_field.cc +++ b/system/gd/packet/parser/fields/custom_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/custom_field.h b/system/gd/packet/parser/fields/custom_field.h index 9a10479e69..e5f547027f 100644 --- a/system/gd/packet/parser/fields/custom_field.h +++ b/system/gd/packet/parser/fields/custom_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/custom_field_fixed_size.cc b/system/gd/packet/parser/fields/custom_field_fixed_size.cc index 84cffa7986..8419d0b58b 100644 --- a/system/gd/packet/parser/fields/custom_field_fixed_size.cc +++ b/system/gd/packet/parser/fields/custom_field_fixed_size.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/custom_field_fixed_size.h b/system/gd/packet/parser/fields/custom_field_fixed_size.h index a5f728286e..05c16fde68 100644 --- a/system/gd/packet/parser/fields/custom_field_fixed_size.h +++ b/system/gd/packet/parser/fields/custom_field_fixed_size.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/enum_field.cc b/system/gd/packet/parser/fields/enum_field.cc index 675232d568..f6a46719b8 100644 --- a/system/gd/packet/parser/fields/enum_field.cc +++ b/system/gd/packet/parser/fields/enum_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/enum_field.h b/system/gd/packet/parser/fields/enum_field.h index ea1a48f3ee..d961824e7e 100644 --- a/system/gd/packet/parser/fields/enum_field.h +++ b/system/gd/packet/parser/fields/enum_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/fixed_enum_field.cc b/system/gd/packet/parser/fields/fixed_enum_field.cc index 642c46fd4a..a3460df65e 100644 --- a/system/gd/packet/parser/fields/fixed_enum_field.cc +++ b/system/gd/packet/parser/fields/fixed_enum_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/fixed_enum_field.h b/system/gd/packet/parser/fields/fixed_enum_field.h index 4ea33db12b..31873c6bc3 100644 --- a/system/gd/packet/parser/fields/fixed_enum_field.h +++ b/system/gd/packet/parser/fields/fixed_enum_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/fixed_field.cc b/system/gd/packet/parser/fields/fixed_field.cc index a5dcd372fa..a15c7e4cac 100644 --- a/system/gd/packet/parser/fields/fixed_field.cc +++ b/system/gd/packet/parser/fields/fixed_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/fixed_field.h b/system/gd/packet/parser/fields/fixed_field.h index da67daf4e6..4f6da5e6d6 100644 --- a/system/gd/packet/parser/fields/fixed_field.h +++ b/system/gd/packet/parser/fields/fixed_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/fixed_scalar_field.cc b/system/gd/packet/parser/fields/fixed_scalar_field.cc index 4f66ddb4b7..1cf4ec7d4d 100644 --- a/system/gd/packet/parser/fields/fixed_scalar_field.cc +++ b/system/gd/packet/parser/fields/fixed_scalar_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/fixed_scalar_field.h b/system/gd/packet/parser/fields/fixed_scalar_field.h index fc6603ad37..ac1afdc892 100644 --- a/system/gd/packet/parser/fields/fixed_scalar_field.h +++ b/system/gd/packet/parser/fields/fixed_scalar_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/group_field.cc b/system/gd/packet/parser/fields/group_field.cc index 1440d23293..c9c4ce5681 100644 --- a/system/gd/packet/parser/fields/group_field.cc +++ b/system/gd/packet/parser/fields/group_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/group_field.h b/system/gd/packet/parser/fields/group_field.h index d1f0bee5c5..749a7539c4 100644 --- a/system/gd/packet/parser/fields/group_field.h +++ b/system/gd/packet/parser/fields/group_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/packet_field.cc b/system/gd/packet/parser/fields/packet_field.cc index 04239ade66..f83c68e4e9 100644 --- a/system/gd/packet/parser/fields/packet_field.cc +++ b/system/gd/packet/parser/fields/packet_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/packet_field.h b/system/gd/packet/parser/fields/packet_field.h index 4e25c9017e..22194d7fc1 100644 --- a/system/gd/packet/parser/fields/packet_field.h +++ b/system/gd/packet/parser/fields/packet_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/padding_field.cc b/system/gd/packet/parser/fields/padding_field.cc index d38148eb92..7f92b6c83a 100644 --- a/system/gd/packet/parser/fields/padding_field.cc +++ b/system/gd/packet/parser/fields/padding_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/padding_field.h b/system/gd/packet/parser/fields/padding_field.h index b9c5449a04..75ef037b5c 100644 --- a/system/gd/packet/parser/fields/padding_field.h +++ b/system/gd/packet/parser/fields/padding_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/payload_field.cc b/system/gd/packet/parser/fields/payload_field.cc index 85d17b81b7..9f5c3c25a7 100644 --- a/system/gd/packet/parser/fields/payload_field.cc +++ b/system/gd/packet/parser/fields/payload_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/payload_field.h b/system/gd/packet/parser/fields/payload_field.h index 6ef419d863..17aa1c07ff 100644 --- a/system/gd/packet/parser/fields/payload_field.h +++ b/system/gd/packet/parser/fields/payload_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/reserved_field.cc b/system/gd/packet/parser/fields/reserved_field.cc index 72b7f25601..a57c9855b7 100644 --- a/system/gd/packet/parser/fields/reserved_field.cc +++ b/system/gd/packet/parser/fields/reserved_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/reserved_field.h b/system/gd/packet/parser/fields/reserved_field.h index 258ce234af..a658c2067a 100644 --- a/system/gd/packet/parser/fields/reserved_field.h +++ b/system/gd/packet/parser/fields/reserved_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/scalar_field.cc b/system/gd/packet/parser/fields/scalar_field.cc index f916329cc1..b65e8bd8f7 100644 --- a/system/gd/packet/parser/fields/scalar_field.cc +++ b/system/gd/packet/parser/fields/scalar_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/scalar_field.h b/system/gd/packet/parser/fields/scalar_field.h index a63d46dd21..802e6f4db1 100644 --- a/system/gd/packet/parser/fields/scalar_field.h +++ b/system/gd/packet/parser/fields/scalar_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/size_field.cc b/system/gd/packet/parser/fields/size_field.cc index 6c0fbb5360..44c3418c55 100644 --- a/system/gd/packet/parser/fields/size_field.cc +++ b/system/gd/packet/parser/fields/size_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/size_field.h b/system/gd/packet/parser/fields/size_field.h index 9258a45752..1bd258fee6 100644 --- a/system/gd/packet/parser/fields/size_field.h +++ b/system/gd/packet/parser/fields/size_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/struct_field.cc b/system/gd/packet/parser/fields/struct_field.cc index 50762045e3..10e3bd26b6 100644 --- a/system/gd/packet/parser/fields/struct_field.cc +++ b/system/gd/packet/parser/fields/struct_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/struct_field.h b/system/gd/packet/parser/fields/struct_field.h index cb05169c28..e2dd1e7c8f 100644 --- a/system/gd/packet/parser/fields/struct_field.h +++ b/system/gd/packet/parser/fields/struct_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/variable_length_struct_field.cc b/system/gd/packet/parser/fields/variable_length_struct_field.cc index 0ba48e8800..f114af50bf 100644 --- a/system/gd/packet/parser/fields/variable_length_struct_field.cc +++ b/system/gd/packet/parser/fields/variable_length_struct_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/variable_length_struct_field.h b/system/gd/packet/parser/fields/variable_length_struct_field.h index 361b7fdca8..34cb38380c 100644 --- a/system/gd/packet/parser/fields/variable_length_struct_field.h +++ b/system/gd/packet/parser/fields/variable_length_struct_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/vector_field.cc b/system/gd/packet/parser/fields/vector_field.cc index 741bcff32f..ca620247da 100644 --- a/system/gd/packet/parser/fields/vector_field.cc +++ b/system/gd/packet/parser/fields/vector_field.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/fields/vector_field.h b/system/gd/packet/parser/fields/vector_field.h index 8ef1155540..c371a731c4 100644 --- a/system/gd/packet/parser/fields/vector_field.h +++ b/system/gd/packet/parser/fields/vector_field.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/gen_cpp.cc b/system/gd/packet/parser/gen_cpp.cc index 7dd2deee07..5227c14001 100644 --- a/system/gd/packet/parser/gen_cpp.cc +++ b/system/gd/packet/parser/gen_cpp.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/logging.h b/system/gd/packet/parser/logging.h index 0f1f6f1428..6ccaf7d713 100644 --- a/system/gd/packet/parser/logging.h +++ b/system/gd/packet/parser/logging.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/main.cc b/system/gd/packet/parser/main.cc index 4426f748f8..cfe585c402 100644 --- a/system/gd/packet/parser/main.cc +++ b/system/gd/packet/parser/main.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/packet_def.cc b/system/gd/packet/parser/packet_def.cc index 7753d37547..0d067a371b 100644 --- a/system/gd/packet/parser/packet_def.cc +++ b/system/gd/packet/parser/packet_def.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/packet_def.h b/system/gd/packet/parser/packet_def.h index 2ca40975ff..1959c4c267 100644 --- a/system/gd/packet/parser/packet_def.h +++ b/system/gd/packet/parser/packet_def.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/packet_dependency.cc b/system/gd/packet/parser/packet_dependency.cc index 01000ea1ae..ae4c690522 100644 --- a/system/gd/packet/parser/packet_dependency.cc +++ b/system/gd/packet/parser/packet_dependency.cc @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/packet_dependency.h b/system/gd/packet/parser/packet_dependency.h index ad2a5aa024..2e275e6242 100644 --- a/system/gd/packet/parser/packet_dependency.h +++ b/system/gd/packet/parser/packet_dependency.h @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/parent_def.cc b/system/gd/packet/parser/parent_def.cc index 18fd9a98ba..416ee76ea1 100644 --- a/system/gd/packet/parser/parent_def.cc +++ b/system/gd/packet/parser/parent_def.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/parent_def.h b/system/gd/packet/parser/parent_def.h index c7816da45b..acaf202d11 100644 --- a/system/gd/packet/parser/parent_def.h +++ b/system/gd/packet/parser/parent_def.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/parse_location.h b/system/gd/packet/parser/parse_location.h index ee2b747888..a3283ab71c 100644 --- a/system/gd/packet/parser/parse_location.h +++ b/system/gd/packet/parser/parse_location.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/size.h b/system/gd/packet/parser/size.h index f863639e36..493e4ae949 100644 --- a/system/gd/packet/parser/size.h +++ b/system/gd/packet/parser/size.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/struct_def.cc b/system/gd/packet/parser/struct_def.cc index b611bc8957..3f13e0537b 100644 --- a/system/gd/packet/parser/struct_def.cc +++ b/system/gd/packet/parser/struct_def.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/struct_def.h b/system/gd/packet/parser/struct_def.h index 82bba3446e..a1a9e275b9 100644 --- a/system/gd/packet/parser/struct_def.h +++ b/system/gd/packet/parser/struct_def.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/struct_parser_generator.cc b/system/gd/packet/parser/struct_parser_generator.cc index cd66b31da6..13d894e3c7 100644 --- a/system/gd/packet/parser/struct_parser_generator.cc +++ b/system/gd/packet/parser/struct_parser_generator.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/struct_parser_generator.h b/system/gd/packet/parser/struct_parser_generator.h index 1f5f9b1fcd..8120b187c6 100644 --- a/system/gd/packet/parser/struct_parser_generator.h +++ b/system/gd/packet/parser/struct_parser_generator.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/test/generated_packet_test.cc b/system/gd/packet/parser/test/generated_packet_test.cc index e706e15bee..61d7ea1299 100644 --- a/system/gd/packet/parser/test/generated_packet_test.cc +++ b/system/gd/packet/parser/test/generated_packet_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/test/simple_sum.h b/system/gd/packet/parser/test/simple_sum.h index aea9448803..6228a3abff 100644 --- a/system/gd/packet/parser/test/simple_sum.h +++ b/system/gd/packet/parser/test/simple_sum.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/test/six_bytes.cc b/system/gd/packet/parser/test/six_bytes.cc index 5122868318..bc5a16e42b 100644 --- a/system/gd/packet/parser/test/six_bytes.cc +++ b/system/gd/packet/parser/test/six_bytes.cc @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/test/six_bytes.h b/system/gd/packet/parser/test/six_bytes.h index c8b3ea8293..34bd44b1c5 100644 --- a/system/gd/packet/parser/test/six_bytes.h +++ b/system/gd/packet/parser/test/six_bytes.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/test/variable.cc b/system/gd/packet/parser/test/variable.cc index 727d33a392..ff77914d26 100644 --- a/system/gd/packet/parser/test/variable.cc +++ b/system/gd/packet/parser/test/variable.cc @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/test/variable.h b/system/gd/packet/parser/test/variable.h index febd3e63f7..c2d4dfabac 100644 --- a/system/gd/packet/parser/test/variable.h +++ b/system/gd/packet/parser/test/variable.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/type_def.h b/system/gd/packet/parser/type_def.h index 9aa5c29731..38c9ae4622 100644 --- a/system/gd/packet/parser/type_def.h +++ b/system/gd/packet/parser/type_def.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/parser/util.h b/system/gd/packet/parser/util.h index c65a5dc493..cc7f09330d 100644 --- a/system/gd/packet/parser/util.h +++ b/system/gd/packet/parser/util.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/raw_builder.cc b/system/gd/packet/raw_builder.cc index 49ebeed351..46ffe27852 100644 --- a/system/gd/packet/raw_builder.cc +++ b/system/gd/packet/raw_builder.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/raw_builder.h b/system/gd/packet/raw_builder.h index 0b17c049d2..28aa291011 100644 --- a/system/gd/packet/raw_builder.h +++ b/system/gd/packet/raw_builder.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/raw_builder_unittest.cc b/system/gd/packet/raw_builder_unittest.cc index 07beca80c4..827ad2fc3b 100644 --- a/system/gd/packet/raw_builder_unittest.cc +++ b/system/gd/packet/raw_builder_unittest.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/view.cc b/system/gd/packet/view.cc index 672d2f7769..22b3f5c202 100644 --- a/system/gd/packet/view.cc +++ b/system/gd/packet/view.cc @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/packet/view.h b/system/gd/packet/view.h index 9ec8c4b1b1..372e2fb837 100644 --- a/system/gd/packet/view.h +++ b/system/gd/packet/view.h @@ -1,5 +1,5 @@ /* - * Copyright 2019 The Android Open Source Project + * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/proto/bluetooth/metrics/bluetooth.proto b/system/gd/proto/bluetooth/metrics/bluetooth.proto index 64eb0eea21..4acad9fe1e 100644 --- a/system/gd/proto/bluetooth/metrics/bluetooth.proto +++ b/system/gd/proto/bluetooth/metrics/bluetooth.proto @@ -22,286 +22,10 @@ package bluetooth.metrics.BluetoothMetricsProto; option java_package = "com.android.bluetooth"; option java_outer_classname = "BluetoothMetricsProto"; -message BluetoothLog { - // Session information that gets logged for every BT connection. - repeated BluetoothSession session = 1; - - // Session information that gets logged for every Pair event. - repeated PairEvent pair_event = 2; - - // Information for Wake locks. - repeated WakeEvent wake_event = 3; - - // Scan event information. - repeated ScanEvent scan_event = 4; - - // Number of bonded devices. - optional int32 num_bonded_devices = 5; - - // Number of BluetoothSession including discarded ones beyond capacity - optional int64 num_bluetooth_session = 6; - - // Number of PairEvent including discarded ones beyond capacity - optional int64 num_pair_event = 7; - - // Number of WakeEvent including discarded ones beyond capacity - optional int64 num_wake_event = 8; - - // Number of ScanEvent including discarded ones beyond capacity - optional int64 num_scan_event = 9; - - // Statistics about Bluetooth profile connections - repeated ProfileConnectionStats profile_connection_stats = 10; - - // Statistics about Headset profile connections - repeated HeadsetProfileConnectionStats headset_profile_connection_stats = 11; -} - -// The information about the device. -message DeviceInfo { - // Device type. - enum DeviceType { - // Type is unknown. - DEVICE_TYPE_UNKNOWN = 0; - - DEVICE_TYPE_BREDR = 1; - - DEVICE_TYPE_LE = 2; - - DEVICE_TYPE_DUMO = 3; - } - - // Device class - // https://cs.corp.google.com/#android/packages/modules/Bluetooth/system/stack/include/btm_api.h&q=major_computer. - optional int32 device_class = 1; - - // Device type. - optional DeviceType device_type = 2; -} - -// Information that gets logged for every Bluetooth connection. -message BluetoothSession { - // Type of technology used in the connection. - enum ConnectionTechnologyType { - CONNECTION_TECHNOLOGY_TYPE_UNKNOWN = 0; - - CONNECTION_TECHNOLOGY_TYPE_LE = 1; - - CONNECTION_TECHNOLOGY_TYPE_BREDR = 2; - } - - enum DisconnectReasonType { - UNKNOWN = 0; - - // A metrics dump takes a snapshot of current Bluetooth session and thus - // is not a real disconnect, but a discontinuation in metrics logging. - // This enum indicates this situation. - METRICS_DUMP = 1; - - NEXT_START_WITHOUT_END_PREVIOUS = 2; - } - - // Duration of the session. - optional int64 session_duration_sec = 2; - - // Technology type. - optional ConnectionTechnologyType connection_technology_type = 3; - - // Reason for disconnecting. - optional string disconnect_reason = 4 [deprecated = true]; - - // The information about the device which it is connected to. - optional DeviceInfo device_connected_to = 5; - - // The information about the RFComm session. - optional RFCommSession rfcomm_session = 6; - - // The information about the A2DP audio session. - optional A2DPSession a2dp_session = 7; - - // Numeric reason for disconnecting as defined in metrics.h - optional DisconnectReasonType disconnect_reason_type = 8; -} - -message RFCommSession { - // bytes transmitted. - optional int32 rx_bytes = 1; - - // bytes transmitted. - optional int32 tx_bytes = 2; -} - -enum A2dpSourceCodec { - A2DP_SOURCE_CODEC_UNKNOWN = 0; - A2DP_SOURCE_CODEC_SBC = 1; - A2DP_SOURCE_CODEC_AAC = 2; - A2DP_SOURCE_CODEC_APTX = 3; - A2DP_SOURCE_CODEC_APTX_HD = 4; - A2DP_SOURCE_CODEC_LDAC = 5; -} - -// Session information that gets logged for A2DP session. -message A2DPSession { - // Media timer in milliseconds. - optional int32 media_timer_min_millis = 1; - - // Media timer in milliseconds. - optional int32 media_timer_max_millis = 2; - - // Media timer in milliseconds. - optional int32 media_timer_avg_millis = 3; - - // Buffer overruns count. - optional int32 buffer_overruns_max_count = 4; - - // Buffer overruns total. - optional int32 buffer_overruns_total = 5; - - // Buffer underruns average. - optional float buffer_underruns_average = 6; - - // Buffer underruns count. - optional int32 buffer_underruns_count = 7; - - // Total audio time in this A2DP session - optional int64 audio_duration_millis = 8; - - // Audio codec used in this A2DP session in A2DP source role - optional A2dpSourceCodec source_codec = 9; - - // Whether A2DP offload is enabled in this A2DP session - optional bool is_a2dp_offload = 10; -} - -message PairEvent { - // The reason for disconnecting - // See: packages/modules/Bluetooth/system/stack/include/hcidefs.h, HCI_ERR_CONN_FAILED_ESTABLISHMENT - optional int32 disconnect_reason = 1; - - // Pair event time - optional int64 event_time_millis = 2; // [(datapol.semantic_type) = ST_TIMESTAMP]; - - // The information about the device which it is paired to. - optional DeviceInfo device_paired_with = 3; -} - -message WakeEvent { - // Information about the wake event type. - enum WakeEventType { - UNKNOWN = 0; - // WakeLock was acquired. - ACQUIRED = 1; - // WakeLock was released. - RELEASED = 2; - } - - // Information about the wake event type. - optional WakeEventType wake_event_type = 1; - - // Initiator of the scan. Only the first three names will be stored. - // e.g. com.company.app - optional string requestor = 2; - - // Name of the wakelock (e.g. bluedroid_timer). - optional string name = 3; - - // Time of the event. - optional int64 event_time_millis = 4; // [(datapol.semantic_type) = ST_TIMESTAMP]; -} - -message ScanEvent { - // Scan type. - enum ScanTechnologyType { - SCAN_TYPE_UNKNOWN = 0; - - SCAN_TECH_TYPE_LE = 1; - - SCAN_TECH_TYPE_BREDR = 2; - - SCAN_TECH_TYPE_BOTH = 3; - } - - // Scan event type. - enum ScanEventType { - // Scan started. - SCAN_EVENT_START = 0; - // Scan stopped. - SCAN_EVENT_STOP = 1; - } - - // Scan event type. - optional ScanEventType scan_event_type = 1; - - // Initiator of the scan. Only the first three names will be stored. - // e.g. com.company.app - optional string initiator = 2; - - // Technology used for scanning. - optional ScanTechnologyType scan_technology_type = 3; - - // Number of results returned. - optional int32 number_results = 4; - - // Time of the event. - optional int64 event_time_millis = 5; // [(datapol.semantic_type) = ST_TIMESTAMP]; -} - -// Profile IDs defined in BluetoothProfile API class -// Values must match API class values -enum ProfileId { - PROFILE_UNKNOWN = 0; - HEADSET = 1; - A2DP = 2; - HEALTH = 3; - HID_HOST = 4; - PAN = 5; - PBAP = 6; - GATT = 7; - GATT_SERVER = 8; - MAP = 9; - SAP = 10; - A2DP_SINK = 11; - AVRCP_CONTROLLER = 12; - AVRCP = 13; - HEADSET_CLIENT = 16; - PBAP_CLIENT = 17; - MAP_CLIENT = 18; - HID_DEVICE = 19; - OPP = 20; - HEARING_AID = 21; -} - -// Statistics about Bluetooth profile connections -message ProfileConnectionStats { - // Profile id defined in BluetoothProfile.java - optional ProfileId profile_id = 1; - - // Number of times that this profile is connected since last metrics dump - optional int32 num_times_connected = 2; -} - -enum HeadsetProfileType { - HEADSET_PROFILE_UNKNOWN = 0; - HSP = 1; - HFP = 2; -} - -// Statistics about headset profile connections -message HeadsetProfileConnectionStats { - // Type of headset profile connected - optional HeadsetProfileType headset_profile_type = 1; - - // Number of times this type of headset profile is connected - optional int32 num_times_connected = 2; -} - /** * Encapsulates Remote Device Information. Needs to be kept consistent with * BluetoothRemoteDeviceInformation * in frameworks/proto_logging/stats/atoms/bluetooth/bluetooth_extension_atoms.proto -* -* Logged from: -* packages/modules/Bluetooth */ message BluetoothRemoteDeviceInformation { // SHA256 hashed Bluetooth device name. diff --git a/system/gd/rust/linux/service/src/interface_manager.rs b/system/gd/rust/linux/service/src/interface_manager.rs index 116979de0d..62fdbc8638 100644 --- a/system/gd/rust/linux/service/src/interface_manager.rs +++ b/system/gd/rust/linux/service/src/interface_manager.rs @@ -1,27 +1,29 @@ -use dbus::{channel::MatchingReceiver, message::MatchRule, nonblock::SyncConnection}; +use dbus::channel::MatchingReceiver; +use dbus::message::MatchRule; +use dbus::nonblock::SyncConnection; use dbus_crossroads::Crossroads; use dbus_projection::DisconnectWatcher; use std::sync::{Arc, Mutex}; use tokio::sync::mpsc::{channel, Receiver, Sender}; -use btstack::{ - battery_manager::BatteryManager, battery_provider_manager::BatteryProviderManager, - bluetooth::Bluetooth, bluetooth_admin::BluetoothAdmin, bluetooth_gatt::BluetoothGatt, - bluetooth_logging::BluetoothLogging, bluetooth_media::BluetoothMedia, - bluetooth_qa::BluetoothQA, socket_manager::BluetoothSocketManager, suspend::Suspend, - APIMessage, BluetoothAPI, Message, -}; +use btstack::battery_manager::BatteryManager; +use btstack::battery_provider_manager::BatteryProviderManager; +use btstack::bluetooth::{Bluetooth, SigData}; +use btstack::bluetooth_admin::BluetoothAdmin; +use btstack::bluetooth_gatt::BluetoothGatt; +use btstack::bluetooth_logging::BluetoothLogging; +use btstack::bluetooth_media::BluetoothMedia; +use btstack::bluetooth_qa::BluetoothQA; +use btstack::socket_manager::BluetoothSocketManager; +use btstack::suspend::Suspend; +use btstack::{APIMessage, BluetoothAPI}; -use crate::iface_battery_manager; -use crate::iface_battery_provider_manager; -use crate::iface_bluetooth; -use crate::iface_bluetooth_admin; -use crate::iface_bluetooth_gatt; -use crate::iface_bluetooth_media; -use crate::iface_bluetooth_qa; -use crate::iface_bluetooth_telephony; -use crate::iface_logging; +use crate::{ + iface_battery_manager, iface_battery_provider_manager, iface_bluetooth, iface_bluetooth_admin, + iface_bluetooth_gatt, iface_bluetooth_media, iface_bluetooth_qa, iface_bluetooth_telephony, + iface_logging, +}; pub(crate) struct InterfaceManager {} @@ -50,11 +52,11 @@ impl InterfaceManager { #[allow(clippy::too_many_arguments)] pub async fn dispatch( mut rx: Receiver<APIMessage>, - tx: Sender<Message>, virt_index: i32, conn: Arc<SyncConnection>, conn_join_handle: tokio::task::JoinHandle<()>, disconnect_watcher: Arc<Mutex<DisconnectWatcher>>, + sig_notifier: Arc<SigData>, bluetooth: Arc<Mutex<Box<Bluetooth>>>, bluetooth_admin: Arc<Mutex<Box<BluetoothAdmin>>>, bluetooth_gatt: Arc<Mutex<Box<BluetoothGatt>>>, @@ -93,6 +95,9 @@ impl InterfaceManager { }), ); + *sig_notifier.api_enabled.lock().unwrap() = true; + sig_notifier.api_notify.notify_all(); + // Register D-Bus method handlers of IBluetooth. let adapter_iface = iface_bluetooth::export_bluetooth_dbus_intf( conn.clone(), @@ -246,11 +251,8 @@ impl InterfaceManager { // To shut down the connection, call _handle.abort() and drop the connection. conn_join_handle.abort(); drop(conn); - - let tx = tx.clone(); - tokio::spawn(async move { - let _ = tx.send(Message::AdapterShutdown).await; - }); + *sig_notifier.api_enabled.lock().unwrap() = false; + sig_notifier.api_notify.notify_all(); break; } } diff --git a/system/gd/rust/linux/service/src/main.rs b/system/gd/rust/linux/service/src/main.rs index f326bb62ee..4fc43d11f3 100644 --- a/system/gd/rust/linux/service/src/main.rs +++ b/system/gd/rust/linux/service/src/main.rs @@ -9,22 +9,21 @@ use std::time::Duration; use tokio::runtime::Builder; use tokio::sync::mpsc::Sender; -use bt_topshim::{btif::get_btinterface, topstack}; -use btstack::{ - battery_manager::BatteryManager, - battery_provider_manager::BatteryProviderManager, - battery_service::BatteryService, - bluetooth::{Bluetooth, IBluetooth, SigData}, - bluetooth_admin::BluetoothAdmin, - bluetooth_gatt::BluetoothGatt, - bluetooth_logging::BluetoothLogging, - bluetooth_media::BluetoothMedia, - bluetooth_qa::BluetoothQA, - dis::DeviceInformation, - socket_manager::BluetoothSocketManager, - suspend::Suspend, - Message, Stack, -}; +use bt_topshim::btif::get_btinterface; +use bt_topshim::topstack; +use btstack::battery_manager::BatteryManager; +use btstack::battery_provider_manager::BatteryProviderManager; +use btstack::battery_service::BatteryService; +use btstack::bluetooth::{Bluetooth, IBluetooth, SigData}; +use btstack::bluetooth_admin::BluetoothAdmin; +use btstack::bluetooth_gatt::BluetoothGatt; +use btstack::bluetooth_logging::BluetoothLogging; +use btstack::bluetooth_media::BluetoothMedia; +use btstack::bluetooth_qa::BluetoothQA; +use btstack::dis::DeviceInformation; +use btstack::socket_manager::BluetoothSocketManager; +use btstack::suspend::Suspend; +use btstack::{Message, Stack}; mod dbus_arg; mod iface_battery_manager; @@ -40,6 +39,8 @@ mod interface_manager; const DBUS_SERVICE_NAME: &str = "org.chromium.bluetooth"; const ADMIN_SETTINGS_FILE_PATH: &str = "/var/lib/bluetooth/admin_policy.json"; +// Time to wait for API unregistration in DBus +const API_DISABLE_TIMEOUT_MS: Duration = Duration::from_millis(100); // The maximum ACL disconnect timeout is 3.5s defined by BTA_DM_DISABLE_TIMER_MS // and BTA_DM_DISABLE_TIMER_RETRIAL_MS const STACK_TURN_OFF_TIMEOUT_MS: Duration = Duration::from_millis(4000); @@ -115,6 +116,8 @@ fn main() -> Result<(), Box<dyn Error>> { enabled_notify: Condvar::new(), thread_attached: Mutex::new(false), thread_notify: Condvar::new(), + api_enabled: Mutex::new(false), + api_notify: Condvar::new(), }); // This needs to be built before any |topstack::get_runtime()| call! @@ -148,8 +151,14 @@ fn main() -> Result<(), Box<dyn Error>> { signal::SaFlags::empty(), signal::SigSet::empty(), ); + let sig_action_usr1 = signal::SigAction::new( + signal::SigHandler::Handler(handle_sigusr1), + signal::SaFlags::empty(), + signal::SigSet::empty(), + ); unsafe { signal::sigaction(signal::SIGTERM, &sig_action_term).unwrap(); + signal::sigaction(signal::SIGUSR1, &sig_action_usr1).unwrap(); } // Construct btstack profiles. @@ -241,11 +250,11 @@ fn main() -> Result<(), Box<dyn Error>> { tokio::spawn(interface_manager::InterfaceManager::dispatch( api_rx, - tx.clone(), virt_index, conn, conn_join_handle, disconnect_watcher.clone(), + sig_notifier.clone(), bluetooth.clone(), bluetooth_admin.clone(), bluetooth_gatt.clone(), @@ -267,37 +276,63 @@ fn main() -> Result<(), Box<dyn Error>> { /// Data needed for signal handling. static SIG_DATA: Mutex<Option<(Sender<Message>, Arc<SigData>)>> = Mutex::new(None); -extern "C" fn handle_sigterm(_signum: i32) { - let guard = SIG_DATA.lock().unwrap(); - if let Some((tx, notifier)) = guard.as_ref() { - log::debug!("Handling SIGTERM by disabling the adapter!"); - let txl = tx.clone(); - topstack::get_runtime().spawn(async move { - // Send the shutdown message here. - let _ = txl.send(Message::InterfaceShutdown).await; - }); +/// Try to cleanup the whole stack. Returns whether to clean up. +extern "C" fn try_cleanup_stack(abort: bool) -> bool { + let lock = SIG_DATA.try_lock(); + + // If SIG_DATA is locked, it is likely the cleanup procedure is ongoing. No + // need to do anything here. + if lock.is_err() { + return false; + } + + if let Some((tx, notifier)) = lock.unwrap().as_ref() { + log::info!("Cleanup stack: disabling the adapter!"); + + // Remove the API first to prevent clients calling while shutting down. + let guard = notifier.api_enabled.lock().unwrap(); + if *guard { + let txl = tx.clone(); + topstack::get_runtime().spawn(async move { + // Remove the API first to prevent clients calling while shutting down. + let _ = txl.send(Message::InterfaceShutdown).await; + }); + log::info!( + "Cleanup stack: Waiting for API shutdown to complete for {:?}", + API_DISABLE_TIMEOUT_MS + ); + let _ = notifier.api_notify.wait_timeout(guard, API_DISABLE_TIMEOUT_MS); + } let guard = notifier.enabled.lock().unwrap(); if *guard { - log::debug!("Waiting for stack to turn off for {:?}", STACK_TURN_OFF_TIMEOUT_MS); + let txl = tx.clone(); + topstack::get_runtime().spawn(async move { + let _ = txl.send(Message::AdapterShutdown(abort)).await; + }); + log::info!( + "Cleanup stack: Waiting for stack to turn off for {:?}", + STACK_TURN_OFF_TIMEOUT_MS + ); let _ = notifier.enabled_notify.wait_timeout(guard, STACK_TURN_OFF_TIMEOUT_MS); } - log::debug!("SIGTERM cleaning up the stack."); - let txl = tx.clone(); - topstack::get_runtime().spawn(async move { - // Clean up the profiles first as some of them might require main thread to clean up. - let _ = txl.send(Message::CleanupProfiles).await; - // Currently there is no good way to know when the profile is cleaned. - // Simply add a small delay here. - tokio::time::sleep(STACK_CLEANUP_PROFILES_TIMEOUT_MS).await; - // Send the cleanup message to clean up the main thread. - let _ = txl.send(Message::Cleanup).await; - }); - let guard = notifier.thread_attached.lock().unwrap(); if *guard { - log::debug!("Waiting for stack to clean up for {:?}", STACK_CLEANUP_TIMEOUT_MS); + let txl = tx.clone(); + topstack::get_runtime().spawn(async move { + // Clean up the profiles first as some of them might require main thread to clean up. + let _ = txl.send(Message::CleanupProfiles).await; + // Currently there is no good way to know when the profile is cleaned. + // Simply add a small delay here. + tokio::time::sleep(STACK_CLEANUP_PROFILES_TIMEOUT_MS).await; + // Send the cleanup message to clean up the main thread. + let _ = txl.send(Message::Cleanup).await; + }); + log::info!( + "Cleanup stack: Waiting for libbluetooth stack to clean up for {:?}", + STACK_CLEANUP_TIMEOUT_MS + ); let _ = notifier.thread_notify.wait_timeout(guard, STACK_CLEANUP_TIMEOUT_MS); } @@ -305,7 +340,26 @@ extern "C" fn handle_sigterm(_signum: i32) { // finishing btif cleanup. std::thread::sleep(EXTRA_WAIT_BEFORE_KILL_MS); } + return true; +} - log::debug!("Sigterm completed"); +extern "C" fn handle_sigterm(_signum: i32) { + log::info!("SIGTERM received"); + if !try_cleanup_stack(false) { + log::info!("Skipped to handle SIGTERM"); + return; + } + log::info!("SIGTERM completed"); + std::process::exit(0); +} + +/// Used to indicate controller needs reset +extern "C" fn handle_sigusr1(_signum: i32) { + log::info!("SIGUSR1 received"); + if !try_cleanup_stack(true) { + log::info!("Skipped to handle SIGUSR1"); + return; + } + log::info!("SIGUSR1 completed"); std::process::exit(0); } diff --git a/system/gd/rust/linux/stack/src/bluetooth.rs b/system/gd/rust/linux/stack/src/bluetooth.rs index bac9c4a1a9..ade91229c4 100644 --- a/system/gd/rust/linux/stack/src/bluetooth.rs +++ b/system/gd/rust/linux/stack/src/bluetooth.rs @@ -503,6 +503,9 @@ pub struct SigData { pub thread_attached: Mutex<bool>, pub thread_notify: Condvar, + + pub api_enabled: Mutex<bool>, + pub api_notify: Condvar, } /// The interface for adapter callbacks registered through `IBluetooth::register_callback`. @@ -818,6 +821,21 @@ impl Bluetooth { self.connection_callbacks.remove_callback(id); } + pub fn shutdown_adapter(&mut self, abort: bool) -> bool { + self.disabling = true; + + if !abort { + if !self.set_discoverable(BtDiscMode::NonDiscoverable, 0) { + warn!("set_discoverable failed on disabling"); + } + if !self.set_connectable_internal(false) { + warn!("set_connectable_internal failed on disabling"); + } + } + + self.intf.lock().unwrap().disable() == 0 + } + fn get_remote_device_property( &self, device: &BluetoothDevice, @@ -2240,14 +2258,7 @@ impl IBluetooth for Bluetooth { } fn disable(&mut self) -> bool { - self.disabling = true; - if !self.set_discoverable(BtDiscMode::NonDiscoverable, 0) { - warn!("set_discoverable failed on disabling"); - } - if !self.set_connectable_internal(false) { - warn!("set_connectable_internal failed on disabling"); - } - self.intf.lock().unwrap().disable() == 0 + self.shutdown_adapter(false) } fn cleanup(&mut self) { diff --git a/system/gd/rust/linux/stack/src/lib.rs b/system/gd/rust/linux/stack/src/lib.rs index d9f97bfa32..4f49a186b4 100644 --- a/system/gd/rust/linux/stack/src/lib.rs +++ b/system/gd/rust/linux/stack/src/lib.rs @@ -66,7 +66,9 @@ pub enum Message { /// Remove the DBus API. Call it before other AdapterShutdown. InterfaceShutdown, /// Disable the adapter by calling btif disable. - AdapterShutdown, + /// Param: bool to indicate abort(true) or graceful shutdown(false). + /// Use abort when we believe adapter is already in a bad state. + AdapterShutdown(bool), /// Clean up the adapter by calling btif cleanup. Cleanup, /// Clean up the media by calling profile cleanup. @@ -287,9 +289,9 @@ impl Stack { }); } - Message::AdapterShutdown => { + Message::AdapterShutdown(abort) => { bluetooth_gatt.lock().unwrap().enable(false); - bluetooth.lock().unwrap().disable(); + bluetooth.lock().unwrap().shutdown_adapter(abort); } Message::Cleanup => { diff --git a/system/gd/rust/topshim/controller/controller_shim.cc b/system/gd/rust/topshim/controller/controller_shim.cc index b47065f440..4b587d79b3 100644 --- a/system/gd/rust/topshim/controller/controller_shim.cc +++ b/system/gd/rust/topshim/controller/controller_shim.cc @@ -1,5 +1,5 @@ /* - * Copyright 2021 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/classic_device.cc b/system/gd/storage/classic_device.cc index f2104a9c07..e49e6b214e 100644 --- a/system/gd/storage/classic_device.cc +++ b/system/gd/storage/classic_device.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/classic_device.h b/system/gd/storage/classic_device.h index 155b44d8d8..dec4ebceda 100644 --- a/system/gd/storage/classic_device.h +++ b/system/gd/storage/classic_device.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/classic_device_test.cc b/system/gd/storage/classic_device_test.cc index ae26587d7a..2dbe9df5d6 100644 --- a/system/gd/storage/classic_device_test.cc +++ b/system/gd/storage/classic_device_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/config_cache.cc b/system/gd/storage/config_cache.cc index f2517be128..c506c3dcae 100644 --- a/system/gd/storage/config_cache.cc +++ b/system/gd/storage/config_cache.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/config_cache.h b/system/gd/storage/config_cache.h index 238660170c..25a3a1b6c3 100644 --- a/system/gd/storage/config_cache.h +++ b/system/gd/storage/config_cache.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/config_cache_helper.cc b/system/gd/storage/config_cache_helper.cc index 485ed61508..7c2eb7d630 100644 --- a/system/gd/storage/config_cache_helper.cc +++ b/system/gd/storage/config_cache_helper.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/config_cache_helper.h b/system/gd/storage/config_cache_helper.h index e4f5c23a57..2f02c0e0e4 100644 --- a/system/gd/storage/config_cache_helper.h +++ b/system/gd/storage/config_cache_helper.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/config_cache_helper_test.cc b/system/gd/storage/config_cache_helper_test.cc index e149c3777c..5ad20e6be0 100644 --- a/system/gd/storage/config_cache_helper_test.cc +++ b/system/gd/storage/config_cache_helper_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/config_cache_test.cc b/system/gd/storage/config_cache_test.cc index c129e8841b..3aa0bc493d 100644 --- a/system/gd/storage/config_cache_test.cc +++ b/system/gd/storage/config_cache_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/device.cc b/system/gd/storage/device.cc index 7210a110fe..b84f360477 100644 --- a/system/gd/storage/device.cc +++ b/system/gd/storage/device.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/device.h b/system/gd/storage/device.h index 03311d1504..40ca990080 100644 --- a/system/gd/storage/device.h +++ b/system/gd/storage/device.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/device_test.cc b/system/gd/storage/device_test.cc index 01754cfd7e..ab8d399db0 100644 --- a/system/gd/storage/device_test.cc +++ b/system/gd/storage/device_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/le_device.cc b/system/gd/storage/le_device.cc index 3cbbb7839f..bf6475faa8 100644 --- a/system/gd/storage/le_device.cc +++ b/system/gd/storage/le_device.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/le_device.h b/system/gd/storage/le_device.h index 835519929e..aa5c4d8815 100644 --- a/system/gd/storage/le_device.h +++ b/system/gd/storage/le_device.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/le_device_test.cc b/system/gd/storage/le_device_test.cc index b18b4e2fb7..c32c94f3d3 100644 --- a/system/gd/storage/le_device_test.cc +++ b/system/gd/storage/le_device_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/legacy_config_file.cc b/system/gd/storage/legacy_config_file.cc index 0bee52af03..29f09da9bd 100644 --- a/system/gd/storage/legacy_config_file.cc +++ b/system/gd/storage/legacy_config_file.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/legacy_config_file.h b/system/gd/storage/legacy_config_file.h index 2a5a8bf9b0..0bfa1651b6 100644 --- a/system/gd/storage/legacy_config_file.h +++ b/system/gd/storage/legacy_config_file.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/legacy_config_file_test.cc b/system/gd/storage/legacy_config_file_test.cc index b52891793f..1c11ea8ba0 100644 --- a/system/gd/storage/legacy_config_file_test.cc +++ b/system/gd/storage/legacy_config_file_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/mutation.cc b/system/gd/storage/mutation.cc index e091344f36..097357a668 100644 --- a/system/gd/storage/mutation.cc +++ b/system/gd/storage/mutation.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/mutation.h b/system/gd/storage/mutation.h index 4f24e7725b..ec801f13ee 100644 --- a/system/gd/storage/mutation.h +++ b/system/gd/storage/mutation.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/mutation_entry.cc b/system/gd/storage/mutation_entry.cc index 5d610e70ef..a3b99afd09 100644 --- a/system/gd/storage/mutation_entry.cc +++ b/system/gd/storage/mutation_entry.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/mutation_entry.h b/system/gd/storage/mutation_entry.h index cc1a3d09ed..00ce85bc6c 100644 --- a/system/gd/storage/mutation_entry.h +++ b/system/gd/storage/mutation_entry.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/mutation_test.cc b/system/gd/storage/mutation_test.cc index 1a1a3e82ff..c99b3d754f 100644 --- a/system/gd/storage/mutation_test.cc +++ b/system/gd/storage/mutation_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/serializable.h b/system/gd/storage/serializable.h index ef26d3a4f4..0b617e0d3d 100644 --- a/system/gd/storage/serializable.h +++ b/system/gd/storage/serializable.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/storage_module.cc b/system/gd/storage/storage_module.cc index 9a59caf4f6..5e3459e109 100644 --- a/system/gd/storage/storage_module.cc +++ b/system/gd/storage/storage_module.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/storage_module.h b/system/gd/storage/storage_module.h index 8899423697..de47e71e25 100644 --- a/system/gd/storage/storage_module.h +++ b/system/gd/storage/storage_module.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/storage/storage_module_test.cc b/system/gd/storage/storage_module_test.cc index 488eda0a53..7eaf3ae3fa 100644 --- a/system/gd/storage/storage_module_test.cc +++ b/system/gd/storage/storage_module_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/sysprops/sysprops_module.cc b/system/gd/sysprops/sysprops_module.cc index 0cdcaa2efa..b994bcf52c 100644 --- a/system/gd/sysprops/sysprops_module.cc +++ b/system/gd/sysprops/sysprops_module.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/sysprops/sysprops_module.h b/system/gd/sysprops/sysprops_module.h index d1050bd660..eaeb648941 100644 --- a/system/gd/sysprops/sysprops_module.h +++ b/system/gd/sysprops/sysprops_module.h @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/gd/sysprops/sysprops_module_test.cc b/system/gd/sysprops/sysprops_module_test.cc index e427db3831..e4f90b9068 100644 --- a/system/gd/sysprops/sysprops_module_test.cc +++ b/system/gd/sysprops/sysprops_module_test.cc @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Android Open Source Project + * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/system/include/hardware/bluetooth_headset_interface.h b/system/include/hardware/bluetooth_headset_interface.h index b2b98ffe1f..396c2b2880 100644 --- a/system/include/hardware/bluetooth_headset_interface.h +++ b/system/include/hardware/bluetooth_headset_interface.h @@ -97,9 +97,10 @@ public: /** * Start voice recognition * @param bd_addr remote device address + * @param sendResult whether a BVRA response should be sent * @return BT_STATUS_SUCCESS on success */ - virtual bt_status_t StartVoiceRecognition(RawAddress* bd_addr) = 0; + virtual bt_status_t StartVoiceRecognition(RawAddress* bd_addr, bool sendResult) = 0; /** * Stop voice recognition diff --git a/system/include/hardware/bt_sock.h b/system/include/hardware/bt_sock.h index 0436fad9cb..340085998c 100644 --- a/system/include/hardware/bt_sock.h +++ b/system/include/hardware/bt_sock.h @@ -38,6 +38,25 @@ typedef enum { BTSOCK_L2CAP_LE = 4 } btsock_type_t; +typedef enum { + BTSOCK_ERROR_NONE = 0, + BTSOCK_ERROR_SERVER_START_FAILURE = 1, + BTSOCK_ERROR_CLIENT_INIT_FAILURE = 2, + BTSOCK_ERROR_LISTEN_FAILURE = 3, + BTSOCK_ERROR_CONNECTION_FAILURE = 4, + BTSOCK_ERROR_OPEN_FAILURE = 5, + BTSOCK_ERROR_OFFLOAD_SERVER_NOT_ACCEPTING = 6, + BTSOCK_ERROR_OFFLOAD_HAL_OPEN_FAILURE = 7, + BTSOCK_ERROR_SEND_TO_APP_FAILURE = 8, + BTSOCK_ERROR_RECEIVE_DATA_FAILURE = 9, + BTSOCK_ERROR_READ_SIGNALED_FAILURE = 10, + BTSOCK_ERROR_WRITE_SIGNALED_FAILURE = 11, + BTSOCK_ERROR_SEND_SCN_FAILURE = 12, + BTSOCK_ERROR_SCN_ALLOCATION_FAILURE = 13, + BTSOCK_ERROR_ADD_SDP_FAILURE = 14, + BTSOCK_ERROR_SDP_DISCOVERY_FAILURE = 15, +} btsock_error_code_t; + /** * Data path used for Bluetooth socket communication. * diff --git a/system/linux_include/log/log.h b/system/linux_include/log/log.h deleted file mode 100644 index 037649312c..0000000000 --- a/system/linux_include/log/log.h +++ /dev/null @@ -1,24 +0,0 @@ -/****************************************************************************** - * - * Copyright 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ -#pragma once - -#ifndef __ANDROID__ - -#include <cstdint> - -#endif diff --git a/system/main/shim/metrics_api.cc b/system/main/shim/metrics_api.cc index f222adf82a..2250090901 100644 --- a/system/main/shim/metrics_api.cc +++ b/system/main/shim/metrics_api.cc @@ -135,10 +135,14 @@ void LogMetricSdpAttribute(const RawAddress& raw_address, uint16_t protocol_uuid void LogMetricSocketConnectionState(const RawAddress& raw_address, int port, int type, android::bluetooth::SocketConnectionstateEnum connection_state, int64_t tx_bytes, int64_t rx_bytes, int uid, int server_port, - android::bluetooth::SocketRoleEnum socket_role) { + android::bluetooth::SocketRoleEnum socket_role, + uint64_t connection_duration_ms, + android::bluetooth::SocketErrorEnum error_code, + bool is_hardware_offload) { Address address = bluetooth::ToGdAddress(raw_address); - bluetooth::os::LogMetricSocketConnectionState(address, port, type, connection_state, tx_bytes, - rx_bytes, uid, server_port, socket_role); + bluetooth::os::LogMetricSocketConnectionState( + address, port, type, connection_state, tx_bytes, rx_bytes, uid, server_port, socket_role, + connection_duration_ms, error_code, is_hardware_offload); } void LogMetricManufacturerInfo(const RawAddress& raw_address, diff --git a/system/main/shim/metrics_api.h b/system/main/shim/metrics_api.h index 3b8e369b69..143a2f754d 100644 --- a/system/main/shim/metrics_api.h +++ b/system/main/shim/metrics_api.h @@ -225,11 +225,17 @@ void LogMetricSdpAttribute(const RawAddress& address, uint16_t protocol_uuid, ui * by |server_port| * @param socket_role role of this socket, server or connection * @param uid socket owner's uid + * @param connection_duration_ms duration of socket connection in milliseconds + * @param error_code error code of socket failures + * @param is_hardware_offload whether this is a offload socket */ void LogMetricSocketConnectionState(const RawAddress& address, int port, int type, android::bluetooth::SocketConnectionstateEnum connection_state, int64_t tx_bytes, int64_t rx_bytes, int uid, int server_port, - android::bluetooth::SocketRoleEnum socket_role); + android::bluetooth::SocketRoleEnum socket_role, + uint64_t connection_duration_ms, + android::bluetooth::SocketErrorEnum error_code, + bool is_hardware_offload); /** * Logs when a Bluetooth device's manufacturer information is learnt diff --git a/system/main/shim/stack.cc b/system/main/shim/stack.cc index bb8994aee0..4560a6180f 100644 --- a/system/main/shim/stack.cc +++ b/system/main/shim/stack.cc @@ -169,11 +169,11 @@ void Stack::Stop() { log::assert_that(is_running_, "Gd stack not running"); is_running_ = false; - if (!com::android::bluetooth::flags::same_handler_for_all_modules()) { - // Clear the handler only if the flag is not defined, otherwise it will be cleared by the - // registry - stack_handler_->Clear(); + stack_handler_->Clear(); + if(com::android::bluetooth::flags::same_handler_for_all_modules()) { + stack_handler_->WaitUntilStopped(bluetooth::kHandlerStopTimeout); } + WakelockManager::Get().Acquire(); std::promise<void> promise; @@ -195,14 +195,7 @@ void Stack::Stop() { delete management_handler_; delete management_thread_; - if (!com::android::bluetooth::flags::same_handler_for_all_modules()) { - // delete the handler only if the flag is not defined, otherwise it will be deleted by the - // registry - delete stack_handler_; - } - - // stack_handler_ is already deleted by the registry in handle_shut_down, just set it to nullptr - // to avoid any potential use-after-free + delete stack_handler_; stack_handler_ = nullptr; stack_thread_->Stop(); diff --git a/system/main/test/main_shim_test.cc b/system/main/test/main_shim_test.cc index 2f4056a381..c66024cabb 100644 --- a/system/main/test/main_shim_test.cc +++ b/system/main/test/main_shim_test.cc @@ -332,8 +332,10 @@ protected: thread_ = new os::Thread("acl_thread", os::Thread::Priority::NORMAL); handler_ = new os::Handler(thread_); - /* extern */ test::mock_controller_ = new bluetooth::hci::testing::MockControllerInterface(); - /* extern */ test::mock_acl_manager_ = new bluetooth::hci::testing::MockAclManager(); + /* extern */ test::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); + /* extern */ test::mock_acl_manager_ = + std::make_unique<bluetooth::hci::testing::MockAclManager>(); /* extern */ test::mock_le_scanning_manager_ = new bluetooth::hci::testing::MockLeScanningManager(); /* extern */ test::mock_le_advertising_manager_ = @@ -342,10 +344,8 @@ protected: new bluetooth::hci::testing::MockDistanceMeasurementManager(); } void TearDown() override { - delete test::mock_controller_; - test::mock_controller_ = nullptr; - delete test::mock_acl_manager_; - test::mock_acl_manager_ = nullptr; + test::mock_controller_.reset(); + test::mock_acl_manager_.release(); delete test::mock_le_advertising_manager_; test::mock_le_advertising_manager_ = nullptr; delete test::mock_le_scanning_manager_; @@ -567,7 +567,6 @@ TEST_F(MainShimTest, DISABLED_BleScannerInterfaceImpl_OnScanResult) { bluetooth::shim::get_ble_scanner_instance()); EXPECT_CALL(*hci::testing::mock_le_scanning_manager_, RegisterScanningCallback(_)).Times(1); - ; bluetooth::shim::init_scanning_manager(); TestScanningCallbacks cb; diff --git a/system/osi/BUILD.gn b/system/osi/BUILD.gn index 5bdf04c1e9..fa47062f52 100644 --- a/system/osi/BUILD.gn +++ b/system/osi/BUILD.gn @@ -43,7 +43,6 @@ static_library("osi") { include_dirs = [ "//bt/system/", - "//bt/system/linux_include", "//bt/system/osi/include_internal", "//bt/system/stack/include", ] diff --git a/system/pdl/hci/hci_packets.pdl b/system/pdl/hci/hci_packets.pdl index fcdd255b99..838b1fa586 100644 --- a/system/pdl/hci/hci_packets.pdl +++ b/system/pdl/hci/hci_packets.pdl @@ -4949,7 +4949,8 @@ struct CsOptionalNadmRandomCapability { struct CsOptionalCsSyncPhysSupported { le_2m_phy : 1, - _reserved_ : 7, + le_2m_2bt_phy : 1, + _reserved_ : 6, } struct CsOptionalSubfeaturesSupported { @@ -5151,6 +5152,7 @@ enum CsConfigRttType : 8 { enum CsSyncPhy : 8 { LE_1M_PHY = 0x01, LE_2M_PHY = 0x02, + LE_2M_2BT_PHY = 0x03, } enum CsChannelSelectionType : 8 { diff --git a/system/stack/Android.bp b/system/stack/Android.bp index ebab1ff5f4..78af467a76 100644 --- a/system/stack/Android.bp +++ b/system/stack/Android.bp @@ -48,7 +48,6 @@ cc_library_static { "hid", "include", "l2cap", - "metrics", "pan", "sdp", "smp", @@ -183,7 +182,6 @@ cc_library_static { "l2cap/l2c_main.cc", "l2cap/l2c_utils.cc", "l2cap/l2cap_api.cc", - "metrics/stack_metrics_logging.cc", "pan/pan_api.cc", "pan/pan_main.cc", "pan/pan_utils.cc", @@ -374,9 +372,9 @@ cc_fuzz { ":TestFakeOsi", ":TestMockBtif", ":TestMockDevice", + ":TestMockMainShim", ":TestMockStackBtm", ":TestMockStackL2cap", - ":TestMockStackMetrics", "fuzzers/sdp_fuzzer.cc", ], static_libs: [ @@ -414,6 +412,7 @@ cc_fuzz { ":TestMockBtif", ":TestMockDevice", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockSrvcDis", ":TestMockStackAcl", @@ -421,7 +420,6 @@ cc_fuzz { ":TestMockStackBtm", ":TestMockStackHcic", ":TestMockStackL2cap", - ":TestMockStackMetrics", ":TestMockStackSdp", "fuzzers/rfcomm_fuzzer.cc", "rfcomm/*.cc", @@ -465,6 +463,7 @@ cc_fuzz { ":TestMockBtif", ":TestMockDevice", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockSrvcDis", ":TestMockStackAcl", @@ -473,7 +472,6 @@ cc_fuzz { ":TestMockStackConnMgr", ":TestMockStackHcic", ":TestMockStackL2cap", - ":TestMockStackMetrics", ":TestMockStackSdp", "ais/*.cc", "eatt/*.cc", @@ -517,12 +515,12 @@ cc_fuzz { ":TestMockBtif", ":TestMockDevice", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockStackAcl", ":TestMockStackBtm", ":TestMockStackHcic", ":TestMockStackL2cap", - ":TestMockStackMetrics", "fuzzers/smp_fuzzer.cc", "smp/*.cc", // add other sources files (p256 related) under smp into this test ], @@ -563,12 +561,12 @@ cc_fuzz { ":TestMockBtif", ":TestMockDevice", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockStackAcl", ":TestMockStackBtm", ":TestMockStackHcic", ":TestMockStackL2cap", - ":TestMockStackMetrics", "bnep/*.cc", "fuzzers/bnep_fuzzer.cc", ], @@ -601,12 +599,12 @@ cc_fuzz { ":TestMockBtif", ":TestMockDevice", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockStackAcl", ":TestMockStackBtm", ":TestMockStackHcic", ":TestMockStackL2cap", - ":TestMockStackMetrics", ":TestMockStackSdp", "avct/*.cc", "avrc/*.cc", @@ -648,11 +646,11 @@ cc_fuzz { ":TestMockBtif", ":TestMockDevice", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockStackAcl", ":TestMockStackBtm", ":TestMockStackHcic", - ":TestMockStackMetrics", "fuzzers/l2cap_fuzzer.cc", "l2cap/*.cc", ], @@ -809,10 +807,10 @@ cc_test { ":TestCommonMockFunctions", ":TestMockHci", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockStackBtm", ":TestMockStackL2capInterface", - ":TestMockStackMetrics", ":TestMockStackRfcommMetrics", "rfcomm/port_api.cc", "rfcomm/port_rfc.cc", @@ -903,12 +901,12 @@ cc_test { ":TestMockBtif", ":TestMockDevice", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockStackAcl", ":TestMockStackBtm", ":TestMockStackHcic", ":TestMockStackL2cap", - ":TestMockStackMetrics", "smp/p_256_curvepara.cc", "smp/p_256_ecc_pp.cc", "smp/p_256_multprecision.cc", @@ -1006,9 +1004,9 @@ cc_test { ":TestCommonMainHandler", ":TestCommonMockFunctions", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockStackBtm", - ":TestMockStackMetrics", "connection_manager/connection_manager.cc", "test/connection_manager_test.cc", ], @@ -1419,10 +1417,10 @@ cc_test { ":TestMockBtif", ":TestMockDevice", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockStackBtm", ":TestMockStackConnMgr", ":TestMockStackL2cap", - ":TestMockStackMetrics", "gatt/gatt_db.cc", "gatt/gatt_sr_hash.cc", "gatt/gatt_utils.cc", @@ -1675,7 +1673,6 @@ cc_test { "btm/hfp_msbc_decoder.cc", "btm/hfp_msbc_encoder.cc", "btm/security_event_parser.cc", - "metrics/stack_metrics_logging.cc", "test/btm/peer_packet_types_test.cc", "test/btm/sco_hci_test.cc", "test/btm/sco_pkt_status_test.cc", @@ -1813,9 +1810,9 @@ cc_test { ], srcs: [ ":TestCommonMockFunctions", + ":TestMockMainShim", ":TestMockStackBtm", ":TestMockStackL2cap", - ":TestMockStackMetrics", ":TestMockStackSdp", "hid/hidd_api.cc", "hid/hidd_conn.cc", @@ -1887,12 +1884,12 @@ cc_test { ":TestMockBtif", ":TestMockHci", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockStackAcl", ":TestMockStackBtm", ":TestMockStackHcic", ":TestMockStackL2cap", - ":TestMockStackMetrics", ":TestMockStackSmp", "btu/btu_hcif.cc", "btu/main_thread.cc", @@ -1964,12 +1961,12 @@ cc_test { ":TestMockBtif", ":TestMockHci", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockSrvcDis", ":TestMockStackAcl", ":TestMockStackBtm", ":TestMockStackL2cap", - ":TestMockStackMetrics", ":TestMockStackSdp", ":TestMockStackSmp", "ais/ais_ble.cc", @@ -2165,6 +2162,7 @@ cc_test { ":TestMockHci", ":TestMockLegacyHciInterface", ":TestMockMainShim", + ":TestMockMainShim", ":TestMockMainShimEntry", ":TestMockStackBtm", ":TestMockStackBtu", @@ -2172,7 +2170,6 @@ cc_test { ":TestMockStackGatt", ":TestMockStackHcic", ":TestMockStackL2cap", - ":TestMockStackMetrics", ":TestMockStackSdp", ":TestMockStackSmp", "acl/*.cc", @@ -2349,9 +2346,9 @@ cc_test { ":TestFakeOsi", ":TestMockBta", ":TestMockBtif", + ":TestMockMainShim", ":TestMockStackBtm", ":TestMockStackL2cap", - ":TestMockStackMetrics", "test/sdp/stack_sdp_api_test.cc", "test/sdp/stack_sdp_db_test.cc", "test/sdp/stack_sdp_parse_test.cc", diff --git a/system/stack/BUILD.gn b/system/stack/BUILD.gn index d078d1bc14..f06a098bd5 100644 --- a/system/stack/BUILD.gn +++ b/system/stack/BUILD.gn @@ -149,7 +149,6 @@ source_set("stack") { "l2cap/l2c_main.cc", "l2cap/l2c_utils.cc", "l2cap/l2cap_api.cc", - "metrics/stack_metrics_logging.cc", "pan/pan_api.cc", "pan/pan_main.cc", "pan/pan_utils.cc", @@ -210,7 +209,6 @@ source_set("stack") { "//bt/system/ctrlr/include", "//bt/system/gd", "//bt/system/hcis", - "//bt/system/linux_include", "//bt/system/rpc/include", "//bt/system/udrv/include", "//bt/system/vnd/ble", @@ -367,7 +365,6 @@ if (defined(use.android) && use.android) { include_dirs = [ "//bt/system/", - "//bt/system/linux_include", "//bt/system/bta/include", "//bt/system/bta/sys", "//bt/system/embdrv/sbc/encoder/include", diff --git a/system/stack/btm/btm_ble_sec.cc b/system/stack/btm/btm_ble_sec.cc index 05d1c16337..cef553c79e 100644 --- a/system/stack/btm/btm_ble_sec.cc +++ b/system/stack/btm/btm_ble_sec.cc @@ -744,16 +744,28 @@ tBTM_STATUS btm_ble_start_sec_check(const RawAddress& bd_addr, uint16_t psm, boo bool is_encrypted = BTM_IsEncrypted(bd_addr, BT_TRANSPORT_LE); bool is_link_key_authed = BTM_IsLinkKeyAuthed(bd_addr, BT_TRANSPORT_LE); bool is_authenticated = BTM_IsAuthenticated(bd_addr, BT_TRANSPORT_LE); + bool is_bonded = BTM_IsBonded(bd_addr, BT_TRANSPORT_LE); if (!is_originator) { - if ((p_serv_rec->security_flags & BTM_SEC_IN_ENCRYPT) && !is_encrypted) { - log::error("BTM_NOT_ENCRYPTED. service security_flags=0x{:x}", p_serv_rec->security_flags); - return tBTM_STATUS::BTM_NOT_ENCRYPTED; - } else if ((p_serv_rec->security_flags & BTM_SEC_IN_AUTHENTICATE) && - !(is_link_key_authed || is_authenticated)) { - log::error("tBTM_STATUS::BTM_NOT_AUTHENTICATED. service security_flags=0x{:x}", - p_serv_rec->security_flags); - return tBTM_STATUS::BTM_NOT_AUTHENTICATED; + if (!com::android::bluetooth::flags::donot_mandate_auth_along_with_encryption()) { + if ((p_serv_rec->security_flags & BTM_SEC_IN_ENCRYPT) && !is_encrypted) { + log::error("BTM_NOT_ENCRYPTED. service security_flags=0x{:x}", p_serv_rec->security_flags); + return tBTM_STATUS::BTM_NOT_ENCRYPTED; + } else if ((p_serv_rec->security_flags & BTM_SEC_IN_AUTHENTICATE) && + !(is_link_key_authed || is_authenticated)) { + log::error("tBTM_STATUS::BTM_NOT_AUTHENTICATED. service security_flags=0x{:x}", + p_serv_rec->security_flags); + return tBTM_STATUS::BTM_NOT_AUTHENTICATED; + } + } else { + if ((p_serv_rec->security_flags & BTM_SEC_IN_ENCRYPT) && !is_encrypted) { + log::error("BTM_NOT_ENCRYPTED. service security_flags=0x{:x}", p_serv_rec->security_flags); + return tBTM_STATUS::BTM_NOT_ENCRYPTED; + } else if ((p_serv_rec->security_flags & BTM_SEC_IN_AUTHENTICATE) && !(is_bonded)) { + log::error("tBTM_STATUS::BTM_NOT_AUTHENTICATED. service security_flags=0x{:x}", + p_serv_rec->security_flags); + return tBTM_STATUS::BTM_NOT_AUTHENTICATED; + } } /* TODO: When security is required, then must check that the key size of our service is equal or smaller than the incoming connection key size. */ @@ -1609,8 +1621,16 @@ void btm_ble_connection_established(const RawAddress& bda) { !p_dev_rec->sec_rec.is_le_link_key_known())) { // Unknown device if (p_dev_rec->dev_class == kDevClassEmpty || p_dev_rec->dev_class == kDevClassUnclassified) { - // Class of device not known, read appearance characteristic - btm_ble_read_remote_cod(bda); + // Class of device not known, read appearance characteristic ... + // Unless it is one of those devices which don't respond to this request + BD_NAME remote_name = {}; + if (p_dev_rec->sec_rec.is_name_known() && BTM_GetRemoteDeviceName(bda, remote_name) && + interop_match_name(INTEROP_DISABLE_READ_LE_APPEARANCE, (const char*)remote_name)) { + log::warn("Name {} matches IOP database, not reading appearance for {}", + (const char*)remote_name, bda); + } else { + btm_ble_read_remote_cod(bda); + } } } } @@ -1677,7 +1697,6 @@ static void btm_ble_consent_req(const RawAddress& bd_addr, tBTM_LE_EVT_DATA* p_d static void btm_ble_complete_evt(const RawAddress& bd_addr, tBTM_SEC_DEV_REC* p_dev_rec, tBTM_LE_EVT_DATA* p_data) { - if (btm_ble_complete_evt_ignore(p_dev_rec, p_data)) { return; } diff --git a/system/stack/btm/btm_sco.cc b/system/stack/btm/btm_sco.cc index c48b321448..82182135eb 100644 --- a/system/stack/btm/btm_sco.cc +++ b/system/stack/btm/btm_sco.cc @@ -44,6 +44,7 @@ #include "internal_include/bt_target.h" #include "main/shim/entry.h" #include "main/shim/helpers.h" +#include "main/shim/metrics_api.h" #include "osi/include/properties.h" #include "osi/include/stack_power_telemetry.h" #include "stack/btm/btm_int_types.h" @@ -60,7 +61,6 @@ #include "stack/include/main_thread.h" #include "stack/include/sco_hci_link_interface.h" #include "stack/include/sdpdefs.h" -#include "stack/include/stack_metrics_logging.h" #include "types/raw_address.h" extern tBTM_CB btm_cb; @@ -1298,7 +1298,8 @@ static void btm_sco_on_disconnected(uint16_t hci_handle, tHCI_REASON reason) { if (fill_plc_stats(&num_decoded_frames, &packet_loss_ratio)) { const int16_t codec_id = sco_codec_type_to_id(codec_type); const std::string codec = sco_codec_type_text(codec_type); - log_hfp_audio_packet_loss_stats(bd_addr, num_decoded_frames, packet_loss_ratio, codec_id); + bluetooth::shim::LogMetricHfpPacketLossStats(bd_addr, num_decoded_frames, packet_loss_ratio, + codec_id); log::debug( "Stopped SCO codec:{}, num_decoded_frames:{}, " "packet_loss_ratio:{:f}", diff --git a/system/stack/btm/btm_sec.cc b/system/stack/btm/btm_sec.cc index b00b779eee..6244b951c6 100644 --- a/system/stack/btm/btm_sec.cc +++ b/system/stack/btm/btm_sec.cc @@ -47,6 +47,7 @@ #include "main/shim/acl_api.h" #include "main/shim/entry.h" #include "main/shim/helpers.h" +#include "main/shim/metrics_api.h" #include "metrics/bluetooth_event.h" #include "osi/include/allocator.h" #include "osi/include/properties.h" @@ -75,7 +76,6 @@ #include "stack/include/main_thread.h" #include "stack/include/rnr_interface.h" #include "stack/include/smp_api.h" -#include "stack/include/stack_metrics_logging.h" #include "types/bt_transport.h" #include "types/raw_address.h" @@ -1923,7 +1923,7 @@ static void btm_sec_bond_cancel_complete(void) { void btm_create_conn_cancel_complete(uint8_t status, const RawAddress bd_addr) { log::verbose("btm_create_conn_cancel_complete(): in State: {} status:{}", tBTM_SEC_CB::btm_pair_state_descr(btm_sec_cb.pairing_state), status); - log_link_layer_connection_event( + bluetooth::shim::LogMetricLinkLayerConnectionEvent( &bd_addr, bluetooth::common::kUnknownConnectionHandle, android::bluetooth::DIRECTION_OUTGOING, android::bluetooth::LINK_TYPE_ACL, android::bluetooth::hci::CMD_CREATE_CONNECTION_CANCEL, @@ -2440,8 +2440,7 @@ void btm_io_capabilities_req(RawAddress p) { /* If device is bonded, and encrypted it's upgrading security and it's ok. * If it's bonded and not encrypted, it's remote missing keys scenario */ - if (!p_dev_rec->sec_rec.is_device_encrypted() && - com::android::bluetooth::flags::key_missing_classic_device()) { + if (!p_dev_rec->sec_rec.is_device_encrypted()) { log::warn("Incoming bond request, but {} is already bonded (notifying user)", p); bta_dm_remote_key_missing(p); btm_sec_disconnect(p_dev_rec->hci_handle, HCI_ERR_AUTH_FAILURE, @@ -2632,8 +2631,7 @@ void btm_io_capabilities_rsp(const tBTM_SP_IO_RSP evt_data) { /* If device is bonded, and encrypted it's upgrading security and it's ok. * If it's bonded and not encrypted, it's remote missing keys scenario */ - if (btm_sec_is_a_bonded_dev(evt_data.bd_addr) && !p_dev_rec->sec_rec.is_device_encrypted() && - com::android::bluetooth::flags::key_missing_classic_device()) { + if (btm_sec_is_a_bonded_dev(evt_data.bd_addr) && !p_dev_rec->sec_rec.is_device_encrypted()) { log::warn("Incoming bond request, but {} is already bonded (notifying user)", evt_data.bd_addr); bta_dm_remote_key_missing(evt_data.bd_addr); btm_sec_disconnect(p_dev_rec->hci_handle, HCI_ERR_AUTH_FAILURE, @@ -3031,8 +3029,7 @@ void btm_sec_auth_complete(uint16_t handle, tHCI_STATUS status) { p_dev_rec->sec_rec.classic_link, p_dev_rec->bd_addr, reinterpret_cast<char const*>(p_dev_rec->sec_bd_name)); - if (status == HCI_ERR_KEY_MISSING && - com::android::bluetooth::flags::key_missing_classic_device()) { + if (status == HCI_ERR_KEY_MISSING) { log::warn("auth_complete KEY_MISSING {} is already bonded (notifying user)", p_dev_rec->bd_addr); bta_dm_remote_key_missing(p_dev_rec->bd_addr); @@ -3133,12 +3130,12 @@ void btm_sec_auth_complete(uint16_t handle, tHCI_STATUS status) { p_dev_rec->sec_rec.security_required &= ~BTM_SEC_OUT_AUTHENTICATE; if (status != HCI_SUCCESS) { - if ((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST)) { + if (status != HCI_ERR_PEER_USER && status != HCI_ERR_CONN_CAUSE_LOCAL_HOST) { btm_sec_send_hci_disconnect( p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle, "stack::btm::btm_sec::btm_sec_auth_retry Auth fail while bonding"); } - } else { + } else if (!com::android::bluetooth::flags::immediate_encryption_after_pairing()) { BTM_LogHistory(kBtmLogTag, p_dev_rec->bd_addr, "Bonding completed", hci_error_code_text(status)); @@ -3163,6 +3160,11 @@ void btm_sec_auth_complete(uint16_t handle, tHCI_STATUS status) { } l2cu_start_post_bond_timer(p_dev_rec->hci_handle); + } else { + BTM_LogHistory(kBtmLogTag, p_dev_rec->bd_addr, "Bonding completed", + hci_error_code_text(status)); + BTM_SetEncryption(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, NULL, NULL, BTM_BLE_SEC_NONE); + l2cu_start_post_bond_timer(p_dev_rec->hci_handle); } return; @@ -3321,10 +3323,8 @@ void btm_sec_encrypt_change(uint16_t handle, tHCI_STATUS status, uint8_t encr_en if (status == HCI_ERR_KEY_MISSING) { log::info("Remote key missing - will report"); bta_dm_remote_key_missing(p_dev_rec->ble.pseudo_addr); - if (com::android::bluetooth::flags::sec_disconnect_on_le_key_missing()) { - btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_HOST_REJECT_SECURITY, - p_dev_rec->ble_hci_handle, "encryption_change:key_missing"); - } + btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_HOST_REJECT_SECURITY, + p_dev_rec->ble_hci_handle, "encryption_change:key_missing"); return; } diff --git a/system/stack/btm/security_event_parser.cc b/system/stack/btm/security_event_parser.cc index 84d7005d16..deba84b67f 100644 --- a/system/stack/btm/security_event_parser.cc +++ b/system/stack/btm/security_event_parser.cc @@ -25,10 +25,10 @@ #include "common/metrics.h" #include "hci/hci_packets.h" #include "main/shim/helpers.h" +#include "main/shim/metrics_api.h" #include "stack/include/btm_sec_api_types.h" #include "stack/include/hci_error_code.h" #include "stack/include/sec_hci_link_interface.h" -#include "stack/include/stack_metrics_logging.h" #include "types/raw_address.h" using namespace bluetooth; @@ -46,8 +46,8 @@ static void log_address_and_status(const Address& bda, EventCode event_code, uint16_t reason = android::bluetooth::hci::STATUS_UNKNOWN; uint16_t handle = bluetooth::common::kUnknownConnectionHandle; int64_t value = 0; - log_classic_pairing_event(ToRawAddress(bda), handle, cmd, static_cast<uint16_t>(event_code), - status, reason, value); + bluetooth::shim::LogMetricClassicPairingEvent( + ToRawAddress(bda), handle, cmd, static_cast<uint16_t>(event_code), status, reason, value); } static void log_address(const Address& bda, EventCode event_code) { uint32_t cmd = android::bluetooth::hci::CMD_UNKNOWN; @@ -55,8 +55,8 @@ static void log_address(const Address& bda, EventCode event_code) { uint16_t reason = android::bluetooth::hci::STATUS_UNKNOWN; uint16_t handle = bluetooth::common::kUnknownConnectionHandle; int64_t value = 0; - log_classic_pairing_event(ToRawAddress(bda), handle, cmd, static_cast<uint16_t>(event_code), - status, reason, value); + bluetooth::shim::LogMetricClassicPairingEvent( + ToRawAddress(bda), handle, cmd, static_cast<uint16_t>(event_code), status, reason, value); } static void parse_encryption_change(const EventView event) { auto change_opt = EncryptionChangeView::CreateOptional(event); @@ -69,7 +69,7 @@ static void parse_encryption_change(const EventView event) { btm_sec_encryption_change_evt(handle, static_cast<tHCI_STATUS>(status), static_cast<uint8_t>(encr_enable), 0); - log_classic_pairing_event( + bluetooth::shim::LogMetricClassicPairingEvent( ToRawAddress(Address::kEmpty), handle, android::bluetooth::hci::CMD_UNKNOWN, static_cast<uint32_t>(change.GetEventCode()), static_cast<uint16_t>(status), android::bluetooth::hci::STATUS_UNKNOWN, 0); @@ -86,7 +86,7 @@ static void parse_encryption_change_v2(const EventView event) { btm_sec_encryption_change_evt(handle, static_cast<tHCI_STATUS>(status), static_cast<uint8_t>(encr_enable), key_size); - log_classic_pairing_event( + bluetooth::shim::LogMetricClassicPairingEvent( ToRawAddress(Address::kEmpty), handle, android::bluetooth::hci::CMD_UNKNOWN, static_cast<uint32_t>(change.GetEventCode()), static_cast<uint16_t>(status), android::bluetooth::hci::STATUS_UNKNOWN, 0); @@ -96,7 +96,7 @@ static void parse_change_connection_link_key_complete(const EventView event) { log::assert_that(complete_opt.has_value(), "assert failed: complete_opt.has_value()"); auto complete = complete_opt.value(); - log_classic_pairing_event( + bluetooth::shim::LogMetricClassicPairingEvent( ToRawAddress(Address::kEmpty), complete.GetConnectionHandle(), android::bluetooth::hci::CMD_UNKNOWN, static_cast<uint32_t>(complete.GetEventCode()), static_cast<uint16_t>(complete.GetStatus()), android::bluetooth::hci::STATUS_UNKNOWN, 0); diff --git a/system/stack/btu/btu_hcif.cc b/system/stack/btu/btu_hcif.cc index 7a4b6d1256..ee3c9757a5 100644 --- a/system/stack/btu/btu_hcif.cc +++ b/system/stack/btu/btu_hcif.cc @@ -40,6 +40,7 @@ #include "common/metrics.h" #include "internal_include/bt_target.h" #include "main/shim/hci_layer.h" +#include "main/shim/metrics_api.h" #include "osi/include/allocator.h" #include "stack/include/acl_api.h" #include "stack/include/acl_hci_link_interface.h" @@ -59,7 +60,6 @@ #include "stack/include/sco_hci_link_interface.h" #include "stack/include/sec_hci_link_interface.h" #include "stack/include/smp_api.h" -#include "stack/include/stack_metrics_logging.h" #include "types/hci_role.h" #include "types/raw_address.h" @@ -125,25 +125,29 @@ static void btu_hcif_log_event_metrics(uint8_t evt_code, const uint8_t* p_event) case HCI_KEYPRESS_NOTIFY_EVT: case HCI_REMOTE_OOB_DATA_REQUEST_EVT: STREAM_TO_BDADDR(bda, p_event); - log_classic_pairing_event(bda, handle, cmd, evt_code, status, reason, value); + bluetooth::shim::LogMetricClassicPairingEvent(bda, handle, cmd, evt_code, status, reason, + value); break; case HCI_SIMPLE_PAIRING_COMPLETE_EVT: STREAM_TO_UINT8(status, p_event); STREAM_TO_BDADDR(bda, p_event); - log_classic_pairing_event(bda, handle, cmd, evt_code, status, reason, value); + bluetooth::shim::LogMetricClassicPairingEvent(bda, handle, cmd, evt_code, status, reason, + value); break; case HCI_AUTHENTICATION_COMP_EVT: STREAM_TO_UINT8(status, p_event); STREAM_TO_UINT16(handle, p_event); handle = HCID_GET_HANDLE(handle); - log_classic_pairing_event(bda, handle, cmd, evt_code, status, reason, value); + bluetooth::shim::LogMetricClassicPairingEvent(bda, handle, cmd, evt_code, status, reason, + value); break; case HCI_ENCRYPTION_CHANGE_EVT: { uint8_t encryption_enabled; STREAM_TO_UINT8(status, p_event); STREAM_TO_UINT16(handle, p_event); STREAM_TO_UINT8(encryption_enabled, p_event); - log_classic_pairing_event(bda, handle, cmd, evt_code, status, reason, encryption_enabled); + bluetooth::shim::LogMetricClassicPairingEvent(bda, handle, cmd, evt_code, status, reason, + encryption_enabled); break; } case HCI_ENCRYPTION_CHANGE_EVT_V2: { @@ -153,7 +157,8 @@ static void btu_hcif_log_event_metrics(uint8_t evt_code, const uint8_t* p_event) STREAM_TO_UINT16(handle, p_event); STREAM_TO_UINT8(encryption_enabled, p_event); STREAM_TO_UINT8(key_size, p_event); - log_classic_pairing_event(bda, handle, cmd, evt_code, status, reason, encryption_enabled); + bluetooth::shim::LogMetricClassicPairingEvent(bda, handle, cmd, evt_code, status, reason, + encryption_enabled); break; } case HCI_ESCO_CONNECTION_COMP_EVT: { @@ -163,18 +168,19 @@ static void btu_hcif_log_event_metrics(uint8_t evt_code, const uint8_t* p_event) STREAM_TO_BDADDR(bda, p_event); STREAM_TO_UINT8(link_type, p_event); handle = HCID_GET_HANDLE(handle); - log_link_layer_connection_event(&bda, handle, android::bluetooth::DIRECTION_UNKNOWN, - link_type, cmd, evt_code, - android::bluetooth::hci::BLE_EVT_UNKNOWN, status, reason); + bluetooth::shim::LogMetricLinkLayerConnectionEvent( + &bda, handle, android::bluetooth::DIRECTION_UNKNOWN, link_type, cmd, evt_code, + android::bluetooth::hci::BLE_EVT_UNKNOWN, status, reason); break; } case HCI_ESCO_CONNECTION_CHANGED_EVT: { STREAM_TO_UINT8(status, p_event); STREAM_TO_UINT16(handle, p_event); handle = HCID_GET_HANDLE(handle); - log_link_layer_connection_event(nullptr, handle, android::bluetooth::DIRECTION_UNKNOWN, - android::bluetooth::LINK_TYPE_UNKNOWN, cmd, evt_code, - android::bluetooth::hci::BLE_EVT_UNKNOWN, status, reason); + bluetooth::shim::LogMetricLinkLayerConnectionEvent( + nullptr, handle, android::bluetooth::DIRECTION_UNKNOWN, + android::bluetooth::LINK_TYPE_UNKNOWN, cmd, evt_code, + android::bluetooth::hci::BLE_EVT_UNKNOWN, status, reason); break; } // Ignore these events @@ -368,7 +374,7 @@ static void btu_hcif_log_command_metrics(uint16_t opcode, const uint8_t* p_cmd, case HCI_CREATE_CONNECTION: case HCI_CREATE_CONNECTION_CANCEL: STREAM_TO_BDADDR(bd_addr, p_cmd); - log_link_layer_connection_event( + bluetooth::shim::LogMetricLinkLayerConnectionEvent( &bd_addr, bluetooth::common::kUnknownConnectionHandle, android::bluetooth::DIRECTION_OUTGOING, android::bluetooth::LINK_TYPE_ACL, opcode, hci_event, kUnknownBleEvt, cmd_status, android::bluetooth::hci::STATUS_UNKNOWN); @@ -376,23 +382,24 @@ static void btu_hcif_log_command_metrics(uint16_t opcode, const uint8_t* p_cmd, case HCI_DISCONNECT: STREAM_TO_UINT16(handle, p_cmd); STREAM_TO_UINT8(reason, p_cmd); - log_link_layer_connection_event(nullptr, handle, android::bluetooth::DIRECTION_UNKNOWN, - android::bluetooth::LINK_TYPE_UNKNOWN, opcode, hci_event, - kUnknownBleEvt, cmd_status, reason); + bluetooth::shim::LogMetricLinkLayerConnectionEvent( + nullptr, handle, android::bluetooth::DIRECTION_UNKNOWN, + android::bluetooth::LINK_TYPE_UNKNOWN, opcode, hci_event, kUnknownBleEvt, cmd_status, + reason); break; case HCI_SETUP_ESCO_CONNECTION: case HCI_ENH_SETUP_ESCO_CONNECTION: STREAM_TO_UINT16(handle, p_cmd); - log_link_layer_connection_event(nullptr, handle, android::bluetooth::DIRECTION_OUTGOING, - android::bluetooth::LINK_TYPE_UNKNOWN, opcode, hci_event, - kUnknownBleEvt, cmd_status, - android::bluetooth::hci::STATUS_UNKNOWN); + bluetooth::shim::LogMetricLinkLayerConnectionEvent( + nullptr, handle, android::bluetooth::DIRECTION_OUTGOING, + android::bluetooth::LINK_TYPE_UNKNOWN, opcode, hci_event, kUnknownBleEvt, cmd_status, + android::bluetooth::hci::STATUS_UNKNOWN); break; case HCI_ACCEPT_CONNECTION_REQUEST: case HCI_ACCEPT_ESCO_CONNECTION: case HCI_ENH_ACCEPT_ESCO_CONNECTION: STREAM_TO_BDADDR(bd_addr, p_cmd); - log_link_layer_connection_event( + bluetooth::shim::LogMetricLinkLayerConnectionEvent( &bd_addr, bluetooth::common::kUnknownConnectionHandle, android::bluetooth::DIRECTION_INCOMING, android::bluetooth::LINK_TYPE_UNKNOWN, opcode, hci_event, kUnknownBleEvt, cmd_status, android::bluetooth::hci::STATUS_UNKNOWN); @@ -401,10 +408,10 @@ static void btu_hcif_log_command_metrics(uint16_t opcode, const uint8_t* p_cmd, case HCI_REJECT_ESCO_CONNECTION: STREAM_TO_BDADDR(bd_addr, p_cmd); STREAM_TO_UINT8(reason, p_cmd); - log_link_layer_connection_event(&bd_addr, bluetooth::common::kUnknownConnectionHandle, - android::bluetooth::DIRECTION_INCOMING, - android::bluetooth::LINK_TYPE_UNKNOWN, opcode, hci_event, - kUnknownBleEvt, cmd_status, reason); + bluetooth::shim::LogMetricLinkLayerConnectionEvent( + &bd_addr, bluetooth::common::kUnknownConnectionHandle, + android::bluetooth::DIRECTION_INCOMING, android::bluetooth::LINK_TYPE_UNKNOWN, opcode, + hci_event, kUnknownBleEvt, cmd_status, reason); break; // BLE Commands @@ -431,7 +438,7 @@ static void btu_hcif_log_command_metrics(uint16_t opcode, const uint8_t* p_cmd, // Selectively log to avoid log spam due to acceptlist connections: // - When doing non-acceptlist connection // - When there is an error in command status - log_link_layer_connection_event( + bluetooth::shim::LogMetricLinkLayerConnectionEvent( bd_addr_p, bluetooth::common::kUnknownConnectionHandle, android::bluetooth::DIRECTION_OUTGOING, android::bluetooth::LINK_TYPE_ACL, opcode, hci_event, kUnknownBleEvt, cmd_status, android::bluetooth::hci::STATUS_UNKNOWN); @@ -456,7 +463,7 @@ static void btu_hcif_log_command_metrics(uint16_t opcode, const uint8_t* p_cmd, // Selectively log to avoid log spam due to acceptlist connections: // - When doing non-acceptlist connection // - When there is an error in command status - log_link_layer_connection_event( + bluetooth::shim::LogMetricLinkLayerConnectionEvent( bd_addr_p, bluetooth::common::kUnknownConnectionHandle, android::bluetooth::DIRECTION_OUTGOING, android::bluetooth::LINK_TYPE_ACL, opcode, hci_event, kUnknownBleEvt, cmd_status, android::bluetooth::hci::STATUS_UNKNOWN); @@ -466,7 +473,7 @@ static void btu_hcif_log_command_metrics(uint16_t opcode, const uint8_t* p_cmd, case HCI_BLE_CREATE_CONN_CANCEL: if (cmd_status != HCI_SUCCESS && !is_cmd_status) { // Only log errors to prevent log spam due to acceptlist connections - log_link_layer_connection_event( + bluetooth::shim::LogMetricLinkLayerConnectionEvent( nullptr, bluetooth::common::kUnknownConnectionHandle, android::bluetooth::DIRECTION_OUTGOING, android::bluetooth::LINK_TYPE_ACL, opcode, hci_event, kUnknownBleEvt, cmd_status, android::bluetooth::hci::STATUS_UNKNOWN); @@ -474,46 +481,48 @@ static void btu_hcif_log_command_metrics(uint16_t opcode, const uint8_t* p_cmd, break; case HCI_READ_LOCAL_OOB_DATA: case HCI_READ_LOCAL_OOB_EXTENDED_DATA: - log_classic_pairing_event(RawAddress::kEmpty, bluetooth::common::kUnknownConnectionHandle, - opcode, hci_event, cmd_status, - android::bluetooth::hci::STATUS_UNKNOWN, 0); + bluetooth::shim::LogMetricClassicPairingEvent( + RawAddress::kEmpty, bluetooth::common::kUnknownConnectionHandle, opcode, hci_event, + cmd_status, android::bluetooth::hci::STATUS_UNKNOWN, 0); break; case HCI_WRITE_SIMPLE_PAIRING_MODE: { uint8_t simple_pairing_mode; STREAM_TO_UINT8(simple_pairing_mode, p_cmd); - log_classic_pairing_event(RawAddress::kEmpty, bluetooth::common::kUnknownConnectionHandle, - opcode, hci_event, cmd_status, - android::bluetooth::hci::STATUS_UNKNOWN, simple_pairing_mode); + bluetooth::shim::LogMetricClassicPairingEvent( + RawAddress::kEmpty, bluetooth::common::kUnknownConnectionHandle, opcode, hci_event, + cmd_status, android::bluetooth::hci::STATUS_UNKNOWN, simple_pairing_mode); break; } case HCI_WRITE_SECURE_CONNS_SUPPORT: { uint8_t secure_conn_host_support; STREAM_TO_UINT8(secure_conn_host_support, p_cmd); - log_classic_pairing_event(RawAddress::kEmpty, bluetooth::common::kUnknownConnectionHandle, - opcode, hci_event, cmd_status, - android::bluetooth::hci::STATUS_UNKNOWN, secure_conn_host_support); + bluetooth::shim::LogMetricClassicPairingEvent( + RawAddress::kEmpty, bluetooth::common::kUnknownConnectionHandle, opcode, hci_event, + cmd_status, android::bluetooth::hci::STATUS_UNKNOWN, secure_conn_host_support); break; } case HCI_AUTHENTICATION_REQUESTED: STREAM_TO_UINT16(handle, p_cmd); - log_classic_pairing_event(RawAddress::kEmpty, handle, opcode, hci_event, cmd_status, - android::bluetooth::hci::STATUS_UNKNOWN, 0); + bluetooth::shim::LogMetricClassicPairingEvent(RawAddress::kEmpty, handle, opcode, hci_event, + cmd_status, + android::bluetooth::hci::STATUS_UNKNOWN, 0); break; case HCI_SET_CONN_ENCRYPTION: { STREAM_TO_UINT16(handle, p_cmd); uint8_t encryption_enable; STREAM_TO_UINT8(encryption_enable, p_cmd); - log_classic_pairing_event(RawAddress::kEmpty, handle, opcode, hci_event, cmd_status, - android::bluetooth::hci::STATUS_UNKNOWN, encryption_enable); + bluetooth::shim::LogMetricClassicPairingEvent( + RawAddress::kEmpty, handle, opcode, hci_event, cmd_status, + android::bluetooth::hci::STATUS_UNKNOWN, encryption_enable); break; } case HCI_DELETE_STORED_LINK_KEY: { uint8_t delete_all_flag; STREAM_TO_BDADDR(bd_addr, p_cmd); STREAM_TO_UINT8(delete_all_flag, p_cmd); - log_classic_pairing_event(bd_addr, bluetooth::common::kUnknownConnectionHandle, opcode, - hci_event, cmd_status, android::bluetooth::hci::STATUS_UNKNOWN, - delete_all_flag); + bluetooth::shim::LogMetricClassicPairingEvent( + bd_addr, bluetooth::common::kUnknownConnectionHandle, opcode, hci_event, cmd_status, + android::bluetooth::hci::STATUS_UNKNOWN, delete_all_flag); break; } case HCI_RMT_NAME_REQUEST: @@ -528,14 +537,16 @@ static void btu_hcif_log_command_metrics(uint16_t opcode, const uint8_t* p_cmd, case HCI_REM_OOB_DATA_REQ_REPLY: case HCI_REM_OOB_DATA_REQ_NEG_REPLY: STREAM_TO_BDADDR(bd_addr, p_cmd); - log_classic_pairing_event(bd_addr, bluetooth::common::kUnknownConnectionHandle, opcode, - hci_event, cmd_status, android::bluetooth::hci::STATUS_UNKNOWN, 0); + bluetooth::shim::LogMetricClassicPairingEvent( + bd_addr, bluetooth::common::kUnknownConnectionHandle, opcode, hci_event, cmd_status, + android::bluetooth::hci::STATUS_UNKNOWN, 0); break; case HCI_IO_CAP_REQ_NEG_REPLY: STREAM_TO_BDADDR(bd_addr, p_cmd); STREAM_TO_UINT8(reason, p_cmd); - log_classic_pairing_event(bd_addr, bluetooth::common::kUnknownConnectionHandle, opcode, - hci_event, cmd_status, reason, 0); + bluetooth::shim::LogMetricClassicPairingEvent(bd_addr, + bluetooth::common::kUnknownConnectionHandle, + opcode, hci_event, cmd_status, reason, 0); break; } } @@ -599,8 +610,9 @@ static void btu_hcif_log_command_complete_metrics(uint16_t opcode, const uint8_t case HCI_WRITE_SIMPLE_PAIRING_MODE: case HCI_WRITE_SECURE_CONNS_SUPPORT: STREAM_TO_UINT8(status, p_return_params); - log_classic_pairing_event(RawAddress::kEmpty, bluetooth::common::kUnknownConnectionHandle, - opcode, hci_event, status, reason, 0); + bluetooth::shim::LogMetricClassicPairingEvent(RawAddress::kEmpty, + bluetooth::common::kUnknownConnectionHandle, + opcode, hci_event, status, reason, 0); break; case HCI_READ_ENCR_KEY_SIZE: { uint16_t handle; @@ -608,8 +620,8 @@ static void btu_hcif_log_command_complete_metrics(uint16_t opcode, const uint8_t STREAM_TO_UINT8(status, p_return_params); STREAM_TO_UINT16(handle, p_return_params); STREAM_TO_UINT8(key_size, p_return_params); - log_classic_pairing_event(RawAddress::kEmpty, handle, opcode, hci_event, status, reason, - key_size); + bluetooth::shim::LogMetricClassicPairingEvent(RawAddress::kEmpty, handle, opcode, hci_event, + status, reason, key_size); break; } case HCI_LINK_KEY_REQUEST_REPLY: @@ -624,8 +636,9 @@ static void btu_hcif_log_command_complete_metrics(uint16_t opcode, const uint8_t case HCI_REM_OOB_DATA_REQ_NEG_REPLY: STREAM_TO_UINT8(status, p_return_params); STREAM_TO_BDADDR(bd_addr, p_return_params); - log_classic_pairing_event(bd_addr, bluetooth::common::kUnknownConnectionHandle, opcode, - hci_event, status, reason, 0); + bluetooth::shim::LogMetricClassicPairingEvent(bd_addr, + bluetooth::common::kUnknownConnectionHandle, + opcode, hci_event, status, reason, 0); break; } } diff --git a/system/stack/fuzzers/l2cap_fuzzer.cc b/system/stack/fuzzers/l2cap_fuzzer.cc index 6cb4d5170f..69243a67c4 100644 --- a/system/stack/fuzzers/l2cap_fuzzer.cc +++ b/system/stack/fuzzers/l2cap_fuzzer.cc @@ -121,26 +121,30 @@ public: GetInterfaceToProfiles()->profileSpecific_HACK->GetHearingAidDeviceCount = []() { return 1; }; - ON_CALL(controller_, GetLeSuggestedDefaultDataLength).WillByDefault(Return(512)); + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); + ON_CALL(*bluetooth::hci::testing::mock_controller_, GetLeSuggestedDefaultDataLength) + .WillByDefault(Return(512)); bluetooth::hci::LeBufferSize iso_size; iso_size.le_data_packet_length_ = 512; iso_size.total_num_le_packets_ = 6; - ON_CALL(controller_, GetControllerIsoBufferSize).WillByDefault(Return(iso_size)); + ON_CALL(*bluetooth::hci::testing::mock_controller_, GetControllerIsoBufferSize) + .WillByDefault(Return(iso_size)); bluetooth::hci::LeBufferSize le_size; le_size.le_data_packet_length_ = 512; le_size.total_num_le_packets_ = 6; - ON_CALL(controller_, GetLeBufferSize).WillByDefault(Return(le_size)); - ON_CALL(controller_, SupportsBle).WillByDefault(Return(true)); - ON_CALL(controller_, GetAclPacketLength).WillByDefault(Return(512)); - bluetooth::hci::testing::mock_controller_ = &controller_; + ON_CALL(*bluetooth::hci::testing::mock_controller_, GetLeBufferSize) + .WillByDefault(Return(le_size)); + ON_CALL(*bluetooth::hci::testing::mock_controller_, SupportsBle).WillByDefault(Return(true)); + ON_CALL(*bluetooth::hci::testing::mock_controller_, GetAclPacketLength) + .WillByDefault(Return(512)); } ~FakeBtStack() { test::mock::stack_acl::acl_send_data_packet_br_edr = {}; test::mock::stack_acl::acl_send_data_packet_ble = {}; - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); } - bluetooth::hci::testing::MockControllerInterface controller_; }; class Fakes { diff --git a/system/stack/gatt/gatt_api.cc b/system/stack/gatt/gatt_api.cc index 1b60132b00..7b1a425f5e 100644 --- a/system/stack/gatt/gatt_api.cc +++ b/system/stack/gatt/gatt_api.cc @@ -34,6 +34,7 @@ #include "internal_include/bt_target.h" #include "internal_include/stack_config.h" #include "main/shim/helpers.h" +#include "main/shim/metrics_api.h" #include "os/system_properties.h" #include "osi/include/allocator.h" #include "stack/arbiter/acl_arbiter.h" @@ -48,7 +49,6 @@ #include "stack/include/l2cap_interface.h" #include "stack/include/l2cdefs.h" #include "stack/include/sdp_api.h" -#include "stack/include/stack_metrics_logging.h" #include "types/bluetooth/uuid.h" #include "types/bt_transport.h" #include "types/raw_address.h" @@ -1476,7 +1476,8 @@ bool GATT_Connect(tGATT_IF gatt_if, const RawAddress& bd_addr, tBLE_ADDR_TYPE ad return true; } - log_le_connection_lifecycle(ToGdAddress(bd_addr), true /* is_connect */, is_direct); + bluetooth::shim::LogMetricLeConnectionLifecycle(ToGdAddress(bd_addr), true /* is_connect */, + is_direct); bool ret = false; if (is_direct) { @@ -1618,8 +1619,8 @@ tGATT_STATUS GATT_Disconnect(tCONN_ID conn_id) { return GATT_ILLEGAL_PARAMETER; } - log_le_connection_lifecycle(ToGdAddress(p_tcb->peer_bda), true /* is_connect */, - false /* is_direct */); + bluetooth::shim::LogMetricLeConnectionLifecycle(ToGdAddress(p_tcb->peer_bda), + true /* is_connect */, false /* is_direct */); tGATT_IF gatt_if = gatt_get_gatt_if(conn_id); gatt_update_app_use_link_flag(gatt_if, p_tcb, false, true); diff --git a/system/stack/hid/hidd_api.cc b/system/stack/hid/hidd_api.cc index 169868bbfc..58d9bdc07a 100644 --- a/system/stack/hid/hidd_api.cc +++ b/system/stack/hid/hidd_api.cc @@ -38,13 +38,13 @@ #include "hidd_int.h" #include "hiddefs.h" #include "internal_include/bt_target.h" +#include "main/shim/metrics_api.h" #include "osi/include/allocator.h" #include "stack/include/bt_psm_types.h" #include "stack/include/bt_types.h" #include "stack/include/bt_uuid16.h" #include "stack/include/sdp_api.h" #include "stack/include/sdpdefs.h" -#include "stack/include/stack_metrics_logging.h" #include "stack/sdp/sdp_discovery_db.h" #include "types/raw_address.h" @@ -83,12 +83,14 @@ tHID_STATUS HID_DevRegister(tHID_DEV_HOST_CALLBACK* host_cback) { log::verbose(""); if (hd_cb.reg_flag) { - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_ALREADY_REGISTERED, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_ALREADY_REGISTERED, 1); return HID_ERR_ALREADY_REGISTERED; } if (host_cback == NULL) { - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_HOST_CALLBACK_NULL, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_HOST_CALLBACK_NULL, 1); return HID_ERR_INVALID_PARAM; } @@ -122,7 +124,7 @@ tHID_STATUS HID_DevDeregister(void) { log::verbose(""); if (!hd_cb.reg_flag) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_NOT_REGISTERED_AT_DEREGISTER, 1); return HID_ERR_NOT_REGISTERED; } @@ -263,9 +265,10 @@ tHID_STATUS HID_DevAddRecord(uint32_t handle, char* p_name, char* p_description, if (desc_len > HIDD_APP_DESCRIPTOR_LEN) { log::error("descriptor length = {}, larger than max {}", desc_len, HIDD_APP_DESCRIPTOR_LEN); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum:: - HIDD_ERR_NOT_REGISTERED_DUE_TO_DESCRIPTOR_LENGTH, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum:: + HIDD_ERR_NOT_REGISTERED_DUE_TO_DESCRIPTOR_LENGTH, + 1); return HID_ERR_NOT_REGISTERED; }; @@ -273,9 +276,10 @@ tHID_STATUS HID_DevAddRecord(uint32_t handle, char* p_name, char* p_description, if (p_buf == NULL) { log::error("Buffer allocation failure for size = {}", buf_len); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum:: - HIDD_ERR_NOT_REGISTERED_DUE_TO_BUFFER_ALLOCATION, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum:: + HIDD_ERR_NOT_REGISTERED_DUE_TO_BUFFER_ALLOCATION, + 1); return HID_ERR_NOT_REGISTERED; } @@ -346,8 +350,8 @@ tHID_STATUS HID_DevAddRecord(uint32_t handle, char* p_name, char* p_description, if (!result) { log::error("failed to complete SDP record"); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_NOT_REGISTERED_AT_SDP, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_NOT_REGISTERED_AT_SDP, 1); return HID_ERR_NOT_REGISTERED; } @@ -376,7 +380,7 @@ tHID_STATUS HID_DevSendReport(uint8_t channel, uint8_t type, uint8_t id, uint16_ return hidd_conn_send_data(HID_CHANNEL_INTR, HID_TRANS_DATA, HID_PAR_REP_TYPE_INPUT, id, len, p_data); } - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_INVALID_PARAM_SEND_REPORT, 1); return HID_ERR_INVALID_PARAM; } @@ -444,19 +448,20 @@ tHID_STATUS HID_DevUnplugDevice(const RawAddress& addr) { ******************************************************************************/ tHID_STATUS HID_DevConnect(void) { if (!hd_cb.reg_flag) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_NOT_REGISTERED_AT_CONNECT, 1); return HID_ERR_NOT_REGISTERED; } if (!hd_cb.device.in_use) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_DEVICE_NOT_IN_USE_AT_CONNECT, 1); return HID_ERR_INVALID_PARAM; } if (hd_cb.device.state != HIDD_DEV_NO_CONN) { - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_ALREADY_CONN, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_ALREADY_CONN, 1); return HID_ERR_ALREADY_CONN; } @@ -474,13 +479,13 @@ tHID_STATUS HID_DevConnect(void) { ******************************************************************************/ tHID_STATUS HID_DevDisconnect(void) { if (!hd_cb.reg_flag) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_NOT_REGISTERED_AT_DISCONNECT, 1); return HID_ERR_NOT_REGISTERED; } if (!hd_cb.device.in_use) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_DEVICE_NOT_IN_USE_AT_DISCONNECT, 1); return HID_ERR_INVALID_PARAM; @@ -492,10 +497,11 @@ tHID_STATUS HID_DevDisconnect(void) { tHID_STATUS ret = hidd_conn_disconnect(); hd_cb.device.conn.conn_state = HID_CONN_STATE_UNUSED; hd_cb.callback(hd_cb.device.addr, HID_DHOST_EVT_CLOSE, HID_ERR_DISCONNECTING, NULL); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_DISCONNECTING, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_DISCONNECTING, 1); return ret; } - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_NO_CONNECTION_AT_DISCONNECT, 1); return HID_ERR_NO_CONNECTION; } @@ -565,7 +571,7 @@ tHID_STATUS HID_DevGetDevice(RawAddress* addr) { if (hd_cb.device.in_use) { *addr = hd_cb.device.addr; } else { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_NOT_REGISTERED_AT_GET_DEVICE, 1); return HID_ERR_NOT_REGISTERED; } diff --git a/system/stack/hid/hidd_conn.cc b/system/stack/hid/hidd_conn.cc index 7276af8acd..5f94c1c870 100644 --- a/system/stack/hid/hidd_conn.cc +++ b/system/stack/hid/hidd_conn.cc @@ -37,13 +37,13 @@ #include "hiddefs.h" #include "internal_include/bt_target.h" #include "l2cap_types.h" +#include "main/shim/metrics_api.h" #include "osi/include/allocator.h" #include "stack/hid/hidd_int.h" #include "stack/include/bt_hdr.h" #include "stack/include/bt_psm_types.h" #include "stack/include/l2cap_interface.h" #include "stack/include/l2cdefs.h" -#include "stack/include/stack_metrics_logging.h" #include "types/bt_transport.h" #include "types/raw_address.h" @@ -300,7 +300,7 @@ static void hidd_l2cif_config_cfm(uint16_t cid, uint16_t /* initiator */, tL2CAP log::warn("could not start L2CAP connection for INTR"); hd_cb.callback(hd_cb.device.addr, HID_DHOST_EVT_CLOSE, HID_ERR_L2CAP_FAILED, NULL); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_L2CAP_NOT_STARTED_INCOMING, 1); return; } else { @@ -577,8 +577,8 @@ tHID_STATUS hidd_conn_reg(void) { HID_PSM_CONTROL, dev_reg_info, false /* enable_snoop */, nullptr, HID_DEV_MTU_SIZE, 0, BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT)) { log::error("HID Control (device) registration failed"); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_L2CAP_FAILED_CONTROL, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_L2CAP_FAILED_CONTROL, 1); return HID_ERR_L2CAP_FAILED; } @@ -587,8 +587,8 @@ tHID_STATUS hidd_conn_reg(void) { 0, BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT)) { stack::l2cap::get_interface().L2CA_Deregister(HID_PSM_CONTROL); log::error("HID Interrupt (device) registration failed"); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_L2CAP_FAILED_INTERRUPT, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_L2CAP_FAILED_INTERRUPT, 1); return HID_ERR_L2CAP_FAILED; } @@ -627,14 +627,15 @@ tHID_STATUS hidd_conn_initiate(void) { if (!p_dev->in_use) { log::warn("no virtual cable established"); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_NOT_REGISTERED_AT_INITIATE, 1); return HID_ERR_NOT_REGISTERED; } if (p_dev->conn.conn_state != HID_CONN_STATE_UNUSED) { log::warn("connection already in progress"); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_CONN_IN_PROCESS, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_CONN_IN_PROCESS, 1); return HID_ERR_CONN_IN_PROCESS; } @@ -649,8 +650,8 @@ tHID_STATUS hidd_conn_initiate(void) { HID_PSM_CONTROL, p_dev->addr, BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT)) == 0) { log::warn("could not start L2CAP connection"); hd_cb.callback(hd_cb.device.addr, HID_DHOST_EVT_CLOSE, HID_ERR_L2CAP_FAILED, NULL); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_L2CAP_FAILED_INITIATE, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_L2CAP_FAILED_INITIATE, 1); } else { p_dev->conn.conn_state = HID_CONN_STATE_CONNECTING_CTRL; } @@ -723,7 +724,7 @@ tHID_STATUS hidd_conn_send_data(uint8_t channel, uint8_t msg_type, uint8_t param tHID_CONN* p_hcon = &hd_cb.device.conn; if (p_hcon->conn_flags & HID_CONN_FLAGS_CONGESTED) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_CONGESTED_AT_FLAG_CHECK, 1); return HID_ERR_CONGESTED; } @@ -744,13 +745,15 @@ tHID_STATUS hidd_conn_send_data(uint8_t channel, uint8_t msg_type, uint8_t param } break; default: - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_INVALID_PARAM, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_INVALID_PARAM, 1); return HID_ERR_INVALID_PARAM; } p_buf = (BT_HDR*)osi_malloc(buf_size); if (p_buf == NULL) { - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_NO_RESOURCES, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_NO_RESOURCES, 1); return HID_ERR_NO_RESOURCES; } @@ -792,7 +795,7 @@ tHID_STATUS hidd_conn_send_data(uint8_t channel, uint8_t msg_type, uint8_t param return HID_SUCCESS; } - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_NO_CONNECTION_AT_SEND_DATA, 1); return HID_ERR_NO_CONNECTION; } @@ -800,7 +803,7 @@ tHID_STATUS hidd_conn_send_data(uint8_t channel, uint8_t msg_type, uint8_t param log::verbose("report sent"); if (stack::l2cap::get_interface().L2CA_DataWrite(cid, p_buf) == tL2CAP_DW_RESULT::FAILED) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDD_ERR_CONGESTED_AT_DATA_WRITE, 1); return HID_ERR_CONGESTED; } diff --git a/system/stack/hid/hidh_api.cc b/system/stack/hid/hidh_api.cc index 97d811ed5b..1ab5ba2a6a 100644 --- a/system/stack/hid/hidh_api.cc +++ b/system/stack/hid/hidh_api.cc @@ -37,6 +37,7 @@ #include "hiddefs.h" #include "hidh_int.h" #include "internal_include/bt_target.h" +#include "main/shim/metrics_api.h" #include "osi/include/alarm.h" #include "osi/include/allocator.h" #include "sdp_api.h" @@ -44,7 +45,6 @@ #include "stack/include/bt_hdr.h" #include "stack/include/bt_uuid16.h" #include "stack/include/sdpdefs.h" -#include "stack/include/stack_metrics_logging.h" #include "stack/sdp/sdp_discovery_db.h" #include "types/bluetooth/uuid.h" #include "types/raw_address.h" @@ -69,7 +69,8 @@ static void hidh_search_callback(const RawAddress& bd_addr, tSDP_RESULT sdp_resu tHID_STATUS HID_HostGetSDPRecord(const RawAddress& addr, tSDP_DISCOVERY_DB* p_db, uint32_t db_len, tHID_HOST_SDP_CALLBACK* sdp_cback) { if (hh_cb.sdp_busy) { - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_SDP_BUSY, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_SDP_BUSY, 1); return HID_ERR_SDP_BUSY; } @@ -87,7 +88,8 @@ tHID_STATUS HID_HostGetSDPRecord(const RawAddress& addr, tSDP_DISCOVERY_DB* p_db return HID_SUCCESS; } else { log::warn("Unable to start SDP service search request peer:{}", addr); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_NO_RESOURCES_SDP, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_NO_RESOURCES_SDP, 1); return HID_ERR_NO_RESOURCES; } } @@ -289,12 +291,13 @@ tHID_STATUS HID_HostRegister(tHID_HOST_DEV_CALLBACK* dev_cback) { tHID_STATUS st; if (hh_cb.reg_flag) { - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_ALREADY_REGISTERED, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_ALREADY_REGISTERED, 1); return HID_ERR_ALREADY_REGISTERED; } if (dev_cback == NULL) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_INVALID_PARAM_AT_HOST_REGISTER, 1); return HID_ERR_INVALID_PARAM; } @@ -392,7 +395,7 @@ tHID_STATUS HID_HostAddDev(const RawAddress& addr, uint16_t attr_mask, uint8_t* } if (i == HID_HOST_MAX_DEVICES) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_NO_RESOURCES_ADD_DEVICE, 1); return HID_ERR_NO_RESOURCES; } @@ -427,7 +430,7 @@ tHID_STATUS HID_HostRemoveDev(uint8_t dev_handle) { } if ((dev_handle >= HID_HOST_MAX_DEVICES) || (!hh_cb.devices[dev_handle].in_use)) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_INVALID_PARAM_AT_HOST_REMOVE_DEV, 1); return HID_ERR_INVALID_PARAM; @@ -457,13 +460,14 @@ tHID_STATUS HID_HostOpenDev(uint8_t dev_handle) { } if ((dev_handle >= HID_HOST_MAX_DEVICES) || (!hh_cb.devices[dev_handle].in_use)) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_INVALID_PARAM_AT_HOST_OPEN_DEV, 1); return HID_ERR_INVALID_PARAM; } if (hh_cb.devices[dev_handle].state != HID_DEV_NO_CONN) { - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_ALREADY_CONN, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_ALREADY_CONN, 1); return HID_ERR_ALREADY_CONN; } @@ -494,13 +498,13 @@ tHID_STATUS HID_HostWriteDev(uint8_t dev_handle, uint8_t t_type, uint8_t param, if ((dev_handle >= HID_HOST_MAX_DEVICES) || (!hh_cb.devices[dev_handle].in_use)) { log::error("HID_ERR_INVALID_PARAM"); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_INVALID_PARAM_AT_HOST_WRITE_DEV, 1); status = HID_ERR_INVALID_PARAM; } else if (hh_cb.devices[dev_handle].state != HID_DEV_CONNECTED) { log::error("HID_ERR_NO_CONNECTION dev_handle {}", dev_handle); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_NO_CONNECTION_AT_HOST_WRITE_DEV, 1); status = HID_ERR_NO_CONNECTION; @@ -530,14 +534,14 @@ tHID_STATUS HID_HostCloseDev(uint8_t dev_handle) { } if ((dev_handle >= HID_HOST_MAX_DEVICES) || (!hh_cb.devices[dev_handle].in_use)) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_INVALID_PARAM_AT_HOST_CLOSE_DEV, 1); return HID_ERR_INVALID_PARAM; } if (hh_cb.devices[dev_handle].state != HID_DEV_CONNECTED) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_NO_CONNECTION_AT_HOST_CLOSE_DEV, 1); return HID_ERR_NO_CONNECTION; diff --git a/system/stack/hid/hidh_conn.cc b/system/stack/hid/hidh_conn.cc index cdc7906d16..71785478a1 100644 --- a/system/stack/hid/hidh_conn.cc +++ b/system/stack/hid/hidh_conn.cc @@ -39,6 +39,7 @@ #include "internal_include/bt_target.h" #include "l2cap_types.h" #include "l2cdefs.h" +#include "main/shim/metrics_api.h" #include "osi/include/alarm.h" #include "osi/include/allocator.h" #include "osi/include/osi.h" @@ -48,7 +49,6 @@ #include "stack/include/btm_client_interface.h" #include "stack/include/btm_log_history.h" #include "stack/include/l2cap_interface.h" -#include "stack/include/stack_metrics_logging.h" #include "types/bt_transport.h" #include "types/raw_address.h" @@ -119,7 +119,7 @@ tHID_STATUS hidh_conn_reg(void) { HID_PSM_CONTROL, hst_reg_info, false /* enable_snoop */, nullptr, HID_HOST_MTU, 0, BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT)) { log::error("HID-Host Control Registration failed"); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_L2CAP_FAILED_AT_REGISTER_CONTROL, 1); return HID_ERR_L2CAP_FAILED; @@ -129,7 +129,7 @@ tHID_STATUS hidh_conn_reg(void) { BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT)) { stack::l2cap::get_interface().L2CA_Deregister(HID_PSM_CONTROL); log::error("HID-Host Interrupt Registration failed"); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_L2CAP_FAILED_AT_REGISTER_INTERRUPT, 1); return HID_ERR_L2CAP_FAILED; @@ -549,7 +549,8 @@ static void hidh_l2cif_disconnect_ind(uint16_t l2cap_cid, bool ack_needed) { (disc_res == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) || (disc_res == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE) || (disc_res == HCI_ERR_REPEATED_ATTEMPTS)) { - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_AUTH_FAILED, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_AUTH_FAILED, 1); hid_close_evt_reason = HID_ERR_AUTH_FAILED; } @@ -771,14 +772,14 @@ tHID_STATUS hidh_conn_snd_data(uint8_t dhandle, uint8_t trans_type, uint8_t para if (!get_btm_client_interface().peer.BTM_IsAclConnectionUp(hh_cb.devices[dhandle].addr, BT_TRANSPORT_BR_EDR)) { osi_free(buf); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_NO_CONNECTION_AT_SEND_DATA, 1); return HID_ERR_NO_CONNECTION; } if (p_hcon->conn_flags & HID_CONN_FLAGS_CONGESTED) { osi_free(buf); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_CONGESTED_AT_FLAG_CHECK, 1); return HID_ERR_CONGESTED; } @@ -799,7 +800,7 @@ tHID_STATUS hidh_conn_snd_data(uint8_t dhandle, uint8_t trans_type, uint8_t para buf_size = HID_INTERRUPT_BUF_SIZE; break; default: - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_INVALID_PARAM_AT_SEND_DATA, 1); return HID_ERR_INVALID_PARAM; } @@ -860,7 +861,7 @@ tHID_STATUS hidh_conn_snd_data(uint8_t dhandle, uint8_t trans_type, uint8_t para /* Send the buffer through L2CAP */ if ((p_hcon->conn_flags & HID_CONN_FLAGS_CONGESTED) || (stack::l2cap::get_interface().L2CA_DataWrite(cid, p_buf) == tL2CAP_DW_RESULT::FAILED)) { - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_CONGESTED_AT_SEND_DATA, 1); return HID_ERR_CONGESTED; } @@ -889,7 +890,8 @@ tHID_STATUS hidh_conn_initiate(uint8_t dhandle) { tHID_HOST_DEV_CTB* p_dev = &hh_cb.devices[dhandle]; if (p_dev->conn.conn_state != HID_CONN_STATE_UNUSED) { - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_CONN_IN_PROCESS, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_CONN_IN_PROCESS, 1); return HID_ERR_CONN_IN_PROCESS; } @@ -908,7 +910,7 @@ tHID_STATUS hidh_conn_initiate(uint8_t dhandle) { log::warn("HID-Host Originate failed"); hh_cb.callback(dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, HID_ERR_L2CAP_FAILED, NULL); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::HIDH_ERR_L2CAP_FAILED_AT_INITIATE, 1); } else { /* Transition to the next appropriate state, waiting for connection confirm diff --git a/system/stack/include/stack_metrics_logging.h b/system/stack/include/stack_metrics_logging.h deleted file mode 100644 index 9a0a80baa4..0000000000 --- a/system/stack/include/stack_metrics_logging.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include <frameworks/proto_logging/stats/enums/bluetooth/enums.pb.h> -#include <frameworks/proto_logging/stats/enums/bluetooth/hci/enums.pb.h> - -#include <cstdint> - -#include "hci/address.h" -#include "hci/hci_packets.h" -#include "types/raw_address.h" - -void log_classic_pairing_event(const RawAddress& address, uint16_t handle, uint32_t hci_cmd, - uint16_t hci_event, uint16_t cmd_status, uint16_t reason_code, - int64_t event_value); - -void log_link_layer_connection_event(const RawAddress* address, uint32_t connection_handle, - android::bluetooth::DirectionEnum direction, - uint16_t link_type, uint32_t hci_cmd, uint16_t hci_event, - uint16_t hci_ble_event, uint16_t cmd_status, - uint16_t reason_code); - -void log_smp_pairing_event(const RawAddress& address, uint16_t smp_cmd, - android::bluetooth::DirectionEnum direction, uint16_t smp_fail_reason); - -void log_sdp_attribute(const RawAddress& address, uint16_t protocol_uuid, uint16_t attribute_id, - size_t attribute_size, const char* attribute_value); - -void log_manufacturer_info(const RawAddress& address, - android::bluetooth::AddressTypeEnum address_type, - android::bluetooth::DeviceInfoSrcEnum source_type, - const std::string& source_name, const std::string& manufacturer, - const std::string& model, const std::string& hardware_version, - const std::string& software_version); - -void log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum key, int64_t value); - -void log_hfp_audio_packet_loss_stats(const RawAddress& address, int num_decoded_frames, - double packet_loss_ratio, uint16_t codec_type); - -void log_mmc_transcode_rtt_stats(int maximum_rtt, double mean_rtt, int num_requests, - int codec_type); - -void log_le_pairing_fail(const RawAddress& raw_address, uint8_t failure_reason, bool is_outgoing); - -void log_le_connection_status(bluetooth::hci::Address address, bool is_connect, - bluetooth::hci::ErrorCode reason); - -void log_le_device_in_accept_list(bluetooth::hci::Address address, bool is_add); - -void log_le_connection_lifecycle(bluetooth::hci::Address address, bool is_connect, bool is_direct); - -void log_le_connection_completion(bluetooth::hci::Address address, bluetooth::hci::ErrorCode reason, - bool is_locally_initiated); diff --git a/system/stack/l2cap/l2c_ble.cc b/system/stack/l2cap/l2c_ble.cc index 49dca969dc..d964271002 100644 --- a/system/stack/l2cap/l2c_ble.cc +++ b/system/stack/l2cap/l2c_ble.cc @@ -1443,7 +1443,7 @@ tL2CAP_LE_RESULT_CODE l2ble_sec_access_req(const RawAddress& bd_addr, uint16_t p * constraints. For example, when there is at least one Hearing Aid device * bonded, the minimum interval is raised. On return, min_interval and * max_interval are updated. */ -void L2CA_AdjustConnectionIntervals(uint16_t* min_interval, uint16_t* max_interval, +void L2CA_AdjustConnectionIntervals(uint16_t* /* min_interval */, uint16_t* max_interval, uint16_t floor_interval) { // Allow for customization by systemprops for mainline uint16_t phone_min_interval = floor_interval; @@ -1462,13 +1462,6 @@ void L2CA_AdjustConnectionIntervals(uint16_t* min_interval, uint16_t* max_interv log::verbose("Have Hearing Aids. Min. interval is set to {}", phone_min_interval); } - if (!com::android::bluetooth::flags::l2cap_le_do_not_adjust_min_interval() && - *min_interval < phone_min_interval) { - log::verbose("requested min_interval={} too small. Set to {}", *min_interval, - phone_min_interval); - *min_interval = phone_min_interval; - } - // While this could result in connection parameters that fall // outside fo the range requested, this will allow the connection // to remain established. diff --git a/system/stack/metrics/stack_metrics_logging.cc b/system/stack/metrics/stack_metrics_logging.cc deleted file mode 100644 index 398a72ce33..0000000000 --- a/system/stack/metrics/stack_metrics_logging.cc +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "stack/include/stack_metrics_logging.h" - -#include <frameworks/proto_logging/stats/enums/bluetooth/enums.pb.h> -#include <frameworks/proto_logging/stats/enums/bluetooth/hci/enums.pb.h> - -#include "common/metrics.h" -#include "main/shim/metrics_api.h" -#include "main/shim/shim.h" -#include "types/raw_address.h" - -void log_classic_pairing_event(const RawAddress& address, uint16_t handle, uint32_t hci_cmd, - uint16_t hci_event, uint16_t cmd_status, uint16_t reason_code, - int64_t event_value) { - bluetooth::shim::LogMetricClassicPairingEvent(address, handle, hci_cmd, hci_event, cmd_status, - reason_code, event_value); -} - -void log_link_layer_connection_event(const RawAddress* address, uint32_t connection_handle, - android::bluetooth::DirectionEnum direction, - uint16_t link_type, uint32_t hci_cmd, uint16_t hci_event, - uint16_t hci_ble_event, uint16_t cmd_status, - uint16_t reason_code) { - bluetooth::shim::LogMetricLinkLayerConnectionEvent(address, connection_handle, direction, - link_type, hci_cmd, hci_event, hci_ble_event, - cmd_status, reason_code); -} - -void log_smp_pairing_event(const RawAddress& address, uint16_t smp_cmd, - android::bluetooth::DirectionEnum direction, uint16_t smp_fail_reason) { - bluetooth::shim::LogMetricSmpPairingEvent(address, smp_cmd, direction, smp_fail_reason); -} - -void log_sdp_attribute(const RawAddress& address, uint16_t protocol_uuid, uint16_t attribute_id, - size_t attribute_size, const char* attribute_value) { - bluetooth::shim::LogMetricSdpAttribute(address, protocol_uuid, attribute_id, attribute_size, - attribute_value); -} - -void log_manufacturer_info(const RawAddress& address, - android::bluetooth::AddressTypeEnum address_type, - android::bluetooth::DeviceInfoSrcEnum source_type, - const std::string& source_name, const std::string& manufacturer, - const std::string& model, const std::string& hardware_version, - const std::string& software_version) { - bluetooth::shim::LogMetricManufacturerInfo(address, address_type, source_type, source_name, - manufacturer, model, hardware_version, - software_version); -} - -void log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum key, int64_t value) { - bluetooth::shim::CountCounterMetrics(key, value); -} - -void log_hfp_audio_packet_loss_stats(const RawAddress& address, int num_decoded_frames, - double packet_loss_ratio, uint16_t codec_type) { - bluetooth::shim::LogMetricHfpPacketLossStats(address, num_decoded_frames, packet_loss_ratio, - codec_type); -} - -void log_mmc_transcode_rtt_stats(int maximum_rtt, double mean_rtt, int num_requests, - int codec_type) { - bluetooth::shim::LogMetricMmcTranscodeRttStats(maximum_rtt, mean_rtt, num_requests, codec_type); -} - -void log_le_pairing_fail(const RawAddress& raw_address, uint8_t failure_reason, bool is_outgoing) { - bluetooth::shim::LogMetricLePairingFail(raw_address, failure_reason, is_outgoing); -} - -void log_le_connection_status(bluetooth::hci::Address address, bool is_connect, - bluetooth::hci::ErrorCode reason) { - bluetooth::shim::LogMetricLeConnectionStatus(address, is_connect, reason); -} - -void log_le_device_in_accept_list(bluetooth::hci::Address address, bool is_add) { - bluetooth::shim::LogMetricLeDeviceInAcceptList(address, is_add); -} - -void log_le_connection_lifecycle(bluetooth::hci::Address address, bool is_connect, bool is_direct) { - bluetooth::shim::LogMetricLeConnectionLifecycle(address, is_connect, is_direct); -} - -void log_le_connection_completion(bluetooth::hci::Address address, bluetooth::hci::ErrorCode reason, - bool is_locally_initiated) { - bluetooth::shim::LogMetricLeConnectionCompletion(address, reason, is_locally_initiated); -} diff --git a/system/stack/mmc/metrics/mmc_rtt_logger.cc b/system/stack/mmc/metrics/mmc_rtt_logger.cc index 761d825b44..c95566f0cb 100644 --- a/system/stack/mmc/metrics/mmc_rtt_logger.cc +++ b/system/stack/mmc/metrics/mmc_rtt_logger.cc @@ -20,7 +20,7 @@ #include <cmath> #include <string> -#include "stack/include/stack_metrics_logging.h" +#include "main/shim/metrics_api.h" namespace mmc { @@ -43,7 +43,8 @@ void MmcRttLogger::UploadTranscodeRttStatics() { if (num_requests_ == 0) { return; } - log_mmc_transcode_rtt_stats(maximum_rtt_, rtt_sum_ / num_requests_, num_requests_, codec_type_); + bluetooth::shim::LogMetricMmcTranscodeRttStats(maximum_rtt_, rtt_sum_ / num_requests_, + num_requests_, codec_type_); num_requests_ = 0; rtt_sum_ = 0; maximum_rtt_ = 0; diff --git a/system/stack/rfcomm/port_api.cc b/system/stack/rfcomm/port_api.cc index a78f3ea890..6ab7cdccea 100644 --- a/system/stack/rfcomm/port_api.cc +++ b/system/stack/rfcomm/port_api.cc @@ -1229,7 +1229,9 @@ int PORT_GetChannelInfo(uint16_t handle, uint16_t* local_mtu, uint16_t* remote_m return PORT_NOT_OPENED; } - if (p_port->line_status) { + if (p_port->rfc.p_mcb == nullptr || p_port->line_status) { + log::warn("PORT_LINE_ERR - p_port->rfc.p_mcb == nullptr:{} p_port->line_status:{}", + (p_port->rfc.p_mcb == nullptr) ? "T" : "F", p_port->line_status); return PORT_LINE_ERR; } diff --git a/system/stack/rfcomm/port_rfc.cc b/system/stack/rfcomm/port_rfc.cc index 860fdf0450..c1518665d9 100644 --- a/system/stack/rfcomm/port_rfc.cc +++ b/system/stack/rfcomm/port_rfc.cc @@ -36,12 +36,12 @@ #include "internal_include/bt_target.h" #include "internal_include/bt_trace.h" #include "main/shim/entry.h" +#include "main/shim/metrics_api.h" #include "osi/include/allocator.h" #include "osi/include/mutex.h" #include "stack/include/bt_hdr.h" #include "stack/include/bt_uuid16.h" #include "stack/include/rfc_metrics.h" -#include "stack/include/stack_metrics_logging.h" #include "stack/l2cap/l2c_int.h" #include "stack/rfcomm/port_int.h" #include "stack/rfcomm/rfc_int.h" @@ -186,7 +186,8 @@ void port_start_close(tPORT* p_port) { * clear tPort */ if (p_port->p_mgmt_callback) { p_port->p_mgmt_callback(PORT_CLOSED, p_port->handle); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_START_CLOSE, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_START_CLOSE, 1); } port_release_port(p_port); @@ -230,7 +231,7 @@ void PORT_StartCnf(tRFC_MCB* p_mcb, uint16_t result) { if (p_port->p_mgmt_callback) { p_port->p_mgmt_callback(PORT_START_FAILED, p_port->handle); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_START_CNF_FAILED, 1); } port_release_port(p_port); @@ -457,14 +458,14 @@ void PORT_DlcEstablishInd(tRFC_MCB* p_mcb, uint8_t dlci, uint16_t mtu) { if (p_port->rfc_cfg_info.data_path != BTSOCK_DATA_PATH_HARDWARE_OFFLOAD && p_port->p_mgmt_callback) { p_port->p_mgmt_callback(PORT_SUCCESS, p_port->handle); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::RFCOMM_CONNECTION_SUCCESS_IND, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::RFCOMM_CONNECTION_SUCCESS_IND, 1); } } else { if (p_port->p_mgmt_callback) { p_port->p_mgmt_callback(PORT_SUCCESS, p_port->handle); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::RFCOMM_CONNECTION_SUCCESS_IND, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::RFCOMM_CONNECTION_SUCCESS_IND, 1); } } @@ -493,7 +494,8 @@ void PORT_DlcEstablishCnf(tRFC_MCB* p_mcb, uint8_t dlci, uint16_t mtu, uint16_t if (result != RFCOMM_SUCCESS) { log::warn("Unable to establish configuration dlci:{} result:{}", dlci, result); port_rfc_closed(p_port, PORT_START_FAILED); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_START_FAILED, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_START_FAILED, 1); return; } @@ -513,14 +515,14 @@ void PORT_DlcEstablishCnf(tRFC_MCB* p_mcb, uint8_t dlci, uint16_t mtu, uint16_t if (p_port->rfc_cfg_info.data_path != BTSOCK_DATA_PATH_HARDWARE_OFFLOAD && p_port->p_mgmt_callback) { p_port->p_mgmt_callback(PORT_SUCCESS, p_port->handle); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::RFCOMM_CONNECTION_SUCCESS_CNF, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::RFCOMM_CONNECTION_SUCCESS_CNF, 1); } } else { if (p_port->p_mgmt_callback) { p_port->p_mgmt_callback(PORT_SUCCESS, p_port->handle); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::RFCOMM_CONNECTION_SUCCESS_CNF, - 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::RFCOMM_CONNECTION_SUCCESS_CNF, 1); } } @@ -590,7 +592,8 @@ void PORT_PortNegCnf(tRFC_MCB* p_mcb, uint8_t dlci, PortSettings* /* p_settings RFCOMM_DlcReleaseReq(p_mcb, p_port->dlci); port_rfc_closed(p_port, PORT_PORT_NEG_FAILED); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_NEG_FAILED, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_NEG_FAILED, 1); return; } @@ -661,7 +664,7 @@ void PORT_ControlInd(tRFC_MCB* p_mcb, uint8_t dlci, tPORT_CTRL* p_pars) { if (p_port->rfc_cfg_info.data_path == BTSOCK_DATA_PATH_HARDWARE_OFFLOAD) { if (p_port->port_ctrl == PORT_CTRL_SETUP_COMPLETED && p_port->p_mgmt_callback) { p_port->p_mgmt_callback(PORT_SUCCESS, p_port->handle); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::RFCOMM_CONNECTION_SUCCESS_IND, 1); } } @@ -708,7 +711,7 @@ void PORT_ControlCnf(tRFC_MCB* p_mcb, uint8_t dlci, tPORT_CTRL* /* p_pars */) { if (p_port->rfc_cfg_info.data_path == BTSOCK_DATA_PATH_HARDWARE_OFFLOAD) { if (p_port->port_ctrl == PORT_CTRL_SETUP_COMPLETED && p_port->p_mgmt_callback) { p_port->p_mgmt_callback(PORT_SUCCESS, p_port->handle); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::RFCOMM_CONNECTION_SUCCESS_CNF, 1); } } @@ -767,7 +770,8 @@ void PORT_DlcReleaseInd(tRFC_MCB* p_mcb, uint8_t dlci) { return; } port_rfc_closed(p_port, PORT_CLOSED); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_CLOSED, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_CLOSED, 1); } /******************************************************************************* @@ -788,7 +792,7 @@ void PORT_CloseInd(tRFC_MCB* p_mcb) { for (i = 0; i < MAX_RFC_PORTS; i++, p_port++) { if (p_port->rfc.p_mcb == p_mcb) { port_rfc_closed(p_port, PORT_PEER_CONNECTION_FAILED); - log_counter_metrics( + bluetooth::shim::CountCounterMetrics( android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_PEER_CONNECTION_FAILED, 1); } } @@ -813,7 +817,8 @@ void PORT_TimeOutCloseMux(tRFC_MCB* p_mcb) { for (i = 0; i < MAX_RFC_PORTS; i++, p_port++) { if (p_port->rfc.p_mcb == p_mcb) { port_rfc_closed(p_port, PORT_PEER_TIMEOUT); - log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_PEER_TIMEOUT, 1); + bluetooth::shim::CountCounterMetrics( + android::bluetooth::CodePathCounterKeyEnum::RFCOMM_PORT_PEER_TIMEOUT, 1); } } } diff --git a/system/stack/rfcomm/rfc_l2cap_if.cc b/system/stack/rfcomm/rfc_l2cap_if.cc index 5b7fc00185..10826d235a 100644 --- a/system/stack/rfcomm/rfc_l2cap_if.cc +++ b/system/stack/rfcomm/rfc_l2cap_if.cc @@ -91,28 +91,26 @@ void rfcomm_l2cap_if_init(void) { void RFCOMM_ConnectInd(const RawAddress& bd_addr, uint16_t lcid, uint16_t /* psm */, uint8_t id) { tRFC_MCB* p_mcb = rfc_alloc_multiplexer_channel(bd_addr, false); - if ((p_mcb) && (p_mcb->state != RFC_MX_STATE_IDLE)) { - /* if this is collision case */ - if ((p_mcb->is_initiator) && (p_mcb->state == RFC_MX_STATE_WAIT_CONN_CNF)) { - p_mcb->pending_lcid = lcid; - - /* wait random timeout (2 - 12) to resolve collision */ - /* if peer gives up then local device rejects incoming connection and - * continues as initiator */ - /* if timeout, local device disconnects outgoing connection and continues - * as acceptor */ - log::verbose( - "RFCOMM_ConnectInd start timer for collision, initiator's " - "LCID(0x{:x}), acceptor's LCID(0x{:x})", - p_mcb->lcid, p_mcb->pending_lcid); - - rfc_timer_start(p_mcb, (uint16_t)(bluetooth::common::time_get_os_boottime_ms() % 10 + 2)); - return; - } else { - /* we cannot accept connection request from peer at this state */ - /* don't update lcid */ - p_mcb = nullptr; - } + if (p_mcb != nullptr && p_mcb->is_initiator && p_mcb->state == RFC_MX_STATE_WAIT_CONN_CNF) { + p_mcb->pending_lcid = lcid; + + /* wait random timeout (2 - 12) to resolve collision */ + /* if peer gives up then local device rejects incoming connection and + * continues as initiator */ + /* if timeout, local device disconnects outgoing connection and continues + * as acceptor */ + log::verbose( + "RFCOMM_ConnectInd start timer for collision, initiator's " + "LCID(0x{:x}), acceptor's LCID(0x{:x})", + p_mcb->lcid, p_mcb->pending_lcid); + + rfc_timer_start(p_mcb, (uint16_t)(bluetooth::common::time_get_os_boottime_ms() % 10 + 2)); + return; + } + if (p_mcb != nullptr && p_mcb->is_initiator && p_mcb->state != RFC_MX_STATE_IDLE) { + /* we cannot accept connection request from peer at this state */ + /* don't update lcid */ + p_mcb = nullptr; } else { /* store mcb even if null */ rfc_save_lcid_mcb(p_mcb, lcid); @@ -141,7 +139,7 @@ void RFCOMM_ConnectInd(const RawAddress& bd_addr, uint16_t lcid, uint16_t /* psm void RFCOMM_ConnectCnf(uint16_t lcid, tL2CAP_CONN result) { tRFC_MCB* p_mcb = rfc_find_lcid_mcb(lcid); - if (!p_mcb) { + if (p_mcb == nullptr) { log::error("RFCOMM_ConnectCnf LCID:0x{:x}", lcid); return; } @@ -188,7 +186,7 @@ void RFCOMM_ConfigInd(uint16_t lcid, tL2CAP_CFG_INFO* p_cfg) { tRFC_MCB* p_mcb = rfc_find_lcid_mcb(lcid); - if (!p_mcb) { + if (p_mcb == nullptr) { log::error("RFCOMM_ConfigInd LCID:0x{:x}", lcid); for (auto& [cid, mcb] : rfc_lcid_mcb) { if (mcb != nullptr && mcb->pending_lcid == lcid) { @@ -218,7 +216,7 @@ void RFCOMM_ConfigCnf(uint16_t lcid, uint16_t /* initiator */, tL2CAP_CFG_INFO* tRFC_MCB* p_mcb = rfc_find_lcid_mcb(lcid); - if (!p_mcb) { + if (p_mcb == nullptr) { log::error("RFCOMM_ConfigCnf no MCB LCID:0x{:x}", lcid); return; } @@ -237,7 +235,7 @@ void RFCOMM_ConfigCnf(uint16_t lcid, uint16_t /* initiator */, tL2CAP_CFG_INFO* void RFCOMM_DisconnectInd(uint16_t lcid, bool is_conf_needed) { log::verbose("lcid:0x{:x}, is_conf_needed:{}", lcid, is_conf_needed); tRFC_MCB* p_mcb = rfc_find_lcid_mcb(lcid); - if (!p_mcb) { + if (p_mcb == nullptr) { log::warn("no mcb for lcid 0x{:x}", lcid); return; } @@ -257,7 +255,7 @@ void RFCOMM_DisconnectInd(uint16_t lcid, bool is_conf_needed) { void RFCOMM_BufDataInd(uint16_t lcid, BT_HDR* p_buf) { tRFC_MCB* p_mcb = rfc_find_lcid_mcb(lcid); - if (!p_mcb) { + if (p_mcb == nullptr) { log::warn("Cannot find RFCOMM multiplexer for lcid 0x{:x}", lcid); osi_free(p_buf); return; @@ -351,7 +349,7 @@ void RFCOMM_BufDataInd(uint16_t lcid, BT_HDR* p_buf) { void RFCOMM_CongestionStatusInd(uint16_t lcid, bool is_congested) { tRFC_MCB* p_mcb = rfc_find_lcid_mcb(lcid); - if (!p_mcb) { + if (p_mcb == nullptr) { log::error("RFCOMM_CongestionStatusInd dropped LCID:0x{:x}", lcid); return; } else { diff --git a/system/stack/sdp/sdp_utils.cc b/system/stack/sdp/sdp_utils.cc index 2fb4f4622b..324f4dd06e 100644 --- a/system/stack/sdp/sdp_utils.cc +++ b/system/stack/sdp/sdp_utils.cc @@ -39,6 +39,7 @@ #include "device/include/interop.h" #include "internal_include/bt_target.h" #include "internal_include/bt_trace.h" +#include "main/shim/metrics_api.h" #include "osi/include/allocator.h" #include "osi/include/properties.h" #include "stack/include/avrc_api.h" @@ -50,7 +51,6 @@ #include "stack/include/btm_sec_api_types.h" #include "stack/include/l2cap_interface.h" #include "stack/include/sdpdefs.h" -#include "stack/include/stack_metrics_logging.h" #include "stack/sdp/internal/sdp_api.h" #include "stack/sdp/sdpint.h" #include "storage/config_keys.h" @@ -184,15 +184,15 @@ void sdpu_log_attribute_metrics(const RawAddress& bda, tSDP_DISCOVERY_DB* p_db) } // Log the existence of a profile role // This can be different from Bluetooth Profile Descriptor List - log_sdp_attribute(bda, service_uuid, 0, 0, nullptr); + bluetooth::shim::LogMetricSdpAttribute(bda, service_uuid, 0, 0, nullptr); // Log profile version from Bluetooth Profile Descriptor List auto uuid_version_array = sdpu_find_profile_version(p_rec); for (const auto& uuid_version_pair : uuid_version_array) { uint16_t profile_uuid = uuid_version_pair.first; uint16_t version = uuid_version_pair.second; auto version_array = to_little_endian_array(version); - log_sdp_attribute(bda, profile_uuid, ATTR_ID_BT_PROFILE_DESC_LIST, version_array.size(), - version_array.data()); + bluetooth::shim::LogMetricSdpAttribute(bda, profile_uuid, ATTR_ID_BT_PROFILE_DESC_LIST, + version_array.size(), version_array.data()); } // Log protocol version from Protocol Descriptor List uint16_t protocol_uuid = 0; @@ -217,8 +217,8 @@ void sdpu_log_attribute_metrics(const RawAddress& bda, tSDP_DISCOVERY_DB* p_db) if (protocol_elements.num_params >= 1) { uint16_t version = protocol_elements.params[0]; auto version_array = to_little_endian_array(version); - log_sdp_attribute(bda, protocol_uuid, ATTR_ID_PROTOCOL_DESC_LIST, version_array.size(), - version_array.data()); + bluetooth::shim::LogMetricSdpAttribute(bda, protocol_uuid, ATTR_ID_PROTOCOL_DESC_LIST, + version_array.size(), version_array.data()); } } } @@ -238,8 +238,8 @@ void sdpu_log_attribute_metrics(const RawAddress& bda, tSDP_DISCOVERY_DB* p_db) } uint16_t supported_features = p_attr->attr_value.v.u16; auto version_array = to_little_endian_array(supported_features); - log_sdp_attribute(bda, service_uuid, ATTR_ID_SUPPORTED_FEATURES, version_array.size(), - version_array.data()); + bluetooth::shim::LogMetricSdpAttribute(bda, service_uuid, ATTR_ID_SUPPORTED_FEATURES, + version_array.size(), version_array.data()); break; } case UUID_SERVCLASS_MESSAGE_NOTIFICATION: @@ -251,8 +251,8 @@ void sdpu_log_attribute_metrics(const RawAddress& bda, tSDP_DISCOVERY_DB* p_db) } uint32_t map_supported_features = p_attr->attr_value.v.u32; auto features_array = to_little_endian_array(map_supported_features); - log_sdp_attribute(bda, service_uuid, ATTR_ID_MAP_SUPPORTED_FEATURES, features_array.size(), - features_array.data()); + bluetooth::shim::LogMetricSdpAttribute(bda, service_uuid, ATTR_ID_MAP_SUPPORTED_FEATURES, + features_array.size(), features_array.data()); break; } case UUID_SERVCLASS_PBAP_PCE: @@ -264,8 +264,8 @@ void sdpu_log_attribute_metrics(const RawAddress& bda, tSDP_DISCOVERY_DB* p_db) } uint32_t pbap_supported_features = p_attr->attr_value.v.u32; auto features_array = to_little_endian_array(pbap_supported_features); - log_sdp_attribute(bda, service_uuid, ATTR_ID_PBAP_SUPPORTED_FEATURES, features_array.size(), - features_array.data()); + bluetooth::shim::LogMetricSdpAttribute(bda, service_uuid, ATTR_ID_PBAP_SUPPORTED_FEATURES, + features_array.size(), features_array.data()); break; } } @@ -278,15 +278,17 @@ void sdpu_log_attribute_metrics(const RawAddress& bda, tSDP_DISCOVERY_DB* p_db) tSDP_DI_GET_RECORD di_record = {}; if (SDP_GetDiRecord(1, &di_record, p_db) == tSDP_STATUS::SDP_SUCCESS) { auto version_array = to_little_endian_array(di_record.spec_id); - log_sdp_attribute(bda, UUID_SERVCLASS_PNP_INFORMATION, ATTR_ID_SPECIFICATION_ID, - version_array.size(), version_array.data()); + bluetooth::shim::LogMetricSdpAttribute(bda, UUID_SERVCLASS_PNP_INFORMATION, + ATTR_ID_SPECIFICATION_ID, version_array.size(), + version_array.data()); std::stringstream ss; // [N - native]::SDP::[DIP - Device ID Profile] ss << "N:SDP::DIP::" << loghex(di_record.rec.vendor_id_source); - log_manufacturer_info(bda, android::bluetooth::AddressTypeEnum::ADDRESS_TYPE_PUBLIC, - android::bluetooth::DeviceInfoSrcEnum::DEVICE_INFO_INTERNAL, ss.str(), - loghex(di_record.rec.vendor), loghex(di_record.rec.product), - loghex(di_record.rec.version), ""); + bluetooth::shim::LogMetricManufacturerInfo( + bda, android::bluetooth::AddressTypeEnum::ADDRESS_TYPE_PUBLIC, + android::bluetooth::DeviceInfoSrcEnum::DEVICE_INFO_INTERNAL, ss.str(), + loghex(di_record.rec.vendor), loghex(di_record.rec.product), + loghex(di_record.rec.version), ""); std::string bda_string = bda.ToString(); // write manufacturer, model, HW version to config diff --git a/system/stack/smp/smp_l2c.cc b/system/stack/smp/smp_l2c.cc index 219cb723f7..69591b10e5 100644 --- a/system/stack/smp/smp_l2c.cc +++ b/system/stack/smp/smp_l2c.cc @@ -263,13 +263,6 @@ static void smp_br_connect_callback(uint16_t /* channel */, const RawAddress& bd log::info("BDA:{} pairing_bda:{}, connected:{}", bd_addr, p_cb->pairing_bda, connected); if (bd_addr != p_cb->pairing_bda) { - if (!com::android::bluetooth::flags::smp_state_machine_stuck_after_disconnection_fix()) { - log::info( - "If your pairing failed, get a build with " - "smp_state_machine_stuck_after_disconnection_fix and try again :)"); - return; - } - tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr); /* When pairing was initiated to RPA, and connection was on LE transport first using RPA, then * we must check record pseudo address, it might be same device */ diff --git a/system/stack/smp/smp_utils.cc b/system/stack/smp/smp_utils.cc index e5aefe3c6a..9be3de7db1 100644 --- a/system/stack/smp/smp_utils.cc +++ b/system/stack/smp/smp_utils.cc @@ -35,6 +35,7 @@ #include "internal_include/stack_config.h" #include "main/shim/entry.h" #include "main/shim/helpers.h" +#include "main/shim/metrics_api.h" #include "metrics/bluetooth_event.h" #include "osi/include/allocator.h" #include "p_256_ecc_pp.h" @@ -51,7 +52,6 @@ #include "stack/include/l2cap_interface.h" #include "stack/include/l2cdefs.h" #include "stack/include/smp_status.h" -#include "stack/include/stack_metrics_logging.h" #include "types/raw_address.h" #define SMP_PAIRING_REQ_SIZE 7 @@ -320,7 +320,7 @@ void smp_log_metrics(const RawAddress& bd_addr, bool is_outgoing, const uint8_t* uint8_t failure_reason = 0; if (raw_cmd == SMP_OPCODE_PAIRING_FAILED && buf_len >= 1) { STREAM_TO_UINT8(failure_reason, p_buf); - log_le_pairing_fail(bd_addr, failure_reason, is_outgoing); + bluetooth::shim::LogMetricLePairingFail(bd_addr, failure_reason, is_outgoing); } if (smp_cb.is_pair_cancel) { failure_reason = SMP_USER_CANCELLED; // Tracking pairing cancellations @@ -330,7 +330,8 @@ void smp_log_metrics(const RawAddress& bd_addr, bool is_outgoing, const uint8_t* android::bluetooth::DirectionEnum direction = is_outgoing ? android::bluetooth::DirectionEnum::DIRECTION_OUTGOING : android::bluetooth::DirectionEnum::DIRECTION_INCOMING; - log_smp_pairing_event(bd_addr, metric_cmd, direction, static_cast<uint16_t>(failure_reason)); + bluetooth::shim::LogMetricSmpPairingEvent(bd_addr, metric_cmd, direction, + static_cast<uint16_t>(failure_reason)); } /******************************************************************************* @@ -1011,7 +1012,8 @@ void smp_proc_pairing_cmpl(tSMP_CB* p_cb) { if (metric_status > SMP_MAX_FAIL_RSN_PER_SPEC) { metric_status |= SMP_METRIC_STATUS_INTERNAL_FLAG; } - log_smp_pairing_event(p_cb->pairing_bda, metric_cmd, direction, metric_status); + bluetooth::shim::LogMetricSmpPairingEvent(p_cb->pairing_bda, metric_cmd, direction, + metric_status); } if (p_cb->status == SMP_SUCCESS && p_cb->smp_over_br) { diff --git a/system/stack/test/btm/stack_btm_power_mode_test.cc b/system/stack/test/btm/stack_btm_power_mode_test.cc index a3376d8649..ad7b27a71a 100644 --- a/system/stack/test/btm/stack_btm_power_mode_test.cc +++ b/system/stack/test/btm/stack_btm_power_mode_test.cc @@ -49,8 +49,10 @@ std::deque<power_mode_callback> power_mode_callback_queue; class StackBtmPowerMode : public testing::Test { protected: void SetUp() override { - ON_CALL(controller_, SupportsSniffMode).WillByDefault(Return(true)); - bluetooth::hci::testing::mock_controller_ = &controller_; + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); + ON_CALL(*bluetooth::hci::testing::mock_controller_, SupportsSniffMode) + .WillByDefault(Return(true)); power_mode_callback_queue.clear(); reset_mock_function_count_map(); ASSERT_EQ(tBTM_STATUS::BTM_SUCCESS, @@ -71,10 +73,9 @@ protected: BTM_PmRegister(BTM_PM_DEREG, &pm_id_, [](const RawAddress& /* p_bda */, tBTM_PM_STATUS /* status */, uint16_t /* value */, tHCI_STATUS /* hci_status */) {})); - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); } - bluetooth::hci::testing::MockControllerInterface controller_; uint8_t pm_id_{0}; }; diff --git a/system/stack/test/btm/stack_btm_sec_test.cc b/system/stack/test/btm/stack_btm_sec_test.cc index 58317afc29..62226e2750 100644 --- a/system/stack/test/btm/stack_btm_sec_test.cc +++ b/system/stack/test/btm/stack_btm_sec_test.cc @@ -69,7 +69,8 @@ protected: down_thread_ = new bluetooth::os::Thread("down_thread", bluetooth::os::Thread::Priority::NORMAL); down_handler_ = new bluetooth::os::Handler(down_thread_); - bluetooth::hci::testing::mock_hci_layer_ = &mock_hci_; + bluetooth::hci::testing::mock_hci_layer_ = + std::make_unique<bluetooth::hci::testing::MockHciLayer>(); bluetooth::hci::testing::mock_gd_shim_handler_ = up_handler_; } void TearDown() override { @@ -79,10 +80,10 @@ protected: down_handler_->Clear(); delete down_handler_; delete down_thread_; + bluetooth::hci::testing::mock_hci_layer_.reset(); StackBtmSecTest::TearDown(); } bluetooth::common::BidiQueue<bluetooth::hci::ScoView, bluetooth::hci::ScoBuilder> sco_queue_{10}; - bluetooth::hci::testing::MockHciLayer mock_hci_; bluetooth::os::Thread* up_thread_; bluetooth::os::Handler* up_handler_; bluetooth::os::Thread* down_thread_; diff --git a/system/stack/test/btm/stack_btm_test.cc b/system/stack/test/btm/stack_btm_test.cc index 7471d4faca..2341b21677 100644 --- a/system/stack/test/btm/stack_btm_test.cc +++ b/system/stack/test/btm/stack_btm_test.cc @@ -63,13 +63,13 @@ public: protected: void SetUp() override { BtmWithMocksTest::SetUp(); - bluetooth::hci::testing::mock_controller_ = &controller_; + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); } void TearDown() override { - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); BtmWithMocksTest::TearDown(); } - bluetooth::hci::testing::MockControllerInterface controller_; }; class StackBtmWithQueuesTest : public StackBtmTest { @@ -82,11 +82,12 @@ protected: down_thread_ = new bluetooth::os::Thread("down_thread", bluetooth::os::Thread::Priority::NORMAL); down_handler_ = new bluetooth::os::Handler(down_thread_); - bluetooth::hci::testing::mock_hci_layer_ = &mock_hci_; + bluetooth::hci::testing::mock_hci_layer_ = + std::make_unique<bluetooth::hci::testing::MockHciLayer>(); bluetooth::hci::testing::mock_gd_shim_handler_ = up_handler_; bluetooth::legacy::hci::testing::SetMock(legacy_hci_mock_); - EXPECT_CALL(mock_hci_, RegisterForScoConnectionRequests(_)); - EXPECT_CALL(mock_hci_, RegisterForDisconnects(_)); + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, RegisterForScoConnectionRequests(_)); + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, RegisterForDisconnects(_)); } void TearDown() override { up_handler_->Clear(); @@ -95,10 +96,10 @@ protected: down_handler_->Clear(); delete down_handler_; delete down_thread_; + bluetooth::hci::testing::mock_hci_layer_.release(); StackBtmTest::TearDown(); } bluetooth::common::BidiQueue<bluetooth::hci::ScoView, bluetooth::hci::ScoBuilder> sco_queue_{10}; - bluetooth::hci::testing::MockHciLayer mock_hci_; bluetooth::legacy::hci::testing::MockInterface legacy_hci_mock_; bluetooth::os::Thread* up_thread_; bluetooth::os::Handler* up_handler_; @@ -111,7 +112,8 @@ public: protected: void SetUp() override { StackBtmWithQueuesTest::SetUp(); - EXPECT_CALL(mock_hci_, GetScoQueueEnd()).WillOnce(Return(sco_queue_.GetUpEnd())); + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, GetScoQueueEnd()) + .WillOnce(Return(sco_queue_.GetUpEnd())); btm_cb.Init(); btm_sec_cb.Init(BTM_SEC_MODE_SC); } @@ -123,7 +125,8 @@ protected: }; TEST_F(StackBtmWithQueuesTest, GlobalLifecycle) { - EXPECT_CALL(mock_hci_, GetScoQueueEnd()).WillOnce(Return(sco_queue_.GetUpEnd())); + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, GetScoQueueEnd()) + .WillOnce(Return(sco_queue_.GetUpEnd())); get_btm_client_interface().lifecycle.btm_init(); get_btm_client_interface().lifecycle.btm_free(); } @@ -134,20 +137,23 @@ TEST_F(StackBtmTest, DynamicLifecycle) { } TEST_F(StackBtmWithQueuesTest, InitFree) { - EXPECT_CALL(mock_hci_, GetScoQueueEnd()).WillOnce(Return(sco_queue_.GetUpEnd())); + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, GetScoQueueEnd()) + .WillOnce(Return(sco_queue_.GetUpEnd())); btm_cb.Init(); btm_cb.Free(); } TEST_F(StackBtmWithQueuesTest, tSCO_CB) { - EXPECT_CALL(mock_hci_, GetScoQueueEnd()).WillOnce(Return(sco_queue_.GetUpEnd())); + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, GetScoQueueEnd()) + .WillOnce(Return(sco_queue_.GetUpEnd())); tSCO_CB* p_sco = &btm_cb.sco_cb; p_sco->Init(); p_sco->Free(); } TEST_F(StackBtmWithQueuesTest, InformClientOnConnectionSuccess) { - EXPECT_CALL(mock_hci_, GetScoQueueEnd()).WillOnce(Return(sco_queue_.GetUpEnd())); + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, GetScoQueueEnd()) + .WillOnce(Return(sco_queue_.GetUpEnd())); get_btm_client_interface().lifecycle.btm_init(); RawAddress bda({0x11, 0x22, 0x33, 0x44, 0x55, 0x66}); @@ -159,7 +165,8 @@ TEST_F(StackBtmWithQueuesTest, InformClientOnConnectionSuccess) { } TEST_F(StackBtmWithQueuesTest, NoInformClientOnConnectionFail) { - EXPECT_CALL(mock_hci_, GetScoQueueEnd()).WillOnce(Return(sco_queue_.GetUpEnd())); + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, GetScoQueueEnd()) + .WillOnce(Return(sco_queue_.GetUpEnd())); get_btm_client_interface().lifecycle.btm_init(); RawAddress bda({0x11, 0x22, 0x33, 0x44, 0x55, 0x66}); @@ -171,7 +178,8 @@ TEST_F(StackBtmWithQueuesTest, NoInformClientOnConnectionFail) { } TEST_F(StackBtmWithQueuesTest, default_packet_type) { - EXPECT_CALL(mock_hci_, GetScoQueueEnd()).WillOnce(Return(sco_queue_.GetUpEnd())); + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, GetScoQueueEnd()) + .WillOnce(Return(sco_queue_.GetUpEnd())); get_btm_client_interface().lifecycle.btm_init(); btm_cb.acl_cb_.SetDefaultPacketTypeMask(0x4321); @@ -181,7 +189,8 @@ TEST_F(StackBtmWithQueuesTest, default_packet_type) { } TEST_F(StackBtmWithQueuesTest, change_packet_type) { - EXPECT_CALL(mock_hci_, GetScoQueueEnd()).WillOnce(Return(sco_queue_.GetUpEnd())); + EXPECT_CALL(*bluetooth::hci::testing::mock_hci_layer_, GetScoQueueEnd()) + .WillOnce(Return(sco_queue_.GetUpEnd())); get_btm_client_interface().lifecycle.btm_init(); uint16_t handle = 0x123; diff --git a/system/stack/test/btm_iso_test.cc b/system/stack/test/btm_iso_test.cc index 40453f703d..b44f6fe094 100644 --- a/system/stack/test/btm_iso_test.cc +++ b/system/stack/test/btm_iso_test.cc @@ -134,7 +134,8 @@ protected: bluetooth::shim::SetMockIsoInterface(&iso_interface_); hcic::SetMockHcicInterface(&hcic_interface_); bluetooth::shim::testing::hci_layer_set_interface(&bluetooth::shim::interface); - bluetooth::hci::testing::mock_controller_ = &controller_; + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); big_callbacks_.reset(new MockBigCallbacks()); cig_callbacks_.reset(new MockCigCallbacks()); @@ -142,7 +143,8 @@ protected: iso_sizes_.total_num_le_packets_ = 6; iso_sizes_.le_data_packet_length_ = 1024; - ON_CALL(controller_, GetControllerIsoBufferSize()).WillByDefault(Return(iso_sizes_)); + ON_CALL(*bluetooth::hci::testing::mock_controller_, GetControllerIsoBufferSize()) + .WillByDefault(Return(iso_sizes_)); InitIsoManager(); } @@ -156,7 +158,7 @@ protected: bluetooth::shim::SetMockIsoInterface(nullptr); hcic::SetMockHcicInterface(nullptr); bluetooth::shim::testing::hci_layer_set_interface(nullptr); - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); } virtual void InitIsoManager() { @@ -312,7 +314,6 @@ protected: IsoManager* manager_instance_; bluetooth::shim::MockIsoInterface iso_interface_; hcic::MockHcicInterface hcic_interface_; - bluetooth::hci::testing::MockControllerInterface controller_; bluetooth::hci::LeBufferSize iso_sizes_; std::unique_ptr<MockBigCallbacks> big_callbacks_; @@ -2207,7 +2208,8 @@ TEST_F(IsoManagerTest, SendIsoDataBigValid) { } TEST_F(IsoManagerTest, SendIsoDataNoCredits) { - uint8_t num_buffers = controller_.GetControllerIsoBufferSize().total_num_le_packets_; + uint8_t num_buffers = bluetooth::hci::testing::mock_controller_->GetControllerIsoBufferSize() + .total_num_le_packets_; std::vector<uint8_t> data_vec(108, 0); // Check on CIG @@ -2254,7 +2256,8 @@ TEST_F(IsoManagerTest, SendIsoDataNoCredits) { } TEST_F(IsoManagerTest, SendIsoDataCreditsReturned) { - uint8_t num_buffers = controller_.GetControllerIsoBufferSize().total_num_le_packets_; + uint8_t num_buffers = bluetooth::hci::testing::mock_controller_->GetControllerIsoBufferSize() + .total_num_le_packets_; std::vector<uint8_t> data_vec(108, 0); // Check on CIG @@ -2323,7 +2326,8 @@ TEST_F(IsoManagerTest, SendIsoDataCreditsReturned) { } TEST_F(IsoManagerTest, SendIsoDataCreditsReturnedByDisconnection) { - uint8_t num_buffers = controller_.GetControllerIsoBufferSize().total_num_le_packets_; + uint8_t num_buffers = bluetooth::hci::testing::mock_controller_->GetControllerIsoBufferSize() + .total_num_le_packets_; std::vector<uint8_t> data_vec(108, 0); // Check on CIG @@ -2542,7 +2546,8 @@ TEST_F(IsoManagerDeathTestNoCleanup, HandleLateArivingEventHandleDisconnect) { * is already stopped. */ TEST_F(IsoManagerDeathTestNoCleanup, HandleLateArivingEventHandleNumComplDataPkts) { - uint8_t num_buffers = controller_.GetControllerIsoBufferSize().total_num_le_packets_; + uint8_t num_buffers = bluetooth::hci::testing::mock_controller_->GetControllerIsoBufferSize() + .total_num_le_packets_; IsoManager::GetInstance()->CreateCig(volatile_test_cig_create_cmpl_evt_.cig_id, kDefaultCigParams); diff --git a/system/stack/test/connection_manager_test.cc b/system/stack/test/connection_manager_test.cc index 1a06158ca0..db2908c76b 100644 --- a/system/stack/test/connection_manager_test.cc +++ b/system/stack/test/connection_manager_test.cc @@ -70,9 +70,10 @@ namespace connection_manager { class BleConnectionManager : public testing::Test { void SetUp() override { localConnTimeoutMock = std::make_unique<MockConnTimeout>(); - /* extern */ test::mock_acl_manager_ = new bluetooth::hci::testing::MockAclManager(); + /* extern */ test::mock_acl_manager_ = + std::make_unique<bluetooth::hci::testing::MockAclManager>(); /* extern */ test::mock_controller_ = - new testing::NiceMock<bluetooth::hci::testing::MockControllerInterface>(); + std::make_unique<testing::NiceMock<bluetooth::hci::testing::MockControllerInterface>>(); ON_CALL(*test::mock_controller_, GetLeFilterAcceptListSize()).WillByDefault(Return(16)); auto alarm_mock = AlarmMock::Get(); @@ -92,8 +93,8 @@ class BleConnectionManager : public testing::Test { void TearDown() override { connection_manager::reset(true); AlarmMock::Reset(); - delete test::mock_controller_; - delete test::mock_acl_manager_; + test::mock_controller_.reset(); + test::mock_acl_manager_.reset(); localConnTimeoutMock.reset(); } }; @@ -106,7 +107,7 @@ TEST_F(BleConnectionManager, test_background_connection_add_remove) { EXPECT_TRUE(background_connect_add(CLIENT1, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); std::set<tAPP_ID> apps = get_apps_connecting_to(address1); EXPECT_EQ(apps.size(), 1UL); @@ -119,7 +120,7 @@ TEST_F(BleConnectionManager, test_background_connection_add_remove) { EXPECT_EQ(get_apps_connecting_to(address1).size(), 0UL); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); } /** Verify that multiple clients adding same device multiple times, result in @@ -136,7 +137,7 @@ TEST_F(BleConnectionManager, test_background_connection_multiple_clients) { EXPECT_EQ(get_apps_connecting_to(address1).size(), 3UL); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); EXPECT_CALL(*test::mock_acl_manager_, CreateLeConnection(_, _)).Times(0); @@ -153,7 +154,7 @@ TEST_F(BleConnectionManager, test_background_connection_multiple_clients) { EXPECT_EQ(get_apps_connecting_to(address1).size(), 0UL); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); } /** Verify adding/removing device to direct connection. */ @@ -173,7 +174,7 @@ TEST_F(BleConnectionManager, test_direct_connection_client) { // Client that don't do direct connection should fail attempt to stop it EXPECT_FALSE(direct_connect_remove(CLIENT2, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); EXPECT_CALL(*test::mock_acl_manager_, CancelLeConnect(_)).Times(1); EXPECT_CALL(*AlarmMock::Get(), AlarmFree(_)).Times(1); @@ -183,7 +184,7 @@ TEST_F(BleConnectionManager, test_direct_connection_client) { // acceptlist is in use, i.e. next connection attempt EXPECT_TRUE(direct_connect_remove(CLIENT1, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); } /** Verify direct connection timeout does remove device from acceptlist, and @@ -201,7 +202,7 @@ TEST_F(BleConnectionManager, test_direct_connect_timeout) { // Start direct connect attempt... EXPECT_TRUE(direct_connect_add(CLIENT1, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); EXPECT_CALL(*test::mock_acl_manager_, CancelLeConnect(_)).Times(1); EXPECT_CALL(*localConnTimeoutMock, OnConnectionTimedOut(CLIENT1, address1)).Times(1); @@ -210,7 +211,7 @@ TEST_F(BleConnectionManager, test_direct_connect_timeout) { // simulate timeout seconds passed, alarm executing alarm_callback(alarm_data); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); } /** Verify that we properly handle successfull direct connection */ @@ -222,7 +223,7 @@ TEST_F(BleConnectionManager, test_direct_connection_success) { // Start direct connect attempt... EXPECT_TRUE(direct_connect_add(CLIENT1, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); EXPECT_CALL(*test::mock_acl_manager_, CancelLeConnect(address1_hci)).Times(1); EXPECT_CALL(*AlarmMock::Get(), AlarmFree(_)).Times(1); @@ -230,7 +231,7 @@ TEST_F(BleConnectionManager, test_direct_connection_success) { // successfully. on_connection_complete(address1); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); } /** Verify that we properly handle application unregistration */ @@ -244,23 +245,23 @@ TEST_F(BleConnectionManager, test_app_unregister) { EXPECT_CALL(*test::mock_acl_manager_, CreateLeConnection(address1_hci, true)).Times(1); EXPECT_TRUE(direct_connect_add(CLIENT1, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); EXPECT_CALL(*test::mock_acl_manager_, CreateLeConnection(address2_hci, false)).Times(1); EXPECT_TRUE(background_connect_add(CLIENT1, address2)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); EXPECT_CALL(*test::mock_acl_manager_, CreateLeConnection(address2_hci, true)).Times(1); EXPECT_TRUE(direct_connect_add(CLIENT2, address2)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); EXPECT_CALL(*test::mock_acl_manager_, CancelLeConnect(address1_hci)).Times(1); on_app_deregistered(CLIENT1); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); EXPECT_CALL(*test::mock_acl_manager_, CancelLeConnect(address2_hci)).Times(1); on_app_deregistered(CLIENT2); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); } /** Verify adding device to both direct connection and background connection. */ @@ -273,7 +274,7 @@ TEST_F(BleConnectionManager, test_direct_and_background_connect) { EXPECT_TRUE(direct_connect_add(CLIENT1, address1)); EXPECT_TRUE(background_connect_add(CLIENT1, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); EXPECT_CALL(*AlarmMock::Get(), AlarmFree(_)).Times(1); // not removing from acceptlist yet, as the background connection is still @@ -284,7 +285,7 @@ TEST_F(BleConnectionManager, test_direct_and_background_connect) { EXPECT_CALL(*test::mock_acl_manager_, CancelLeConnect(_)).Times(1); EXPECT_TRUE(background_connect_remove(CLIENT1, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); } TEST_F(BleConnectionManager, test_target_announement_connect) { @@ -302,7 +303,7 @@ TEST_F(BleConnectionManager, test_add_targeted_announement_when_allow_list_used) EXPECT_TRUE(background_connect_add(CLIENT1, address1)); EXPECT_TRUE(background_connect_targeted_announcement_add(CLIENT2, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); } TEST_F(BleConnectionManager, test_add_background_connect_when_targeted_announcement_are_enabled) { @@ -315,7 +316,7 @@ TEST_F(BleConnectionManager, test_add_background_connect_when_targeted_announcem EXPECT_TRUE(background_connect_targeted_announcement_add(CLIENT2, address1)); EXPECT_TRUE(background_connect_add(CLIENT1, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); } TEST_F(BleConnectionManager, test_re_add_background_connect_to_allow_list) { @@ -325,7 +326,7 @@ TEST_F(BleConnectionManager, test_re_add_background_connect_to_allow_list) { EXPECT_TRUE(background_connect_targeted_announcement_add(CLIENT2, address1)); EXPECT_TRUE(background_connect_add(CLIENT1, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); /* Now remove app using targeted announcement and expect device * to be added to white list @@ -335,11 +336,11 @@ TEST_F(BleConnectionManager, test_re_add_background_connect_to_allow_list) { EXPECT_CALL(*test::mock_acl_manager_, CreateLeConnection(address1_hci, false)).Times(1); EXPECT_TRUE(background_connect_remove(CLIENT2, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); EXPECT_CALL(*test::mock_acl_manager_, CancelLeConnect(_)).Times(1); EXPECT_TRUE(background_connect_remove(CLIENT1, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); } TEST_F(BleConnectionManager, test_re_add_to_allow_list_after_timeout_with_multiple_clients) { @@ -352,7 +353,7 @@ TEST_F(BleConnectionManager, test_re_add_to_allow_list_after_timeout_with_multip EXPECT_TRUE(background_connect_add(CLIENT1, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); EXPECT_CALL(*AlarmMock::Get(), AlarmSetOnMloop(_, _, _, _)) .Times(1) @@ -360,7 +361,7 @@ TEST_F(BleConnectionManager, test_re_add_to_allow_list_after_timeout_with_multip // Start direct connect attempt... EXPECT_TRUE(direct_connect_add(CLIENT2, address1)); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); // simulate timeout seconds passed, alarm executing EXPECT_CALL(*localConnTimeoutMock, OnConnectionTimedOut(CLIENT2, address1)).Times(1); @@ -369,7 +370,7 @@ TEST_F(BleConnectionManager, test_re_add_to_allow_list_after_timeout_with_multip EXPECT_CALL(*AlarmMock::Get(), AlarmFree(_)).Times(1); alarm_callback(alarm_data); - Mock::VerifyAndClearExpectations(test::mock_acl_manager_); + Mock::VerifyAndClearExpectations(test::mock_acl_manager_.get()); } } // namespace connection_manager diff --git a/system/stack/test/eatt/eatt_test.cc b/system/stack/test/eatt/eatt_test.cc index 130893a0a5..5d7a2eeea8 100644 --- a/system/stack/test/eatt/eatt_test.cc +++ b/system/stack/test/eatt/eatt_test.cc @@ -219,11 +219,13 @@ protected: le_buffer_size_.le_data_packet_length_ = 128; le_buffer_size_.total_num_le_packets_ = 24; - EXPECT_CALL(controller_, GetLeBufferSize).WillRepeatedly(Return(le_buffer_size_)); + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); + EXPECT_CALL(*bluetooth::hci::testing::mock_controller_, GetLeBufferSize) + .WillRepeatedly(Return(le_buffer_size_)); bluetooth::l2cap::SetMockInterface(&l2cap_interface_); bluetooth::manager::SetMockBtmApiInterface(&btm_api_interface_); bluetooth::gatt::SetMockGattInterface(&gatt_interface_); - bluetooth::hci::testing::mock_controller_ = &controller_; // Clear the static memory for each test case memset(&test_tcb, 0, sizeof(test_tcb)); @@ -258,7 +260,7 @@ protected: bluetooth::l2cap::SetMockInterface(nullptr); bluetooth::testing::stack::l2cap::reset_interface(); bluetooth::manager::SetMockBtmApiInterface(nullptr); - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); Test::TearDown(); } @@ -269,7 +271,6 @@ protected: bluetooth::l2cap::MockL2capInterface l2cap_interface_; bluetooth::testing::stack::l2cap::Mock mock_stack_l2cap_interface_; bluetooth::gatt::MockGattInterface gatt_interface_; - bluetooth::hci::testing::MockControllerInterface controller_; bluetooth::hci::LeBufferSize le_buffer_size_; tL2CAP_APPL_INFO l2cap_app_info_; diff --git a/system/stack/test/stack_acl_test.cc b/system/stack/test/stack_acl_test.cc index b08a45cb80..bd0b153b9f 100644 --- a/system/stack/test/stack_acl_test.cc +++ b/system/stack/test/stack_acl_test.cc @@ -48,12 +48,12 @@ class StackAclTest : public testing::Test { protected: void SetUp() override { reset_mock_function_count_map(); - bluetooth::hci::testing::mock_controller_ = &controller_; + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); } - void TearDown() override { bluetooth::hci::testing::mock_controller_ = nullptr; } + void TearDown() override { bluetooth::hci::testing::mock_controller_.reset(); } tBTM_SEC_DEV_REC device_record_; - bluetooth::hci::testing::MockControllerInterface controller_; }; TEST_F(StackAclTest, nop) {} diff --git a/system/stack/test/stack_l2cap_test.cc b/system/stack/test/stack_l2cap_test.cc index ffe78055bc..204900b462 100644 --- a/system/stack/test/stack_l2cap_test.cc +++ b/system/stack/test/stack_l2cap_test.cc @@ -49,23 +49,23 @@ constexpr uint16_t kAclBufferSizeBle = 45; class StackL2capTest : public ::testing::Test { protected: void SetUp() override { - bluetooth::hci::testing::mock_controller_ = &controller_interface_; - ON_CALL(controller_interface_, GetNumAclPacketBuffers) + bluetooth::hci::testing::mock_controller_ = + std::make_unique<bluetooth::hci::testing::MockControllerInterface>(); + ON_CALL(*bluetooth::hci::testing::mock_controller_, GetNumAclPacketBuffers) .WillByDefault(Return(kAclBufferCountClassic)); bluetooth::hci::LeBufferSize le_sizes; le_sizes.total_num_le_packets_ = kAclBufferCountBle; le_sizes.le_data_packet_length_ = kAclBufferSizeBle; - ON_CALL(controller_interface_, GetLeBufferSize).WillByDefault(Return(le_sizes)); - ON_CALL(controller_interface_, SupportsBle).WillByDefault(Return(true)); + ON_CALL(*bluetooth::hci::testing::mock_controller_, GetLeBufferSize) + .WillByDefault(Return(le_sizes)); + ON_CALL(*bluetooth::hci::testing::mock_controller_, SupportsBle).WillByDefault(Return(true)); l2c_init(); } void TearDown() override { l2c_free(); - bluetooth::hci::testing::mock_controller_ = nullptr; + bluetooth::hci::testing::mock_controller_.reset(); } - - bluetooth::hci::testing::MockControllerInterface controller_interface_; }; TEST_F(StackL2capTest, l2cble_process_data_length_change_event) { diff --git a/system/test/Android.bp b/system/test/Android.bp index c35931ea17..106dedb7bd 100644 --- a/system/test/Android.bp +++ b/system/test/Android.bp @@ -450,13 +450,6 @@ filegroup { } filegroup { - name: "TestMockStackMetrics", - srcs: [ - "mock/mock_stack_metrics*.cc", - ], -} - -filegroup { name: "TestMockStackGap", srcs: [ "mock/mock_stack_gap*.cc", diff --git a/system/test/README.md b/system/test/README.md deleted file mode 100644 index 1f43e952ef..0000000000 --- a/system/test/README.md +++ /dev/null @@ -1,81 +0,0 @@ -# Fluoride Bluetooth Tests - -This document refers to the tests in the packages/modules/Bluetooth/system/test directory. - -The tests are designed to be run when the Android runtime is not running. From a terminal, run: - -## Before you run tests -```sh -adb shell stop -``` - -## After you're done -```sh -adb shell start -``` - -## Running tests -Then see what options the test script provides: - -```sh -./run_unit_tests.sh --help -``` - -But for the impatient, run specific groups of tests like this: - -```sh -./run_unit_tests.sh net_test_bluetooth -``` - -a single test: - -```sh -./run_unit_tests.sh net_test_bluetooth.BluetoothTest.AdapterRepeatedEnableDisable -``` - -## Sample Output - -packages/modules/Bluetooth/system/test$ ./run_unit_tests.sh net_test_bluetooth ---- net_test_bluetooth --- -pushing... -/tbd/aosp-master/out/target/product/bullhead/data/nativetest/n...st_bluetooth: 1 file pushed. 9.2 MB/s (211832 bytes in 0.022s) -running... - -Running main() from gtest_main.cc -[==========] Running 11 tests from 2 test cases. -[----------] Global test environment set-up. -[----------] 6 tests from BluetoothTest -[ RUN ] BluetoothTest.AdapterEnableDisable -[ OK ] BluetoothTest.AdapterEnableDisable (2538 ms) -[ RUN ] BluetoothTest.AdapterRepeatedEnableDisable -[ OK ] BluetoothTest.AdapterRepeatedEnableDisable (11384 ms) -[ RUN ] BluetoothTest.AdapterSetGetName -[ OK ] BluetoothTest.AdapterSetGetName (2378 ms) -[ RUN ] BluetoothTest.AdapterStartDiscovery -[ OK ] BluetoothTest.AdapterStartDiscovery (2397 ms) -[ RUN ] BluetoothTest.AdapterCancelDiscovery -[ OK ] BluetoothTest.AdapterCancelDiscovery (2401 ms) -[ RUN ] BluetoothTest.AdapterDisableDuringBonding -[ OK ] BluetoothTest.AdapterDisableDuringBonding (11689 ms) -[----------] 6 tests from BluetoothTest (32789 ms total) - -[----------] 5 tests from GattTest -[ RUN ] GattTest.GattClientRegister -[ OK ] GattTest.GattClientRegister (2370 ms) -[ RUN ] GattTest.GattClientScanRemoteDevice -[ OK ] GattTest.GattClientScanRemoteDevice (2273 ms) -[ RUN ] GattTest.GattClientAdvertise -[ OK ] GattTest.GattClientAdvertise (2236 ms) -[ RUN ] GattTest.GattServerRegister -[ OK ] GattTest.GattServerRegister (2391 ms) -[ RUN ] GattTest.GattServerBuild -[ OK ] GattTest.GattServerBuild (2435 ms) -[----------] 5 tests from GattTest (11706 ms total) - -[----------] Global test environment tear-down -[==========] 11 tests from 2 test cases ran. (44495 ms total) -[ PASSED ] 11 tests. - -## Troubleshooting: Your phone is bricked! -Probably not. See [After you're done](#After-you're-done) - diff --git a/system/test/mock/mock_main_shim_entry.cc b/system/test/mock/mock_main_shim_entry.cc index 5d68f11b9d..3cdc714eaf 100644 --- a/system/test/mock/mock_main_shim_entry.cc +++ b/system/test/mock/mock_main_shim_entry.cc @@ -38,9 +38,9 @@ namespace bluetooth { namespace hci { namespace testing { -MockAclManager* mock_acl_manager_{nullptr}; -MockControllerInterface* mock_controller_{nullptr}; -HciInterface* mock_hci_layer_{nullptr}; +std::unique_ptr<MockAclManager> mock_acl_manager_; +std::unique_ptr<MockControllerInterface> mock_controller_; +std::unique_ptr<MockHciLayer> mock_hci_layer_; os::Handler* mock_gd_shim_handler_{nullptr}; MockLeAdvertisingManager* mock_le_advertising_manager_{nullptr}; MockLeScanningManager* mock_le_scanning_manager_{nullptr}; @@ -58,9 +58,9 @@ class Dumpsys; namespace shim { -hci::AclManager* GetAclManager() { return hci::testing::mock_acl_manager_; } -hci::ControllerInterface* GetController() { return hci::testing::mock_controller_; } -hci::HciInterface* GetHciLayer() { return hci::testing::mock_hci_layer_; } +hci::AclManager* GetAclManager() { return hci::testing::mock_acl_manager_.get(); } +hci::ControllerInterface* GetController() { return hci::testing::mock_controller_.get(); } +hci::HciInterface* GetHciLayer() { return hci::testing::mock_hci_layer_.get(); } hci::LeAdvertisingManager* GetAdvertising() { return hci::testing::mock_le_advertising_manager_; } hci::LeScanningManager* GetScanning() { return hci::testing::mock_le_scanning_manager_; } hci::DistanceMeasurementManager* GetDistanceMeasurementManager() { diff --git a/system/test/mock/mock_main_shim_entry.h b/system/test/mock/mock_main_shim_entry.h index ca84a27193..5d427fd963 100644 --- a/system/test/mock/mock_main_shim_entry.h +++ b/system/test/mock/mock_main_shim_entry.h @@ -15,11 +15,12 @@ */ #include <functional> +#include <memory> #include "hci/acl_manager_mock.h" #include "hci/controller_interface_mock.h" #include "hci/distance_measurement_manager_mock.h" -#include "hci/hci_interface.h" +#include "hci/hci_layer_mock.h" #include "hci/le_advertising_manager_mock.h" #include "hci/le_scanning_manager_mock.h" #include "storage/storage_module.h" @@ -28,9 +29,9 @@ namespace bluetooth { namespace hci { namespace testing { -extern MockAclManager* mock_acl_manager_; -extern MockControllerInterface* mock_controller_; -extern HciInterface* mock_hci_layer_; +extern std::unique_ptr<MockAclManager> mock_acl_manager_; +extern std::unique_ptr<MockControllerInterface> mock_controller_; +extern std::unique_ptr<MockHciLayer> mock_hci_layer_; extern os::Handler* mock_gd_shim_handler_; extern MockLeAdvertisingManager* mock_le_advertising_manager_; extern MockLeScanningManager* mock_le_scanning_manager_; diff --git a/system/test/mock/mock_main_shim_metrics_api.cc b/system/test/mock/mock_main_shim_metrics_api.cc index 0a501c7e6c..e635979ed8 100644 --- a/system/test/mock/mock_main_shim_metrics_api.cc +++ b/system/test/mock/mock_main_shim_metrics_api.cc @@ -184,12 +184,13 @@ void bluetooth::shim::LogMetricSdpAttribute(const RawAddress& raw_address, uint1 void bluetooth::shim::LogMetricSocketConnectionState( const RawAddress& raw_address, int port, int type, android::bluetooth::SocketConnectionstateEnum connection_state, int64_t tx_bytes, - int64_t rx_bytes, int uid, int server_port, - android::bluetooth::SocketRoleEnum socket_role) { + int64_t rx_bytes, int uid, int server_port, android::bluetooth::SocketRoleEnum socket_role, + uint64_t connection_duration_ms, android::bluetooth::SocketErrorEnum error_code, + bool is_hardware_offload) { inc_func_call_count(__func__); test::mock::main_shim_metrics_api::LogMetricSocketConnectionState( raw_address, port, type, connection_state, tx_bytes, rx_bytes, uid, server_port, - socket_role); + socket_role, connection_duration_ms, error_code, is_hardware_offload); } void bluetooth::shim::LogMetricManufacturerInfo( const RawAddress& raw_address, android::bluetooth::AddressTypeEnum address_type, diff --git a/system/test/mock/mock_main_shim_metrics_api.h b/system/test/mock/mock_main_shim_metrics_api.h index 887090d743..4beaab72c0 100644 --- a/system/test/mock/mock_main_shim_metrics_api.h +++ b/system/test/mock/mock_main_shim_metrics_api.h @@ -274,17 +274,23 @@ struct LogMetricSocketConnectionState { std::function<void(const RawAddress& raw_address, int port, int type, android::bluetooth::SocketConnectionstateEnum connection_state, int64_t tx_bytes, int64_t rx_bytes, int uid, int server_port, - android::bluetooth::SocketRoleEnum socket_role)> + android::bluetooth::SocketRoleEnum socket_role, + uint64_t connection_duration_ms, + android::bluetooth::SocketErrorEnum error_code, bool is_hardware_offload)> body{[](const RawAddress& /* raw_address */, int /* port */, int /* type */, android::bluetooth::SocketConnectionstateEnum /* connection_state */, int64_t /* tx_bytes */, int64_t /* rx_bytes */, int /* uid */, - int /* server_port */, android::bluetooth::SocketRoleEnum /* socket_role */) {}}; + int /* server_port */, android::bluetooth::SocketRoleEnum /* socket_role */, + uint64_t /* connection_duration_ms */, + android::bluetooth::SocketErrorEnum /* error_code */, + bool /* is_hardware_offload */) {}}; void operator()(const RawAddress& raw_address, int port, int type, android::bluetooth::SocketConnectionstateEnum connection_state, int64_t tx_bytes, int64_t rx_bytes, int uid, int server_port, - android::bluetooth::SocketRoleEnum socket_role) { + android::bluetooth::SocketRoleEnum socket_role, uint64_t connection_duration_ms, + android::bluetooth::SocketErrorEnum error_code, bool is_hardware_offload) { body(raw_address, port, type, connection_state, tx_bytes, rx_bytes, uid, server_port, - socket_role); + socket_role, connection_duration_ms, error_code, is_hardware_offload); } }; extern struct LogMetricSocketConnectionState LogMetricSocketConnectionState; diff --git a/system/test/mock/mock_stack_metrics_logging.cc b/system/test/mock/mock_stack_metrics_logging.cc deleted file mode 100644 index ff2cee4472..0000000000 --- a/system/test/mock/mock_stack_metrics_logging.cc +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Generated mock file from original source file - * Functions generated:5 - * - * mockcify.pl ver 0.2 - */ -// Mock include file to share data between tests and mock -#include "test/mock/mock_stack_metrics_logging.h" - -#include <string> - -// Original included files, if any -#include <frameworks/proto_logging/stats/enums/bluetooth/enums.pb.h> -#include <frameworks/proto_logging/stats/enums/bluetooth/hci/enums.pb.h> - -#include "stack/include/stack_metrics_logging.h" -#include "test/common/mock_functions.h" -#include "types/raw_address.h" - -// Mocked compile conditionals, if any -// Mocked internal structures, if any - -namespace test { -namespace mock { -namespace stack_metrics_logging { - -// Function state capture and return values, if needed -struct log_classic_pairing_event log_classic_pairing_event; -struct log_link_layer_connection_event log_link_layer_connection_event; -struct log_smp_pairing_event log_smp_pairing_event; -struct log_le_pairing_fail log_le_pairing_fail; -struct log_sdp_attribute log_sdp_attribute; -struct log_manufacturer_info log_manufacturer_info; -struct log_counter_metrics log_counter_metrics; -struct log_hfp_audio_packet_loss_stats log_hfp_audio_packet_loss_stats; -struct log_mmc_transcode_rtt_stats log_mmc_transcode_rtt_stats; -struct log_le_connection_status log_le_connection_status; -struct log_le_device_in_accept_list log_le_device_in_accept_list; -struct log_le_connection_lifecycle log_le_connection_lifecycle; -struct log_le_connection_completion log_le_connection_completion; - -} // namespace stack_metrics_logging -} // namespace mock -} // namespace test - -// Mocked functions, if any -void log_classic_pairing_event(const RawAddress& address, uint16_t handle, uint32_t hci_cmd, - uint16_t hci_event, uint16_t cmd_status, uint16_t reason_code, - int64_t event_value) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_classic_pairing_event( - address, handle, hci_cmd, hci_event, cmd_status, reason_code, event_value); -} -void log_link_layer_connection_event(const RawAddress* address, uint32_t connection_handle, - android::bluetooth::DirectionEnum direction, - uint16_t link_type, uint32_t hci_cmd, uint16_t hci_event, - uint16_t hci_ble_event, uint16_t cmd_status, - uint16_t reason_code) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_link_layer_connection_event( - address, connection_handle, direction, link_type, hci_cmd, hci_event, hci_ble_event, - cmd_status, reason_code); -} -void log_smp_pairing_event(const RawAddress& address, uint16_t smp_cmd, - android::bluetooth::DirectionEnum direction, uint16_t smp_fail_reason) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_smp_pairing_event(address, smp_cmd, direction, - smp_fail_reason); -} - -void log_le_pairing_fail(const RawAddress& raw_address, uint8_t failure_reason, bool is_outgoing) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_le_pairing_fail(raw_address, failure_reason, is_outgoing); -} - -void log_sdp_attribute(const RawAddress& address, uint16_t protocol_uuid, uint16_t attribute_id, - size_t attribute_size, const char* attribute_value) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_sdp_attribute(address, protocol_uuid, attribute_id, - attribute_size, attribute_value); -} -void log_manufacturer_info(const RawAddress& address, - android::bluetooth::AddressTypeEnum address_type, - android::bluetooth::DeviceInfoSrcEnum source_type, - const std::string& source_name, const std::string& manufacturer, - const std::string& model, const std::string& hardware_version, - const std::string& software_version) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_manufacturer_info(address, address_type, source_type, - source_name, manufacturer, model, - hardware_version, software_version); -} - -void log_counter_metrics(android::bluetooth::CodePathCounterKeyEnum key, int64_t value) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_counter_metrics(key, value); -} - -void log_hfp_audio_packet_loss_stats(const RawAddress& address, int num_decoded_frames, - double packet_loss_ratio, uint16_t codec_type) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_hfp_audio_packet_loss_stats(address, num_decoded_frames, - packet_loss_ratio, codec_type); -} - -void log_mmc_transcode_rtt_stats(int maximum_rtt, double mean_rtt, int num_requests, - int codec_type) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_mmc_transcode_rtt_stats(maximum_rtt, mean_rtt, - num_requests, codec_type); -} - -void log_le_connection_status(bluetooth::hci::Address address, bool is_connect, - bluetooth::hci::ErrorCode reason) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_le_connection_status(address, is_connect, reason); -} - -void log_le_device_in_accept_list(bluetooth::hci::Address address, bool is_add) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_le_device_in_accept_list(address, is_add); -} - -void log_le_connection_lifecycle(bluetooth::hci::Address address, bool is_connect, bool is_direct) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_le_connection_lifecycle(address, is_connect, is_direct); -} - -void log_le_connection_completion(bluetooth::hci::Address address, bluetooth::hci::ErrorCode reason, - bool is_locally_initiated) { - inc_func_call_count(__func__); - test::mock::stack_metrics_logging::log_le_connection_completion(address, reason, - is_locally_initiated); -} -// END mockcify generation diff --git a/system/test/mock/mock_stack_metrics_logging.h b/system/test/mock/mock_stack_metrics_logging.h deleted file mode 100644 index 40212e60ea..0000000000 --- a/system/test/mock/mock_stack_metrics_logging.h +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Generated mock file from original source file - * Functions generated:5 - * - * mockcify.pl ver 0.2 - */ - -#include <string> - -// Original included files, if any -#include <frameworks/proto_logging/stats/enums/bluetooth/enums.pb.h> -#include <frameworks/proto_logging/stats/enums/bluetooth/hci/enums.pb.h> - -#include "hci/address.h" -#include "hci/hci_packets.h" -#include "types/raw_address.h" - -// Mocked compile conditionals, if any - -namespace test { -namespace mock { -namespace stack_metrics_logging { - -// Shared state between mocked functions and tests -// Name: log_classic_pairing_event -// Params: const RawAddress& address, uint16_t handle, uint32_t hci_cmd, -// uint16_t hci_event, uint16_t cmd_status, uint16_t reason_code, int64_t -// event_value Returns: void -struct log_classic_pairing_event { - std::function<void(const RawAddress& address, uint16_t handle, uint32_t hci_cmd, - uint16_t hci_event, uint16_t cmd_status, uint16_t reason_code, - int64_t event_value)> - body{[](const RawAddress& /* address */, uint16_t /* handle */, uint32_t /* hci_cmd */, - uint16_t /* hci_event */, uint16_t /* cmd_status */, uint16_t /* reason_code */, - int64_t /* event_value */) {}}; - void operator()(const RawAddress& address, uint16_t handle, uint32_t hci_cmd, uint16_t hci_event, - uint16_t cmd_status, uint16_t reason_code, int64_t event_value) { - body(address, handle, hci_cmd, hci_event, cmd_status, reason_code, event_value); - } -}; -extern struct log_classic_pairing_event log_classic_pairing_event; -// Name: log_link_layer_connection_event -// Params: const RawAddress* address, uint32_t connection_handle, -// android::bluetooth::DirectionEnum direction, uint16_t link_type, uint32_t -// hci_cmd, uint16_t hci_event, uint16_t hci_ble_event, uint16_t cmd_status, -// uint16_t reason_code Returns: void -struct log_link_layer_connection_event { - std::function<void(const RawAddress* address, uint32_t connection_handle, - android::bluetooth::DirectionEnum direction, uint16_t link_type, - uint32_t hci_cmd, uint16_t hci_event, uint16_t hci_ble_event, - uint16_t cmd_status, uint16_t reason_code)> - body{[](const RawAddress* /* address */, uint32_t /* connection_handle */, - android::bluetooth::DirectionEnum /* direction */, uint16_t /* link_type */, - uint32_t /* hci_cmd */, uint16_t /* hci_event */, uint16_t /* hci_ble_event */, - uint16_t /* cmd_status */, uint16_t /* reason_code */) {}}; - void operator()(const RawAddress* address, uint32_t connection_handle, - android::bluetooth::DirectionEnum direction, uint16_t link_type, uint32_t hci_cmd, - uint16_t hci_event, uint16_t hci_ble_event, uint16_t cmd_status, - uint16_t reason_code) { - body(address, connection_handle, direction, link_type, hci_cmd, hci_event, hci_ble_event, - cmd_status, reason_code); - } -}; -extern struct log_link_layer_connection_event log_link_layer_connection_event; -// Name: log_smp_pairing_event -// Params: const RawAddress& address, uint16_t smp_cmd, -// android::bluetooth::DirectionEnum direction, uint8_t smp_fail_reason Returns: -// void -struct log_smp_pairing_event { - std::function<void(const RawAddress& address, uint16_t smp_cmd, - android::bluetooth::DirectionEnum direction, uint16_t smp_fail_reason)> - body{[](const RawAddress& /* address */, uint16_t /* smp_cmd */, - android::bluetooth::DirectionEnum /* direction */, - uint16_t /* smp_fail_reason */) {}}; - void operator()(const RawAddress& address, uint16_t smp_cmd, - android::bluetooth::DirectionEnum direction, uint16_t smp_fail_reason) { - body(address, smp_cmd, direction, smp_fail_reason); - } -}; -extern struct log_smp_pairing_event log_smp_pairing_event; - -// Name: log_le_pairing_fail -// Params: const RawAddress& raw_address, uint8_t failure_reason, bool -// is_outgoing Returns: -// void -// Name: log_sdp_attribute -// Params: const RawAddress& address, uint16_t protocol_uuid, uint16_t -// attribute_id, size_t attribute_size, const char* attribute_value Returns: -// void -struct log_le_pairing_fail { - std::function<void(const RawAddress& raw_address, uint8_t failure_reason, bool is_outgoing)> body{ - [](const RawAddress& /* address */, uint8_t /* failure reason */, - bool /* is_outgoing */) {}}; - void operator()(const RawAddress& raw_address, uint8_t failure_reason, bool is_outgoing) { - body(raw_address, failure_reason, is_outgoing); - } -}; -extern struct log_le_pairing_fail log_le_pairing_fail; - -struct log_sdp_attribute { - std::function<void(const RawAddress& address, uint16_t protocol_uuid, uint16_t attribute_id, - size_t attribute_size, const char* attribute_value)> - body{[](const RawAddress& /* address */, uint16_t /* protocol_uuid */, - uint16_t /* attribute_id */, size_t /* attribute_size */, - const char* /* attribute_value */) {}}; - void operator()(const RawAddress& address, uint16_t protocol_uuid, uint16_t attribute_id, - size_t attribute_size, const char* attribute_value) { - body(address, protocol_uuid, attribute_id, attribute_size, attribute_value); - } -}; -extern struct log_sdp_attribute log_sdp_attribute; -// Name: log_manufacturer_info -// Params: const RawAddress& address, android::bluetooth::DeviceInfoSrcEnum -// source_type, const std::string& source_name, const std::string& manufacturer, -// const std::string& model, const std::string& hardware_version, const -// std::string& software_version Returns: void -struct log_manufacturer_info { - std::function<void(const RawAddress& address, android::bluetooth::AddressTypeEnum address_type, - android::bluetooth::DeviceInfoSrcEnum source_type, - const std::string& source_name, const std::string& manufacturer, - const std::string& model, const std::string& hardware_version, - const std::string& software_version)> - body2{[](const RawAddress& /* address */, - android::bluetooth::AddressTypeEnum /* address_type */, - android::bluetooth::DeviceInfoSrcEnum /* source_type */, - const std::string& /* source_name */, const std::string& /* manufacturer */, - const std::string& /* model */, const std::string& /* hardware_version */, - const std::string& /* software_version */) {}}; - void operator()(const RawAddress& address, android::bluetooth::AddressTypeEnum address_type, - android::bluetooth::DeviceInfoSrcEnum source_type, const std::string& source_name, - const std::string& manufacturer, const std::string& model, - const std::string& hardware_version, const std::string& software_version) { - body2(address, address_type, source_type, source_name, manufacturer, model, hardware_version, - software_version); - } - std::function<void(const RawAddress& address, android::bluetooth::DeviceInfoSrcEnum source_type, - const std::string& source_name, const std::string& manufacturer, - const std::string& model, const std::string& hardware_version, - const std::string& software_version)> - body{[](const RawAddress& /* address */, - android::bluetooth::DeviceInfoSrcEnum /* source_type */, - const std::string& /* source_name */, const std::string& /* manufacturer */, - const std::string& /* model */, const std::string& /* hardware_version */, - const std::string& /* software_version */) {}}; - void operator()(const RawAddress& address, android::bluetooth::DeviceInfoSrcEnum source_type, - const std::string& source_name, const std::string& manufacturer, - const std::string& model, const std::string& hardware_version, - const std::string& software_version) { - body(address, source_type, source_name, manufacturer, model, hardware_version, - software_version); - } -}; -extern struct log_manufacturer_info log_manufacturer_info; - -// Name: log_counter_metrics -struct log_counter_metrics { - std::function<void(android::bluetooth::CodePathCounterKeyEnum key, int64_t value)> body{ - [](android::bluetooth::CodePathCounterKeyEnum /* key */, int64_t /* value */) {}}; - void operator()(android::bluetooth::CodePathCounterKeyEnum key, int64_t value) { - body(key, value); - } -}; -extern struct log_counter_metrics log_counter_metrics; - -// Name: log_hfp_audio_packet_loss_stats -struct log_hfp_audio_packet_loss_stats { - std::function<void(const RawAddress& address, int num_decoded_frames, double packet_loss_ratio, - uint16_t codec_type)> - body{[](const RawAddress& /* address */, int /* num_decoded_frames */, - double /* packet_loss_ratio */, uint16_t /* codec_type */) {}}; - void operator()(const RawAddress& address, int num_decoded_frames, double packet_loss_ratio, - uint16_t codec_type) { - body(address, num_decoded_frames, packet_loss_ratio, codec_type); - } -}; -extern struct log_hfp_audio_packet_loss_stats log_hfp_audio_packet_loss_stats; - -// Name: log_mmc_transcode_rtt_stats -struct log_mmc_transcode_rtt_stats { - std::function<void(int maximum_rtt, double mean_rtt, int num_requests, int codec_type)> body{ - [](int /* maximum_rtt */, double /* mean_rtt */, int /* num_requests */, - int /* codec_type */) {}}; - void operator()(int maximum_rtt, double mean_rtt, int num_requests, int codec_type) { - body(maximum_rtt, mean_rtt, num_requests, codec_type); - } -}; -extern struct log_mmc_transcode_rtt_stats log_mmc_transcode_rtt_stats; - -// Name: log_le_connection_status -struct log_le_connection_status { - std::function<void(bluetooth::hci::Address address, bool is_connect, - bluetooth::hci::ErrorCode reason)> - body{[](bluetooth::hci::Address /* address */, bool /* is_connect */, - bluetooth::hci::ErrorCode /* reason */) {}}; - void operator()(bluetooth::hci::Address address, bool is_connect, - bluetooth::hci::ErrorCode reason) { - body(address, is_connect, reason); - } -}; -extern struct log_le_connection_status log_le_connection_status; - -// Name: log_le_device_in_accept_list -struct log_le_device_in_accept_list { - std::function<void(bluetooth::hci::Address address, bool is_add)> body{ - [](bluetooth::hci::Address /* address */, bool /* is_add */) {}}; - void operator()(bluetooth::hci::Address address, bool is_add) { body(address, is_add); } -}; -extern struct log_le_device_in_accept_list log_le_device_in_accept_list; - -// Name: log_le_connection_lifecycle -struct log_le_connection_lifecycle { - std::function<void(bluetooth::hci::Address address, bool is_connect, bool is_direct)> body{ - [](bluetooth::hci::Address /* address */, bool /* is_connect */, bool /* is_direct */) { - }}; - void operator()(bluetooth::hci::Address address, bool is_connect, bool is_direct) { - body(address, is_connect, is_direct); - } -}; -extern struct log_le_device_in_accept_list log_le_device_in_accept_list; - -// Name: log_le_connection_completion -struct log_le_connection_completion { - std::function<void(bluetooth::hci::Address address, bluetooth::hci::ErrorCode reason, - bool is_locally_initiated)> - body{[](bluetooth::hci::Address /* address */, bluetooth::hci::ErrorCode /* reason */, - bool /* is locally initiated */) {}}; - void operator()(bluetooth::hci::Address address, bluetooth::hci::ErrorCode reason, - bool is_locally_initiated) { - body(address, reason, is_locally_initiated); - } -}; -extern struct log_le_connection_completion log_le_connection_completion; - -} // namespace stack_metrics_logging -} // namespace mock -} // namespace test - -// END mockcify generation |