RootCanal: LE advertisement fixes
- Reject LE connection requests if advertising events
are non-connectable (Core Specification v5.3,
6.B ยง 4.4.2 Advertising state).
- Disable LE advertiser after LE connection request is received.
Test: cert/run
Change-Id: Id122ec8edd9a0fa15c0648862fe5d7055c73dcef
diff --git a/system/vendor_libs/test_vendor_lib/model/controller/le_advertiser.cc b/system/vendor_libs/test_vendor_lib/model/controller/le_advertiser.cc
index cbb4cb7..27a63fe 100644
--- a/system/vendor_libs/test_vendor_lib/model/controller/le_advertiser.cc
+++ b/system/vendor_libs/test_vendor_lib/model/controller/le_advertiser.cc
@@ -103,6 +103,11 @@
bool LeAdvertiser::IsExtended() const { return extended_; }
+bool LeAdvertiser::IsConnectable() const {
+ return type_ != model::packets::AdvertisementType::ADV_NONCONN_IND &&
+ type_ != model::packets::AdvertisementType::ADV_SCAN_IND;
+}
+
uint8_t LeAdvertiser::GetNumAdvertisingEvents() const { return num_events_; }
std::unique_ptr<model::packets::LeAdvertisementBuilder>
diff --git a/system/vendor_libs/test_vendor_lib/model/controller/le_advertiser.h b/system/vendor_libs/test_vendor_lib/model/controller/le_advertiser.h
index f591c25..a9d14ab 100644
--- a/system/vendor_libs/test_vendor_lib/model/controller/le_advertiser.h
+++ b/system/vendor_libs/test_vendor_lib/model/controller/le_advertiser.h
@@ -71,6 +71,8 @@
bool IsExtended() const;
+ bool IsConnectable() const;
+
uint8_t GetNumAdvertisingEvents() const;
bluetooth::hci::AddressWithType GetAddress() const;
diff --git a/system/vendor_libs/test_vendor_lib/model/controller/link_layer_controller.cc b/system/vendor_libs/test_vendor_lib/model/controller/link_layer_controller.cc
index bd13c36..b071916 100644
--- a/system/vendor_libs/test_vendor_lib/model/controller/link_layer_controller.cc
+++ b/system/vendor_libs/test_vendor_lib/model/controller/link_layer_controller.cc
@@ -1432,6 +1432,13 @@
return;
}
+ if (!advertisers_[set].IsConnectable()) {
+ LOG_INFO(
+ "Rejecting connection request from %s to non-connectable advertiser",
+ incoming.GetSourceAddress().ToString().c_str());
+ return;
+ }
+
uint16_t handle = HandleLeConnection(
AddressWithType(
incoming.GetSourceAddress(),
@@ -1447,9 +1454,10 @@
static_cast<uint8_t>(my_address.GetAddressType()));
SendLeLinkLayerPacket(std::move(to_send));
+ advertisers_[set].Disable();
+
if (advertisers_[set].IsExtended()) {
uint8_t num_advertisements = advertisers_[set].GetNumAdvertisingEvents();
- advertisers_[set].Disable();
if (properties_.GetLeEventSupported(
bluetooth::hci::SubeventCode::ADVERTISING_SET_TERMINATED)) {
send_event_(bluetooth::hci::LeAdvertisingSetTerminatedBuilder::Create(