Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(128)

Side by Side Diff: chromeos/components/tether/ble_advertiser.cc

Issue 2972263002: [CrOS Tether] Do not register a new Bluetooth advertisement until any previous identical advertisem… (Closed)
Patch Set: Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chromeos/components/tether/ble_advertiser.h" 5 #include "chromeos/components/tether/ble_advertiser.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "chromeos/components/tether/ble_constants.h" 8 #include "chromeos/components/tether/ble_constants.h"
9 #include "components/cryptauth/local_device_data_provider.h" 9 #include "components/cryptauth/local_device_data_provider.h"
10 #include "components/cryptauth/proto/cryptauth_api.pb.h" 10 #include "components/cryptauth/proto/cryptauth_api.pb.h"
11 #include "components/cryptauth/remote_beacon_seed_fetcher.h" 11 #include "components/cryptauth/remote_beacon_seed_fetcher.h"
12 #include "components/proximity_auth/logging/logging.h" 12 #include "components/proximity_auth/logging/logging.h"
13 #include "device/bluetooth/bluetooth_advertisement.h" 13 #include "device/bluetooth/bluetooth_advertisement.h"
14 14
15 namespace chromeos { 15 namespace chromeos {
16 16
17 namespace tether { 17 namespace tether {
18 18
19 namespace { 19 namespace {
20 20
21 uint8_t kInvertedConnectionFlag = 0x01; 21 uint8_t kInvertedConnectionFlag = 0x01;
22 22
23 } // namespace 23 } // namespace
24 24
25 BleAdvertiser::IndividualAdvertisement::IndividualAdvertisement( 25 BleAdvertiser::IndividualAdvertisement::IndividualAdvertisement(
26 const std::string& device_id, 26 const std::string& device_id,
27 scoped_refptr<device::BluetoothAdapter> adapter, 27 scoped_refptr<device::BluetoothAdapter> adapter,
28 std::unique_ptr<cryptauth::DataWithTimestamp> advertisement_data) 28 std::unique_ptr<cryptauth::DataWithTimestamp> advertisement_data,
29 const base::Closure& on_advertisement_unregistered_callback,
30 std::unordered_set<std::string>* active_advertisement_device_ids_set)
29 : device_id_(device_id), 31 : device_id_(device_id),
30 adapter_(adapter), 32 adapter_(adapter),
31 advertisement_data_(std::move(advertisement_data)), 33 advertisement_data_(std::move(advertisement_data)),
32 is_initializing_advertising_(false), 34 is_initializing_advertising_(false),
33 advertisement_(nullptr), 35 advertisement_(nullptr),
36 on_advertisement_unregistered_callback_(
37 on_advertisement_unregistered_callback),
38 active_advertisement_device_ids_set_(active_advertisement_device_ids_set),
34 weak_ptr_factory_(this) { 39 weak_ptr_factory_(this) {
35 adapter_->AddObserver(this); 40 adapter_->AddObserver(this);
36 AdvertiseIfPossible(); 41 AdvertiseIfPossible();
37 } 42 }
38 43
39 BleAdvertiser::IndividualAdvertisement::~IndividualAdvertisement() { 44 BleAdvertiser::IndividualAdvertisement::~IndividualAdvertisement() {
40 if (advertisement_) { 45 if (advertisement_) {
41 advertisement_->Unregister( 46 advertisement_->Unregister(
42 base::Bind(&base::DoNothing), 47 on_advertisement_unregistered_callback_,
43 base::Bind(&IndividualAdvertisement::OnAdvertisementUnregisterFailure, 48 base::Bind(&IndividualAdvertisement::OnAdvertisementUnregisterFailure,
Ryan Hansberry 2017/07/11 21:27:41 I don't believe that this method is ever called wi
Kyle Horimoto 2017/07/12 02:22:04 Done.
44 weak_ptr_factory_.GetWeakPtr())); 49 weak_ptr_factory_.GetWeakPtr()));
45 } 50 }
46 51
47 adapter_->RemoveObserver(this); 52 adapter_->RemoveObserver(this);
48 } 53 }
49 54
55 void BleAdvertiser::IndividualAdvertisement::
56 OnPreviousAdvertisementUnregistered() {
57 DCHECK(active_advertisement_device_ids_set_->find(device_id_) ==
58 active_advertisement_device_ids_set_->end());
59 AdvertiseIfPossible();
60 }
61
50 void BleAdvertiser::IndividualAdvertisement::AdapterPoweredChanged( 62 void BleAdvertiser::IndividualAdvertisement::AdapterPoweredChanged(
51 device::BluetoothAdapter* adapter, 63 device::BluetoothAdapter* adapter,
52 bool powered) { 64 bool powered) {
53 DCHECK(adapter_.get() == adapter); 65 DCHECK(adapter_.get() == adapter);
54 AdvertiseIfPossible(); 66 AdvertiseIfPossible();
55 } 67 }
56 68
57 void BleAdvertiser::IndividualAdvertisement::AdvertisementReleased( 69 void BleAdvertiser::IndividualAdvertisement::AdvertisementReleased(
58 device::BluetoothAdvertisement* advertisement) { 70 device::BluetoothAdvertisement* advertisement) {
59 DCHECK(advertisement_.get() == advertisement); 71 DCHECK(advertisement_.get() == advertisement);
60 72
61 // If the advertisement was released, delete it and try again. Note that this 73 // If the advertisement was released, delete it and try again. Note that this
62 // situation is not expected to occur under normal circumstances. 74 // situation is not expected to occur under normal circumstances.
75 advertisement_->RemoveObserver(this);
63 advertisement_ = nullptr; 76 advertisement_ = nullptr;
77 active_advertisement_device_ids_set_->erase(device_id_);
78
64 AdvertiseIfPossible(); 79 AdvertiseIfPossible();
65 } 80 }
66 81
67 void BleAdvertiser::IndividualAdvertisement::AdvertiseIfPossible() { 82 void BleAdvertiser::IndividualAdvertisement::AdvertiseIfPossible() {
68 if (!adapter_->IsPowered() || is_initializing_advertising_ || 83 if (!adapter_->IsPowered() || is_initializing_advertising_ ||
69 advertisement_) { 84 advertisement_ ||
85 active_advertisement_device_ids_set_->find(device_id_) !=
86 active_advertisement_device_ids_set_->end()) {
87 // It is not possible to advertise if the adapter is not powered. Likewise,
88 // we should not try to advertise if there is an advertisement already in
89 // progress.
70 return; 90 return;
71 } 91 }
72 92
73 is_initializing_advertising_ = true; 93 is_initializing_advertising_ = true;
74 94
75 std::unique_ptr<device::BluetoothAdvertisement::Data> advertisement_data = 95 std::unique_ptr<device::BluetoothAdvertisement::Data> advertisement_data =
76 base::MakeUnique<device::BluetoothAdvertisement::Data>( 96 base::MakeUnique<device::BluetoothAdvertisement::Data>(
77 device::BluetoothAdvertisement::AdvertisementType:: 97 device::BluetoothAdvertisement::AdvertisementType::
78 ADVERTISEMENT_TYPE_BROADCAST); 98 ADVERTISEMENT_TYPE_BROADCAST);
79 advertisement_data->set_service_uuids(CreateServiceUuids()); 99 advertisement_data->set_service_uuids(CreateServiceUuids());
80 advertisement_data->set_service_data(CreateServiceData()); 100 advertisement_data->set_service_data(CreateServiceData());
81 101
82 adapter_->RegisterAdvertisement( 102 adapter_->RegisterAdvertisement(
83 std::move(advertisement_data), 103 std::move(advertisement_data),
84 base::Bind(&IndividualAdvertisement::OnAdvertisementRegisteredCallback, 104 base::Bind(&IndividualAdvertisement::OnAdvertisementRegisteredCallback,
85 weak_ptr_factory_.GetWeakPtr()), 105 weak_ptr_factory_.GetWeakPtr()),
86 base::Bind(&IndividualAdvertisement::OnAdvertisementErrorCallback, 106 base::Bind(&IndividualAdvertisement::OnAdvertisementErrorCallback,
87 weak_ptr_factory_.GetWeakPtr())); 107 weak_ptr_factory_.GetWeakPtr()));
88 } 108 }
89 109
90 void BleAdvertiser::IndividualAdvertisement::OnAdvertisementRegisteredCallback( 110 void BleAdvertiser::IndividualAdvertisement::OnAdvertisementRegisteredCallback(
91 scoped_refptr<device::BluetoothAdvertisement> advertisement) { 111 scoped_refptr<device::BluetoothAdvertisement> advertisement) {
92 is_initializing_advertising_ = false; 112 is_initializing_advertising_ = false;
113
93 advertisement_ = advertisement; 114 advertisement_ = advertisement;
115 advertisement_->AddObserver(this);
116 active_advertisement_device_ids_set_->insert(device_id_);
117
94 PA_LOG(INFO) << "Advertisement registered. " 118 PA_LOG(INFO) << "Advertisement registered. "
95 << "Device ID: \"" 119 << "Device ID: \""
96 << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(device_id_) 120 << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(device_id_)
97 << "\", Service data: " << advertisement_data_->DataInHex(); 121 << "\", Service data: " << advertisement_data_->DataInHex();
98 } 122 }
99 123
100 void BleAdvertiser::IndividualAdvertisement::OnAdvertisementErrorCallback( 124 void BleAdvertiser::IndividualAdvertisement::OnAdvertisementErrorCallback(
101 device::BluetoothAdvertisement::ErrorCode error_code) { 125 device::BluetoothAdvertisement::ErrorCode error_code) {
102 is_initializing_advertising_ = false; 126 is_initializing_advertising_ = false;
103 PA_LOG(ERROR) << "Error registering advertisement. " 127 PA_LOG(ERROR) << "Error registering advertisement. "
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 BleAdvertiser::~BleAdvertiser() {} 179 BleAdvertiser::~BleAdvertiser() {}
156 180
157 BleAdvertiser::BleAdvertiser( 181 BleAdvertiser::BleAdvertiser(
158 scoped_refptr<device::BluetoothAdapter> adapter, 182 scoped_refptr<device::BluetoothAdapter> adapter,
159 std::unique_ptr<cryptauth::ForegroundEidGenerator> eid_generator, 183 std::unique_ptr<cryptauth::ForegroundEidGenerator> eid_generator,
160 const cryptauth::RemoteBeaconSeedFetcher* remote_beacon_seed_fetcher, 184 const cryptauth::RemoteBeaconSeedFetcher* remote_beacon_seed_fetcher,
161 const cryptauth::LocalDeviceDataProvider* local_device_data_provider) 185 const cryptauth::LocalDeviceDataProvider* local_device_data_provider)
162 : adapter_(adapter), 186 : adapter_(adapter),
163 eid_generator_(std::move(eid_generator)), 187 eid_generator_(std::move(eid_generator)),
164 remote_beacon_seed_fetcher_(remote_beacon_seed_fetcher), 188 remote_beacon_seed_fetcher_(remote_beacon_seed_fetcher),
165 local_device_data_provider_(local_device_data_provider) {} 189 local_device_data_provider_(local_device_data_provider),
190 weak_ptr_factory_(this) {}
166 191
167 bool BleAdvertiser::StartAdvertisingToDevice( 192 bool BleAdvertiser::StartAdvertisingToDevice(
168 const cryptauth::RemoteDevice& remote_device) { 193 const cryptauth::RemoteDevice& remote_device) {
169 if (device_id_to_advertisement_map_.size() >= kMaxConcurrentAdvertisements) { 194 if (device_id_to_advertisement_map_.size() >= kMaxConcurrentAdvertisements) {
170 PA_LOG(ERROR) << "Attempted to register a device when the maximum number " 195 PA_LOG(ERROR) << "Attempted to register a device when the maximum number "
171 << "of devices have already been registered."; 196 << "of devices have already been registered.";
172 return false; 197 return false;
173 } 198 }
174 199
175 std::string local_device_public_key; 200 std::string local_device_public_key;
(...skipping 25 matching lines...) Expand all
201 std::unique_ptr<cryptauth::DataWithTimestamp> advertisement = 226 std::unique_ptr<cryptauth::DataWithTimestamp> advertisement =
202 eid_generator_->GenerateAdvertisement(local_device_public_key, 227 eid_generator_->GenerateAdvertisement(local_device_public_key,
203 remote_beacon_seeds); 228 remote_beacon_seeds);
204 if (!advertisement) { 229 if (!advertisement) {
205 PA_LOG(WARNING) << "Error generating advertisement for device with ID " 230 PA_LOG(WARNING) << "Error generating advertisement for device with ID "
206 << remote_device.GetTruncatedDeviceIdForLogs() << ". " 231 << remote_device.GetTruncatedDeviceIdForLogs() << ". "
207 << "Cannot advertise."; 232 << "Cannot advertise.";
208 return false; 233 return false;
209 } 234 }
210 235
211 device_id_to_advertisement_map_[remote_device.GetDeviceId()] = 236 std::string device_id = remote_device.GetDeviceId();
237 device_id_to_advertisement_map_[device_id] =
212 base::MakeUnique<IndividualAdvertisement>( 238 base::MakeUnique<IndividualAdvertisement>(
213 remote_device.GetDeviceId(), adapter_, std::move(advertisement)); 239 remote_device.GetDeviceId(), adapter_, std::move(advertisement),
240 base::Bind(&BleAdvertiser::OnAdvertisementUnregistered,
241 weak_ptr_factory_.GetWeakPtr(), device_id),
242 &active_advertisement_device_ids_set_);
214 return true; 243 return true;
215 } 244 }
216 245
217 bool BleAdvertiser::StopAdvertisingToDevice( 246 bool BleAdvertiser::StopAdvertisingToDevice(
218 const cryptauth::RemoteDevice& remote_device) { 247 const cryptauth::RemoteDevice& remote_device) {
219 return device_id_to_advertisement_map_.erase(remote_device.GetDeviceId()) > 0; 248 return device_id_to_advertisement_map_.erase(remote_device.GetDeviceId()) > 0;
220 } 249 }
221 250
251 void BleAdvertiser::OnAdvertisementUnregistered(
252 const std::string& associated_device_id) {
253 active_advertisement_device_ids_set_.erase(associated_device_id);
254
255 auto it = device_id_to_advertisement_map_.find(associated_device_id);
Ryan Hansberry 2017/07/11 21:27:41 nit: it's now easy to incorrectly conflate what ac
Kyle Horimoto 2017/07/12 02:22:04 Done.
256 if (it != device_id_to_advertisement_map_.end())
257 it->second->OnPreviousAdvertisementUnregistered();
258 }
259
222 } // namespace tether 260 } // namespace tether
223 261
224 } // namespace chromeos 262 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698