summaryrefslogtreecommitdiff
path: root/system
diff options
context:
space:
mode:
Diffstat (limited to 'system')
-rw-r--r--system/BUILD.gn1
-rw-r--r--system/audio_hal_interface/aidl/le_audio_software_aidl.cc26
-rw-r--r--system/bta/Android.bp4
-rw-r--r--system/bta/BUILD.gn1
-rw-r--r--system/bta/gatt/bta_gattc_utils.cc2
-rw-r--r--system/bta/le_audio/broadcaster/broadcaster_test.cc9
-rw-r--r--system/bta/le_audio/codec_manager.cc10
-rw-r--r--system/bta/le_audio/codec_manager_test.cc26
-rw-r--r--system/bta/le_audio/devices_test.cc7
-rw-r--r--system/bta/le_audio/le_audio_client_test.cc13
-rw-r--r--system/bta/le_audio/state_machine_test.cc7
-rw-r--r--system/bta/test/bta_ag_sco_test.cc6
-rw-r--r--system/bta/test/bta_ag_test.cc6
-rw-r--r--system/bta/test/bta_dm_test.cc11
-rw-r--r--system/bta/test/bta_sdp_test.cc11
-rw-r--r--system/bta/test/bta_test_fixtures.h6
-rw-r--r--system/btif/Android.bp1
-rw-r--r--system/btif/BUILD.gn1
-rw-r--r--system/btif/include/btif_metrics_logging.h69
-rw-r--r--system/btif/include/btif_sock_logging.h4
-rw-r--r--system/btif/src/bluetooth.cc4
-rw-r--r--system/btif/src/btif_a2dp_source.cc127
-rw-r--r--system/btif/src/btif_av.cc41
-rw-r--r--system/btif/src/btif_config.cc15
-rw-r--r--system/btif/src/btif_dm.cc19
-rw-r--r--system/btif/src/btif_hf.cc23
-rw-r--r--system/btif/src/btif_hh.cc26
-rw-r--r--system/btif/src/btif_metrics_logging.cc107
-rw-r--r--system/btif/src/btif_sock.cc15
-rw-r--r--system/btif/src/btif_sock_l2cap.cc118
-rw-r--r--system/btif/src/btif_sock_logging.cc68
-rw-r--r--system/btif/src/btif_sock_rfc.cc99
-rw-r--r--system/btif/test/btif_core_test.cc27
-rw-r--r--system/common/Android.bp2
-rw-r--r--system/common/BUILD.gn1
-rw-r--r--system/common/id_generator.h48
-rw-r--r--system/common/id_generator_unittest.cc37
-rw-r--r--system/common/lru.h187
-rw-r--r--system/common/lru_unittest.cc250
-rw-r--r--system/common/metrics.cc333
-rw-r--r--system/common/metrics.h202
-rw-r--r--system/common/metrics_linux.cc65
-rw-r--r--system/conf/interop_database.conf5
-rw-r--r--system/device/include/interop.h10
-rw-r--r--system/device/src/interop.cc1
-rw-r--r--system/gd/Android.bp8
-rw-r--r--system/gd/AndroidTestTemplate.xml2
-rw-r--r--system/gd/benchmark.cc2
-rw-r--r--system/gd/common/audit_log.cc2
-rw-r--r--system/gd/common/audit_log.h2
-rw-r--r--system/gd/common/bidi_queue.h2
-rw-r--r--system/gd/common/bidi_queue_unittest.cc2
-rw-r--r--system/gd/common/bind.h2
-rw-r--r--system/gd/common/blocking_queue.h2
-rw-r--r--system/gd/common/blocking_queue_unittest.cc2
-rw-r--r--system/gd/common/byte_array.h2
-rw-r--r--system/gd/common/byte_array_test.cc2
-rw-r--r--system/gd/common/callback.h2
-rw-r--r--system/gd/common/circular_buffer.h2
-rw-r--r--system/gd/common/circular_buffer_test.cc2
-rw-r--r--system/gd/common/contextual_callback.h2
-rw-r--r--system/gd/common/i_postable_context.h2
-rw-r--r--system/gd/common/list_map.h2
-rw-r--r--system/gd/common/list_map_test.cc2
-rw-r--r--system/gd/common/lru_cache.h2
-rw-r--r--system/gd/common/lru_cache_test.cc2
-rw-r--r--system/gd/common/multi_priority_queue.h2
-rw-r--r--system/gd/common/multi_priority_queue_test.cc2
-rw-r--r--system/gd/common/numbers.h2
-rw-r--r--system/gd/common/numbers_test.cc2
-rw-r--r--system/gd/common/postable_context.h2
-rw-r--r--system/gd/common/stop_watch.cc2
-rw-r--r--system/gd/common/stop_watch.h2
-rw-r--r--system/gd/common/strings.cc2
-rw-r--r--system/gd/common/strings.h2
-rw-r--r--system/gd/common/strings_test.cc2
-rw-r--r--system/gd/common/sync_map_count.h2
-rw-r--r--system/gd/common/sync_map_count_test.cc2
-rw-r--r--system/gd/common/testing/bind_test_util.h2
-rw-r--r--system/gd/common/testing/wired_pair_of_bidi_queues.h2
-rw-r--r--system/gd/common/type_helper.h2
-rw-r--r--system/gd/crypto_toolbox/crypto_toolbox_test.cc2
-rw-r--r--system/gd/fuzz/helpers.cc2
-rw-r--r--system/gd/fuzz/helpers.h2
-rw-r--r--system/gd/fuzz_test.cc2
-rw-r--r--system/gd/hal/fuzz/fuzz_hci_hal.cc2
-rw-r--r--system/gd/hal/fuzz/fuzz_hci_hal.h2
-rw-r--r--system/gd/hal/hci_backend.h2
-rw-r--r--system/gd/hal/hci_backend_aidl.cc2
-rw-r--r--system/gd/hal/hci_backend_hidl.cc2
-rw-r--r--system/gd/hal/hci_hal.h9
-rw-r--r--system/gd/hal/hci_hal_android.cc2
-rw-r--r--system/gd/hal/hci_hal_android_test.cc10
-rw-r--r--system/gd/hal/hci_hal_fake.cc2
-rw-r--r--system/gd/hal/hci_hal_fake.h2
-rw-r--r--system/gd/hal/hci_hal_host.cc38
-rw-r--r--system/gd/hal/hci_hal_host.h2
-rw-r--r--system/gd/hal/hci_hal_host_rootcanal.cc2
-rw-r--r--system/gd/hal/hci_hal_host_test.cc10
-rw-r--r--system/gd/hal/link_clocker.cc2
-rw-r--r--system/gd/hal/link_clocker.h2
-rw-r--r--system/gd/hal/ranging_hal.h2
-rw-r--r--system/gd/hal/ranging_hal_android.cc2
-rw-r--r--system/gd/hal/ranging_hal_host.cc2
-rw-r--r--system/gd/hal/ranging_hal_mock.h2
-rw-r--r--system/gd/hal/serialize_packet.h2
-rw-r--r--system/gd/hal/snoop_logger.cc2
-rw-r--r--system/gd/hal/snoop_logger.h2
-rw-r--r--system/gd/hal/snoop_logger_socket_test.cc2
-rw-r--r--system/gd/hal/snoop_logger_socket_thread_test.cc2
-rw-r--r--system/gd/hal/snoop_logger_test.cc2
-rw-r--r--system/gd/hal/snoop_logger_tracing.cc2
-rw-r--r--system/gd/hal/snoop_logger_tracing.h2
-rw-r--r--system/gd/hal/socket_hal.h2
-rw-r--r--system/gd/hal/socket_hal_android.cc2
-rw-r--r--system/gd/hal/socket_hal_host.cc2
-rw-r--r--system/gd/hci/acl_builder_test.cc2
-rw-r--r--system/gd/hci/acl_connection_interface.h2
-rw-r--r--system/gd/hci/acl_manager.cc7
-rw-r--r--system/gd/hci/acl_manager.h3
-rw-r--r--system/gd/hci/acl_manager/acl_connection.cc2
-rw-r--r--system/gd/hci/acl_manager/acl_connection.h2
-rw-r--r--system/gd/hci/acl_manager/acl_fragmenter.cc2
-rw-r--r--system/gd/hci/acl_manager/acl_fragmenter.h2
-rw-r--r--system/gd/hci/acl_manager/acl_scheduler.cc2
-rw-r--r--system/gd/hci/acl_manager/acl_scheduler.h2
-rw-r--r--system/gd/hci/acl_manager/acl_scheduler_test.cc2
-rw-r--r--system/gd/hci/acl_manager/assembler.h2
-rw-r--r--system/gd/hci/acl_manager/classic_acl_connection.cc2
-rw-r--r--system/gd/hci/acl_manager/classic_acl_connection.h2
-rw-r--r--system/gd/hci/acl_manager/classic_acl_connection_test.cc2
-rw-r--r--system/gd/hci/acl_manager/classic_impl.h2
-rw-r--r--system/gd/hci/acl_manager/classic_impl_test.cc2
-rw-r--r--system/gd/hci/acl_manager/connection_callbacks.h2
-rw-r--r--system/gd/hci/acl_manager/connection_callbacks_mock.h2
-rw-r--r--system/gd/hci/acl_manager/connection_management_callbacks.h2
-rw-r--r--system/gd/hci/acl_manager/connection_management_callbacks_mock.h2
-rw-r--r--system/gd/hci/acl_manager/le_acceptlist_callbacks.h2
-rw-r--r--system/gd/hci/acl_manager/le_acl_connection.cc2
-rw-r--r--system/gd/hci/acl_manager/le_acl_connection.h2
-rw-r--r--system/gd/hci/acl_manager/le_acl_connection_test.cc2
-rw-r--r--system/gd/hci/acl_manager/le_connection_callbacks.h2
-rw-r--r--system/gd/hci/acl_manager/le_connection_callbacks_mock.h2
-rw-r--r--system/gd/hci/acl_manager/le_connection_management_callbacks.h2
-rw-r--r--system/gd/hci/acl_manager/le_connection_management_callbacks_mock.h2
-rw-r--r--system/gd/hci/acl_manager/le_impl.h26
-rw-r--r--system/gd/hci/acl_manager/le_impl_test.cc2
-rw-r--r--system/gd/hci/acl_manager/round_robin_scheduler.cc12
-rw-r--r--system/gd/hci/acl_manager/round_robin_scheduler.h2
-rw-r--r--system/gd/hci/acl_manager/round_robin_scheduler_test.cc5
-rw-r--r--system/gd/hci/acl_manager_mock.h2
-rw-r--r--system/gd/hci/acl_manager_test.cc2
-rw-r--r--system/gd/hci/acl_manager_unittest.cc2
-rw-r--r--system/gd/hci/address_unittest.cc2
-rw-r--r--system/gd/hci/address_with_type.h2
-rw-r--r--system/gd/hci/address_with_type_test.cc2
-rw-r--r--system/gd/hci/class_of_device_unittest.cc2
-rw-r--r--system/gd/hci/command_interface.h2
-rw-r--r--system/gd/hci/controller.cc6
-rw-r--r--system/gd/hci/controller.h2
-rw-r--r--system/gd/hci/controller_interface.h2
-rw-r--r--system/gd/hci/controller_interface_mock.h2
-rw-r--r--system/gd/hci/controller_mock.h2
-rw-r--r--system/gd/hci/controller_test.cc2
-rw-r--r--system/gd/hci/controller_unittest.cc2
-rw-r--r--system/gd/hci/distance_measurement_interface.h2
-rw-r--r--system/gd/hci/distance_measurement_manager.cc130
-rw-r--r--system/gd/hci/distance_measurement_manager.h2
-rw-r--r--system/gd/hci/distance_measurement_manager_mock.h12
-rw-r--r--system/gd/hci/distance_measurement_manager_test.cc534
-rw-r--r--system/gd/hci/enum_helper.h2
-rw-r--r--system/gd/hci/event_checkers.h2
-rw-r--r--system/gd/hci/fuzz/acl_manager_fuzz_test.cc2
-rw-r--r--system/gd/hci/fuzz/fuzz_hci_layer.cc2
-rw-r--r--system/gd/hci/fuzz/fuzz_hci_layer.h2
-rw-r--r--system/gd/hci/fuzz/hci_layer_fuzz_client.cc2
-rw-r--r--system/gd/hci/fuzz/hci_layer_fuzz_client.h2
-rw-r--r--system/gd/hci/fuzz/hci_layer_fuzz_test.cc2
-rw-r--r--system/gd/hci/fuzz/status_vs_complete_commands.cc2
-rw-r--r--system/gd/hci/fuzz/status_vs_complete_commands.h2
-rw-r--r--system/gd/hci/hci_interface.h2
-rw-r--r--system/gd/hci/hci_layer.cc43
-rw-r--r--system/gd/hci/hci_layer.h4
-rw-r--r--system/gd/hci/hci_layer_fake.cc2
-rw-r--r--system/gd/hci/hci_layer_fake.h2
-rw-r--r--system/gd/hci/hci_layer_mock.h2
-rw-r--r--system/gd/hci/hci_layer_test.cc2
-rw-r--r--system/gd/hci/hci_layer_unittest.cc2
-rw-r--r--system/gd/hci/hci_metrics_logging.cc2
-rw-r--r--system/gd/hci/hci_metrics_logging.h2
-rw-r--r--system/gd/hci/hci_packets_fuzz_test.cc2
-rw-r--r--system/gd/hci/hci_packets_test.cc2
-rw-r--r--system/gd/hci/inquiry_interface.h2
-rw-r--r--system/gd/hci/le_acl_connection_interface.h2
-rw-r--r--system/gd/hci/le_address_manager.cc60
-rw-r--r--system/gd/hci/le_address_manager.h2
-rw-r--r--system/gd/hci/le_address_manager_test.cc2
-rw-r--r--system/gd/hci/le_advertising_interface.h2
-rw-r--r--system/gd/hci/le_advertising_manager.cc173
-rw-r--r--system/gd/hci/le_advertising_manager.h2
-rw-r--r--system/gd/hci/le_advertising_manager_mock.h2
-rw-r--r--system/gd/hci/le_advertising_manager_test.cc2
-rw-r--r--system/gd/hci/le_iso_interface.h2
-rw-r--r--system/gd/hci/le_periodic_sync_manager.h2
-rw-r--r--system/gd/hci/le_periodic_sync_manager_test.cc2
-rw-r--r--system/gd/hci/le_rand_callback.h2
-rw-r--r--system/gd/hci/le_scanning_callback.h2
-rw-r--r--system/gd/hci/le_scanning_interface.h2
-rw-r--r--system/gd/hci/le_scanning_manager.cc2
-rw-r--r--system/gd/hci/le_scanning_manager.h2
-rw-r--r--system/gd/hci/le_scanning_manager_mock.h2
-rw-r--r--system/gd/hci/le_scanning_manager_test.cc2
-rw-r--r--system/gd/hci/le_scanning_reassembler.cc2
-rw-r--r--system/gd/hci/le_scanning_reassembler.h2
-rw-r--r--system/gd/hci/le_scanning_reassembler_test.cc2
-rw-r--r--system/gd/hci/le_security_interface.h2
-rw-r--r--system/gd/hci/link_key.cc2
-rw-r--r--system/gd/hci/link_key.h2
-rw-r--r--system/gd/hci/msft.cc2
-rw-r--r--system/gd/hci/msft.h2
-rw-r--r--system/gd/hci/octets.h2
-rw-r--r--system/gd/hci/remote_name_request.cc2
-rw-r--r--system/gd/hci/remote_name_request.h2
-rw-r--r--system/gd/hci/remote_name_request_test.cc2
-rw-r--r--system/gd/hci/security_interface.h2
-rw-r--r--system/gd/hci/uuid_unittest.cc2
-rw-r--r--system/gd/lpp/lpp_offload_interface.h2
-rw-r--r--system/gd/lpp/lpp_offload_interface_mock.h2
-rw-r--r--system/gd/lpp/lpp_offload_manager.cc2
-rw-r--r--system/gd/lpp/lpp_offload_manager.h2
-rw-r--r--system/gd/metrics/bluetooth_event.cc2
-rw-r--r--system/gd/metrics/bluetooth_event.h2
-rw-r--r--system/gd/metrics/chromeos/metrics.cc2
-rw-r--r--system/gd/metrics/chromeos/metrics_allowlist.cc2
-rw-r--r--system/gd/metrics/chromeos/metrics_allowlist.h2
-rw-r--r--system/gd/metrics/chromeos/metrics_event.cc2
-rw-r--r--system/gd/metrics/chromeos/metrics_event.h2
-rw-r--r--system/gd/metrics/counter_metrics.cc2
-rw-r--r--system/gd/metrics/counter_metrics.h2
-rw-r--r--system/gd/metrics/counter_metrics_unittest.cc2
-rw-r--r--system/gd/metrics/linux/metrics.cc2
-rw-r--r--system/gd/metrics/metrics.h2
-rw-r--r--system/gd/metrics/utils.cc2
-rw-r--r--system/gd/metrics/utils.h2
-rw-r--r--system/gd/module.cc33
-rw-r--r--system/gd/module.h8
-rw-r--r--system/gd/module_unittest.cc8
-rw-r--r--system/gd/os/alarm.h2
-rw-r--r--system/gd/os/alarm_benchmark.cc2
-rw-r--r--system/gd/os/android/metrics.cc19
-rw-r--r--system/gd/os/android/parameter_provider.cc2
-rw-r--r--system/gd/os/android/system_properties.cc2
-rw-r--r--system/gd/os/bt_keystore.h2
-rw-r--r--system/gd/os/chromeos/metrics.cc5
-rw-r--r--system/gd/os/chromeos/parameter_provider.cc2
-rw-r--r--system/gd/os/chromeos/system_properties.cc2
-rw-r--r--system/gd/os/fake_timer/fake_timerfd.cc2
-rw-r--r--system/gd/os/fake_timer/fake_timerfd.h2
-rw-r--r--system/gd/os/files.h2
-rw-r--r--system/gd/os/fuzz/dev_null_queue.h2
-rw-r--r--system/gd/os/fuzz/fuzz_inject_queue.h2
-rw-r--r--system/gd/os/handler.cc2
-rw-r--r--system/gd/os/handler.h2
-rw-r--r--system/gd/os/handler_unittest.cc2
-rw-r--r--system/gd/os/host/metrics.cc3
-rw-r--r--system/gd/os/host/parameter_provider.cc2
-rw-r--r--system/gd/os/host/system_properties.cc2
-rw-r--r--system/gd/os/linux/metrics.cc5
-rw-r--r--system/gd/os/linux/parameter_provider.cc2
-rw-r--r--system/gd/os/linux/system_properties.cc2
-rw-r--r--system/gd/os/linux_generic/alarm.cc8
-rw-r--r--system/gd/os/linux_generic/alarm_timerfd_unittest.cc2
-rw-r--r--system/gd/os/linux_generic/alarm_unittest.cc2
-rw-r--r--system/gd/os/linux_generic/files.cc2
-rw-r--r--system/gd/os/linux_generic/files_test.cc2
-rw-r--r--system/gd/os/linux_generic/linux.h2
-rw-r--r--system/gd/os/linux_generic/mgmt.cc2
-rw-r--r--system/gd/os/linux_generic/queue_unittest.cc2
-rw-r--r--system/gd/os/linux_generic/reactive_semaphore.cc2
-rw-r--r--system/gd/os/linux_generic/reactive_semaphore.h2
-rw-r--r--system/gd/os/linux_generic/reactor.cc2
-rw-r--r--system/gd/os/linux_generic/reactor_unittest.cc2
-rw-r--r--system/gd/os/linux_generic/repeating_alarm.cc2
-rw-r--r--system/gd/os/linux_generic/repeating_alarm_unittest.cc2
-rw-r--r--system/gd/os/linux_generic/thread.cc2
-rw-r--r--system/gd/os/linux_generic/thread_unittest.cc2
-rw-r--r--system/gd/os/metrics.h8
-rw-r--r--system/gd/os/mock_queue.h2
-rw-r--r--system/gd/os/parameter_provider.h2
-rw-r--r--system/gd/os/queue.h2
-rw-r--r--system/gd/os/queue_benchmark.cc2
-rw-r--r--system/gd/os/rand.h2
-rw-r--r--system/gd/os/reactor.h2
-rw-r--r--system/gd/os/repeating_alarm.h2
-rw-r--r--system/gd/os/system_properties.h2
-rw-r--r--system/gd/os/system_properties_common.cc2
-rw-r--r--system/gd/os/system_properties_common_test.cc2
-rw-r--r--system/gd/os/thread.h2
-rw-r--r--system/gd/os/thread_benchmark.cc2
-rw-r--r--system/gd/os/utils.h2
-rw-r--r--system/gd/packet/base_packet_builder.h2
-rw-r--r--system/gd/packet/base_struct.h2
-rw-r--r--system/gd/packet/bit_inserter.cc2
-rw-r--r--system/gd/packet/bit_inserter.h2
-rw-r--r--system/gd/packet/bit_inserter_unittest.cc2
-rw-r--r--system/gd/packet/byte_inserter.cc2
-rw-r--r--system/gd/packet/byte_inserter.h2
-rw-r--r--system/gd/packet/byte_observer.cc2
-rw-r--r--system/gd/packet/byte_observer.h2
-rw-r--r--system/gd/packet/checksum_type_checker.h2
-rw-r--r--system/gd/packet/custom_field_fixed_size_interface.h2
-rw-r--r--system/gd/packet/custom_type_checker.h2
-rw-r--r--system/gd/packet/endian_inserter.h2
-rw-r--r--system/gd/packet/fragmenting_inserter.cc2
-rw-r--r--system/gd/packet/fragmenting_inserter.h2
-rw-r--r--system/gd/packet/fragmenting_inserter_unittest.cc2
-rw-r--r--system/gd/packet/iterator.cc2
-rw-r--r--system/gd/packet/iterator.h2
-rw-r--r--system/gd/packet/packet_builder.h2
-rw-r--r--system/gd/packet/packet_builder_unittest.cc2
-rw-r--r--system/gd/packet/packet_struct.h2
-rw-r--r--system/gd/packet/packet_view.cc2
-rw-r--r--system/gd/packet/packet_view.h2
-rw-r--r--system/gd/packet/packet_view_unittest.cc2
-rw-r--r--system/gd/packet/parser/checksum_def.cc2
-rw-r--r--system/gd/packet/parser/checksum_def.h2
-rw-r--r--system/gd/packet/parser/custom_field_def.cc2
-rw-r--r--system/gd/packet/parser/custom_field_def.h2
-rw-r--r--system/gd/packet/parser/declarations.h2
-rw-r--r--system/gd/packet/parser/enum_def.cc2
-rw-r--r--system/gd/packet/parser/enum_def.h2
-rw-r--r--system/gd/packet/parser/enum_gen.cc2
-rw-r--r--system/gd/packet/parser/enum_gen.h2
-rw-r--r--system/gd/packet/parser/field_list.h2
-rw-r--r--system/gd/packet/parser/fields/all_fields.h2
-rw-r--r--system/gd/packet/parser/fields/array_field.cc2
-rw-r--r--system/gd/packet/parser/fields/array_field.h2
-rw-r--r--system/gd/packet/parser/fields/body_field.cc2
-rw-r--r--system/gd/packet/parser/fields/body_field.h2
-rw-r--r--system/gd/packet/parser/fields/checksum_field.cc2
-rw-r--r--system/gd/packet/parser/fields/checksum_field.h2
-rw-r--r--system/gd/packet/parser/fields/checksum_start_field.cc2
-rw-r--r--system/gd/packet/parser/fields/checksum_start_field.h2
-rw-r--r--system/gd/packet/parser/fields/count_field.cc2
-rw-r--r--system/gd/packet/parser/fields/count_field.h2
-rw-r--r--system/gd/packet/parser/fields/custom_field.cc2
-rw-r--r--system/gd/packet/parser/fields/custom_field.h2
-rw-r--r--system/gd/packet/parser/fields/custom_field_fixed_size.cc2
-rw-r--r--system/gd/packet/parser/fields/custom_field_fixed_size.h2
-rw-r--r--system/gd/packet/parser/fields/enum_field.cc2
-rw-r--r--system/gd/packet/parser/fields/enum_field.h2
-rw-r--r--system/gd/packet/parser/fields/fixed_enum_field.cc2
-rw-r--r--system/gd/packet/parser/fields/fixed_enum_field.h2
-rw-r--r--system/gd/packet/parser/fields/fixed_field.cc2
-rw-r--r--system/gd/packet/parser/fields/fixed_field.h2
-rw-r--r--system/gd/packet/parser/fields/fixed_scalar_field.cc2
-rw-r--r--system/gd/packet/parser/fields/fixed_scalar_field.h2
-rw-r--r--system/gd/packet/parser/fields/group_field.cc2
-rw-r--r--system/gd/packet/parser/fields/group_field.h2
-rw-r--r--system/gd/packet/parser/fields/packet_field.cc2
-rw-r--r--system/gd/packet/parser/fields/packet_field.h2
-rw-r--r--system/gd/packet/parser/fields/padding_field.cc2
-rw-r--r--system/gd/packet/parser/fields/padding_field.h2
-rw-r--r--system/gd/packet/parser/fields/payload_field.cc2
-rw-r--r--system/gd/packet/parser/fields/payload_field.h2
-rw-r--r--system/gd/packet/parser/fields/reserved_field.cc2
-rw-r--r--system/gd/packet/parser/fields/reserved_field.h2
-rw-r--r--system/gd/packet/parser/fields/scalar_field.cc2
-rw-r--r--system/gd/packet/parser/fields/scalar_field.h2
-rw-r--r--system/gd/packet/parser/fields/size_field.cc2
-rw-r--r--system/gd/packet/parser/fields/size_field.h2
-rw-r--r--system/gd/packet/parser/fields/struct_field.cc2
-rw-r--r--system/gd/packet/parser/fields/struct_field.h2
-rw-r--r--system/gd/packet/parser/fields/variable_length_struct_field.cc2
-rw-r--r--system/gd/packet/parser/fields/variable_length_struct_field.h2
-rw-r--r--system/gd/packet/parser/fields/vector_field.cc2
-rw-r--r--system/gd/packet/parser/fields/vector_field.h2
-rw-r--r--system/gd/packet/parser/gen_cpp.cc2
-rw-r--r--system/gd/packet/parser/logging.h2
-rw-r--r--system/gd/packet/parser/main.cc2
-rw-r--r--system/gd/packet/parser/packet_def.cc2
-rw-r--r--system/gd/packet/parser/packet_def.h2
-rw-r--r--system/gd/packet/parser/packet_dependency.cc2
-rw-r--r--system/gd/packet/parser/packet_dependency.h2
-rw-r--r--system/gd/packet/parser/parent_def.cc2
-rw-r--r--system/gd/packet/parser/parent_def.h2
-rw-r--r--system/gd/packet/parser/parse_location.h2
-rw-r--r--system/gd/packet/parser/size.h2
-rw-r--r--system/gd/packet/parser/struct_def.cc2
-rw-r--r--system/gd/packet/parser/struct_def.h2
-rw-r--r--system/gd/packet/parser/struct_parser_generator.cc2
-rw-r--r--system/gd/packet/parser/struct_parser_generator.h2
-rw-r--r--system/gd/packet/parser/test/generated_packet_test.cc2
-rw-r--r--system/gd/packet/parser/test/simple_sum.h2
-rw-r--r--system/gd/packet/parser/test/six_bytes.cc2
-rw-r--r--system/gd/packet/parser/test/six_bytes.h2
-rw-r--r--system/gd/packet/parser/test/variable.cc2
-rw-r--r--system/gd/packet/parser/test/variable.h2
-rw-r--r--system/gd/packet/parser/type_def.h2
-rw-r--r--system/gd/packet/parser/util.h2
-rw-r--r--system/gd/packet/raw_builder.cc2
-rw-r--r--system/gd/packet/raw_builder.h2
-rw-r--r--system/gd/packet/raw_builder_unittest.cc2
-rw-r--r--system/gd/packet/view.cc2
-rw-r--r--system/gd/packet/view.h2
-rw-r--r--system/gd/proto/bluetooth/metrics/bluetooth.proto276
-rw-r--r--system/gd/rust/linux/service/src/interface_manager.rs48
-rw-r--r--system/gd/rust/linux/service/src/main.rs136
-rw-r--r--system/gd/rust/linux/stack/src/bluetooth.rs27
-rw-r--r--system/gd/rust/linux/stack/src/lib.rs8
-rw-r--r--system/gd/rust/topshim/controller/controller_shim.cc2
-rw-r--r--system/gd/storage/classic_device.cc2
-rw-r--r--system/gd/storage/classic_device.h2
-rw-r--r--system/gd/storage/classic_device_test.cc2
-rw-r--r--system/gd/storage/config_cache.cc2
-rw-r--r--system/gd/storage/config_cache.h2
-rw-r--r--system/gd/storage/config_cache_helper.cc2
-rw-r--r--system/gd/storage/config_cache_helper.h2
-rw-r--r--system/gd/storage/config_cache_helper_test.cc2
-rw-r--r--system/gd/storage/config_cache_test.cc2
-rw-r--r--system/gd/storage/device.cc2
-rw-r--r--system/gd/storage/device.h2
-rw-r--r--system/gd/storage/device_test.cc2
-rw-r--r--system/gd/storage/le_device.cc2
-rw-r--r--system/gd/storage/le_device.h2
-rw-r--r--system/gd/storage/le_device_test.cc2
-rw-r--r--system/gd/storage/legacy_config_file.cc2
-rw-r--r--system/gd/storage/legacy_config_file.h2
-rw-r--r--system/gd/storage/legacy_config_file_test.cc2
-rw-r--r--system/gd/storage/mutation.cc2
-rw-r--r--system/gd/storage/mutation.h2
-rw-r--r--system/gd/storage/mutation_entry.cc2
-rw-r--r--system/gd/storage/mutation_entry.h2
-rw-r--r--system/gd/storage/mutation_test.cc2
-rw-r--r--system/gd/storage/serializable.h2
-rw-r--r--system/gd/storage/storage_module.cc2
-rw-r--r--system/gd/storage/storage_module.h2
-rw-r--r--system/gd/storage/storage_module_test.cc2
-rw-r--r--system/gd/sysprops/sysprops_module.cc2
-rw-r--r--system/gd/sysprops/sysprops_module.h2
-rw-r--r--system/gd/sysprops/sysprops_module_test.cc2
-rw-r--r--system/include/hardware/bluetooth_headset_interface.h3
-rw-r--r--system/include/hardware/bt_sock.h19
-rw-r--r--system/linux_include/log/log.h24
-rw-r--r--system/main/shim/metrics_api.cc10
-rw-r--r--system/main/shim/metrics_api.h8
-rw-r--r--system/main/shim/stack.cc17
-rw-r--r--system/main/test/main_shim_test.cc13
-rw-r--r--system/osi/BUILD.gn1
-rw-r--r--system/pdl/hci/hci_packets.pdl4
-rw-r--r--system/stack/Android.bp35
-rw-r--r--system/stack/BUILD.gn3
-rw-r--r--system/stack/btm/btm_ble_sec.cc41
-rw-r--r--system/stack/btm/btm_sco.cc5
-rw-r--r--system/stack/btm/btm_sec.cc28
-rw-r--r--system/stack/btm/security_event_parser.cc16
-rw-r--r--system/stack/btu/btu_hcif.cc121
-rw-r--r--system/stack/fuzzers/l2cap_fuzzer.cc20
-rw-r--r--system/stack/gatt/gatt_api.cc9
-rw-r--r--system/stack/hid/hidd_api.cc48
-rw-r--r--system/stack/hid/hidd_conn.cc33
-rw-r--r--system/stack/hid/hidh_api.cc30
-rw-r--r--system/stack/hid/hidh_conn.cc22
-rw-r--r--system/stack/include/stack_metrics_logging.h69
-rw-r--r--system/stack/l2cap/l2c_ble.cc9
-rw-r--r--system/stack/metrics/stack_metrics_logging.cc101
-rw-r--r--system/stack/mmc/metrics/mmc_rtt_logger.cc5
-rw-r--r--system/stack/rfcomm/port_api.cc4
-rw-r--r--system/stack/rfcomm/port_rfc.cc41
-rw-r--r--system/stack/rfcomm/rfc_l2cap_if.cc54
-rw-r--r--system/stack/sdp/sdp_utils.cc38
-rw-r--r--system/stack/smp/smp_l2c.cc7
-rw-r--r--system/stack/smp/smp_utils.cc10
-rw-r--r--system/stack/test/btm/stack_btm_power_mode_test.cc9
-rw-r--r--system/stack/test/btm/stack_btm_sec_test.cc5
-rw-r--r--system/stack/test/btm/stack_btm_test.cc39
-rw-r--r--system/stack/test/btm_iso_test.cc21
-rw-r--r--system/stack/test/connection_manager_test.cc59
-rw-r--r--system/stack/test/eatt/eatt_test.cc9
-rw-r--r--system/stack/test/stack_acl_test.cc6
-rw-r--r--system/stack/test/stack_l2cap_test.cc14
-rw-r--r--system/test/Android.bp7
-rw-r--r--system/test/README.md81
-rw-r--r--system/test/mock/mock_main_shim_entry.cc12
-rw-r--r--system/test/mock/mock_main_shim_entry.h9
-rw-r--r--system/test/mock/mock_main_shim_metrics_api.cc7
-rw-r--r--system/test/mock/mock_main_shim_metrics_api.h14
-rw-r--r--system/test/mock/mock_stack_metrics_logging.cc151
-rw-r--r--system/test/mock/mock_stack_metrics_logging.h254
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_, &times_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