• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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