Commit 04a6b4cd authored by Kyle Horimoto's avatar Kyle Horimoto Committed by Kyle Horimoto

[CrOS Tether] Rate-limit BLE discovery sessions.

There are race conditions in Bluetooth which can cause errors when
starting and stopping discovery sessions too close to one another.
In the worst case, these issues can cause a crash.

This CL rate-limits BLE advertisements and scans to at most one per
200ms. This reduces the possibility of race conditions in the kernel.

Bug: 768523, 672263
Change-Id: I985aec16b6f9cd80c385ab9af199daff4fb50ced
Reviewed-on: https://chromium-review.googlesource.com/683756Reviewed-by: default avatarRyan Hansberry <hansberry@chromium.org>
Cr-Commit-Position: refs/heads/master@{#504291}
parent 3e58f9b7
...@@ -12,8 +12,6 @@ static_library("tether") { ...@@ -12,8 +12,6 @@ static_library("tether") {
"active_host_network_state_updater.h", "active_host_network_state_updater.h",
"ble_advertisement_device_queue.cc", "ble_advertisement_device_queue.cc",
"ble_advertisement_device_queue.h", "ble_advertisement_device_queue.h",
"ble_advertisement_synchronizer.cc",
"ble_advertisement_synchronizer.h",
"ble_advertiser.cc", "ble_advertiser.cc",
"ble_advertiser.h", "ble_advertiser.h",
"ble_connection_manager.cc", "ble_connection_manager.cc",
...@@ -21,6 +19,8 @@ static_library("tether") { ...@@ -21,6 +19,8 @@ static_library("tether") {
"ble_constants.h", "ble_constants.h",
"ble_scanner.cc", "ble_scanner.cc",
"ble_scanner.h", "ble_scanner.h",
"ble_synchronizer.cc",
"ble_synchronizer.h",
"connect_tethering_operation.cc", "connect_tethering_operation.cc",
"connect_tethering_operation.h", "connect_tethering_operation.h",
"crash_recovery_manager.cc", "crash_recovery_manager.cc",
...@@ -130,10 +130,10 @@ static_library("test_support") { ...@@ -130,10 +130,10 @@ static_library("test_support") {
sources = [ sources = [
"fake_active_host.cc", "fake_active_host.cc",
"fake_active_host.h", "fake_active_host.h",
"fake_ble_advertisement_synchronizer.cc",
"fake_ble_advertisement_synchronizer.h",
"fake_ble_connection_manager.cc", "fake_ble_connection_manager.cc",
"fake_ble_connection_manager.h", "fake_ble_connection_manager.h",
"fake_ble_synchronizer.cc",
"fake_ble_synchronizer.h",
"fake_disconnect_tethering_request_sender.cc", "fake_disconnect_tethering_request_sender.cc",
"fake_disconnect_tethering_request_sender.h", "fake_disconnect_tethering_request_sender.h",
"fake_error_tolerant_ble_advertisement.cc", "fake_error_tolerant_ble_advertisement.cc",
...@@ -189,10 +189,10 @@ source_set("unit_tests") { ...@@ -189,10 +189,10 @@ source_set("unit_tests") {
"active_host_network_state_updater_unittest.cc", "active_host_network_state_updater_unittest.cc",
"active_host_unittest.cc", "active_host_unittest.cc",
"ble_advertisement_device_queue_unittest.cc", "ble_advertisement_device_queue_unittest.cc",
"ble_advertisement_synchronizer_unittest.cc",
"ble_advertiser_unittest.cc", "ble_advertiser_unittest.cc",
"ble_connection_manager_unittest.cc", "ble_connection_manager_unittest.cc",
"ble_scanner_unittest.cc", "ble_scanner_unittest.cc",
"ble_synchronizer_unittest.cc",
"connect_tethering_operation_unittest.cc", "connect_tethering_operation_unittest.cc",
"crash_recovery_manager_unittest.cc", "crash_recovery_manager_unittest.cc",
"device_status_util_unittest.cc", "device_status_util_unittest.cc",
......
...@@ -26,10 +26,10 @@ BleAdvertiser::AdvertisementMetadata::~AdvertisementMetadata() {} ...@@ -26,10 +26,10 @@ BleAdvertiser::AdvertisementMetadata::~AdvertisementMetadata() {}
BleAdvertiser::BleAdvertiser( BleAdvertiser::BleAdvertiser(
cryptauth::LocalDeviceDataProvider* local_device_data_provider, cryptauth::LocalDeviceDataProvider* local_device_data_provider,
cryptauth::RemoteBeaconSeedFetcher* remote_beacon_seed_fetcher, cryptauth::RemoteBeaconSeedFetcher* remote_beacon_seed_fetcher,
BleAdvertisementSynchronizer* ble_advertisement_synchronizer) BleSynchronizer* ble_synchronizer)
: remote_beacon_seed_fetcher_(remote_beacon_seed_fetcher), : remote_beacon_seed_fetcher_(remote_beacon_seed_fetcher),
local_device_data_provider_(local_device_data_provider), local_device_data_provider_(local_device_data_provider),
ble_advertisement_synchronizer_(ble_advertisement_synchronizer), ble_synchronizer_(ble_synchronizer),
eid_generator_(base::MakeUnique<cryptauth::ForegroundEidGenerator>()), eid_generator_(base::MakeUnique<cryptauth::ForegroundEidGenerator>()),
weak_ptr_factory_(this) {} weak_ptr_factory_(this) {}
...@@ -154,7 +154,7 @@ void BleAdvertiser::UpdateAdvertisements() { ...@@ -154,7 +154,7 @@ void BleAdvertiser::UpdateAdvertisements() {
advertisements_[i] = advertisements_[i] =
ErrorTolerantBleAdvertisementImpl::Factory::NewInstance( ErrorTolerantBleAdvertisementImpl::Factory::NewInstance(
metadata->device_id, std::move(service_data_copy), metadata->device_id, std::move(service_data_copy),
ble_advertisement_synchronizer_); ble_synchronizer_);
continue; continue;
} }
......
...@@ -27,7 +27,7 @@ namespace chromeos { ...@@ -27,7 +27,7 @@ namespace chromeos {
namespace tether { namespace tether {
class BleAdvertisementSynchronizer; class BleSynchronizer;
class ErrorTolerantBleAdvertisement; class ErrorTolerantBleAdvertisement;
// Advertises to a given device. When StartAdvertisingToDevice() is called, a // Advertises to a given device. When StartAdvertisingToDevice() is called, a
...@@ -47,7 +47,7 @@ class BleAdvertiser { ...@@ -47,7 +47,7 @@ class BleAdvertiser {
BleAdvertiser(cryptauth::LocalDeviceDataProvider* local_device_data_provider, BleAdvertiser(cryptauth::LocalDeviceDataProvider* local_device_data_provider,
cryptauth::RemoteBeaconSeedFetcher* remote_beacon_seed_fetcher, cryptauth::RemoteBeaconSeedFetcher* remote_beacon_seed_fetcher,
BleAdvertisementSynchronizer* ble_advertisement_synchronizer_); BleSynchronizer* ble_synchronizer);
virtual ~BleAdvertiser(); virtual ~BleAdvertiser();
virtual bool StartAdvertisingToDevice( virtual bool StartAdvertisingToDevice(
...@@ -84,7 +84,7 @@ class BleAdvertiser { ...@@ -84,7 +84,7 @@ class BleAdvertiser {
cryptauth::RemoteBeaconSeedFetcher* remote_beacon_seed_fetcher_; cryptauth::RemoteBeaconSeedFetcher* remote_beacon_seed_fetcher_;
cryptauth::LocalDeviceDataProvider* local_device_data_provider_; cryptauth::LocalDeviceDataProvider* local_device_data_provider_;
BleAdvertisementSynchronizer* ble_advertisement_synchronizer_; BleSynchronizer* ble_synchronizer_;
std::unique_ptr<cryptauth::ForegroundEidGenerator> eid_generator_; std::unique_ptr<cryptauth::ForegroundEidGenerator> eid_generator_;
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
#include "base/stl_util.h" #include "base/stl_util.h"
#include "chromeos/components/tether/ble_constants.h" #include "chromeos/components/tether/ble_constants.h"
#include "chromeos/components/tether/error_tolerant_ble_advertisement_impl.h" #include "chromeos/components/tether/error_tolerant_ble_advertisement_impl.h"
#include "chromeos/components/tether/fake_ble_advertisement_synchronizer.h" #include "chromeos/components/tether/fake_ble_synchronizer.h"
#include "chromeos/components/tether/fake_error_tolerant_ble_advertisement.h" #include "chromeos/components/tether/fake_error_tolerant_ble_advertisement.h"
#include "components/cryptauth/mock_foreground_eid_generator.h" #include "components/cryptauth/mock_foreground_eid_generator.h"
#include "components/cryptauth/mock_local_device_data_provider.h" #include "components/cryptauth/mock_local_device_data_provider.h"
...@@ -72,7 +72,7 @@ class FakeErrorTolerantBleAdvertisementFactory ...@@ -72,7 +72,7 @@ class FakeErrorTolerantBleAdvertisementFactory
std::unique_ptr<ErrorTolerantBleAdvertisement> BuildInstance( std::unique_ptr<ErrorTolerantBleAdvertisement> BuildInstance(
const std::string& device_id, const std::string& device_id,
std::unique_ptr<cryptauth::DataWithTimestamp> advertisement_data, std::unique_ptr<cryptauth::DataWithTimestamp> advertisement_data,
BleAdvertisementSynchronizer* ble_advertisement_synchronizer) override { BleSynchronizer* ble_synchronizer) override {
FakeErrorTolerantBleAdvertisement* fake_advertisement = FakeErrorTolerantBleAdvertisement* fake_advertisement =
new FakeErrorTolerantBleAdvertisement( new FakeErrorTolerantBleAdvertisement(
device_id, base::Bind(&FakeErrorTolerantBleAdvertisementFactory:: device_id, base::Bind(&FakeErrorTolerantBleAdvertisementFactory::
...@@ -151,8 +151,7 @@ class BleAdvertiserTest : public testing::Test { ...@@ -151,8 +151,7 @@ class BleAdvertiserTest : public testing::Test {
mock_local_data_provider_->SetPublicKey( mock_local_data_provider_->SetPublicKey(
base::MakeUnique<std::string>(kFakePublicKey)); base::MakeUnique<std::string>(kFakePublicKey));
fake_ble_advertisement_synchronizer_ = fake_ble_synchronizer_ = base::MakeUnique<FakeBleSynchronizer>();
base::MakeUnique<FakeBleAdvertisementSynchronizer>();
fake_advertisement_factory_ = fake_advertisement_factory_ =
base::WrapUnique(new FakeErrorTolerantBleAdvertisementFactory()); base::WrapUnique(new FakeErrorTolerantBleAdvertisementFactory());
...@@ -163,7 +162,7 @@ class BleAdvertiserTest : public testing::Test { ...@@ -163,7 +162,7 @@ class BleAdvertiserTest : public testing::Test {
ble_advertiser_ = base::MakeUnique<BleAdvertiser>( ble_advertiser_ = base::MakeUnique<BleAdvertiser>(
mock_local_data_provider_.get(), mock_seed_fetcher_.get(), mock_local_data_provider_.get(), mock_seed_fetcher_.get(),
fake_ble_advertisement_synchronizer_.get()); fake_ble_synchronizer_.get());
ble_advertiser_->SetEidGeneratorForTest(std::move(eid_generator)); ble_advertiser_->SetEidGeneratorForTest(std::move(eid_generator));
ble_advertiser_->AddObserver(test_observer_.get()); ble_advertiser_->AddObserver(test_observer_.get());
} }
...@@ -199,8 +198,7 @@ class BleAdvertiserTest : public testing::Test { ...@@ -199,8 +198,7 @@ class BleAdvertiserTest : public testing::Test {
std::unique_ptr<cryptauth::MockRemoteBeaconSeedFetcher> mock_seed_fetcher_; std::unique_ptr<cryptauth::MockRemoteBeaconSeedFetcher> mock_seed_fetcher_;
std::unique_ptr<cryptauth::MockLocalDeviceDataProvider> std::unique_ptr<cryptauth::MockLocalDeviceDataProvider>
mock_local_data_provider_; mock_local_data_provider_;
std::unique_ptr<FakeBleAdvertisementSynchronizer> std::unique_ptr<FakeBleSynchronizer> fake_ble_synchronizer_;
fake_ble_advertisement_synchronizer_;
std::unique_ptr<TestObserver> test_observer_; std::unique_ptr<TestObserver> test_observer_;
......
...@@ -148,7 +148,7 @@ class UnregisteringObserver : public BleConnectionManager::Observer { ...@@ -148,7 +148,7 @@ class UnregisteringObserver : public BleConnectionManager::Observer {
class MockBleScanner : public BleScanner { class MockBleScanner : public BleScanner {
public: public:
explicit MockBleScanner(scoped_refptr<device::BluetoothAdapter> adapter) explicit MockBleScanner(scoped_refptr<device::BluetoothAdapter> adapter)
: BleScanner(adapter, nullptr) {} : BleScanner(adapter, nullptr, nullptr) {}
~MockBleScanner() override {} ~MockBleScanner() override {}
MOCK_METHOD1(RegisterScanFilterForDevice, MOCK_METHOD1(RegisterScanFilterForDevice,
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
#include "chromeos/components/tether/ble_constants.h" #include "chromeos/components/tether/ble_constants.h"
#include "chromeos/components/tether/ble_synchronizer.h"
#include "components/cryptauth/proto/cryptauth_api.pb.h" #include "components/cryptauth/proto/cryptauth_api.pb.h"
#include "components/cryptauth/remote_device.h" #include "components/cryptauth/remote_device.h"
#include "components/proximity_auth/logging/logging.h" #include "components/proximity_auth/logging/logging.h"
...@@ -41,21 +42,13 @@ BleScanner::ServiceDataProviderImpl::GetServiceDataForUUID( ...@@ -41,21 +42,13 @@ BleScanner::ServiceDataProviderImpl::GetServiceDataForUUID(
BleScanner::BleScanner( BleScanner::BleScanner(
scoped_refptr<device::BluetoothAdapter> adapter, scoped_refptr<device::BluetoothAdapter> adapter,
const cryptauth::LocalDeviceDataProvider* local_device_data_provider) cryptauth::LocalDeviceDataProvider* local_device_data_provider,
: BleScanner(base::MakeUnique<ServiceDataProviderImpl>(), BleSynchronizer* ble_synchronizer)
adapter, : adapter_(adapter),
base::WrapUnique(new cryptauth::ForegroundEidGenerator()),
local_device_data_provider) {}
BleScanner::BleScanner(
std::unique_ptr<ServiceDataProvider> service_data_provider,
scoped_refptr<device::BluetoothAdapter> adapter,
std::unique_ptr<cryptauth::ForegroundEidGenerator> eid_generator,
const cryptauth::LocalDeviceDataProvider* local_device_data_provider)
: service_data_provider_(std::move(service_data_provider)),
adapter_(adapter),
eid_generator_(std::move(eid_generator)),
local_device_data_provider_(local_device_data_provider), local_device_data_provider_(local_device_data_provider),
ble_synchronizer_(ble_synchronizer),
service_data_provider_(base::MakeUnique<ServiceDataProviderImpl>()),
eid_generator_(base::MakeUnique<cryptauth::ForegroundEidGenerator>()),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
adapter_->AddObserver(this); adapter_->AddObserver(this);
} }
...@@ -127,6 +120,13 @@ bool BleScanner::IsDiscoverySessionActive() { ...@@ -127,6 +120,13 @@ bool BleScanner::IsDiscoverySessionActive() {
return false; return false;
} }
void BleScanner::SetTestDoubles(
std::unique_ptr<ServiceDataProvider> service_data_provider,
std::unique_ptr<cryptauth::ForegroundEidGenerator> eid_generator) {
service_data_provider_ = std::move(service_data_provider);
eid_generator_ = std::move(eid_generator);
}
bool BleScanner::IsDeviceRegistered(const std::string& device_id) { bool BleScanner::IsDeviceRegistered(const std::string& device_id) {
for (auto it = registered_remote_devices_.begin(); for (auto it = registered_remote_devices_.begin();
it != registered_remote_devices_.end(); ++it) { it != registered_remote_devices_.end(); ++it) {
...@@ -184,6 +184,7 @@ void BleScanner::ResetDiscoverySessionIfNotActive() { ...@@ -184,6 +184,7 @@ void BleScanner::ResetDiscoverySessionIfNotActive() {
// properly. When we detect that this situation has occurred, delete the // properly. When we detect that this situation has occurred, delete the
// pointer and reset discovery state. // pointer and reset discovery state.
discovery_session_.reset(); discovery_session_.reset();
discovery_session_weak_ptr_factory_.reset();
is_initializing_discovery_session_ = false; is_initializing_discovery_session_ = false;
is_stopping_discovery_session_ = false; is_stopping_discovery_session_ = false;
weak_ptr_factory_.InvalidateWeakPtrs(); weak_ptr_factory_.InvalidateWeakPtrs();
...@@ -199,8 +200,6 @@ void BleScanner::UpdateDiscoveryStatus() { ...@@ -199,8 +200,6 @@ void BleScanner::UpdateDiscoveryStatus() {
} }
void BleScanner::EnsureDiscoverySessionActive() { void BleScanner::EnsureDiscoverySessionActive() {
DCHECK(adapter_);
// If the session is active or is in the process of becoming active, there is // If the session is active or is in the process of becoming active, there is
// nothing to do. // nothing to do.
if (IsDiscoverySessionActive() || is_initializing_discovery_session_) if (IsDiscoverySessionActive() || is_initializing_discovery_session_)
...@@ -208,13 +207,7 @@ void BleScanner::EnsureDiscoverySessionActive() { ...@@ -208,13 +207,7 @@ void BleScanner::EnsureDiscoverySessionActive() {
is_initializing_discovery_session_ = true; is_initializing_discovery_session_ = true;
// Note: Ideally, we would use a filter for only LE devices here. However, ble_synchronizer_->StartDiscoverySession(
// using a filter here triggers a bug in some kernel implementations which
// causes LE scanning to toggle rapidly on and off. This can cause race
// conditions which result in Bluetooth bugs. See crbug.com/759090.
// TODO(mcchou): Once these issues have been resolved, add the filter back.
// See crbug.com/759091.
adapter_->StartDiscoverySession(
base::Bind(&BleScanner::OnDiscoverySessionStarted, base::Bind(&BleScanner::OnDiscoverySessionStarted,
weak_ptr_factory_.GetWeakPtr()), weak_ptr_factory_.GetWeakPtr()),
base::Bind(&BleScanner::OnStartDiscoverySessionError, base::Bind(&BleScanner::OnStartDiscoverySessionError,
...@@ -224,7 +217,12 @@ void BleScanner::EnsureDiscoverySessionActive() { ...@@ -224,7 +217,12 @@ void BleScanner::EnsureDiscoverySessionActive() {
void BleScanner::OnDiscoverySessionStarted( void BleScanner::OnDiscoverySessionStarted(
std::unique_ptr<device::BluetoothDiscoverySession> discovery_session) { std::unique_ptr<device::BluetoothDiscoverySession> discovery_session) {
is_initializing_discovery_session_ = false; is_initializing_discovery_session_ = false;
PA_LOG(INFO) << "Started discovery session successfully.";
discovery_session_ = std::move(discovery_session); discovery_session_ = std::move(discovery_session);
discovery_session_weak_ptr_factory_ =
base::MakeUnique<base::WeakPtrFactory<device::BluetoothDiscoverySession>>(
discovery_session_.get());
NotifyDiscoverySessionStateChanged(true /* discovery_session_active */); NotifyDiscoverySessionStateChanged(true /* discovery_session_active */);
...@@ -232,7 +230,7 @@ void BleScanner::OnDiscoverySessionStarted( ...@@ -232,7 +230,7 @@ void BleScanner::OnDiscoverySessionStarted(
} }
void BleScanner::OnStartDiscoverySessionError() { void BleScanner::OnStartDiscoverySessionError() {
PA_LOG(WARNING) << "Error starting discovery session. Initialization failed."; PA_LOG(ERROR) << "Error starting discovery session. Initialization failed.";
is_initializing_discovery_session_ = false; is_initializing_discovery_session_ = false;
UpdateDiscoveryStatus(); UpdateDiscoveryStatus();
} }
...@@ -244,15 +242,20 @@ void BleScanner::EnsureDiscoverySessionNotActive() { ...@@ -244,15 +242,20 @@ void BleScanner::EnsureDiscoverySessionNotActive() {
is_stopping_discovery_session_ = true; is_stopping_discovery_session_ = true;
discovery_session_->Stop(base::Bind(&BleScanner::OnDiscoverySessionStopped, ble_synchronizer_->StopDiscoverySession(
weak_ptr_factory_.GetWeakPtr()), discovery_session_weak_ptr_factory_->GetWeakPtr(),
base::Bind(&BleScanner::OnStopDiscoverySessionError, base::Bind(&BleScanner::OnDiscoverySessionStopped,
weak_ptr_factory_.GetWeakPtr())); weak_ptr_factory_.GetWeakPtr()),
base::Bind(&BleScanner::OnStopDiscoverySessionError,
weak_ptr_factory_.GetWeakPtr()));
} }
void BleScanner::OnDiscoverySessionStopped() { void BleScanner::OnDiscoverySessionStopped() {
is_stopping_discovery_session_ = false; is_stopping_discovery_session_ = false;
PA_LOG(INFO) << "Stopped discovery session successfully.";
discovery_session_.reset(); discovery_session_.reset();
discovery_session_weak_ptr_factory_.reset();
NotifyDiscoverySessionStateChanged(false /* discovery_session_active */); NotifyDiscoverySessionStateChanged(false /* discovery_session_active */);
...@@ -260,7 +263,7 @@ void BleScanner::OnDiscoverySessionStopped() { ...@@ -260,7 +263,7 @@ void BleScanner::OnDiscoverySessionStopped() {
} }
void BleScanner::OnStopDiscoverySessionError() { void BleScanner::OnStopDiscoverySessionError() {
PA_LOG(WARNING) << "Error stopping discovery session."; PA_LOG(ERROR) << "Error stopping discovery session.";
is_stopping_discovery_session_ = false; is_stopping_discovery_session_ = false;
UpdateDiscoveryStatus(); UpdateDiscoveryStatus();
} }
......
...@@ -25,6 +25,9 @@ namespace chromeos { ...@@ -25,6 +25,9 @@ namespace chromeos {
namespace tether { namespace tether {
class BleSynchronizer;
// Performs BLE scans for devices which are advertising to this device.
class BleScanner : public device::BluetoothAdapter::Observer { class BleScanner : public device::BluetoothAdapter::Observer {
public: public:
class Observer { class Observer {
...@@ -36,9 +39,9 @@ class BleScanner : public device::BluetoothAdapter::Observer { ...@@ -36,9 +39,9 @@ class BleScanner : public device::BluetoothAdapter::Observer {
} }
}; };
BleScanner( BleScanner(scoped_refptr<device::BluetoothAdapter> adapter,
scoped_refptr<device::BluetoothAdapter> adapter, cryptauth::LocalDeviceDataProvider* local_device_data_provider,
const cryptauth::LocalDeviceDataProvider* local_device_data_provider); BleSynchronizer* ble_synchronizer);
~BleScanner() override; ~BleScanner() override;
virtual bool RegisterScanFilterForDevice( virtual bool RegisterScanFilterForDevice(
...@@ -87,11 +90,9 @@ class BleScanner : public device::BluetoothAdapter::Observer { ...@@ -87,11 +90,9 @@ class BleScanner : public device::BluetoothAdapter::Observer {
device::BluetoothDevice* bluetooth_device) override; device::BluetoothDevice* bluetooth_device) override;
}; };
BleScanner( void SetTestDoubles(
std::unique_ptr<ServiceDataProvider> service_data_provider, std::unique_ptr<ServiceDataProvider> service_data_provider,
scoped_refptr<device::BluetoothAdapter> adapter, std::unique_ptr<cryptauth::ForegroundEidGenerator> eid_generator);
std::unique_ptr<cryptauth::ForegroundEidGenerator> eid_generator,
const cryptauth::LocalDeviceDataProvider* local_device_data_provider);
bool IsDeviceRegistered(const std::string& device_id); bool IsDeviceRegistered(const std::string& device_id);
...@@ -116,22 +117,22 @@ class BleScanner : public device::BluetoothAdapter::Observer { ...@@ -116,22 +117,22 @@ class BleScanner : public device::BluetoothAdapter::Observer {
void CheckForMatchingScanFilters(device::BluetoothDevice* bluetooth_device, void CheckForMatchingScanFilters(device::BluetoothDevice* bluetooth_device,
std::string& service_data); std::string& service_data);
base::ObserverList<Observer> observer_list_;
std::unique_ptr<ServiceDataProvider> service_data_provider_;
scoped_refptr<device::BluetoothAdapter> adapter_; scoped_refptr<device::BluetoothAdapter> adapter_;
cryptauth::LocalDeviceDataProvider* local_device_data_provider_;
BleSynchronizer* ble_synchronizer_;
std::unique_ptr<ServiceDataProvider> service_data_provider_;
std::unique_ptr<cryptauth::ForegroundEidGenerator> eid_generator_; std::unique_ptr<cryptauth::ForegroundEidGenerator> eid_generator_;
// |local_device_data_provider_| is not owned by this instance and must
// outlive it. std::vector<cryptauth::RemoteDevice> registered_remote_devices_;
const cryptauth::LocalDeviceDataProvider* local_device_data_provider_; base::ObserverList<Observer> observer_list_;
bool is_initializing_discovery_session_ = false; bool is_initializing_discovery_session_ = false;
bool is_stopping_discovery_session_ = false; bool is_stopping_discovery_session_ = false;
std::unique_ptr<device::BluetoothDiscoverySession> discovery_session_; std::unique_ptr<device::BluetoothDiscoverySession> discovery_session_;
std::unique_ptr<base::WeakPtrFactory<device::BluetoothDiscoverySession>>
std::vector<cryptauth::RemoteDevice> registered_remote_devices_; discovery_session_weak_ptr_factory_;
base::WeakPtrFactory<BleScanner> weak_ptr_factory_; base::WeakPtrFactory<BleScanner> weak_ptr_factory_;
......
...@@ -2,10 +2,11 @@ ...@@ -2,10 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "chromeos/components/tether/ble_advertisement_synchronizer.h" #include "chromeos/components/tether/ble_synchronizer.h"
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/time/default_clock.h" #include "base/time/default_clock.h"
#include "components/proximity_auth/logging/logging.h"
namespace chromeos { namespace chromeos {
...@@ -13,11 +14,11 @@ namespace tether { ...@@ -13,11 +14,11 @@ namespace tether {
namespace { namespace {
int64_t kTimeBetweenEachCommandMs = 200; const int64_t kTimeBetweenEachCommandMs = 200;
} // namespace } // namespace
BleAdvertisementSynchronizer::RegisterArgs::RegisterArgs( BleSynchronizer::RegisterArgs::RegisterArgs(
std::unique_ptr<device::BluetoothAdvertisement::Data> advertisement_data, std::unique_ptr<device::BluetoothAdvertisement::Data> advertisement_data,
const device::BluetoothAdapter::CreateAdvertisementCallback& callback, const device::BluetoothAdapter::CreateAdvertisementCallback& callback,
const device::BluetoothAdapter::AdvertisementErrorCallback& error_callback) const device::BluetoothAdapter::AdvertisementErrorCallback& error_callback)
...@@ -25,9 +26,9 @@ BleAdvertisementSynchronizer::RegisterArgs::RegisterArgs( ...@@ -25,9 +26,9 @@ BleAdvertisementSynchronizer::RegisterArgs::RegisterArgs(
callback(callback), callback(callback),
error_callback(error_callback) {} error_callback(error_callback) {}
BleAdvertisementSynchronizer::RegisterArgs::~RegisterArgs() {} BleSynchronizer::RegisterArgs::~RegisterArgs() {}
BleAdvertisementSynchronizer::UnregisterArgs::UnregisterArgs( BleSynchronizer::UnregisterArgs::UnregisterArgs(
scoped_refptr<device::BluetoothAdvertisement> advertisement, scoped_refptr<device::BluetoothAdvertisement> advertisement,
const device::BluetoothAdvertisement::SuccessCallback& callback, const device::BluetoothAdvertisement::SuccessCallback& callback,
const device::BluetoothAdvertisement::ErrorCallback& error_callback) const device::BluetoothAdvertisement::ErrorCallback& error_callback)
...@@ -35,30 +36,56 @@ BleAdvertisementSynchronizer::UnregisterArgs::UnregisterArgs( ...@@ -35,30 +36,56 @@ BleAdvertisementSynchronizer::UnregisterArgs::UnregisterArgs(
callback(callback), callback(callback),
error_callback(error_callback) {} error_callback(error_callback) {}
BleAdvertisementSynchronizer::UnregisterArgs::~UnregisterArgs() {} BleSynchronizer::UnregisterArgs::~UnregisterArgs() {}
BleAdvertisementSynchronizer::Command::Command( BleSynchronizer::StartDiscoveryArgs::StartDiscoveryArgs(
std::unique_ptr<RegisterArgs> register_args) const device::BluetoothAdapter::DiscoverySessionCallback& callback,
const device::BluetoothAdapter::ErrorCallback& error_callback)
: callback(callback), error_callback(error_callback) {}
BleSynchronizer::StartDiscoveryArgs::~StartDiscoveryArgs() {}
BleSynchronizer::StopDiscoveryArgs::StopDiscoveryArgs(
base::WeakPtr<device::BluetoothDiscoverySession> discovery_session,
const base::Closure& callback,
const device::BluetoothDiscoverySession::ErrorCallback& error_callback)
: discovery_session(discovery_session),
callback(callback),
error_callback(error_callback) {}
BleSynchronizer::StopDiscoveryArgs::~StopDiscoveryArgs() {}
BleSynchronizer::Command::Command(std::unique_ptr<RegisterArgs> register_args)
: command_type(CommandType::REGISTER_ADVERTISEMENT), : command_type(CommandType::REGISTER_ADVERTISEMENT),
register_args(std::move(register_args)) {} register_args(std::move(register_args)) {}
BleAdvertisementSynchronizer::Command::Command( BleSynchronizer::Command::Command(
std::unique_ptr<UnregisterArgs> unregister_args) std::unique_ptr<UnregisterArgs> unregister_args)
: command_type(CommandType::UNREGISTER_ADVERTISEMENT), : command_type(CommandType::UNREGISTER_ADVERTISEMENT),
unregister_args(std::move(unregister_args)) {} unregister_args(std::move(unregister_args)) {}
BleAdvertisementSynchronizer::Command::~Command() {} BleSynchronizer::Command::Command(
std::unique_ptr<StartDiscoveryArgs> start_discovery_args)
: command_type(CommandType::START_DISCOVERY),
start_discovery_args(std::move(start_discovery_args)) {}
BleSynchronizer::Command::Command(
std::unique_ptr<StopDiscoveryArgs> stop_discovery_args)
: command_type(CommandType::STOP_DISCOVERY),
stop_discovery_args(std::move(stop_discovery_args)) {}
BleAdvertisementSynchronizer::BleAdvertisementSynchronizer( BleSynchronizer::Command::~Command() {}
BleSynchronizer::BleSynchronizer(
scoped_refptr<device::BluetoothAdapter> bluetooth_adapter) scoped_refptr<device::BluetoothAdapter> bluetooth_adapter)
: bluetooth_adapter_(bluetooth_adapter), : bluetooth_adapter_(bluetooth_adapter),
timer_(base::MakeUnique<base::OneShotTimer>()), timer_(base::MakeUnique<base::OneShotTimer>()),
clock_(base::MakeUnique<base::DefaultClock>()), clock_(base::MakeUnique<base::DefaultClock>()),
weak_ptr_factory_(this) {} weak_ptr_factory_(this) {}
BleAdvertisementSynchronizer::~BleAdvertisementSynchronizer() {} BleSynchronizer::~BleSynchronizer() {}
void BleAdvertisementSynchronizer::RegisterAdvertisement( void BleSynchronizer::RegisterAdvertisement(
std::unique_ptr<device::BluetoothAdvertisement::Data> advertisement_data, std::unique_ptr<device::BluetoothAdvertisement::Data> advertisement_data,
const device::BluetoothAdapter::CreateAdvertisementCallback& callback, const device::BluetoothAdapter::CreateAdvertisementCallback& callback,
const device::BluetoothAdapter::AdvertisementErrorCallback& const device::BluetoothAdapter::AdvertisementErrorCallback&
...@@ -68,7 +95,7 @@ void BleAdvertisementSynchronizer::RegisterAdvertisement( ...@@ -68,7 +95,7 @@ void BleAdvertisementSynchronizer::RegisterAdvertisement(
ProcessQueue(); ProcessQueue();
} }
void BleAdvertisementSynchronizer::UnregisterAdvertisement( void BleSynchronizer::UnregisterAdvertisement(
scoped_refptr<device::BluetoothAdvertisement> advertisement, scoped_refptr<device::BluetoothAdvertisement> advertisement,
const device::BluetoothAdvertisement::SuccessCallback& callback, const device::BluetoothAdvertisement::SuccessCallback& callback,
const device::BluetoothAdvertisement::ErrorCallback& error_callback) { const device::BluetoothAdvertisement::ErrorCallback& error_callback) {
...@@ -77,7 +104,24 @@ void BleAdvertisementSynchronizer::UnregisterAdvertisement( ...@@ -77,7 +104,24 @@ void BleAdvertisementSynchronizer::UnregisterAdvertisement(
ProcessQueue(); ProcessQueue();
} }
void BleAdvertisementSynchronizer::ProcessQueue() { void BleSynchronizer::StartDiscoverySession(
const device::BluetoothAdapter::DiscoverySessionCallback& callback,
const device::BluetoothAdapter::ErrorCallback& error_callback) {
command_queue_.emplace_back(
base::MakeUnique<StartDiscoveryArgs>(callback, error_callback));
ProcessQueue();
}
void BleSynchronizer::StopDiscoverySession(
base::WeakPtr<device::BluetoothDiscoverySession> discovery_session,
const base::Closure& callback,
const device::BluetoothDiscoverySession::ErrorCallback& error_callback) {
command_queue_.emplace_back(base::MakeUnique<StopDiscoveryArgs>(
discovery_session, callback, error_callback));
ProcessQueue();
}
void BleSynchronizer::ProcessQueue() {
if (command_queue_.empty()) if (command_queue_.empty())
return; return;
...@@ -98,31 +142,65 @@ void BleAdvertisementSynchronizer::ProcessQueue() { ...@@ -98,31 +142,65 @@ void BleAdvertisementSynchronizer::ProcessQueue() {
base::TimeDelta::FromMilliseconds(kTimeBetweenEachCommandMs)) { base::TimeDelta::FromMilliseconds(kTimeBetweenEachCommandMs)) {
timer_->Start(FROM_HERE, timer_->Start(FROM_HERE,
base::TimeDelta::FromMilliseconds(kTimeBetweenEachCommandMs), base::TimeDelta::FromMilliseconds(kTimeBetweenEachCommandMs),
base::Bind(&BleAdvertisementSynchronizer::ProcessQueue, base::Bind(&BleSynchronizer::ProcessQueue,
weak_ptr_factory_.GetWeakPtr())); weak_ptr_factory_.GetWeakPtr()));
return; return;
} }
last_command_timestamp_ = current_timestamp; last_command_timestamp_ = current_timestamp;
if (command_queue_.front().command_type == switch (command_queue_.front().command_type) {
CommandType::REGISTER_ADVERTISEMENT) { case CommandType::REGISTER_ADVERTISEMENT: {
RegisterArgs* register_args = command_queue_.front().register_args.get(); RegisterArgs* register_args = command_queue_.front().register_args.get();
DCHECK(register_args); DCHECK(register_args);
bluetooth_adapter_->RegisterAdvertisement(
bluetooth_adapter_->RegisterAdvertisement( std::move(register_args->advertisement_data), register_args->callback,
std::move(register_args->advertisement_data), register_args->callback, register_args->error_callback);
register_args->error_callback); break;
} else { }
DCHECK(command_queue_.front().command_type == case CommandType::UNREGISTER_ADVERTISEMENT: {
CommandType::UNREGISTER_ADVERTISEMENT); UnregisterArgs* unregister_args =
command_queue_.front().unregister_args.get();
UnregisterArgs* unregister_args = DCHECK(unregister_args);
command_queue_.front().unregister_args.get(); unregister_args->advertisement->Unregister(
DCHECK(unregister_args); unregister_args->callback, unregister_args->error_callback);
break;
unregister_args->advertisement->Unregister(unregister_args->callback, }
unregister_args->error_callback); case CommandType::START_DISCOVERY: {
StartDiscoveryArgs* start_discovery_args =
command_queue_.front().start_discovery_args.get();
DCHECK(start_discovery_args);
// Note: Ideally, we would use a filter for only LE devices here. However,
// using a filter here triggers a bug in some kernel implementations which
// causes LE scanning to toggle rapidly on and off. This can cause race
// conditions which result in Bluetooth bugs. See crbug.com/759090.
// TODO(mcchou): Once these issues have been resolved, add the filter
// back. See crbug.com/759091.
bluetooth_adapter_->StartDiscoverySession(
start_discovery_args->callback, start_discovery_args->error_callback);
break;
}
case CommandType::STOP_DISCOVERY: {
StopDiscoveryArgs* stop_discovery_args =
command_queue_.front().stop_discovery_args.get();
DCHECK(stop_discovery_args);
// If the discovery session has been deleted, there is nothing to stop.
if (!stop_discovery_args->discovery_session.get()) {
PA_LOG(WARNING) << "Could not process \"stop discovery\" command "
<< "because the DiscoverySession object passed is "
<< "deleted.";
break;
}
stop_discovery_args->discovery_session->Stop(
stop_discovery_args->callback, stop_discovery_args->error_callback);
break;
}
default:
NOTREACHED();
return;
} }
command_queue_.pop_front(); command_queue_.pop_front();
...@@ -130,9 +208,8 @@ void BleAdvertisementSynchronizer::ProcessQueue() { ...@@ -130,9 +208,8 @@ void BleAdvertisementSynchronizer::ProcessQueue() {
ProcessQueue(); ProcessQueue();
} }
void BleAdvertisementSynchronizer::SetTestDoubles( void BleSynchronizer::SetTestDoubles(std::unique_ptr<base::Timer> test_timer,
std::unique_ptr<base::Timer> test_timer, std::unique_ptr<base::Clock> test_clock) {
std::unique_ptr<base::Clock> test_clock) {
timer_ = std::move(test_timer); timer_ = std::move(test_timer);
clock_ = std::move(test_clock); clock_ = std::move(test_clock);
} }
......
...@@ -15,34 +15,49 @@ ...@@ -15,34 +15,49 @@
#include "base/timer/timer.h" #include "base/timer/timer.h"
#include "device/bluetooth/bluetooth_adapter.h" #include "device/bluetooth/bluetooth_adapter.h"
#include "device/bluetooth/bluetooth_advertisement.h" #include "device/bluetooth/bluetooth_advertisement.h"
#include "device/bluetooth/bluetooth_discovery_session.h"
namespace chromeos { namespace chromeos {
namespace tether { namespace tether {
// Ensures that BLE advertisement registration/unregistration commands are not // Ensures that BLE advertisement registration/unregistration commands and
// sent back-to-back. Because Bluetooth race conditions exist in the kernel, // discovery start/stop are not sent too close to each other. Because Bluetooth
// this strategy is necessary to work around potential bugs. Essentially, this // race conditions exist in the kernel, this strategy is necessary to work
// class is a synchronization wrapper around the Bluetooth API. // around potential bugs. Essentially, this class is a synchronization wrapper
class BleAdvertisementSynchronizer { // around the Bluetooth API.
class BleSynchronizer {
public: public:
BleAdvertisementSynchronizer( BleSynchronizer(scoped_refptr<device::BluetoothAdapter> bluetooth_adapter);
scoped_refptr<device::BluetoothAdapter> bluetooth_adapter); virtual ~BleSynchronizer();
virtual ~BleAdvertisementSynchronizer();
// Advertisement wrappers.
void RegisterAdvertisement( void RegisterAdvertisement(
std::unique_ptr<device::BluetoothAdvertisement::Data> advertisement_data, std::unique_ptr<device::BluetoothAdvertisement::Data> advertisement_data,
const device::BluetoothAdapter::CreateAdvertisementCallback& callback, const device::BluetoothAdapter::CreateAdvertisementCallback& callback,
const device::BluetoothAdapter::AdvertisementErrorCallback& const device::BluetoothAdapter::AdvertisementErrorCallback&
error_callback); error_callback);
void UnregisterAdvertisement( void UnregisterAdvertisement(
scoped_refptr<device::BluetoothAdvertisement> advertisement, scoped_refptr<device::BluetoothAdvertisement> advertisement,
const device::BluetoothAdvertisement::SuccessCallback& success_callback, const device::BluetoothAdvertisement::SuccessCallback& success_callback,
const device::BluetoothAdvertisement::ErrorCallback& error_callback); const device::BluetoothAdvertisement::ErrorCallback& error_callback);
// Discovery session wrappers.
void StartDiscoverySession(
const device::BluetoothAdapter::DiscoverySessionCallback& callback,
const device::BluetoothAdapter::ErrorCallback& error_callback);
void StopDiscoverySession(
base::WeakPtr<device::BluetoothDiscoverySession> discovery_session,
const base::Closure& callback,
const device::BluetoothDiscoverySession::ErrorCallback& error_callback);
protected: protected:
enum class CommandType { REGISTER_ADVERTISEMENT, UNREGISTER_ADVERTISEMENT }; enum class CommandType {
REGISTER_ADVERTISEMENT,
UNREGISTER_ADVERTISEMENT,
START_DISCOVERY,
STOP_DISCOVERY
};
struct RegisterArgs { struct RegisterArgs {
RegisterArgs( RegisterArgs(
...@@ -70,14 +85,40 @@ class BleAdvertisementSynchronizer { ...@@ -70,14 +85,40 @@ class BleAdvertisementSynchronizer {
device::BluetoothAdvertisement::ErrorCallback error_callback; device::BluetoothAdvertisement::ErrorCallback error_callback;
}; };
struct StartDiscoveryArgs {
StartDiscoveryArgs(
const device::BluetoothAdapter::DiscoverySessionCallback& callback,
const device::BluetoothAdapter::ErrorCallback& error_callback);
virtual ~StartDiscoveryArgs();
device::BluetoothAdapter::DiscoverySessionCallback callback;
device::BluetoothAdapter::ErrorCallback error_callback;
};
struct StopDiscoveryArgs {
StopDiscoveryArgs(
base::WeakPtr<device::BluetoothDiscoverySession> discovery_session,
const base::Closure& callback,
const device::BluetoothDiscoverySession::ErrorCallback& error_callback);
virtual ~StopDiscoveryArgs();
base::WeakPtr<device::BluetoothDiscoverySession> discovery_session;
base::Closure callback;
device::BluetoothDiscoverySession::ErrorCallback error_callback;
};
struct Command { struct Command {
explicit Command(std::unique_ptr<RegisterArgs> register_args); explicit Command(std::unique_ptr<RegisterArgs> register_args);
explicit Command(std::unique_ptr<UnregisterArgs> unregister_args); explicit Command(std::unique_ptr<UnregisterArgs> unregister_args);
explicit Command(std::unique_ptr<StartDiscoveryArgs> start_discovery_args);
explicit Command(std::unique_ptr<StopDiscoveryArgs> stop_discovery_args);
virtual ~Command(); virtual ~Command();
CommandType command_type; CommandType command_type;
std::unique_ptr<RegisterArgs> register_args; std::unique_ptr<RegisterArgs> register_args;
std::unique_ptr<UnregisterArgs> unregister_args; std::unique_ptr<UnregisterArgs> unregister_args;
std::unique_ptr<StartDiscoveryArgs> start_discovery_args;
std::unique_ptr<StopDiscoveryArgs> stop_discovery_args;
}; };
virtual void ProcessQueue(); virtual void ProcessQueue();
...@@ -85,7 +126,7 @@ class BleAdvertisementSynchronizer { ...@@ -85,7 +126,7 @@ class BleAdvertisementSynchronizer {
const std::deque<Command>& command_queue() { return command_queue_; } const std::deque<Command>& command_queue() { return command_queue_; }
private: private:
friend class BleAdvertisementSynchronizerTest; friend class BleSynchronizerTest;
void SetTestDoubles(std::unique_ptr<base::Timer> test_timer, void SetTestDoubles(std::unique_ptr<base::Timer> test_timer,
std::unique_ptr<base::Clock> test_clock); std::unique_ptr<base::Clock> test_clock);
...@@ -96,9 +137,9 @@ class BleAdvertisementSynchronizer { ...@@ -96,9 +137,9 @@ class BleAdvertisementSynchronizer {
std::unique_ptr<base::Timer> timer_; std::unique_ptr<base::Timer> timer_;
std::unique_ptr<base::Clock> clock_; std::unique_ptr<base::Clock> clock_;
base::Time last_command_timestamp_; base::Time last_command_timestamp_;
base::WeakPtrFactory<BleAdvertisementSynchronizer> weak_ptr_factory_; base::WeakPtrFactory<BleSynchronizer> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(BleAdvertisementSynchronizer); DISALLOW_COPY_AND_ASSIGN(BleSynchronizer);
}; };
} // namespace tether } // namespace tether
......
...@@ -8,8 +8,8 @@ ...@@ -8,8 +8,8 @@
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "chromeos/components/tether/ble_advertisement_synchronizer.h"
#include "chromeos/components/tether/ble_constants.h" #include "chromeos/components/tether/ble_constants.h"
#include "chromeos/components/tether/ble_synchronizer.h"
#include "components/cryptauth/remote_device.h" #include "components/cryptauth/remote_device.h"
#include "components/proximity_auth/logging/logging.h" #include "components/proximity_auth/logging/logging.h"
...@@ -32,12 +32,12 @@ std::unique_ptr<ErrorTolerantBleAdvertisement> ...@@ -32,12 +32,12 @@ std::unique_ptr<ErrorTolerantBleAdvertisement>
ErrorTolerantBleAdvertisementImpl::Factory::NewInstance( ErrorTolerantBleAdvertisementImpl::Factory::NewInstance(
const std::string& device_id, const std::string& device_id,
std::unique_ptr<cryptauth::DataWithTimestamp> advertisement_data, std::unique_ptr<cryptauth::DataWithTimestamp> advertisement_data,
BleAdvertisementSynchronizer* ble_advertisement_synchronizer) { BleSynchronizer* ble_synchronizer) {
if (!factory_instance_) if (!factory_instance_)
factory_instance_ = new Factory(); factory_instance_ = new Factory();
return factory_instance_->BuildInstance( return factory_instance_->BuildInstance(
device_id, std::move(advertisement_data), ble_advertisement_synchronizer); device_id, std::move(advertisement_data), ble_synchronizer);
} }
// static // static
...@@ -50,9 +50,9 @@ std::unique_ptr<ErrorTolerantBleAdvertisement> ...@@ -50,9 +50,9 @@ std::unique_ptr<ErrorTolerantBleAdvertisement>
ErrorTolerantBleAdvertisementImpl::Factory::BuildInstance( ErrorTolerantBleAdvertisementImpl::Factory::BuildInstance(
const std::string& device_id, const std::string& device_id,
std::unique_ptr<cryptauth::DataWithTimestamp> advertisement_data, std::unique_ptr<cryptauth::DataWithTimestamp> advertisement_data,
BleAdvertisementSynchronizer* ble_advertisement_synchronizer) { BleSynchronizer* ble_synchronizer) {
return base::MakeUnique<ErrorTolerantBleAdvertisementImpl>( return base::MakeUnique<ErrorTolerantBleAdvertisementImpl>(
device_id, std::move(advertisement_data), ble_advertisement_synchronizer); device_id, std::move(advertisement_data), ble_synchronizer);
} }
ErrorTolerantBleAdvertisementImpl::Factory::~Factory() {} ErrorTolerantBleAdvertisementImpl::Factory::~Factory() {}
...@@ -60,10 +60,10 @@ ErrorTolerantBleAdvertisementImpl::Factory::~Factory() {} ...@@ -60,10 +60,10 @@ ErrorTolerantBleAdvertisementImpl::Factory::~Factory() {}
ErrorTolerantBleAdvertisementImpl::ErrorTolerantBleAdvertisementImpl( ErrorTolerantBleAdvertisementImpl::ErrorTolerantBleAdvertisementImpl(
const std::string& device_id, const std::string& device_id,
std::unique_ptr<cryptauth::DataWithTimestamp> advertisement_data, std::unique_ptr<cryptauth::DataWithTimestamp> advertisement_data,
BleAdvertisementSynchronizer* ble_advertisement_synchronizer) BleSynchronizer* ble_synchronizer)
: ErrorTolerantBleAdvertisement(device_id), : ErrorTolerantBleAdvertisement(device_id),
advertisement_data_(std::move(advertisement_data)), advertisement_data_(std::move(advertisement_data)),
ble_advertisement_synchronizer_(ble_advertisement_synchronizer), ble_synchronizer_(ble_synchronizer),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
UpdateRegistrationStatus(); UpdateRegistrationStatus();
} }
...@@ -124,7 +124,7 @@ void ErrorTolerantBleAdvertisementImpl::AttemptRegistration() { ...@@ -124,7 +124,7 @@ void ErrorTolerantBleAdvertisementImpl::AttemptRegistration() {
advertisement_data->set_service_uuids(CreateServiceUuids()); advertisement_data->set_service_uuids(CreateServiceUuids());
advertisement_data->set_service_data(CreateServiceData()); advertisement_data->set_service_data(CreateServiceData());
ble_advertisement_synchronizer_->RegisterAdvertisement( ble_synchronizer_->RegisterAdvertisement(
std::move(advertisement_data), std::move(advertisement_data),
base::Bind(&ErrorTolerantBleAdvertisementImpl::OnAdvertisementRegistered, base::Bind(&ErrorTolerantBleAdvertisementImpl::OnAdvertisementRegistered,
weak_ptr_factory_.GetWeakPtr()), weak_ptr_factory_.GetWeakPtr()),
...@@ -145,7 +145,7 @@ void ErrorTolerantBleAdvertisementImpl::AttemptUnregistration() { ...@@ -145,7 +145,7 @@ void ErrorTolerantBleAdvertisementImpl::AttemptUnregistration() {
unregistration_in_progress_ = true; unregistration_in_progress_ = true;
ble_advertisement_synchronizer_->UnregisterAdvertisement( ble_synchronizer_->UnregisterAdvertisement(
advertisement_, advertisement_,
base::Bind( base::Bind(
&ErrorTolerantBleAdvertisementImpl::OnAdvertisementUnregistered, &ErrorTolerantBleAdvertisementImpl::OnAdvertisementUnregistered,
......
...@@ -18,7 +18,7 @@ namespace chromeos { ...@@ -18,7 +18,7 @@ namespace chromeos {
namespace tether { namespace tether {
class BleAdvertisementSynchronizer; class BleSynchronizer;
// Concrete ErrorTolerantBleAdvertisement implementation. // Concrete ErrorTolerantBleAdvertisement implementation.
class ErrorTolerantBleAdvertisementImpl class ErrorTolerantBleAdvertisementImpl
...@@ -30,7 +30,7 @@ class ErrorTolerantBleAdvertisementImpl ...@@ -30,7 +30,7 @@ class ErrorTolerantBleAdvertisementImpl
static std::unique_ptr<ErrorTolerantBleAdvertisement> NewInstance( static std::unique_ptr<ErrorTolerantBleAdvertisement> NewInstance(
const std::string& device_id, const std::string& device_id,
std::unique_ptr<cryptauth::DataWithTimestamp> advertisement_data, std::unique_ptr<cryptauth::DataWithTimestamp> advertisement_data,
BleAdvertisementSynchronizer* ble_advertisement_synchronizer); BleSynchronizer* ble_synchronizer);
static void SetInstanceForTesting(Factory* factory); static void SetInstanceForTesting(Factory* factory);
...@@ -38,7 +38,7 @@ class ErrorTolerantBleAdvertisementImpl ...@@ -38,7 +38,7 @@ class ErrorTolerantBleAdvertisementImpl
virtual std::unique_ptr<ErrorTolerantBleAdvertisement> BuildInstance( virtual std::unique_ptr<ErrorTolerantBleAdvertisement> BuildInstance(
const std::string& device_id, const std::string& device_id,
std::unique_ptr<cryptauth::DataWithTimestamp> advertisement_data, std::unique_ptr<cryptauth::DataWithTimestamp> advertisement_data,
BleAdvertisementSynchronizer* ble_advertisement_synchronizer); BleSynchronizer* ble_synchronizer);
virtual ~Factory(); virtual ~Factory();
...@@ -49,7 +49,7 @@ class ErrorTolerantBleAdvertisementImpl ...@@ -49,7 +49,7 @@ class ErrorTolerantBleAdvertisementImpl
ErrorTolerantBleAdvertisementImpl( ErrorTolerantBleAdvertisementImpl(
const std::string& device_id, const std::string& device_id,
std::unique_ptr<cryptauth::DataWithTimestamp> advertisement_data, std::unique_ptr<cryptauth::DataWithTimestamp> advertisement_data,
BleAdvertisementSynchronizer* ble_advertisement_synchronizer); BleSynchronizer* ble_synchronizer);
~ErrorTolerantBleAdvertisementImpl() override; ~ErrorTolerantBleAdvertisementImpl() override;
// ErrorTolerantBleAdvertisement: // ErrorTolerantBleAdvertisement:
...@@ -88,7 +88,7 @@ class ErrorTolerantBleAdvertisementImpl ...@@ -88,7 +88,7 @@ class ErrorTolerantBleAdvertisementImpl
std::string device_id_; std::string device_id_;
std::unique_ptr<cryptauth::DataWithTimestamp> advertisement_data_; std::unique_ptr<cryptauth::DataWithTimestamp> advertisement_data_;
BleAdvertisementSynchronizer* ble_advertisement_synchronizer_; BleSynchronizer* ble_synchronizer_;
bool registration_in_progress_ = false; bool registration_in_progress_ = false;
bool unregistration_in_progress_ = false; bool unregistration_in_progress_ = false;
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
#include "base/callback_forward.h" #include "base/callback_forward.h"
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "chromeos/components/tether/ble_constants.h" #include "chromeos/components/tether/ble_constants.h"
#include "chromeos/components/tether/fake_ble_advertisement_synchronizer.h" #include "chromeos/components/tether/fake_ble_synchronizer.h"
#include "device/bluetooth/bluetooth_advertisement.h" #include "device/bluetooth/bluetooth_advertisement.h"
#include "device/bluetooth/test/mock_bluetooth_advertisement.h" #include "device/bluetooth/test/mock_bluetooth_advertisement.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
...@@ -38,7 +38,7 @@ class ErrorTolerantBleAdvertisementImplTest : public testing::Test { ...@@ -38,7 +38,7 @@ class ErrorTolerantBleAdvertisementImplTest : public testing::Test {
fake_advertisement_ = nullptr; fake_advertisement_ = nullptr;
stopped_callback_called_ = false; stopped_callback_called_ = false;
fake_synchronizer_ = base::MakeUnique<FakeBleAdvertisementSynchronizer>(); fake_synchronizer_ = base::MakeUnique<FakeBleSynchronizer>();
advertisement_ = base::MakeUnique<ErrorTolerantBleAdvertisementImpl>( advertisement_ = base::MakeUnique<ErrorTolerantBleAdvertisementImpl>(
kDeviceId, kDeviceId,
...@@ -110,7 +110,7 @@ class ErrorTolerantBleAdvertisementImplTest : public testing::Test { ...@@ -110,7 +110,7 @@ class ErrorTolerantBleAdvertisementImplTest : public testing::Test {
const std::unique_ptr<cryptauth::DataWithTimestamp> fake_advertisement_data_; const std::unique_ptr<cryptauth::DataWithTimestamp> fake_advertisement_data_;
std::unique_ptr<FakeBleAdvertisementSynchronizer> fake_synchronizer_; std::unique_ptr<FakeBleSynchronizer> fake_synchronizer_;
device::MockBluetoothAdvertisement* fake_advertisement_; device::MockBluetoothAdvertisement* fake_advertisement_;
......
...@@ -2,23 +2,23 @@ ...@@ -2,23 +2,23 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "chromeos/components/tether/fake_ble_advertisement_synchronizer.h" #include "chromeos/components/tether/fake_ble_synchronizer.h"
namespace chromeos { namespace chromeos {
namespace tether { namespace tether {
FakeBleAdvertisementSynchronizer::FakeBleAdvertisementSynchronizer() FakeBleSynchronizer::FakeBleSynchronizer()
: BleAdvertisementSynchronizer(nullptr /* bluetooth_adapter */) {} : BleSynchronizer(nullptr /* bluetooth_adapter */) {}
FakeBleAdvertisementSynchronizer::~FakeBleAdvertisementSynchronizer() {} FakeBleSynchronizer::~FakeBleSynchronizer() {}
size_t FakeBleAdvertisementSynchronizer::GetNumCommands() { size_t FakeBleSynchronizer::GetNumCommands() {
return command_queue().size(); return command_queue().size();
} }
device::BluetoothAdvertisement::Data& device::BluetoothAdvertisement::Data& FakeBleSynchronizer::GetAdvertisementData(
FakeBleAdvertisementSynchronizer::GetAdvertisementData(size_t index) { size_t index) {
DCHECK(command_queue().size() >= index); DCHECK(command_queue().size() >= index);
DCHECK(command_queue()[index].command_type == DCHECK(command_queue()[index].command_type ==
CommandType::REGISTER_ADVERTISEMENT); CommandType::REGISTER_ADVERTISEMENT);
...@@ -26,7 +26,7 @@ FakeBleAdvertisementSynchronizer::GetAdvertisementData(size_t index) { ...@@ -26,7 +26,7 @@ FakeBleAdvertisementSynchronizer::GetAdvertisementData(size_t index) {
} }
const device::BluetoothAdapter::CreateAdvertisementCallback& const device::BluetoothAdapter::CreateAdvertisementCallback&
FakeBleAdvertisementSynchronizer::GetRegisterCallback(size_t index) { FakeBleSynchronizer::GetRegisterCallback(size_t index) {
DCHECK(command_queue().size() >= index); DCHECK(command_queue().size() >= index);
DCHECK(command_queue()[index].command_type == DCHECK(command_queue()[index].command_type ==
CommandType::REGISTER_ADVERTISEMENT); CommandType::REGISTER_ADVERTISEMENT);
...@@ -34,7 +34,7 @@ FakeBleAdvertisementSynchronizer::GetRegisterCallback(size_t index) { ...@@ -34,7 +34,7 @@ FakeBleAdvertisementSynchronizer::GetRegisterCallback(size_t index) {
} }
const device::BluetoothAdapter::AdvertisementErrorCallback& const device::BluetoothAdapter::AdvertisementErrorCallback&
FakeBleAdvertisementSynchronizer::GetRegisterErrorCallback(size_t index) { FakeBleSynchronizer::GetRegisterErrorCallback(size_t index) {
DCHECK(command_queue().size() >= index); DCHECK(command_queue().size() >= index);
DCHECK(command_queue()[index].command_type == DCHECK(command_queue()[index].command_type ==
CommandType::REGISTER_ADVERTISEMENT); CommandType::REGISTER_ADVERTISEMENT);
...@@ -42,7 +42,7 @@ FakeBleAdvertisementSynchronizer::GetRegisterErrorCallback(size_t index) { ...@@ -42,7 +42,7 @@ FakeBleAdvertisementSynchronizer::GetRegisterErrorCallback(size_t index) {
} }
const device::BluetoothAdvertisement::SuccessCallback& const device::BluetoothAdvertisement::SuccessCallback&
FakeBleAdvertisementSynchronizer::GetUnregisterCallback(size_t index) { FakeBleSynchronizer::GetUnregisterCallback(size_t index) {
DCHECK(command_queue().size() >= index); DCHECK(command_queue().size() >= index);
DCHECK(command_queue()[index].command_type == DCHECK(command_queue()[index].command_type ==
CommandType::UNREGISTER_ADVERTISEMENT); CommandType::UNREGISTER_ADVERTISEMENT);
...@@ -50,15 +50,43 @@ FakeBleAdvertisementSynchronizer::GetUnregisterCallback(size_t index) { ...@@ -50,15 +50,43 @@ FakeBleAdvertisementSynchronizer::GetUnregisterCallback(size_t index) {
} }
const device::BluetoothAdvertisement::ErrorCallback& const device::BluetoothAdvertisement::ErrorCallback&
FakeBleAdvertisementSynchronizer::GetUnregisterErrorCallback(size_t index) { FakeBleSynchronizer::GetUnregisterErrorCallback(size_t index) {
DCHECK(command_queue().size() >= index); DCHECK(command_queue().size() >= index);
DCHECK(command_queue()[index].command_type == DCHECK(command_queue()[index].command_type ==
CommandType::UNREGISTER_ADVERTISEMENT); CommandType::UNREGISTER_ADVERTISEMENT);
return command_queue()[index].unregister_args->error_callback; return command_queue()[index].unregister_args->error_callback;
} }
const device::BluetoothAdapter::DiscoverySessionCallback&
FakeBleSynchronizer::GetStartDiscoveryCallback(size_t index) {
DCHECK(command_queue().size() >= index);
DCHECK(command_queue()[index].command_type == CommandType::START_DISCOVERY);
return command_queue()[index].start_discovery_args->callback;
}
const device::BluetoothAdapter::ErrorCallback&
FakeBleSynchronizer::GetStartDiscoveryErrorCallback(size_t index) {
DCHECK(command_queue().size() >= index);
DCHECK(command_queue()[index].command_type == CommandType::START_DISCOVERY);
return command_queue()[index].start_discovery_args->error_callback;
}
const base::Closure& FakeBleSynchronizer::GetStopDiscoveryCallback(
size_t index) {
DCHECK(command_queue().size() >= index);
DCHECK(command_queue()[index].command_type == CommandType::STOP_DISCOVERY);
return command_queue()[index].stop_discovery_args->callback;
}
const device::BluetoothDiscoverySession::ErrorCallback&
FakeBleSynchronizer::GetStopDiscoveryErrorCallback(size_t index) {
DCHECK(command_queue().size() >= index);
DCHECK(command_queue()[index].command_type == CommandType::STOP_DISCOVERY);
return command_queue()[index].stop_discovery_args->error_callback;
}
// Intentionally left blank. The fake should not actually issue any commands. // Intentionally left blank. The fake should not actually issue any commands.
void FakeBleAdvertisementSynchronizer::ProcessQueue() {} void FakeBleSynchronizer::ProcessQueue() {}
} // namespace tether } // namespace tether
......
...@@ -2,12 +2,12 @@ ...@@ -2,12 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef CHROMEOS_COMPONENTS_TETHER_FAKE_BLE_ADVERTISEMENT_SYNCHRONIZER_H_ #ifndef CHROMEOS_COMPONENTS_TETHER_FAKE_BLE_SYNCHRONIZER_H_
#define CHROMEOS_COMPONENTS_TETHER_FAKE_BLE_ADVERTISEMENT_SYNCHRONIZER_H_ #define CHROMEOS_COMPONENTS_TETHER_FAKE_BLE_SYNCHRONIZER_H_
#include "base/callback_forward.h" #include "base/callback_forward.h"
#include "base/macros.h" #include "base/macros.h"
#include "chromeos/components/tether/ble_advertisement_synchronizer.h" #include "chromeos/components/tether/ble_synchronizer.h"
#include "device/bluetooth/bluetooth_adapter.h" #include "device/bluetooth/bluetooth_adapter.h"
#include "device/bluetooth/bluetooth_advertisement.h" #include "device/bluetooth/bluetooth_advertisement.h"
...@@ -15,11 +15,11 @@ namespace chromeos { ...@@ -15,11 +15,11 @@ namespace chromeos {
namespace tether { namespace tether {
// Test double for BleAdvertisementSynchronizer. // Test double for BleSynchronizer.
class FakeBleAdvertisementSynchronizer : public BleAdvertisementSynchronizer { class FakeBleSynchronizer : public BleSynchronizer {
public: public:
FakeBleAdvertisementSynchronizer(); FakeBleSynchronizer();
~FakeBleAdvertisementSynchronizer() override; ~FakeBleSynchronizer() override;
size_t GetNumCommands(); size_t GetNumCommands();
...@@ -34,15 +34,25 @@ class FakeBleAdvertisementSynchronizer : public BleAdvertisementSynchronizer { ...@@ -34,15 +34,25 @@ class FakeBleAdvertisementSynchronizer : public BleAdvertisementSynchronizer {
const device::BluetoothAdvertisement::ErrorCallback& const device::BluetoothAdvertisement::ErrorCallback&
GetUnregisterErrorCallback(size_t index); GetUnregisterErrorCallback(size_t index);
const device::BluetoothAdapter::DiscoverySessionCallback&
GetStartDiscoveryCallback(size_t index);
const device::BluetoothAdapter::ErrorCallback& GetStartDiscoveryErrorCallback(
size_t index);
const base::Closure& GetStopDiscoveryCallback(size_t index);
const device::BluetoothDiscoverySession::ErrorCallback&
GetStopDiscoveryErrorCallback(size_t index);
protected: protected:
// BleSynchronizer:
void ProcessQueue() override; void ProcessQueue() override;
private: private:
DISALLOW_COPY_AND_ASSIGN(FakeBleAdvertisementSynchronizer); DISALLOW_COPY_AND_ASSIGN(FakeBleSynchronizer);
}; };
} // namespace tether } // namespace tether
} // namespace chromeos } // namespace chromeos
#endif // CHROMEOS_COMPONENTS_TETHER_FAKE_BLE_ADVERTISEMENT_SYNCHRONIZER_H_ #endif // CHROMEOS_COMPONENTS_TETHER_FAKE_BLE_SYNCHRONIZER_H_
...@@ -8,8 +8,8 @@ ...@@ -8,8 +8,8 @@
#include "chromeos/components/tether/active_host.h" #include "chromeos/components/tether/active_host.h"
#include "chromeos/components/tether/active_host_network_state_updater.h" #include "chromeos/components/tether/active_host_network_state_updater.h"
#include "chromeos/components/tether/ble_advertisement_device_queue.h" #include "chromeos/components/tether/ble_advertisement_device_queue.h"
#include "chromeos/components/tether/ble_advertisement_synchronizer.h"
#include "chromeos/components/tether/ble_connection_manager.h" #include "chromeos/components/tether/ble_connection_manager.h"
#include "chromeos/components/tether/ble_synchronizer.h"
#include "chromeos/components/tether/crash_recovery_manager.h" #include "chromeos/components/tether/crash_recovery_manager.h"
#include "chromeos/components/tether/device_id_tether_network_guid_map.h" #include "chromeos/components/tether/device_id_tether_network_guid_map.h"
#include "chromeos/components/tether/disconnect_tethering_request_sender.h" #include "chromeos/components/tether/disconnect_tethering_request_sender.h"
...@@ -193,13 +193,12 @@ void InitializerImpl::CreateComponent() { ...@@ -193,13 +193,12 @@ void InitializerImpl::CreateComponent() {
cryptauth_service_->GetCryptAuthDeviceManager()); cryptauth_service_->GetCryptAuthDeviceManager());
ble_advertisement_device_queue_ = ble_advertisement_device_queue_ =
base::MakeUnique<BleAdvertisementDeviceQueue>(); base::MakeUnique<BleAdvertisementDeviceQueue>();
ble_advertisement_synchronizer_ = ble_synchronizer_ = base::MakeUnique<BleSynchronizer>(adapter_);
base::MakeUnique<BleAdvertisementSynchronizer>(adapter_);
ble_advertiser_ = base::MakeUnique<BleAdvertiser>( ble_advertiser_ = base::MakeUnique<BleAdvertiser>(
local_device_data_provider_.get(), remote_beacon_seed_fetcher_.get(), local_device_data_provider_.get(), remote_beacon_seed_fetcher_.get(),
ble_advertisement_synchronizer_.get()); ble_synchronizer_.get());
ble_scanner_ = ble_scanner_ = base::MakeUnique<BleScanner>(
base::MakeUnique<BleScanner>(adapter_, local_device_data_provider_.get()); adapter_, local_device_data_provider_.get(), ble_synchronizer_.get());
ble_connection_manager_ = base::MakeUnique<BleConnectionManager>( ble_connection_manager_ = base::MakeUnique<BleConnectionManager>(
cryptauth_service_, adapter_, ble_advertisement_device_queue_.get(), cryptauth_service_, adapter_, ble_advertisement_device_queue_.get(),
ble_advertiser_.get(), ble_scanner_.get()); ble_advertiser_.get(), ble_scanner_.get());
...@@ -373,7 +372,7 @@ void InitializerImpl::FinishAsynchronousShutdownIfPossible() { ...@@ -373,7 +372,7 @@ void InitializerImpl::FinishAsynchronousShutdownIfPossible() {
ble_connection_manager_.reset(); ble_connection_manager_.reset();
ble_scanner_.reset(); ble_scanner_.reset();
ble_advertiser_.reset(); ble_advertiser_.reset();
ble_advertisement_synchronizer_.reset(); ble_synchronizer_.reset();
ble_advertisement_device_queue_.reset(); ble_advertisement_device_queue_.reset();
remote_beacon_seed_fetcher_.reset(); remote_beacon_seed_fetcher_.reset();
local_device_data_provider_.reset(); local_device_data_provider_.reset();
......
...@@ -40,8 +40,8 @@ namespace tether { ...@@ -40,8 +40,8 @@ namespace tether {
class ActiveHost; class ActiveHost;
class ActiveHostNetworkStateUpdater; class ActiveHostNetworkStateUpdater;
class BleAdvertisementDeviceQueue; class BleAdvertisementDeviceQueue;
class BleAdvertisementSynchronizer;
class BleConnectionManager; class BleConnectionManager;
class BleSynchronizer;
class CrashRecoveryManager; class CrashRecoveryManager;
class NetworkConnectionHandlerTetherDelegate; class NetworkConnectionHandlerTetherDelegate;
class DeviceIdTetherNetworkGuidMap; class DeviceIdTetherNetworkGuidMap;
...@@ -156,7 +156,7 @@ class InitializerImpl : public Initializer, ...@@ -156,7 +156,7 @@ class InitializerImpl : public Initializer,
std::unique_ptr<cryptauth::RemoteBeaconSeedFetcher> std::unique_ptr<cryptauth::RemoteBeaconSeedFetcher>
remote_beacon_seed_fetcher_; remote_beacon_seed_fetcher_;
std::unique_ptr<BleAdvertisementDeviceQueue> ble_advertisement_device_queue_; std::unique_ptr<BleAdvertisementDeviceQueue> ble_advertisement_device_queue_;
std::unique_ptr<BleAdvertisementSynchronizer> ble_advertisement_synchronizer_; std::unique_ptr<BleSynchronizer> ble_synchronizer_;
std::unique_ptr<BleAdvertiser> ble_advertiser_; std::unique_ptr<BleAdvertiser> ble_advertiser_;
std::unique_ptr<BleScanner> ble_scanner_; std::unique_ptr<BleScanner> ble_scanner_;
std::unique_ptr<BleConnectionManager> ble_connection_manager_; std::unique_ptr<BleConnectionManager> ble_connection_manager_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment