Loading system/blueberry/tests/gd/cert/py_hal.py +6 −0 Original line number Diff line number Diff line Loading @@ -117,6 +117,7 @@ class PyHal(Closable): self.acl_stream = EventStream(self.device.hal.StreamAcl(empty_proto.Empty())) self.event_mask = 0x1FFF_FFFF_FFFF # Default Event Mask (Core Vol 4 [E] 7.3.1) self.le_event_mask = 0x0000_0000_001F # Default LE Event Mask (Core Vol 4 [E] 7.8.1) # We don't deal with SCO for now Loading Loading @@ -173,6 +174,11 @@ class PyHal(Closable): self.event_mask |= 1 << (int(event_code) - 1) self.send_hci_command(hci_packets.SetEventMaskBuilder(self.event_mask)) def unmask_le_event(self, *subevent_codes): for subevent_code in subevent_codes: self.le_event_mask |= 1 << (int(subevent_code) - 1) self.send_hci_command(hci_packets.LeSetEventMaskBuilder(self.le_event_mask)) def start_scanning(self): self.send_hci_command( hci_packets.LeSetExtendedScanEnableBuilder(hci_packets.Enable.ENABLED, Loading system/blueberry/tests/gd/hal/simple_hal_test.py +1 −0 Original line number Diff line number Diff line Loading @@ -72,6 +72,7 @@ class SimpleHalTest(gd_base_test.GdBaseTestClass): def test_le_ad_scan_cert_advertises(self): self.dut_hal.unmask_event(hci_packets.EventCode.LE_META_EVENT) self.dut_hal.unmask_le_event(hci_packets.SubeventCode.EXTENDED_ADVERTISING_REPORT) self.dut_hal.set_random_le_address('0D:05:04:03:02:01') self.dut_hal.set_scan_parameters() Loading tools/rootcanal/model/controller/dual_mode_controller.cc +1 −1 Original line number Diff line number Diff line Loading @@ -2093,7 +2093,7 @@ void DualModeController::LeSetAdvertisingParameters(CommandView command) { } link_layer_controller_.SetLeAdvertisingParameters( command_view.GetAdvertisingIntervalMin(), command_view.GetAdvertisingIntervalMax(), static_cast<uint8_t>(type), command_view.GetAdvertisingIntervalMax(), type, static_cast<uint8_t>(command_view.GetOwnAddressType()), static_cast<uint8_t>(command_view.GetPeerAddressType()), peer_address, command_view.GetAdvertisingChannelMap(), Loading tools/rootcanal/model/controller/le_advertiser.cc +36 −16 Original line number Diff line number Diff line Loading @@ -24,7 +24,7 @@ void LeAdvertiser::Initialize(OwnAddressType address_type, AddressWithType public_address, AddressWithType peer_address, LeScanningFilterPolicy filter_policy, model::packets::AdvertisementType type, AdvertisingType type, const std::vector<uint8_t>& advertisement, const std::vector<uint8_t>& scan_response, std::chrono::steady_clock::duration interval) { Loading @@ -44,8 +44,7 @@ void LeAdvertiser::Initialize(OwnAddressType address_type, void LeAdvertiser::InitializeExtended( unsigned advertising_handle, OwnAddressType address_type, AddressWithType public_address, AddressWithType peer_address, LeScanningFilterPolicy filter_policy, model::packets::AdvertisementType type, LeScanningFilterPolicy filter_policy, AdvertisingType type, std::chrono::steady_clock::duration interval, uint8_t tx_power, const std::function<bluetooth::hci::Address()>& get_address) { get_address_ = get_address; Loading @@ -66,7 +65,7 @@ void LeAdvertiser::Clear() { address_ = AddressWithType{}; peer_address_ = AddressWithType{}; filter_policy_ = LeScanningFilterPolicy::ACCEPT_ALL; type_ = model::packets::AdvertisementType::ADV_IND; type_ = AdvertisingType::ADV_IND; advertisement_.clear(); scan_response_.clear(); interval_ = 0ms; Loading Loading @@ -138,14 +137,14 @@ void LeAdvertiser::EnableExtended(std::chrono::milliseconds duration_ms) { switch (type_) { // [Vol 6] Part B. 4.4.2.4.3 High duty cycle connectable directed // advertising case model::packets::AdvertisementType::ADV_DIRECT_IND: case AdvertisingType::ADV_DIRECT_IND_HIGH: duration = duration == 0ms ? adv_direct_ind_timeout : std::min(duration, adv_direct_ind_timeout); interval_ = adv_direct_ind_interval_high; break; // [Vol 6] Part B. 4.4.2.4.2 Low duty cycle connectable directed advertising case model::packets::AdvertisementType::SCAN_RESPONSE: case AdvertisingType::ADV_DIRECT_IND_LOW: interval_ = adv_direct_ind_interval_low; break; Loading @@ -169,8 +168,8 @@ bool LeAdvertiser::IsEnabled() const { return enabled_; } 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; return type_ != AdvertisingType::ADV_NONCONN_IND && type_ != AdvertisingType::ADV_SCAN_IND; } uint8_t LeAdvertiser::GetNumAdvertisingEvents() const { return num_events_; } Loading @@ -184,8 +183,8 @@ std::unique_ptr<bluetooth::hci::EventBuilder> LeAdvertiser::GetEvent( // [Vol 4] Part E 7.8.9 LE Set Advertising Enable command // [Vol 4] Part E 7.8.56 LE Set Extended Advertising Enable command if (type_ == model::packets::AdvertisementType::ADV_DIRECT_IND && now >= ending_time_ && limited_) { if (type_ == AdvertisingType::ADV_DIRECT_IND_HIGH && now >= ending_time_ && limited_) { LOG_INFO("Directed Advertising Timeout"); enabled_ = false; return bluetooth::hci::LeConnectionCompleteBuilder::Create( Loading Loading @@ -216,21 +215,42 @@ LeAdvertiser::GetAdvertisement(std::chrono::steady_clock::time_point now) { return nullptr; } model::packets::LegacyAdvertisingType advertising_type; switch (type_) { case AdvertisingType::ADV_IND: advertising_type = model::packets::LegacyAdvertisingType::ADV_IND; break; case AdvertisingType::ADV_DIRECT_IND_HIGH: case AdvertisingType::ADV_DIRECT_IND_LOW: advertising_type = model::packets::LegacyAdvertisingType::ADV_DIRECT_IND; break; case AdvertisingType::ADV_SCAN_IND: advertising_type = model::packets::LegacyAdvertisingType::ADV_SCAN_IND; break; case AdvertisingType::ADV_NONCONN_IND: advertising_type = model::packets::LegacyAdvertisingType::ADV_NONCONN_IND; break; } last_le_advertisement_ = now; num_events_ += (num_events_ < 255 ? 1 : 0); if (tx_power_ == kTxPowerUnavailable) { return model::packets::LeAdvertisementBuilder::Create( return model::packets::LeLegacyAdvertisingPduBuilder::Create( address_.GetAddress(), peer_address_.GetAddress(), static_cast<model::packets::AddressType>(address_.GetAddressType()), type_, advertisement_); static_cast<model::packets::AddressType>( peer_address_.GetAddressType()), advertising_type, advertisement_); } else { uint8_t tx_power_jittered = 2 + tx_power_ - (num_events_ & 0x03); return model::packets::RssiWrapperBuilder::Create( address_.GetAddress(), peer_address_.GetAddress(), tx_power_jittered, model::packets::LeAdvertisementBuilder::Create( model::packets::LeLegacyAdvertisingPduBuilder::Create( address_.GetAddress(), peer_address_.GetAddress(), static_cast<model::packets::AddressType>(address_.GetAddressType()), type_, advertisement_)); static_cast<model::packets::AddressType>( peer_address_.GetAddressType()), advertising_type, advertisement_)); } } Loading Loading @@ -258,7 +278,7 @@ LeAdvertiser::GetScanResponse(bluetooth::hci::Address scanned, return model::packets::LeScanResponseBuilder::Create( address_.GetAddress(), peer_address_.GetAddress(), static_cast<model::packets::AddressType>(address_.GetAddressType()), model::packets::AdvertisementType::SCAN_RESPONSE, scan_response_); scan_response_); } else { uint8_t tx_power_jittered = 2 + tx_power_ - (num_events_ & 0x03); return model::packets::RssiWrapperBuilder::Create( Loading @@ -266,7 +286,7 @@ LeAdvertiser::GetScanResponse(bluetooth::hci::Address scanned, model::packets::LeScanResponseBuilder::Create( address_.GetAddress(), peer_address_.GetAddress(), static_cast<model::packets::AddressType>(address_.GetAddressType()), model::packets::AdvertisementType::SCAN_RESPONSE, scan_response_)); scan_response_)); } } Loading tools/rootcanal/model/controller/le_advertiser.h +3 −3 Original line number Diff line number Diff line Loading @@ -36,7 +36,7 @@ class LeAdvertiser { bluetooth::hci::AddressWithType public_address, bluetooth::hci::AddressWithType peer_address, bluetooth::hci::LeScanningFilterPolicy filter_policy, model::packets::AdvertisementType type, bluetooth::hci::AdvertisingType type, const std::vector<uint8_t>& advertisement, const std::vector<uint8_t>& scan_response, std::chrono::steady_clock::duration interval); Loading @@ -46,7 +46,7 @@ class LeAdvertiser { bluetooth::hci::AddressWithType public_address, bluetooth::hci::AddressWithType peer_address, bluetooth::hci::LeScanningFilterPolicy filter_policy, model::packets::AdvertisementType type, bluetooth::hci::AdvertisingType type, std::chrono::steady_clock::duration interval, uint8_t tx_power, const std::function<bluetooth::hci::Address()>& get_address); Loading Loading @@ -92,7 +92,7 @@ class LeAdvertiser { bluetooth::hci::AddressWithType peer_address_{}; // For directed advertisements bluetooth::hci::LeScanningFilterPolicy filter_policy_{}; model::packets::AdvertisementType type_{}; bluetooth::hci::AdvertisingType type_{}; std::vector<uint8_t> advertisement_; std::vector<uint8_t> scan_response_; std::chrono::steady_clock::duration interval_{}; Loading Loading
system/blueberry/tests/gd/cert/py_hal.py +6 −0 Original line number Diff line number Diff line Loading @@ -117,6 +117,7 @@ class PyHal(Closable): self.acl_stream = EventStream(self.device.hal.StreamAcl(empty_proto.Empty())) self.event_mask = 0x1FFF_FFFF_FFFF # Default Event Mask (Core Vol 4 [E] 7.3.1) self.le_event_mask = 0x0000_0000_001F # Default LE Event Mask (Core Vol 4 [E] 7.8.1) # We don't deal with SCO for now Loading Loading @@ -173,6 +174,11 @@ class PyHal(Closable): self.event_mask |= 1 << (int(event_code) - 1) self.send_hci_command(hci_packets.SetEventMaskBuilder(self.event_mask)) def unmask_le_event(self, *subevent_codes): for subevent_code in subevent_codes: self.le_event_mask |= 1 << (int(subevent_code) - 1) self.send_hci_command(hci_packets.LeSetEventMaskBuilder(self.le_event_mask)) def start_scanning(self): self.send_hci_command( hci_packets.LeSetExtendedScanEnableBuilder(hci_packets.Enable.ENABLED, Loading
system/blueberry/tests/gd/hal/simple_hal_test.py +1 −0 Original line number Diff line number Diff line Loading @@ -72,6 +72,7 @@ class SimpleHalTest(gd_base_test.GdBaseTestClass): def test_le_ad_scan_cert_advertises(self): self.dut_hal.unmask_event(hci_packets.EventCode.LE_META_EVENT) self.dut_hal.unmask_le_event(hci_packets.SubeventCode.EXTENDED_ADVERTISING_REPORT) self.dut_hal.set_random_le_address('0D:05:04:03:02:01') self.dut_hal.set_scan_parameters() Loading
tools/rootcanal/model/controller/dual_mode_controller.cc +1 −1 Original line number Diff line number Diff line Loading @@ -2093,7 +2093,7 @@ void DualModeController::LeSetAdvertisingParameters(CommandView command) { } link_layer_controller_.SetLeAdvertisingParameters( command_view.GetAdvertisingIntervalMin(), command_view.GetAdvertisingIntervalMax(), static_cast<uint8_t>(type), command_view.GetAdvertisingIntervalMax(), type, static_cast<uint8_t>(command_view.GetOwnAddressType()), static_cast<uint8_t>(command_view.GetPeerAddressType()), peer_address, command_view.GetAdvertisingChannelMap(), Loading
tools/rootcanal/model/controller/le_advertiser.cc +36 −16 Original line number Diff line number Diff line Loading @@ -24,7 +24,7 @@ void LeAdvertiser::Initialize(OwnAddressType address_type, AddressWithType public_address, AddressWithType peer_address, LeScanningFilterPolicy filter_policy, model::packets::AdvertisementType type, AdvertisingType type, const std::vector<uint8_t>& advertisement, const std::vector<uint8_t>& scan_response, std::chrono::steady_clock::duration interval) { Loading @@ -44,8 +44,7 @@ void LeAdvertiser::Initialize(OwnAddressType address_type, void LeAdvertiser::InitializeExtended( unsigned advertising_handle, OwnAddressType address_type, AddressWithType public_address, AddressWithType peer_address, LeScanningFilterPolicy filter_policy, model::packets::AdvertisementType type, LeScanningFilterPolicy filter_policy, AdvertisingType type, std::chrono::steady_clock::duration interval, uint8_t tx_power, const std::function<bluetooth::hci::Address()>& get_address) { get_address_ = get_address; Loading @@ -66,7 +65,7 @@ void LeAdvertiser::Clear() { address_ = AddressWithType{}; peer_address_ = AddressWithType{}; filter_policy_ = LeScanningFilterPolicy::ACCEPT_ALL; type_ = model::packets::AdvertisementType::ADV_IND; type_ = AdvertisingType::ADV_IND; advertisement_.clear(); scan_response_.clear(); interval_ = 0ms; Loading Loading @@ -138,14 +137,14 @@ void LeAdvertiser::EnableExtended(std::chrono::milliseconds duration_ms) { switch (type_) { // [Vol 6] Part B. 4.4.2.4.3 High duty cycle connectable directed // advertising case model::packets::AdvertisementType::ADV_DIRECT_IND: case AdvertisingType::ADV_DIRECT_IND_HIGH: duration = duration == 0ms ? adv_direct_ind_timeout : std::min(duration, adv_direct_ind_timeout); interval_ = adv_direct_ind_interval_high; break; // [Vol 6] Part B. 4.4.2.4.2 Low duty cycle connectable directed advertising case model::packets::AdvertisementType::SCAN_RESPONSE: case AdvertisingType::ADV_DIRECT_IND_LOW: interval_ = adv_direct_ind_interval_low; break; Loading @@ -169,8 +168,8 @@ bool LeAdvertiser::IsEnabled() const { return enabled_; } 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; return type_ != AdvertisingType::ADV_NONCONN_IND && type_ != AdvertisingType::ADV_SCAN_IND; } uint8_t LeAdvertiser::GetNumAdvertisingEvents() const { return num_events_; } Loading @@ -184,8 +183,8 @@ std::unique_ptr<bluetooth::hci::EventBuilder> LeAdvertiser::GetEvent( // [Vol 4] Part E 7.8.9 LE Set Advertising Enable command // [Vol 4] Part E 7.8.56 LE Set Extended Advertising Enable command if (type_ == model::packets::AdvertisementType::ADV_DIRECT_IND && now >= ending_time_ && limited_) { if (type_ == AdvertisingType::ADV_DIRECT_IND_HIGH && now >= ending_time_ && limited_) { LOG_INFO("Directed Advertising Timeout"); enabled_ = false; return bluetooth::hci::LeConnectionCompleteBuilder::Create( Loading Loading @@ -216,21 +215,42 @@ LeAdvertiser::GetAdvertisement(std::chrono::steady_clock::time_point now) { return nullptr; } model::packets::LegacyAdvertisingType advertising_type; switch (type_) { case AdvertisingType::ADV_IND: advertising_type = model::packets::LegacyAdvertisingType::ADV_IND; break; case AdvertisingType::ADV_DIRECT_IND_HIGH: case AdvertisingType::ADV_DIRECT_IND_LOW: advertising_type = model::packets::LegacyAdvertisingType::ADV_DIRECT_IND; break; case AdvertisingType::ADV_SCAN_IND: advertising_type = model::packets::LegacyAdvertisingType::ADV_SCAN_IND; break; case AdvertisingType::ADV_NONCONN_IND: advertising_type = model::packets::LegacyAdvertisingType::ADV_NONCONN_IND; break; } last_le_advertisement_ = now; num_events_ += (num_events_ < 255 ? 1 : 0); if (tx_power_ == kTxPowerUnavailable) { return model::packets::LeAdvertisementBuilder::Create( return model::packets::LeLegacyAdvertisingPduBuilder::Create( address_.GetAddress(), peer_address_.GetAddress(), static_cast<model::packets::AddressType>(address_.GetAddressType()), type_, advertisement_); static_cast<model::packets::AddressType>( peer_address_.GetAddressType()), advertising_type, advertisement_); } else { uint8_t tx_power_jittered = 2 + tx_power_ - (num_events_ & 0x03); return model::packets::RssiWrapperBuilder::Create( address_.GetAddress(), peer_address_.GetAddress(), tx_power_jittered, model::packets::LeAdvertisementBuilder::Create( model::packets::LeLegacyAdvertisingPduBuilder::Create( address_.GetAddress(), peer_address_.GetAddress(), static_cast<model::packets::AddressType>(address_.GetAddressType()), type_, advertisement_)); static_cast<model::packets::AddressType>( peer_address_.GetAddressType()), advertising_type, advertisement_)); } } Loading Loading @@ -258,7 +278,7 @@ LeAdvertiser::GetScanResponse(bluetooth::hci::Address scanned, return model::packets::LeScanResponseBuilder::Create( address_.GetAddress(), peer_address_.GetAddress(), static_cast<model::packets::AddressType>(address_.GetAddressType()), model::packets::AdvertisementType::SCAN_RESPONSE, scan_response_); scan_response_); } else { uint8_t tx_power_jittered = 2 + tx_power_ - (num_events_ & 0x03); return model::packets::RssiWrapperBuilder::Create( Loading @@ -266,7 +286,7 @@ LeAdvertiser::GetScanResponse(bluetooth::hci::Address scanned, model::packets::LeScanResponseBuilder::Create( address_.GetAddress(), peer_address_.GetAddress(), static_cast<model::packets::AddressType>(address_.GetAddressType()), model::packets::AdvertisementType::SCAN_RESPONSE, scan_response_)); scan_response_)); } } Loading
tools/rootcanal/model/controller/le_advertiser.h +3 −3 Original line number Diff line number Diff line Loading @@ -36,7 +36,7 @@ class LeAdvertiser { bluetooth::hci::AddressWithType public_address, bluetooth::hci::AddressWithType peer_address, bluetooth::hci::LeScanningFilterPolicy filter_policy, model::packets::AdvertisementType type, bluetooth::hci::AdvertisingType type, const std::vector<uint8_t>& advertisement, const std::vector<uint8_t>& scan_response, std::chrono::steady_clock::duration interval); Loading @@ -46,7 +46,7 @@ class LeAdvertiser { bluetooth::hci::AddressWithType public_address, bluetooth::hci::AddressWithType peer_address, bluetooth::hci::LeScanningFilterPolicy filter_policy, model::packets::AdvertisementType type, bluetooth::hci::AdvertisingType type, std::chrono::steady_clock::duration interval, uint8_t tx_power, const std::function<bluetooth::hci::Address()>& get_address); Loading Loading @@ -92,7 +92,7 @@ class LeAdvertiser { bluetooth::hci::AddressWithType peer_address_{}; // For directed advertisements bluetooth::hci::LeScanningFilterPolicy filter_policy_{}; model::packets::AdvertisementType type_{}; bluetooth::hci::AdvertisingType type_{}; std::vector<uint8_t> advertisement_; std::vector<uint8_t> scan_response_; std::chrono::steady_clock::duration interval_{}; Loading