1 // Copyright 2023 The Pigweed Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
5 // the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
13 // the License.
14
15 #include "pw_bluetooth_sapphire/internal/host/gap/adapter.h"
16
17 #include <pw_assert/check.h>
18 #include <pw_async/dispatcher.h>
19 #include <pw_bluetooth/hci_commands.emb.h>
20 #include <pw_bluetooth/hci_events.emb.h>
21 #include <pw_bytes/endian.h>
22
23 #include <cinttypes>
24
25 #include "pw_bluetooth_sapphire/internal/host/common/log.h"
26 #include "pw_bluetooth_sapphire/internal/host/common/metrics.h"
27 #include "pw_bluetooth_sapphire/internal/host/common/random.h"
28 #include "pw_bluetooth_sapphire/internal/host/gap/bredr_connection_manager.h"
29 #include "pw_bluetooth_sapphire/internal/host/gap/bredr_discovery_manager.h"
30 #include "pw_bluetooth_sapphire/internal/host/gap/event_masks.h"
31 #include "pw_bluetooth_sapphire/internal/host/gap/gap.h"
32 #include "pw_bluetooth_sapphire/internal/host/gap/low_energy_address_manager.h"
33 #include "pw_bluetooth_sapphire/internal/host/gap/low_energy_advertising_manager.h"
34 #include "pw_bluetooth_sapphire/internal/host/gap/low_energy_connection_manager.h"
35 #include "pw_bluetooth_sapphire/internal/host/gap/low_energy_discovery_manager.h"
36 #include "pw_bluetooth_sapphire/internal/host/gap/peer.h"
37 #include "pw_bluetooth_sapphire/internal/host/hci-spec/constants.h"
38 #include "pw_bluetooth_sapphire/internal/host/hci-spec/util.h"
39 #include "pw_bluetooth_sapphire/internal/host/hci-spec/vendor_protocol.h"
40 #include "pw_bluetooth_sapphire/internal/host/hci/android_extended_low_energy_advertiser.h"
41 #include "pw_bluetooth_sapphire/internal/host/hci/discovery_filter.h"
42 #include "pw_bluetooth_sapphire/internal/host/hci/extended_low_energy_advertiser.h"
43 #include "pw_bluetooth_sapphire/internal/host/hci/extended_low_energy_scanner.h"
44 #include "pw_bluetooth_sapphire/internal/host/hci/legacy_low_energy_advertiser.h"
45 #include "pw_bluetooth_sapphire/internal/host/hci/legacy_low_energy_scanner.h"
46 #include "pw_bluetooth_sapphire/internal/host/hci/low_energy_connector.h"
47 #include "pw_bluetooth_sapphire/internal/host/hci/low_energy_scanner.h"
48 #include "pw_bluetooth_sapphire/internal/host/hci/sequential_command_runner.h"
49 #include "pw_bluetooth_sapphire/internal/host/l2cap/channel_manager.h"
50 #include "pw_bluetooth_sapphire/internal/host/sm/security_manager.h"
51 #include "pw_bluetooth_sapphire/internal/host/transport/control_packets.h"
52 #include "pw_bluetooth_sapphire/internal/host/transport/transport.h"
53
54 namespace bt::gap {
55
56 namespace android_hci = hci_spec::vendor::android;
57 namespace android_emb = pw::bluetooth::vendor::android_hci;
58
59 static constexpr const char* kInspectLowEnergyDiscoveryManagerNodeName =
60 "low_energy_discovery_manager";
61 static constexpr const char* kInspectLowEnergyConnectionManagerNodeName =
62 "low_energy_connection_manager";
63 static constexpr const char* kInspectBrEdrConnectionManagerNodeName =
64 "bredr_connection_manager";
65 static constexpr const char* kInspectBrEdrDiscoveryManagerNodeName =
66 "bredr_discovery_manager";
67
68 // All asynchronous callbacks are posted on the Loop on which this Adapter
69 // instance is created.
70 class AdapterImpl final : public Adapter {
71 public:
72 explicit AdapterImpl(pw::async::Dispatcher& pw_dispatcher,
73 hci::Transport::WeakPtr hci,
74 gatt::GATT::WeakPtr gatt,
75 Config config,
76 std::unique_ptr<l2cap::ChannelManager> l2cap);
77 ~AdapterImpl() override;
78
identifier() const79 AdapterId identifier() const override { return identifier_; }
80
81 bool Initialize(InitializeCallback callback,
82 fit::closure transport_error_cb) override;
83
84 void ShutDown() override;
85
IsInitializing() const86 bool IsInitializing() const override {
87 return init_state_ == State::kInitializing;
88 }
89
IsInitialized() const90 bool IsInitialized() const override {
91 return init_state_ == State::kInitialized;
92 }
93
state() const94 const AdapterState& state() const override { return state_; }
95
96 class LowEnergyImpl final : public LowEnergy {
97 public:
LowEnergyImpl(AdapterImpl * adapter)98 explicit LowEnergyImpl(AdapterImpl* adapter) : adapter_(adapter) {}
99
Connect(PeerId peer_id,ConnectionResultCallback callback,LowEnergyConnectionOptions connection_options)100 void Connect(PeerId peer_id,
101 ConnectionResultCallback callback,
102 LowEnergyConnectionOptions connection_options) override {
103 adapter_->le_connection_manager_->Connect(
104 peer_id, std::move(callback), connection_options);
105 adapter_->metrics_.le.outgoing_connection_requests.Add();
106 }
107
Disconnect(PeerId peer_id)108 bool Disconnect(PeerId peer_id) override {
109 return adapter_->le_connection_manager_->Disconnect(peer_id);
110 }
111
OpenL2capChannel(PeerId peer_id,l2cap::Psm psm,l2cap::ChannelParameters params,sm::SecurityLevel security_level,l2cap::ChannelCallback cb)112 void OpenL2capChannel(PeerId peer_id,
113 l2cap::Psm psm,
114 l2cap::ChannelParameters params,
115 sm::SecurityLevel security_level,
116 l2cap::ChannelCallback cb) override {
117 adapter_->metrics_.le.open_l2cap_channel_requests.Add();
118 adapter_->le_connection_manager_->OpenL2capChannel(
119 peer_id, psm, params, security_level, std::move(cb));
120 }
121
Pair(PeerId peer_id,sm::SecurityLevel pairing_level,sm::BondableMode bondable_mode,sm::ResultFunction<> cb)122 void Pair(PeerId peer_id,
123 sm::SecurityLevel pairing_level,
124 sm::BondableMode bondable_mode,
125 sm::ResultFunction<> cb) override {
126 adapter_->le_connection_manager_->Pair(
127 peer_id, pairing_level, bondable_mode, std::move(cb));
128 adapter_->metrics_.le.pair_requests.Add();
129 }
130
SetLESecurityMode(LESecurityMode mode)131 void SetLESecurityMode(LESecurityMode mode) override {
132 adapter_->le_connection_manager_->SetSecurityMode(mode);
133 }
134
security_mode() const135 LESecurityMode security_mode() const override {
136 return adapter_->le_connection_manager_->security_mode();
137 }
138
StartAdvertising(AdvertisingData data,AdvertisingData scan_rsp,AdvertisingInterval interval,bool extended_pdu,bool anonymous,bool include_tx_power_level,std::optional<ConnectableAdvertisingParameters> connectable,std::optional<DeviceAddress::Type> address_type,AdvertisingStatusCallback status_callback)139 void StartAdvertising(
140 AdvertisingData data,
141 AdvertisingData scan_rsp,
142 AdvertisingInterval interval,
143 bool extended_pdu,
144 bool anonymous,
145 bool include_tx_power_level,
146 std::optional<ConnectableAdvertisingParameters> connectable,
147 std::optional<DeviceAddress::Type> address_type,
148 AdvertisingStatusCallback status_callback) override {
149 LowEnergyAdvertisingManager::ConnectionCallback advertisement_connect_cb =
150 nullptr;
151 if (connectable) {
152 PW_CHECK(connectable->connection_cb);
153
154 // All advertisement connections are first registered with
155 // LowEnergyConnectionManager before being reported to higher layers.
156 advertisement_connect_cb =
157 [this, connectable_params = std::move(connectable)](
158 AdvertisementId advertisement_id,
159 std::unique_ptr<hci::LowEnergyConnection> link) mutable {
160 auto register_link_cb = [advertisement_id,
161 connection_callback = std::move(
162 connectable_params->connection_cb)](
163 ConnectionResult result) {
164 connection_callback(advertisement_id, std::move(result));
165 };
166
167 adapter_->le_connection_manager_->RegisterRemoteInitiatedLink(
168 std::move(link),
169 connectable_params->bondable_mode,
170 std::move(register_link_cb));
171 };
172 }
173
174 adapter_->le_advertising_manager_->StartAdvertising(
175 std::move(data),
176 std::move(scan_rsp),
177 std::move(advertisement_connect_cb),
178 interval,
179 extended_pdu,
180 anonymous,
181 include_tx_power_level,
182 address_type,
183 std::move(status_callback));
184 adapter_->metrics_.le.start_advertising_events.Add();
185 }
186
StartDiscovery(bool active,std::vector<hci::DiscoveryFilter> discovery_filters,SessionCallback callback)187 void StartDiscovery(bool active,
188 std::vector<hci::DiscoveryFilter> discovery_filters,
189 SessionCallback callback) override {
190 adapter_->le_discovery_manager_->StartDiscovery(
191 active, std::move(discovery_filters), std::move(callback));
192 adapter_->metrics_.le.start_discovery_events.Add();
193 }
194
EnablePrivacy(bool enabled)195 void EnablePrivacy(bool enabled) override {
196 adapter_->le_address_manager_->EnablePrivacy(enabled);
197 }
198
PrivacyEnabled() const199 bool PrivacyEnabled() const override {
200 return adapter_->le_address_manager_->PrivacyEnabled();
201 }
202
CurrentAddress() const203 const DeviceAddress CurrentAddress() const override {
204 return adapter_->le_address_manager_->current_address();
205 }
206
register_address_changed_callback(fit::closure callback)207 void register_address_changed_callback(fit::closure callback) override {
208 auto cb = [addr_changed_cb = std::move(callback)](auto) {
209 addr_changed_cb();
210 };
211 adapter_->le_address_manager_->register_address_changed_callback(
212 std::move(cb));
213 }
214
set_irk(const std::optional<UInt128> & irk)215 void set_irk(const std::optional<UInt128>& irk) override {
216 adapter_->le_address_manager_->set_irk(irk);
217 }
218
irk() const219 std::optional<UInt128> irk() const override {
220 return adapter_->le_address_manager_->irk();
221 }
222
set_request_timeout_for_testing(pw::chrono::SystemClock::duration value)223 void set_request_timeout_for_testing(
224 pw::chrono::SystemClock::duration value) override {
225 adapter_->le_connection_manager_->set_request_timeout_for_testing(value);
226 }
227
set_scan_period_for_testing(pw::chrono::SystemClock::duration period)228 void set_scan_period_for_testing(
229 pw::chrono::SystemClock::duration period) override {
230 adapter_->le_discovery_manager_->set_scan_period(period);
231 }
232
233 private:
234 AdapterImpl* adapter_;
235 };
236
le() const237 LowEnergy* le() const override { return low_energy_.get(); }
238
239 class BrEdrImpl final : public BrEdr {
240 public:
BrEdrImpl(AdapterImpl * adapter)241 explicit BrEdrImpl(AdapterImpl* adapter) : adapter_(adapter) {}
242
Connect(PeerId peer_id,ConnectResultCallback callback)243 bool Connect(PeerId peer_id, ConnectResultCallback callback) override {
244 return adapter_->bredr_connection_manager_->Connect(peer_id,
245 std::move(callback));
246 adapter_->metrics_.bredr.outgoing_connection_requests.Add();
247 }
248
Disconnect(PeerId peer_id,DisconnectReason reason)249 bool Disconnect(PeerId peer_id, DisconnectReason reason) override {
250 return adapter_->bredr_connection_manager_->Disconnect(peer_id, reason);
251 }
252
OpenL2capChannel(PeerId peer_id,l2cap::Psm psm,BrEdrSecurityRequirements security_requirements,l2cap::ChannelParameters params,l2cap::ChannelCallback cb)253 void OpenL2capChannel(PeerId peer_id,
254 l2cap::Psm psm,
255 BrEdrSecurityRequirements security_requirements,
256 l2cap::ChannelParameters params,
257 l2cap::ChannelCallback cb) override {
258 adapter_->metrics_.bredr.open_l2cap_channel_requests.Add();
259 adapter_->bredr_connection_manager_->OpenL2capChannel(
260 peer_id, psm, security_requirements, params, std::move(cb));
261 }
262
GetPeerId(hci_spec::ConnectionHandle handle) const263 PeerId GetPeerId(hci_spec::ConnectionHandle handle) const override {
264 return adapter_->bredr_connection_manager_->GetPeerId(handle);
265 }
266
AddServiceSearch(const UUID & uuid,std::unordered_set<sdp::AttributeId> attributes,SearchCallback callback)267 SearchId AddServiceSearch(const UUID& uuid,
268 std::unordered_set<sdp::AttributeId> attributes,
269 SearchCallback callback) override {
270 return adapter_->bredr_connection_manager_->AddServiceSearch(
271 uuid, std::move(attributes), std::move(callback));
272 }
273
RemoveServiceSearch(SearchId id)274 bool RemoveServiceSearch(SearchId id) override {
275 return adapter_->bredr_connection_manager_->RemoveServiceSearch(id);
276 }
277
Pair(PeerId peer_id,BrEdrSecurityRequirements security,hci::ResultFunction<> callback)278 void Pair(PeerId peer_id,
279 BrEdrSecurityRequirements security,
280 hci::ResultFunction<> callback) override {
281 adapter_->bredr_connection_manager_->Pair(
282 peer_id, security, std::move(callback));
283 adapter_->metrics_.bredr.pair_requests.Add();
284 }
285
SetBrEdrSecurityMode(BrEdrSecurityMode mode)286 void SetBrEdrSecurityMode(BrEdrSecurityMode mode) override {
287 adapter_->bredr_connection_manager_->SetSecurityMode(mode);
288 }
289
security_mode() const290 BrEdrSecurityMode security_mode() const override {
291 return adapter_->bredr_connection_manager_->security_mode();
292 }
293
SetConnectable(bool connectable,hci::ResultFunction<> status_cb)294 void SetConnectable(bool connectable,
295 hci::ResultFunction<> status_cb) override {
296 adapter_->bredr_connection_manager_->SetConnectable(connectable,
297 std::move(status_cb));
298 if (connectable) {
299 adapter_->metrics_.bredr.set_connectable_true_events.Add();
300 } else {
301 adapter_->metrics_.bredr.set_connectable_false_events.Add();
302 }
303 }
304
RequestDiscovery(DiscoveryCallback callback)305 void RequestDiscovery(DiscoveryCallback callback) override {
306 adapter_->bredr_discovery_manager_->RequestDiscovery(std::move(callback));
307 }
308
RequestDiscoverable(DiscoverableCallback callback)309 void RequestDiscoverable(DiscoverableCallback callback) override {
310 adapter_->bredr_discovery_manager_->RequestDiscoverable(
311 std::move(callback));
312 }
313
RegisterService(std::vector<sdp::ServiceRecord> records,l2cap::ChannelParameters chan_params,ServiceConnectCallback conn_cb)314 RegistrationHandle RegisterService(
315 std::vector<sdp::ServiceRecord> records,
316 l2cap::ChannelParameters chan_params,
317 ServiceConnectCallback conn_cb) override {
318 return adapter_->sdp_server_->RegisterService(
319 std::move(records), chan_params, std::move(conn_cb));
320 }
321
UnregisterService(RegistrationHandle handle)322 bool UnregisterService(RegistrationHandle handle) override {
323 return adapter_->sdp_server_->UnregisterService(handle);
324 }
325
GetRegisteredServices(RegistrationHandle handle) const326 std::vector<sdp::ServiceRecord> GetRegisteredServices(
327 RegistrationHandle handle) const override {
328 return adapter_->sdp_server_->GetRegisteredServices(handle);
329 }
330
OpenScoConnection(PeerId peer_id,const bt::StaticPacket<pw::bluetooth::emboss::SynchronousConnectionParametersWriter> & parameters,sco::ScoConnectionManager::OpenConnectionCallback callback)331 std::optional<ScoRequestHandle> OpenScoConnection(
332 PeerId peer_id,
333 const bt::StaticPacket<
334 pw::bluetooth::emboss::SynchronousConnectionParametersWriter>&
335 parameters,
336 sco::ScoConnectionManager::OpenConnectionCallback callback) override {
337 return adapter_->bredr_connection_manager_->OpenScoConnection(
338 peer_id, parameters, std::move(callback));
339 }
AcceptScoConnection(PeerId peer_id,const std::vector<bt::StaticPacket<pw::bluetooth::emboss::SynchronousConnectionParametersWriter>> parameters,sco::ScoConnectionManager::AcceptConnectionCallback callback)340 std::optional<ScoRequestHandle> AcceptScoConnection(
341 PeerId peer_id,
342 const std::vector<bt::StaticPacket<
343 pw::bluetooth::emboss::SynchronousConnectionParametersWriter>>
344 parameters,
345 sco::ScoConnectionManager::AcceptConnectionCallback callback) override {
346 return adapter_->bredr_connection_manager_->AcceptScoConnection(
347 peer_id, std::move(parameters), std::move(callback));
348 }
349
350 private:
351 AdapterImpl* adapter_;
352 };
353
bredr() const354 BrEdr* bredr() const override { return bredr_.get(); }
355
peer_cache()356 PeerCache* peer_cache() override { return &peer_cache_; }
357
358 bool AddBondedPeer(BondingData bonding_data) override;
359
360 void SetPairingDelegate(PairingDelegate::WeakPtr delegate) override;
361
362 bool IsDiscoverable() const override;
363
364 bool IsDiscovering() const override;
365
366 void SetLocalName(std::string name, hci::ResultFunction<> callback) override;
367
local_name() const368 std::string local_name() const override {
369 return bredr_discovery_manager_->local_name();
370 }
371
372 void SetDeviceClass(DeviceClass dev_class,
373 hci::ResultFunction<> callback) override;
374
375 void GetSupportedDelayRange(
376 const bt::StaticPacket<pw::bluetooth::emboss::CodecIdWriter>& codec_id,
377 pw::bluetooth::emboss::LogicalTransportType logical_transport_type,
378 pw::bluetooth::emboss::DataPathDirection direction,
379 const std::optional<std::vector<uint8_t>>& codec_configuration,
380 GetSupportedDelayRangeCallback cb) override;
381
set_auto_connect_callback(AutoConnectCallback callback)382 void set_auto_connect_callback(AutoConnectCallback callback) override {
383 auto_conn_cb_ = std::move(callback);
384 }
385
386 void AttachInspect(inspect::Node& parent, std::string name) override;
387
AsWeakPtr()388 WeakSelf<Adapter>::WeakPtr AsWeakPtr() override {
389 return weak_self_adapter_.GetWeakPtr();
390 }
391
392 private:
393 // Called by Initialize() after Transport is initialized.
394 void InitializeStep1();
395
396 // Second step of the initialization sequence. Called by InitializeStep1()
397 // when the first batch of HCI commands have been sent.
398 void InitializeStep2();
399
400 // Third step of the initialization sequence. Called by InitializeStep2() when
401 // the second batch of HCI commands have been sent.
402 void InitializeStep3();
403
404 // Fourth step of the initialization sequence. Called by InitializeStep3()
405 // when the third batch of HCI commands have been sent.
406 void InitializeStep4();
407
408 // Returns true if initialization was completed, or false if initialization is
409 // not in progress.
410 bool CompleteInitialization(bool success);
411
412 // Reads LMP feature mask's bits from |page|
413 void InitQueueReadLMPFeatureMaskPage(uint8_t page);
414
415 // Assigns properties to |adapter_node_| using values discovered during other
416 // initialization steps.
417 void UpdateInspectProperties();
418
419 // Called by ShutDown() and during Initialize() in case of failure. This
420 // synchronously cleans up the transports and resets initialization state.
421 void CleanUp();
422
423 // Called by Transport after it experiences a fatal error.
424 void OnTransportError();
425
426 // Called when a directed connectable advertisement is received from a bonded
427 // LE device. This amounts to a connection request from a bonded peripheral
428 // which is handled by routing the request to |le_connection_manager_| to
429 // initiate a Direct Connection Establishment procedure (Vol 3, Part C,
430 // 9.3.8).
431 void OnLeAutoConnectRequest(Peer* peer);
432
433 // Called by |le_address_manager_| to query whether it is currently allowed to
434 // reconfigure the LE random address.
435 bool IsLeRandomAddressChangeAllowed();
436
437 // Called when we receive an LE Get Vendor Capabilities Command Complete from
438 // the Controller
439 void ParseLEGetVendorCapabilitiesCommandComplete(
440 const hci::EventPacket& event);
441
GetPacketFilterConfig()442 hci::LowEnergyScanner::PacketFilterConfig GetPacketFilterConfig() {
443 bool offloading_enabled = false;
444 uint8_t max_filters = 0;
445
446 constexpr pw::bluetooth::Controller::FeaturesBits feature =
447 pw::bluetooth::Controller::FeaturesBits::kAndroidVendorExtensions;
448 if (state().IsControllerFeatureSupported(feature) &&
449 state().android_vendor_capabilities &&
450 state().android_vendor_capabilities->supports_filtering()) {
451 bt_log(INFO,
452 "gap",
453 "controller supports android vendor extensions packet filtering, "
454 "max offloaded filters: %d",
455 max_filters);
456 offloading_enabled = true;
457 max_filters = state().android_vendor_capabilities->max_filters();
458 }
459
460 return hci::LowEnergyScanner::PacketFilterConfig(offloading_enabled,
461 max_filters);
462 }
463
CreateAdvertiser(bool extended)464 std::unique_ptr<hci::LowEnergyAdvertiser> CreateAdvertiser(bool extended) {
465 if (extended) {
466 return std::make_unique<hci::ExtendedLowEnergyAdvertiser>(
467 hci_, state_.low_energy_state.max_advertising_data_length_);
468 }
469
470 constexpr pw::bluetooth::Controller::FeaturesBits feature =
471 pw::bluetooth::Controller::FeaturesBits::kAndroidVendorExtensions;
472 if (!state().IsControllerFeatureSupported(feature)) {
473 return std::make_unique<hci::LegacyLowEnergyAdvertiser>(hci_);
474 }
475
476 if (!state().android_vendor_capabilities) {
477 bt_log(
478 WARN,
479 "gap",
480 "controller supports android vendor extensions, but failed to parse "
481 "LEGetVendorCapabilitiesCommandComplete, using legacy advertiser");
482 return std::make_unique<hci::LegacyLowEnergyAdvertiser>(hci_);
483 }
484
485 uint8_t max_advt =
486 state().android_vendor_capabilities->max_simultaneous_advertisements();
487 bt_log(INFO,
488 "gap",
489 "controller supports android vendor extensions, max simultaneous "
490 "advertisements: %d",
491 max_advt);
492 return std::make_unique<hci::AndroidExtendedLowEnergyAdvertiser>(hci_,
493 max_advt);
494 }
495
CreateConnector(bool extended)496 std::unique_ptr<hci::LowEnergyConnector> CreateConnector(bool extended) {
497 return std::make_unique<hci::LowEnergyConnector>(
498 hci_,
499 le_address_manager_.get(),
500 dispatcher_,
501 fit::bind_member<&hci::LowEnergyAdvertiser::OnIncomingConnection>(
502 hci_le_advertiser_.get()),
503 extended);
504 }
505
CreateScanner(bool extended,const hci::LowEnergyScanner::PacketFilterConfig & packet_filter_config)506 std::unique_ptr<hci::LowEnergyScanner> CreateScanner(
507 bool extended,
508 const hci::LowEnergyScanner::PacketFilterConfig& packet_filter_config) {
509 if (extended) {
510 return std::make_unique<hci::ExtendedLowEnergyScanner>(
511 le_address_manager_.get(), packet_filter_config, hci_, dispatcher_);
512 }
513
514 return std::make_unique<hci::LegacyLowEnergyScanner>(
515 le_address_manager_.get(), packet_filter_config, hci_, dispatcher_);
516 }
517
518 // Must be initialized first so that child nodes can be passed to other
519 // constructors.
520 inspect::Node adapter_node_;
521 struct InspectProperties {
522 inspect::StringProperty adapter_id;
523 inspect::StringProperty hci_version;
524 inspect::UintProperty bredr_max_num_packets;
525 inspect::UintProperty bredr_max_data_length;
526 inspect::UintProperty le_max_num_packets;
527 inspect::UintProperty le_max_data_length;
528 inspect::UintProperty sco_max_num_packets;
529 inspect::UintProperty sco_max_data_length;
530 inspect::StringProperty lmp_features;
531 inspect::StringProperty le_features;
532 };
533 InspectProperties inspect_properties_;
534
535 // Metrics properties
536 inspect::Node metrics_node_;
537 inspect::Node metrics_bredr_node_;
538 inspect::Node metrics_le_node_;
539 struct AdapterMetrics {
540 struct LeMetrics {
541 UintMetricCounter open_l2cap_channel_requests;
542 UintMetricCounter outgoing_connection_requests;
543 UintMetricCounter pair_requests;
544 UintMetricCounter start_advertising_events;
545 UintMetricCounter stop_advertising_events;
546 UintMetricCounter start_discovery_events;
547 } le;
548 struct BrEdrMetrics {
549 UintMetricCounter outgoing_connection_requests;
550 UintMetricCounter pair_requests;
551 UintMetricCounter set_connectable_true_events;
552 UintMetricCounter set_connectable_false_events;
553 UintMetricCounter open_l2cap_channel_requests;
554 } bredr;
555 };
556 AdapterMetrics metrics_;
557
558 // Uniquely identifies this adapter on the current system.
559 AdapterId identifier_;
560
561 hci::Transport::WeakPtr hci_;
562
563 // Callback invoked to notify clients when the underlying transport is
564 // closed.
565 fit::closure transport_error_cb_;
566
567 // Parameters relevant to the initialization sequence.
568 // TODO(armansito): The Initialize()/ShutDown() pattern has become common
569 // enough in this project that it might be worth considering moving the
570 // init-state-keeping into an abstract base.
571 enum State {
572 kNotInitialized = 0,
573 kInitializing,
574 kInitialized,
575 };
576 std::atomic<State> init_state_;
577 std::unique_ptr<hci::SequentialCommandRunner> init_seq_runner_;
578
579 // The callback passed to Initialize(). Null after initialization completes.
580 InitializeCallback init_cb_;
581
582 // Contains the global adapter state.
583 AdapterState state_;
584
585 // The maximum LMP feature page that we will read.
586 std::optional<size_t> max_lmp_feature_page_index_;
587
588 // Provides access to discovered, connected, and/or bonded remote Bluetooth
589 // devices.
590 PeerCache peer_cache_;
591
592 // L2CAP layer used by GAP. This must be destroyed after the following
593 // members because they raw pointers to this member.
594 std::unique_ptr<l2cap::ChannelManager> l2cap_;
595
596 // The GATT profile. We use this reference to add and remove data bearers
597 // and for service discovery.
598 gatt::GATT::WeakPtr gatt_;
599
600 // Contains feature flags based on the product's configuration
601 Config config_;
602
603 // Objects that abstract the controller for connection and advertising
604 // procedures.
605 std::unique_ptr<hci::LowEnergyAdvertiser> hci_le_advertiser_;
606 std::unique_ptr<hci::LowEnergyConnector> hci_le_connector_;
607 std::unique_ptr<hci::LowEnergyScanner> hci_le_scanner_;
608
609 // Objects that perform LE procedures.
610 std::unique_ptr<LowEnergyAddressManager> le_address_manager_;
611 std::unique_ptr<LowEnergyDiscoveryManager> le_discovery_manager_;
612 std::unique_ptr<LowEnergyConnectionManager> le_connection_manager_;
613 std::unique_ptr<LowEnergyAdvertisingManager> le_advertising_manager_;
614 std::unique_ptr<LowEnergyImpl> low_energy_;
615
616 // Objects that perform BR/EDR procedures.
617 std::unique_ptr<BrEdrConnectionManager> bredr_connection_manager_;
618 std::unique_ptr<BrEdrDiscoveryManager> bredr_discovery_manager_;
619 std::unique_ptr<sdp::Server> sdp_server_;
620 std::unique_ptr<BrEdrImpl> bredr_;
621
622 // Callback to propagate ownership of an auto-connected LE link.
623 AutoConnectCallback auto_conn_cb_;
624
625 pw::async::Dispatcher& dispatcher_;
626
627 // This must remain the last member to make sure that all weak pointers are
628 // invalidating before other members are destroyed.
629 WeakSelf<AdapterImpl> weak_self_;
630 WeakSelf<Adapter> weak_self_adapter_;
631
632 BT_DISALLOW_COPY_AND_ASSIGN_ALLOW_MOVE(AdapterImpl);
633 };
634
AdapterImpl(pw::async::Dispatcher & pw_dispatcher,hci::Transport::WeakPtr hci,gatt::GATT::WeakPtr gatt,Config config,std::unique_ptr<l2cap::ChannelManager> l2cap)635 AdapterImpl::AdapterImpl(pw::async::Dispatcher& pw_dispatcher,
636 hci::Transport::WeakPtr hci,
637 gatt::GATT::WeakPtr gatt,
638 Config config,
639 std::unique_ptr<l2cap::ChannelManager> l2cap)
640 : identifier_(Random<AdapterId>()),
641 hci_(std::move(hci)),
642 init_state_(State::kNotInitialized),
643 peer_cache_(pw_dispatcher),
644 l2cap_(std::move(l2cap)),
645 gatt_(std::move(gatt)),
646 config_(config),
647 dispatcher_(pw_dispatcher),
648 weak_self_(this),
649 weak_self_adapter_(this) {
650 PW_DCHECK(hci_.is_alive());
651 PW_DCHECK(gatt_.is_alive());
652
653 auto self = weak_self_.GetWeakPtr();
654 hci_->SetTransportErrorCallback([self] {
655 if (self.is_alive()) {
656 self->OnTransportError();
657 }
658 });
659
660 gatt_->SetPersistServiceChangedCCCCallback(
661 [this](PeerId peer_id, gatt::ServiceChangedCCCPersistedData gatt_data) {
662 Peer* peer = peer_cache_.FindById(peer_id);
663 if (!peer) {
664 bt_log(WARN,
665 "gap",
666 "Unable to find peer %s when storing persisted GATT data.",
667 bt_str(peer_id));
668 } else if (!peer->le()) {
669 bt_log(WARN,
670 "gap",
671 "Tried to store persisted GATT data for non-LE peer %s.",
672 bt_str(peer_id));
673 } else {
674 peer->MutLe().set_service_changed_gatt_data(gatt_data);
675 }
676 });
677
678 gatt_->SetRetrieveServiceChangedCCCCallback([this](PeerId peer_id) {
679 Peer* peer = peer_cache_.FindById(peer_id);
680 if (!peer) {
681 bt_log(WARN,
682 "gap",
683 "Unable to find peer %s when retrieving persisted GATT data.",
684 peer_id.ToString().c_str());
685 return std::optional<gatt::ServiceChangedCCCPersistedData>();
686 }
687
688 if (!peer->le()) {
689 bt_log(WARN,
690 "gap",
691 "Tried to retrieve persisted GATT data for non-LE peer %s.",
692 peer_id.ToString().c_str());
693 return std::optional<gatt::ServiceChangedCCCPersistedData>();
694 }
695
696 return std::optional(peer->le()->get_service_changed_gatt_data());
697 });
698 }
699
~AdapterImpl()700 AdapterImpl::~AdapterImpl() {
701 if (IsInitialized()) {
702 ShutDown();
703 }
704 }
705
Initialize(InitializeCallback callback,fit::closure transport_error_cb)706 bool AdapterImpl::Initialize(InitializeCallback callback,
707 fit::closure transport_error_cb) {
708 PW_DCHECK(callback);
709 PW_DCHECK(transport_error_cb);
710
711 if (IsInitialized()) {
712 bt_log(WARN, "gap", "Adapter already initialized");
713 return false;
714 }
715
716 PW_DCHECK(!IsInitializing());
717 PW_DCHECK(!init_seq_runner_);
718
719 init_state_ = State::kInitializing;
720 init_cb_ = std::move(callback);
721 transport_error_cb_ = std::move(transport_error_cb);
722
723 hci_->Initialize([this](bool success) {
724 if (!success) {
725 bt_log(ERROR, "gap", "Failed to initialize Transport");
726 CompleteInitialization(/*success=*/false);
727 return;
728 }
729 init_seq_runner_ = std::make_unique<hci::SequentialCommandRunner>(
730 hci_->command_channel()->AsWeakPtr());
731
732 InitializeStep1();
733 });
734
735 return true;
736 }
737
ShutDown()738 void AdapterImpl::ShutDown() {
739 bt_log(DEBUG, "gap", "adapter shutting down");
740
741 if (IsInitializing()) {
742 PW_DCHECK(!init_seq_runner_->IsReady());
743 init_seq_runner_->Cancel();
744 }
745
746 CleanUp();
747 }
748
AddBondedPeer(BondingData bonding_data)749 bool AdapterImpl::AddBondedPeer(BondingData bonding_data) {
750 return peer_cache()->AddBondedPeer(bonding_data);
751 }
752
SetPairingDelegate(PairingDelegate::WeakPtr delegate)753 void AdapterImpl::SetPairingDelegate(PairingDelegate::WeakPtr delegate) {
754 le_connection_manager_->SetPairingDelegate(delegate);
755 bredr_connection_manager_->SetPairingDelegate(delegate);
756 }
757
IsDiscoverable() const758 bool AdapterImpl::IsDiscoverable() const {
759 if (bredr_discovery_manager_ && bredr_discovery_manager_->discoverable()) {
760 return true;
761 }
762
763 // If LE Privacy is enabled, then we are not discoverable.
764 // TODO(fxbug.dev/42060496): Make this dependent on whether the LE Public
765 // advertisement is active or not.
766 if (le_address_manager_ && le_address_manager_->PrivacyEnabled()) {
767 return false;
768 }
769
770 return (le_advertising_manager_ && le_advertising_manager_->advertising());
771 }
772
IsDiscovering() const773 bool AdapterImpl::IsDiscovering() const {
774 return (le_discovery_manager_ && le_discovery_manager_->discovering()) ||
775 (bredr_discovery_manager_ && bredr_discovery_manager_->discovering());
776 }
777
SetLocalName(std::string name,hci::ResultFunction<> callback)778 void AdapterImpl::SetLocalName(std::string name,
779 hci::ResultFunction<> callback) {
780 // TODO(fxbug.dev/42116852): set the public LE advertisement name from
781 // |name| If BrEdr is not supported, skip the name update.
782 if (!bredr_discovery_manager_) {
783 callback(ToResult(bt::HostError::kNotSupported));
784 return;
785 }
786
787 // Make a copy of |name| to move separately into the lambda.
788 std::string name_copy(name);
789 bredr_discovery_manager_->UpdateLocalName(
790 std::move(name),
791 [this, cb = std::move(callback), local_name = std::move(name_copy)](
792 auto status) {
793 if (!bt_is_error(status, WARN, "gap", "set local name failed")) {
794 state_.local_name = local_name;
795 }
796 cb(status);
797 });
798 }
799
SetDeviceClass(DeviceClass dev_class,hci::ResultFunction<> callback)800 void AdapterImpl::SetDeviceClass(DeviceClass dev_class,
801 hci::ResultFunction<> callback) {
802 auto write_dev_class = hci::CommandPacket::New<
803 pw::bluetooth::emboss::WriteClassOfDeviceCommandWriter>(
804 hci_spec::kWriteClassOfDevice);
805 write_dev_class.view_t().class_of_device().BackingStorage().WriteUInt(
806 dev_class.to_int());
807 hci_->command_channel()->SendCommand(
808 std::move(write_dev_class),
809 [cb = std::move(callback)](auto, const hci::EventPacket& event) {
810 HCI_IS_ERROR(event, WARN, "gap", "set device class failed");
811 cb(event.ToResult());
812 });
813 }
814
GetSupportedDelayRange(const bt::StaticPacket<pw::bluetooth::emboss::CodecIdWriter> & codec_id,pw::bluetooth::emboss::LogicalTransportType logical_transport_type,pw::bluetooth::emboss::DataPathDirection direction,const std::optional<std::vector<uint8_t>> & codec_configuration,GetSupportedDelayRangeCallback cb)815 void AdapterImpl::GetSupportedDelayRange(
816 const bt::StaticPacket<pw::bluetooth::emboss::CodecIdWriter>& codec_id,
817 pw::bluetooth::emboss::LogicalTransportType logical_transport_type,
818 pw::bluetooth::emboss::DataPathDirection direction,
819 const std::optional<std::vector<uint8_t>>& codec_configuration,
820 GetSupportedDelayRangeCallback cb) {
821 if (!state_.SupportedCommands()
822 .read_local_supported_controller_delay()
823 .Read()) {
824 bt_log(WARN,
825 "gap",
826 "read local supported controller delay command not supported");
827 cb(PW_STATUS_UNIMPLEMENTED, /*min=*/0, /*max=*/0);
828 return;
829 }
830 bt_log(INFO, "gap", "retrieving controller codec delay");
831 size_t codec_configuration_size = 0;
832 if (codec_configuration.has_value()) {
833 codec_configuration_size = codec_configuration->size();
834 }
835 size_t packet_size =
836 pw::bluetooth::emboss::ReadLocalSupportedControllerDelayCommand::
837 MinSizeInBytes() +
838 codec_configuration_size;
839 auto cmd_packet = hci::CommandPacket::New<
840 pw::bluetooth::emboss::ReadLocalSupportedControllerDelayCommandWriter>(
841 hci_spec::kReadLocalSupportedControllerDelay, packet_size);
842 auto cmd_view = cmd_packet.view_t();
843 cmd_view.codec_id().CopyFrom(
844 const_cast<bt::StaticPacket<pw::bluetooth::emboss::CodecIdWriter>&>(
845 codec_id)
846 .view());
847 cmd_view.logical_transport_type().Write(logical_transport_type);
848 cmd_view.direction().Write(direction);
849 cmd_view.codec_configuration_length().Write(codec_configuration_size);
850 if (codec_configuration.has_value()) {
851 std::memcpy(cmd_view.codec_configuration().BackingStorage().data(),
852 codec_configuration->data(),
853 codec_configuration_size);
854 }
855
856 hci_->command_channel()->SendCommand(
857 std::move(cmd_packet),
858 [callback = std::move(cb)](auto /*id*/, const hci::EventPacket& event) {
859 auto view = event.view<
860 pw::bluetooth::emboss::
861 ReadLocalSupportedControllerDelayCommandCompleteEventView>();
862 if (HCI_IS_ERROR(event,
863 WARN,
864 "gap",
865 "read local supported controller delay failed")) {
866 callback(PW_STATUS_UNKNOWN, /*min=*/0, /*max=*/0);
867 return;
868 }
869 bt_log(INFO, "gap", "controller delay read successfully");
870 callback(PW_STATUS_OK,
871 view.min_controller_delay().Read(),
872 view.max_controller_delay().Read());
873 });
874 }
875
AttachInspect(inspect::Node & parent,std::string name)876 void AdapterImpl::AttachInspect(inspect::Node& parent, std::string name) {
877 adapter_node_ = parent.CreateChild(name);
878 UpdateInspectProperties();
879
880 peer_cache_.AttachInspect(adapter_node_);
881
882 metrics_node_ = adapter_node_.CreateChild(kMetricsInspectNodeName);
883
884 metrics_le_node_ = metrics_node_.CreateChild("le");
885 metrics_.le.open_l2cap_channel_requests.AttachInspect(
886 metrics_le_node_, "open_l2cap_channel_requests");
887 metrics_.le.outgoing_connection_requests.AttachInspect(
888 metrics_le_node_, "outgoing_connection_requests");
889 metrics_.le.pair_requests.AttachInspect(metrics_le_node_, "pair_requests");
890 metrics_.le.start_advertising_events.AttachInspect(
891 metrics_le_node_, "start_advertising_events");
892 metrics_.le.stop_advertising_events.AttachInspect(metrics_le_node_,
893 "stop_advertising_events");
894 metrics_.le.start_discovery_events.AttachInspect(metrics_le_node_,
895 "start_discovery_events");
896
897 metrics_bredr_node_ = metrics_node_.CreateChild("bredr");
898 metrics_.bredr.outgoing_connection_requests.AttachInspect(
899 metrics_bredr_node_, "outgoing_connection_requests");
900 metrics_.bredr.pair_requests.AttachInspect(metrics_bredr_node_,
901 "pair_requests");
902 metrics_.bredr.set_connectable_true_events.AttachInspect(
903 metrics_bredr_node_, "set_connectable_true_events");
904 metrics_.bredr.set_connectable_false_events.AttachInspect(
905 metrics_bredr_node_, "set_connectable_false_events");
906 metrics_.bredr.open_l2cap_channel_requests.AttachInspect(
907 metrics_bredr_node_, "open_l2cap_channel_requests");
908 }
909
ParseLEGetVendorCapabilitiesCommandComplete(const hci::EventPacket & event)910 void AdapterImpl::ParseLEGetVendorCapabilitiesCommandComplete(
911 const hci::EventPacket& event) {
912 // NOTE: There can be various versions of this command complete event
913 // sent by the Controller. As fields are added, the version_supported
914 // field is incremented to signify which fields are available. In a previous
915 // undertaking (pwrev.dev/203950, fxrev.dev/1029396), we attempted to use
916 // Emboss' conditional fields feature to define fields based on the version
917 // they are included in. However, in practice, we've found vendors sometimes
918 // send the wrong number of bytes required for the version they claim to
919 // send. To tolerate these types of errors, we simply define all the fields
920 // in Emboss. If we receive a response smaller than what we expect, we use
921 // what the vendor sends, and fill the rest with zero to disable the
922 // feature. If we receive a response larger than what we expect, we read up
923 // to what we support and drop the rest of the data.
924 StaticPacket<android_emb::LEGetVendorCapabilitiesCommandCompleteEventView>
925 packet;
926 packet.SetToZeros();
927 size_t copy_size = std::min(packet.data().size(), event.size());
928 packet.mutable_data().Write(event.data().data(), copy_size);
929
930 auto params = packet.view();
931 state_.android_vendor_capabilities = AndroidVendorCapabilities::New(params);
932
933 size_t expected_size = 0;
934 uint8_t major = params.version_supported().major_number().Read();
935 uint8_t minor = params.version_supported().minor_number().Read();
936
937 if (major == 0 && minor == 0) {
938 // The version_supported field was only introduced into the command in
939 // Version 0.95. Controllers that use the base version, Version 0.55,
940 // don't have the version_supported field.
941 expected_size = android_emb::LEGetVendorCapabilitiesCommandCompleteEvent::
942 version_0_55_size();
943 } else if (major == 0 && minor == 95) {
944 expected_size = android_emb::LEGetVendorCapabilitiesCommandCompleteEvent::
945 version_0_95_size();
946 } else if (major == 0 && minor == 96) {
947 expected_size = android_emb::LEGetVendorCapabilitiesCommandCompleteEvent::
948 version_0_96_size();
949 } else if (major == 0 && minor == 98) {
950 expected_size = android_emb::LEGetVendorCapabilitiesCommandCompleteEvent::
951 version_0_98_size();
952 } else if (major == 1 && minor == 03) {
953 expected_size = android_emb::LEGetVendorCapabilitiesCommandCompleteEvent::
954 version_1_03_size();
955 } else if (major == 1 && minor == 04) {
956 expected_size = android_emb::LEGetVendorCapabilitiesCommandCompleteEvent::
957 version_1_04_size();
958 }
959
960 if (event.size() != expected_size) {
961 bt_log(WARN,
962 "gap",
963 "LE Get Vendor Capabilities Command Complete, received %zu bytes, "
964 "expected %zu bytes, version: %d.%d",
965 event.size(),
966 expected_size,
967 major,
968 minor);
969 }
970 }
971
InitializeStep1()972 void AdapterImpl::InitializeStep1() {
973 state_.controller_features = hci_->GetFeatures();
974
975 // Start by resetting the controller to a clean state and then send
976 // informational parameter commands that are not specific to LE or BR/EDR.
977 // The commands sent here are mandatory for all LE controllers.
978 //
979 // NOTE: It's safe to pass capture |this| directly in the callbacks as
980 // |init_seq_runner_| will internally invalidate the callbacks if it ever
981 // gets deleted.
982
983 // HCI_Reset
984 auto reset_command =
985 hci::CommandPacket::New<pw::bluetooth::emboss::ResetCommandWriter>(
986 hci_spec::kReset);
987 init_seq_runner_->QueueCommand(std::move(reset_command));
988
989 // HCI_Read_Local_Version_Information
990 init_seq_runner_->QueueCommand(
991 hci::CommandPacket::New<
992 pw::bluetooth::emboss::ReadLocalVersionInformationCommandView>(
993 hci_spec::kReadLocalVersionInfo),
994 [this](const hci::EventPacket& cmd_complete) {
995 if (HCI_IS_ERROR(
996 cmd_complete, WARN, "gap", "read local version info failed")) {
997 return;
998 }
999 auto params =
1000 cmd_complete
1001 .view<pw::bluetooth::emboss::
1002 ReadLocalVersionInfoCommandCompleteEventView>();
1003 state_.hci_version = params.hci_version().Read();
1004 });
1005
1006 // HCI_Read_Local_Supported_Commands
1007 init_seq_runner_->QueueCommand(
1008 hci::CommandPacket::New<
1009 pw::bluetooth::emboss::ReadLocalSupportedCommandsCommandView>(
1010 hci_spec::kReadLocalSupportedCommands),
1011 [this](const hci::EventPacket& cmd_complete) {
1012 if (HCI_IS_ERROR(cmd_complete,
1013 WARN,
1014 "gap",
1015 "read local supported commands failed")) {
1016 return;
1017 }
1018 auto view =
1019 cmd_complete
1020 .view<pw::bluetooth::emboss::
1021 ReadLocalSupportedCommandsCommandCompleteEventView>();
1022 std::copy(view.supported_commands().BackingStorage().begin(),
1023 view.supported_commands().BackingStorage().end(),
1024 state_.supported_commands);
1025 });
1026
1027 // HCI_Read_Local_Supported_Features
1028 InitQueueReadLMPFeatureMaskPage(0);
1029
1030 // HCI_Read_BD_ADDR
1031 init_seq_runner_->QueueCommand(
1032 hci::CommandPacket::New<pw::bluetooth::emboss::ReadBdAddrCommandView>(
1033 hci_spec::kReadBDADDR),
1034 [this](const hci::EventPacket& cmd_complete) {
1035 if (HCI_IS_ERROR(cmd_complete, WARN, "gap", "read BR_ADDR failed")) {
1036 return;
1037 }
1038 auto packet = cmd_complete.view<
1039 pw::bluetooth::emboss::ReadBdAddrCommandCompleteEventView>();
1040 state_.controller_address = DeviceAddressBytes(packet.bd_addr());
1041 });
1042
1043 if (state().IsControllerFeatureSupported(
1044 pw::bluetooth::Controller::FeaturesBits::kAndroidVendorExtensions)) {
1045 bt_log(INFO,
1046 "gap",
1047 "controller supports android hci extensions, querying exact feature "
1048 "set");
1049 init_seq_runner_->QueueCommand(
1050 hci::CommandPacket::New<
1051 android_emb::LEGetVendorCapabilitiesCommandView>(
1052 android_hci::kLEGetVendorCapabilities),
1053 [this](const hci::EventPacket& event) {
1054 if (HCI_IS_ERROR(
1055 event,
1056 WARN,
1057 "gap",
1058 "Failed to query android hci extension capabilities")) {
1059 return;
1060 }
1061
1062 ParseLEGetVendorCapabilitiesCommandComplete(event);
1063 });
1064 }
1065
1066 init_seq_runner_->RunCommands([this](hci::Result<> status) mutable {
1067 if (bt_is_error(status,
1068 ERROR,
1069 "gap",
1070 "Failed to obtain initial controller information: %s",
1071 bt_str(status))) {
1072 CompleteInitialization(/*success=*/false);
1073 return;
1074 }
1075
1076 InitializeStep2();
1077 });
1078 }
1079
InitializeStep2()1080 void AdapterImpl::InitializeStep2() {
1081 PW_DCHECK(IsInitializing());
1082
1083 // Low Energy MUST be supported. We don't support BR/EDR-only controllers.
1084 if (!state_.IsLowEnergySupported()) {
1085 bt_log(ERROR, "gap", "Bluetooth LE not supported by controller");
1086 CompleteInitialization(/*success=*/false);
1087 return;
1088 }
1089
1090 // Check the HCI version. We officially only support 4.2+ only but for now
1091 // we just log a warning message if the version is legacy.
1092 if (state_.hci_version <
1093 pw::bluetooth::emboss::CoreSpecificationVersion::V4_2) {
1094 bt_log(WARN,
1095 "gap",
1096 "controller is using legacy HCI version %s",
1097 hci_spec::HCIVersionToString(state_.hci_version).c_str());
1098 }
1099
1100 PW_DCHECK(init_seq_runner_->IsReady());
1101
1102 // If the controller supports the Read Buffer Size command then send it.
1103 // Otherwise we'll default to 0 when initializing the ACLDataChannel.
1104 if (state_.SupportedCommands().read_buffer_size().Read()) {
1105 // HCI_Read_Buffer_Size
1106 init_seq_runner_->QueueCommand(
1107 hci::CommandPacket::New<
1108 pw::bluetooth::emboss::ReadBufferSizeCommandView>(
1109 hci_spec::kReadBufferSize),
1110 [this](const hci::EventPacket& cmd_complete) {
1111 if (HCI_IS_ERROR(
1112 cmd_complete, WARN, "gap", "read buffer size failed")) {
1113 return;
1114 }
1115 auto packet = cmd_complete.view<
1116 pw::bluetooth::emboss::ReadBufferSizeCommandCompleteEventView>();
1117 uint16_t acl_mtu = packet.acl_data_packet_length().Read();
1118 uint16_t acl_max_count = packet.total_num_acl_data_packets().Read();
1119 if (acl_mtu && acl_max_count) {
1120 state_.bredr_data_buffer_info =
1121 hci::DataBufferInfo(acl_mtu, acl_max_count);
1122 }
1123 // Use UncheckedRead because this field is supposed to
1124 // be 0x01-0xFF, but it is possible and harmless for controllers to
1125 // set to 0x00 if not supported.
1126 uint16_t sco_mtu =
1127 packet.synchronous_data_packet_length().UncheckedRead();
1128 uint16_t sco_max_count =
1129 packet.total_num_synchronous_data_packets().Read();
1130 if (sco_mtu && sco_max_count) {
1131 state_.sco_buffer_info =
1132 hci::DataBufferInfo(sco_mtu, sco_max_count);
1133 }
1134 });
1135 }
1136
1137 // HCI_LE_Read_Local_Supported_Features
1138 init_seq_runner_->QueueCommand(
1139 hci::CommandPacket::New<
1140 pw::bluetooth::emboss::LEReadLocalSupportedFeaturesCommandView>(
1141 hci_spec::kLEReadLocalSupportedFeatures),
1142 [this](const hci::EventPacket& cmd_complete) {
1143 if (HCI_IS_ERROR(cmd_complete,
1144 WARN,
1145 "gap",
1146 "LE read local supported features failed")) {
1147 return;
1148 }
1149 auto packet = cmd_complete.view<
1150 pw::bluetooth::emboss::
1151 LEReadLocalSupportedFeaturesCommandCompleteEventView>();
1152 state_.low_energy_state.supported_features_ =
1153 packet.le_features().BackingStorage().ReadUInt();
1154 });
1155
1156 // HCI_LE_Read_Supported_States
1157 init_seq_runner_->QueueCommand(
1158 hci::CommandPacket::New<
1159 pw::bluetooth::emboss::LEReadSupportedStatesCommandView>(
1160 hci_spec::kLEReadSupportedStates),
1161 [this](const hci::EventPacket& cmd_complete) {
1162 if (HCI_IS_ERROR(cmd_complete,
1163 WARN,
1164 "gap",
1165 "LE read local supported states failed")) {
1166 return;
1167 }
1168 auto packet =
1169 cmd_complete
1170 .view<pw::bluetooth::emboss::
1171 LEReadSupportedStatesCommandCompleteEventView>();
1172 state_.low_energy_state.supported_states_ =
1173 packet.le_states().BackingStorage().ReadLittleEndianUInt<64>();
1174 });
1175
1176 if (state_.SupportedCommands()
1177 .le_read_maximum_advertising_data_length()
1178 .Read()) {
1179 // HCI_LE_Read_Maximum_Advertising_Data_Length
1180 init_seq_runner_->QueueCommand(
1181 hci::CommandPacket::New<
1182 pw::bluetooth::emboss::LEReadMaxAdvertisingDataLengthCommandView>(
1183 hci_spec::kLEReadMaximumAdvertisingDataLength),
1184 [this](const hci::EventPacket& cmd_complete) {
1185 if (HCI_IS_ERROR(cmd_complete,
1186 WARN,
1187 "gap",
1188 "LE read maximum advertising data length failed")) {
1189 return;
1190 }
1191
1192 auto params = cmd_complete.view<
1193 pw::bluetooth::emboss::
1194 LEReadMaximumAdvertisingDataLengthCommandCompleteEventView>();
1195 state_.low_energy_state.max_advertising_data_length_ =
1196 params.max_advertising_data_length().Read();
1197 bt_log(INFO,
1198 "gap",
1199 "maximum advertising data length: %d",
1200 state_.low_energy_state.max_advertising_data_length_);
1201 });
1202 } else {
1203 bt_log(INFO,
1204 "gap",
1205 "LE read maximum advertising data command not supported, "
1206 "defaulting to legacy maximum: %zu",
1207 hci_spec::kMaxLEAdvertisingDataLength);
1208 state_.low_energy_state.max_advertising_data_length_ =
1209 hci_spec::kMaxLEAdvertisingDataLength;
1210 }
1211
1212 if (state_.SupportedCommands().le_read_buffer_size_v2().Read()) {
1213 // HCI_LE_Read_Buffer_Size [v2]
1214 init_seq_runner_->QueueCommand(
1215 hci::CommandPacket::New<
1216 pw::bluetooth::emboss::LEReadBufferSizeCommandV2View>(
1217 hci_spec::kLEReadBufferSizeV2),
1218 [this](const hci::EventPacket& cmd_complete) {
1219 if (HCI_IS_ERROR(cmd_complete,
1220 WARN,
1221 "gap",
1222 "LE read buffer size [v2] failed")) {
1223 return;
1224 }
1225 auto params =
1226 cmd_complete
1227 .view<pw::bluetooth::emboss::
1228 LEReadBufferSizeV2CommandCompleteEventView>();
1229 uint16_t acl_mtu = params.le_acl_data_packet_length().Read();
1230 uint8_t acl_max_count = params.total_num_le_acl_data_packets().Read();
1231 if (acl_mtu && acl_max_count) {
1232 state_.low_energy_state.acl_data_buffer_info_ =
1233 hci::DataBufferInfo(acl_mtu, acl_max_count);
1234 }
1235 uint16_t iso_mtu = params.iso_data_packet_length().Read();
1236 uint8_t iso_max_count = params.total_num_iso_data_packets().Read();
1237 if (iso_mtu && iso_max_count) {
1238 state_.low_energy_state.iso_data_buffer_info_ =
1239 hci::DataBufferInfo(iso_mtu, iso_max_count);
1240 }
1241 });
1242 } else {
1243 // HCI_LE_Read_Buffer_Size [v1]
1244 init_seq_runner_->QueueCommand(
1245 hci::CommandPacket::New<
1246 pw::bluetooth::emboss::LEReadBufferSizeCommandV1View>(
1247 hci_spec::kLEReadBufferSizeV1),
1248 [this](const hci::EventPacket& cmd_complete) {
1249 if (HCI_IS_ERROR(
1250 cmd_complete, WARN, "gap", "LE read buffer size failed")) {
1251 return;
1252 }
1253 auto params =
1254 cmd_complete
1255 .view<pw::bluetooth::emboss::
1256 LEReadBufferSizeV1CommandCompleteEventView>();
1257 uint16_t mtu = params.le_acl_data_packet_length().Read();
1258 uint8_t max_count = params.total_num_le_acl_data_packets().Read();
1259 if (mtu && max_count) {
1260 state_.low_energy_state.acl_data_buffer_info_ =
1261 hci::DataBufferInfo(mtu, max_count);
1262 }
1263 });
1264 }
1265
1266 if (state_.features.HasBit(
1267 /*page=*/0u,
1268 hci_spec::LMPFeature::kSecureSimplePairingControllerSupport)) {
1269 // HCI_Write_Simple_Pairing_Mode
1270 auto write_spm = hci::CommandPacket::New<
1271 pw::bluetooth::emboss::WriteSimplePairingModeCommandWriter>(
1272 hci_spec::kWriteSimplePairingMode);
1273 auto write_ssp_params = write_spm.view_t();
1274 write_ssp_params.simple_pairing_mode().Write(
1275 pw::bluetooth::emboss::GenericEnableParam::ENABLE);
1276 init_seq_runner_->QueueCommand(
1277 std::move(write_spm), [](const hci::EventPacket& event) {
1278 // Warn if the command failed
1279 HCI_IS_ERROR(event, WARN, "gap", "write simple pairing mode failed");
1280 });
1281 }
1282
1283 // If there are extended features then try to read the first page of the
1284 // extended features.
1285 if (state_.features.HasBit(/*page=*/0u,
1286 hci_spec::LMPFeature::kExtendedFeatures)) {
1287 // HCI_Write_LE_Host_Support
1288 if (!state_.SupportedCommands().write_le_host_support().Read()) {
1289 bt_log(INFO, "gap", "LE Host is not supported");
1290 } else {
1291 bt_log(INFO, "gap", "LE Host is supported. Enabling LE Host mode");
1292 auto cmd_packet = hci::CommandPacket::New<
1293 pw::bluetooth::emboss::WriteLEHostSupportCommandWriter>(
1294 hci_spec::kWriteLEHostSupport);
1295 auto params = cmd_packet.view_t();
1296 params.le_supported_host().Write(
1297 pw::bluetooth::emboss::GenericEnableParam::ENABLE);
1298 init_seq_runner_->QueueCommand(
1299 std::move(cmd_packet), [](const hci::EventPacket& event) {
1300 HCI_IS_ERROR(event, WARN, "gap", "Write LE Host support failed");
1301 });
1302 }
1303
1304 // HCI_Write_Secure_Connections_Host_Support
1305 if (!state_.SupportedCommands()
1306 .write_secure_connections_host_support()
1307 .Read()) {
1308 bt_log(INFO, "gap", "Secure Connections (Host Support) is not supported");
1309 } else {
1310 bt_log(INFO,
1311 "gap",
1312 "Secure Connections (Host Support) is supported. "
1313 "Enabling Secure Connections (Host Support) mode");
1314 auto cmd_packet = hci::CommandPacket::New<
1315 pw::bluetooth::emboss::
1316 WriteSecureConnectionsHostSupportCommandWriter>(
1317 hci_spec::kWriteSecureConnectionsHostSupport);
1318 auto params = cmd_packet.view_t();
1319 params.secure_connections_host_support().Write(
1320 pw::bluetooth::emboss::GenericEnableParam::ENABLE);
1321 init_seq_runner_->QueueCommand(
1322 std::move(cmd_packet), [](const hci::EventPacket& event) {
1323 HCI_IS_ERROR(event,
1324 WARN,
1325 "gap",
1326 "Write Secure Connections (Host Support) failed");
1327 });
1328 }
1329
1330 // Read updated page 1 after host support bits enabled.
1331 InitQueueReadLMPFeatureMaskPage(1);
1332 }
1333
1334 init_seq_runner_->RunCommands([this](hci::Result<> status) mutable {
1335 if (bt_is_error(
1336 status,
1337 ERROR,
1338 "gap",
1339 "failed to obtain initial controller information (step 2)")) {
1340 CompleteInitialization(/*success=*/false);
1341 return;
1342 }
1343 InitializeStep3();
1344 });
1345 }
1346
InitializeStep3()1347 void AdapterImpl::InitializeStep3() {
1348 PW_CHECK(IsInitializing());
1349 PW_CHECK(init_seq_runner_->IsReady());
1350 PW_CHECK(!init_seq_runner_->HasQueuedCommands());
1351
1352 if (!state_.bredr_data_buffer_info.IsAvailable() &&
1353 !state_.low_energy_state.acl_data_buffer_info().IsAvailable()) {
1354 bt_log(ERROR, "gap", "Both BR/EDR and LE buffers are unavailable");
1355 CompleteInitialization(/*success=*/false);
1356 return;
1357 }
1358
1359 // Now that we have all the ACL data buffer information it's time to
1360 // initialize the ACLDataChannel.
1361 if (!hci_->InitializeACLDataChannel(
1362 state_.bredr_data_buffer_info,
1363 state_.low_energy_state.acl_data_buffer_info())) {
1364 bt_log(ERROR, "gap", "Failed to initialize ACLDataChannel (step 3)");
1365 CompleteInitialization(/*success=*/false);
1366 return;
1367 }
1368
1369 if (!state_.low_energy_state.IsFeatureSupported(
1370 hci_spec::LESupportedFeature::
1371 kConnectedIsochronousStreamPeripheral)) {
1372 bt_log(INFO, "gap", "CIS Peripheral is not supported");
1373 } else {
1374 bt_log(INFO,
1375 "gap",
1376 "Connected Isochronous Stream Peripheral is supported. "
1377 "Enabling ConnectedIsochronousStream (Host Support)");
1378 auto cmd_packet = hci::CommandPacket::New<
1379 pw::bluetooth::emboss::LESetHostFeatureCommandWriter>(
1380 hci_spec::kLESetHostFeature);
1381 auto params = cmd_packet.view_t();
1382 params.bit_number().Write(
1383 static_cast<uint8_t>(hci_spec::LESupportedFeatureBitPos::
1384 kConnectedIsochronousStreamHostSupport));
1385 params.bit_value().Write(pw::bluetooth::emboss::GenericEnableParam::ENABLE);
1386 init_seq_runner_->QueueCommand(
1387 std::move(cmd_packet), [](const hci::EventPacket& event) {
1388 HCI_IS_ERROR(
1389 event, WARN, "gap", "Set Host Feature (ISO support) failed");
1390 });
1391 }
1392
1393 // The controller may not support SCO flow control (as implied by not
1394 // supporting HCI_Write_Synchronous_Flow_Control_Enable), in which case we
1395 // don't support HCI SCO on this controller yet.
1396 // TODO(fxbug.dev/42171056): Support controllers that don't support
1397 // SCO flow control.
1398 bool sco_flow_control_supported =
1399 state_.SupportedCommands().write_synchronous_flow_control_enable().Read();
1400 if (state_.sco_buffer_info.IsAvailable() && sco_flow_control_supported) {
1401 // Enable SCO flow control.
1402 auto sync_flow_control = hci::CommandPacket::New<
1403 pw::bluetooth::emboss::WriteSynchronousFlowControlEnableCommandWriter>(
1404 hci_spec::kWriteSynchronousFlowControlEnable);
1405 auto flow_control_params = sync_flow_control.view_t();
1406 flow_control_params.synchronous_flow_control_enable().Write(
1407 pw::bluetooth::emboss::GenericEnableParam::ENABLE);
1408 init_seq_runner_->QueueCommand(
1409 std::move(sync_flow_control), [this](const hci::EventPacket& event) {
1410 if (HCI_IS_ERROR(event,
1411 ERROR,
1412 "gap",
1413 "Write synchronous flow control enable failed, "
1414 "proceeding without HCI "
1415 "SCO support")) {
1416 return;
1417 }
1418
1419 if (!hci_->InitializeScoDataChannel(state_.sco_buffer_info)) {
1420 bt_log(WARN,
1421 "gap",
1422 "Failed to initialize ScoDataChannel, proceeding without "
1423 "HCI SCO support");
1424 return;
1425 }
1426 bt_log(DEBUG, "gap", "ScoDataChannel initialized successfully");
1427 });
1428 } else {
1429 bt_log(INFO,
1430 "gap",
1431 "HCI SCO not supported (SCO buffer available: %d, SCO flow control "
1432 "supported: %d)",
1433 state_.sco_buffer_info.IsAvailable(),
1434 sco_flow_control_supported);
1435 }
1436
1437 const hci::DataBufferInfo iso_data_buffer_info =
1438 state_.low_energy_state.iso_data_buffer_info();
1439 if (iso_data_buffer_info.IsAvailable()) {
1440 bt_log(INFO,
1441 "gap",
1442 "ISO data buffer information available (size: %zu, count: %zu)",
1443 iso_data_buffer_info.max_data_length(),
1444 iso_data_buffer_info.max_num_packets());
1445 if (hci_->InitializeIsoDataChannel(iso_data_buffer_info)) {
1446 bt_log(INFO, "gap", "IsoDataChannel initialized successfully");
1447 } else {
1448 bt_log(WARN,
1449 "gap",
1450 "Failed to initialize IsoDataChannel, proceeding without HCI ISO "
1451 "support");
1452 }
1453 } else {
1454 bt_log(INFO,
1455 "gap",
1456 "No ISO data buffer information available, not starting data "
1457 "channel");
1458 }
1459
1460 hci_->AttachInspect(adapter_node_);
1461
1462 // Create ChannelManager, if we haven't been provided one for testing. Doing
1463 // so here lets us guarantee that AclDataChannel's lifetime is a superset of
1464 // ChannelManager's lifetime.
1465 if (!l2cap_) {
1466 // Initialize ChannelManager to make it available for the next
1467 // initialization step. The AclDataChannel must be initialized before
1468 // creating ChannelManager.
1469 l2cap_ = l2cap::ChannelManager::Create(hci_->acl_data_channel(),
1470 hci_->command_channel(),
1471 /*random_channel_ids=*/true,
1472 dispatcher_);
1473 l2cap_->AttachInspect(adapter_node_,
1474 l2cap::ChannelManager::kInspectNodeName);
1475 }
1476
1477 // HCI_Set_Event_Mask
1478 {
1479 uint64_t event_mask = BuildEventMask();
1480 auto set_event = hci::CommandPacket::New<
1481 pw::bluetooth::emboss::SetEventMaskCommandWriter>(
1482 hci_spec::kSetEventMask);
1483 auto set_event_params = set_event.view_t();
1484 set_event_params.event_mask().Write(event_mask);
1485 init_seq_runner_->QueueCommand(
1486 std::move(set_event), [](const hci::EventPacket& event) {
1487 HCI_IS_ERROR(event, WARN, "gap", "set event mask failed");
1488 });
1489 }
1490
1491 // HCI_LE_Set_Event_Mask
1492 {
1493 uint64_t event_mask = BuildLEEventMask();
1494 auto cmd_packet = hci::CommandPacket::New<
1495 pw::bluetooth::emboss::LESetEventMaskCommandWriter>(
1496 hci_spec::kLESetEventMask);
1497 cmd_packet.view_t().le_event_mask().BackingStorage().WriteUInt(event_mask);
1498 init_seq_runner_->QueueCommand(
1499 std::move(cmd_packet), [](const hci::EventPacket& event) {
1500 HCI_IS_ERROR(event, WARN, "gap", "LE set event mask failed");
1501 });
1502 }
1503
1504 // If page 2 of the extended features bitfield is available, read it
1505 if (max_lmp_feature_page_index_.has_value() &&
1506 max_lmp_feature_page_index_.value() > 1) {
1507 InitQueueReadLMPFeatureMaskPage(2);
1508 }
1509
1510 init_seq_runner_->RunCommands([this](hci::Result<> status) mutable {
1511 if (bt_is_error(
1512 status,
1513 ERROR,
1514 "gap",
1515 "failed to obtain initial controller information (step 3)")) {
1516 CompleteInitialization(/*success=*/false);
1517 return;
1518 }
1519 InitializeStep4();
1520 });
1521 }
1522
InitializeStep4()1523 void AdapterImpl::InitializeStep4() {
1524 // Initialize the scan manager and low energy adapters based on current
1525 // feature support
1526 PW_DCHECK(IsInitializing());
1527
1528 // We use the public controller address as the local LE identity address.
1529 DeviceAddress adapter_identity(DeviceAddress::Type::kLEPublic,
1530 state_.controller_address);
1531
1532 // Initialize the LE local address manager.
1533 le_address_manager_ = std::make_unique<LowEnergyAddressManager>(
1534 adapter_identity,
1535 fit::bind_member<&AdapterImpl::IsLeRandomAddressChangeAllowed>(this),
1536 hci_->command_channel()->AsWeakPtr(),
1537 dispatcher_);
1538
1539 // Initialize the HCI adapters. Note: feature support for extended
1540 // scanning, connections, etc are all grouped under the extended advertising
1541 // feature flag.
1542 bool extended = state().low_energy_state.IsFeatureSupported(
1543 hci_spec::LESupportedFeature::kLEExtendedAdvertising);
1544 bt_log(INFO,
1545 "gap",
1546 "controller support for extended operations: %s",
1547 extended ? "yes" : "no");
1548 hci_le_advertiser_ = CreateAdvertiser(extended);
1549 hci_le_connector_ = CreateConnector(extended);
1550
1551 hci::LowEnergyScanner::PacketFilterConfig packet_filter_config =
1552 GetPacketFilterConfig();
1553 hci_le_scanner_ = CreateScanner(extended, packet_filter_config);
1554
1555 // Initialize the LE manager objects
1556 le_discovery_manager_ = std::make_unique<LowEnergyDiscoveryManager>(
1557 hci_le_scanner_.get(), &peer_cache_, packet_filter_config, dispatcher_);
1558 le_discovery_manager_->AttachInspect(
1559 adapter_node_, kInspectLowEnergyDiscoveryManagerNodeName);
1560 le_discovery_manager_->set_peer_connectable_callback(
1561 fit::bind_member<&AdapterImpl::OnLeAutoConnectRequest>(this));
1562
1563 le_connection_manager_ = std::make_unique<LowEnergyConnectionManager>(
1564 hci_->GetWeakPtr(),
1565 le_address_manager_.get(),
1566 hci_le_connector_.get(),
1567 &peer_cache_,
1568 l2cap_.get(),
1569 gatt_,
1570 le_discovery_manager_->GetWeakPtr(),
1571 sm::SecurityManager::CreateLE,
1572 state(),
1573 dispatcher_);
1574 le_connection_manager_->AttachInspect(
1575 adapter_node_, kInspectLowEnergyConnectionManagerNodeName);
1576
1577 le_advertising_manager_ = std::make_unique<LowEnergyAdvertisingManager>(
1578 hci_le_advertiser_.get(), le_address_manager_.get());
1579 low_energy_ = std::make_unique<LowEnergyImpl>(this);
1580
1581 // Initialize the BR/EDR manager objects if the controller supports BR/EDR.
1582 if (state_.IsBREDRSupported()) {
1583 DeviceAddress local_bredr_address(DeviceAddress::Type::kBREDR,
1584 state_.controller_address);
1585
1586 bredr_connection_manager_ = std::make_unique<BrEdrConnectionManager>(
1587 hci_,
1588 &peer_cache_,
1589 local_bredr_address,
1590 le_address_manager_.get(),
1591 l2cap_.get(),
1592 state_.features.HasBit(/*page=*/0,
1593 hci_spec::LMPFeature::kInterlacedPageScan),
1594 state_.IsLocalSecureConnectionsSupported(),
1595 config_.legacy_pairing_enabled,
1596 state_.IsControllerRemotePublicKeyValidationSupported(),
1597 sm::SecurityManager::CreateBrEdr,
1598 dispatcher_);
1599 bredr_connection_manager_->AttachInspect(
1600 adapter_node_, kInspectBrEdrConnectionManagerNodeName);
1601
1602 pw::bluetooth::emboss::InquiryMode mode =
1603 pw::bluetooth::emboss::InquiryMode::STANDARD;
1604 if (state_.features.HasBit(
1605 /*page=*/0, hci_spec::LMPFeature::kExtendedInquiryResponse)) {
1606 mode = pw::bluetooth::emboss::InquiryMode::EXTENDED;
1607 } else if (state_.features.HasBit(
1608 /*page=*/0, hci_spec::LMPFeature::kRSSIwithInquiryResults)) {
1609 mode = pw::bluetooth::emboss::InquiryMode::RSSI;
1610 }
1611
1612 bredr_discovery_manager_ = std::make_unique<BrEdrDiscoveryManager>(
1613 dispatcher_, hci_->command_channel()->AsWeakPtr(), mode, &peer_cache_);
1614 bredr_discovery_manager_->AttachInspect(
1615 adapter_node_, kInspectBrEdrDiscoveryManagerNodeName);
1616
1617 sdp_server_ = std::make_unique<sdp::Server>(l2cap_.get());
1618 sdp_server_->AttachInspect(adapter_node_);
1619
1620 bredr_ = std::make_unique<BrEdrImpl>(this);
1621 }
1622
1623 // Override the current privacy setting and always use the local stable
1624 // identity address (i.e. not a RPA) when initiating connections. This
1625 // improves interoperability with certain Bluetooth peripherals that fail to
1626 // authenticate following a RPA rotation.
1627 //
1628 // The implication here is that the public address is revealed in LL
1629 // connection request PDUs. LE central privacy is still preserved during an
1630 // active scan, i.e. in LL scan request PDUs.
1631 //
1632 // TODO(fxbug.dev/42141593): Remove this temporary fix once we determine the
1633 // root cause for authentication failures.
1634 hci_le_connector_->UseLocalIdentityAddress();
1635
1636 // Update properties before callback called so properties can be verified in
1637 // unit tests.
1638 UpdateInspectProperties();
1639
1640 // Assign a default name and device class before notifying completion.
1641 auto self = weak_self_.GetWeakPtr();
1642 SetLocalName(kDefaultLocalName, [self](auto) mutable {
1643 // Set the default device class - a computer with audio.
1644 // TODO(fxbug.dev/42074312): set this from a platform configuration file
1645 DeviceClass dev_class(DeviceClass::MajorClass::kComputer);
1646 dev_class.SetServiceClasses({DeviceClass::ServiceClass::kAudio});
1647 self->SetDeviceClass(dev_class, [self](const auto&) {
1648 self->CompleteInitialization(/*success=*/true);
1649 });
1650 });
1651 }
1652
CompleteInitialization(bool success)1653 bool AdapterImpl::CompleteInitialization(bool success) {
1654 if (!init_cb_) {
1655 return false;
1656 }
1657
1658 if (success) {
1659 init_state_ = State::kInitialized;
1660 } else {
1661 CleanUp();
1662 }
1663
1664 init_cb_(success);
1665 return true;
1666 }
1667
InitQueueReadLMPFeatureMaskPage(uint8_t page)1668 void AdapterImpl::InitQueueReadLMPFeatureMaskPage(uint8_t page) {
1669 PW_DCHECK(init_seq_runner_);
1670 PW_DCHECK(init_seq_runner_->IsReady());
1671
1672 if (max_lmp_feature_page_index_.has_value() &&
1673 page > max_lmp_feature_page_index_.value()) {
1674 bt_log(WARN,
1675 "gap",
1676 "Maximum value of LMP features mask page is %zu. Received page "
1677 "%" PRIx8,
1678 max_lmp_feature_page_index_.value(),
1679 page);
1680 return;
1681 }
1682
1683 if (page == 0) {
1684 init_seq_runner_->QueueCommand(
1685 hci::CommandPacket::New<
1686 pw::bluetooth::emboss::ReadLocalSupportedFeaturesCommandView>(
1687 hci_spec::kReadLocalSupportedFeatures),
1688 [this, page](const hci::EventPacket& cmd_complete) {
1689 if (HCI_IS_ERROR(cmd_complete,
1690 WARN,
1691 "gap",
1692 "read local supported features failed")) {
1693 return;
1694 }
1695 auto view = cmd_complete.view<
1696 pw::bluetooth::emboss::
1697 ReadLocalSupportedFeaturesCommandCompleteEventView>();
1698 state_.features.SetPage(page, view.lmp_features().Read());
1699 });
1700 return;
1701 }
1702
1703 if (!state_.features.HasBit(/*page=*/0u,
1704 hci_spec::LMPFeature::kExtendedFeatures)) {
1705 bt_log(WARN, "gap", "LMP features mask does not have extended features");
1706 max_lmp_feature_page_index_ = 0;
1707 return;
1708 }
1709
1710 if (!max_lmp_feature_page_index_.has_value() ||
1711 page <= max_lmp_feature_page_index_.value()) {
1712 // HCI_Read_Local_Extended_Features
1713 auto cmd_packet = hci::CommandPacket::New<
1714 pw::bluetooth::emboss::ReadLocalExtendedFeaturesCommandWriter>(
1715 hci_spec::kReadLocalExtendedFeatures);
1716 cmd_packet.view_t().page_number().Write(page); // Try to read |page|
1717
1718 init_seq_runner_->QueueCommand(
1719 std::move(cmd_packet),
1720 [this, page](const hci::EventPacket& cmd_complete) {
1721 if (HCI_IS_ERROR(cmd_complete,
1722 WARN,
1723 "gap",
1724 "read local extended features failed")) {
1725 return;
1726 }
1727 auto view = cmd_complete.view<
1728 pw::bluetooth::emboss::
1729 ReadLocalExtendedFeaturesCommandCompleteEventView>();
1730 state_.features.SetPage(page, view.extended_lmp_features().Read());
1731 max_lmp_feature_page_index_ = view.max_page_number().Read();
1732 });
1733 }
1734 }
1735
UpdateInspectProperties()1736 void AdapterImpl::UpdateInspectProperties() {
1737 inspect_properties_.adapter_id =
1738 adapter_node_.CreateString("adapter_id", identifier_.ToString());
1739 inspect_properties_.hci_version = adapter_node_.CreateString(
1740 "hci_version", hci_spec::HCIVersionToString(state_.hci_version));
1741
1742 inspect_properties_.bredr_max_num_packets = adapter_node_.CreateUint(
1743 "bredr_max_num_packets", state_.bredr_data_buffer_info.max_num_packets());
1744 inspect_properties_.bredr_max_data_length = adapter_node_.CreateUint(
1745 "bredr_max_data_length", state_.bredr_data_buffer_info.max_data_length());
1746
1747 inspect_properties_.le_max_num_packets = adapter_node_.CreateUint(
1748 "le_max_num_packets",
1749 state_.low_energy_state.acl_data_buffer_info().max_num_packets());
1750 inspect_properties_.le_max_data_length = adapter_node_.CreateUint(
1751 "le_max_data_length",
1752 state_.low_energy_state.acl_data_buffer_info().max_data_length());
1753
1754 inspect_properties_.sco_max_num_packets = adapter_node_.CreateUint(
1755 "sco_max_num_packets", state_.sco_buffer_info.max_num_packets());
1756 inspect_properties_.sco_max_data_length = adapter_node_.CreateUint(
1757 "sco_max_data_length", state_.sco_buffer_info.max_data_length());
1758
1759 inspect_properties_.lmp_features =
1760 adapter_node_.CreateString("lmp_features", state_.features.ToString());
1761
1762 auto le_features = bt_lib_cpp_string::StringPrintf(
1763 "0x%016" PRIx64, state_.low_energy_state.supported_features());
1764 inspect_properties_.le_features =
1765 adapter_node_.CreateString("le_features", le_features);
1766 }
1767
CleanUp()1768 void AdapterImpl::CleanUp() {
1769 if (init_state_ == State::kNotInitialized) {
1770 bt_log(DEBUG, "gap", "clean up: not initialized");
1771 return;
1772 }
1773
1774 init_state_ = State::kNotInitialized;
1775 state_ = AdapterState();
1776 transport_error_cb_ = nullptr;
1777
1778 // Destroy objects in reverse order of construction.
1779 low_energy_ = nullptr;
1780 bredr_ = nullptr;
1781 sdp_server_ = nullptr;
1782 bredr_discovery_manager_ = nullptr;
1783 le_advertising_manager_ = nullptr;
1784 le_connection_manager_ = nullptr;
1785 le_discovery_manager_ = nullptr;
1786
1787 hci_le_connector_ = nullptr;
1788 hci_le_advertiser_ = nullptr;
1789 hci_le_scanner_ = nullptr;
1790
1791 le_address_manager_ = nullptr;
1792
1793 l2cap_ = nullptr;
1794
1795 hci_.reset();
1796 }
1797
OnTransportError()1798 void AdapterImpl::OnTransportError() {
1799 bt_log(INFO, "gap", "HCI transport error");
1800 if (CompleteInitialization(/*success=*/false)) {
1801 return;
1802 }
1803 if (transport_error_cb_) {
1804 transport_error_cb_();
1805 }
1806 }
1807
OnLeAutoConnectRequest(Peer * peer)1808 void AdapterImpl::OnLeAutoConnectRequest(Peer* peer) {
1809 PW_DCHECK(le_connection_manager_);
1810 PW_DCHECK(peer);
1811 PW_DCHECK(peer->le());
1812
1813 PeerId peer_id = peer->identifier();
1814
1815 if (!peer->le()->should_auto_connect()) {
1816 bt_log(DEBUG,
1817 "gap",
1818 "ignoring auto-connection (peer->should_auto_connect() is false) "
1819 "(peer: %s)",
1820 bt_str(peer_id));
1821 return;
1822 }
1823
1824 LowEnergyConnectionOptions options{.auto_connect = true};
1825
1826 auto self = weak_self_.GetWeakPtr();
1827 le_connection_manager_->Connect(
1828 peer_id,
1829 [self, peer_id](auto result) {
1830 if (!self.is_alive()) {
1831 bt_log(DEBUG, "gap", "ignoring auto-connection (adapter destroyed)");
1832 return;
1833 }
1834
1835 if (result.is_error()) {
1836 bt_log(INFO,
1837 "gap",
1838 "failed to auto-connect (peer: %s, error: %s)",
1839 bt_str(peer_id),
1840 HostErrorToString(result.error_value()).c_str());
1841 return;
1842 }
1843
1844 auto conn = std::move(result).value();
1845 PW_CHECK(conn);
1846 bt_log(INFO, "gap", "peer auto-connected (peer: %s)", bt_str(peer_id));
1847 if (self->auto_conn_cb_) {
1848 self->auto_conn_cb_(std::move(conn));
1849 }
1850 },
1851 options);
1852 }
1853
IsLeRandomAddressChangeAllowed()1854 bool AdapterImpl::IsLeRandomAddressChangeAllowed() {
1855 return hci_le_advertiser_->AllowsRandomAddressChange() &&
1856 hci_le_scanner_->AllowsRandomAddressChange() &&
1857 hci_le_connector_->AllowsRandomAddressChange();
1858 }
1859
Create(pw::async::Dispatcher & pw_dispatcher,hci::Transport::WeakPtr hci,gatt::GATT::WeakPtr gatt,Config config,std::unique_ptr<l2cap::ChannelManager> l2cap)1860 std::unique_ptr<Adapter> Adapter::Create(
1861 pw::async::Dispatcher& pw_dispatcher,
1862 hci::Transport::WeakPtr hci,
1863 gatt::GATT::WeakPtr gatt,
1864 Config config,
1865 std::unique_ptr<l2cap::ChannelManager> l2cap) {
1866 return std::make_unique<AdapterImpl>(
1867 pw_dispatcher, hci, gatt, config, std::move(l2cap));
1868 }
1869
1870 } // namespace bt::gap
1871