Loading flags/gap.aconfig +0 −7 Original line number Original line Diff line number Diff line Loading @@ -8,13 +8,6 @@ flag { bug: "308855997" bug: "308855997" } } flag { name: "divide_long_single_gap_data" namespace: "bluetooth" description: "Divide long single gap data if length is longer than HCI data length limit" bug: "310217895" } flag { flag { name: "fix_nonconnectable_scannable_advertisement" name: "fix_nonconnectable_scannable_advertisement" namespace: "bluetooth" namespace: "bluetooth" Loading system/gd/hci/le_advertising_manager.cc +73 −163 Original line number Original line Diff line number Diff line Loading @@ -955,13 +955,10 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb bool check_extended_advertising_data(std::vector<GapData> data, bool include_flag) { bool check_extended_advertising_data(std::vector<GapData> data, bool include_flag) { uint16_t data_len = 0; uint16_t data_len = 0; uint16_t data_limit = com::android::bluetooth::flags::divide_long_single_gap_data() ? kLeMaximumGapDataLength : kLeMaximumFragmentLength; // check data size // check data size for (size_t i = 0; i < data.size(); i++) { for (size_t i = 0; i < data.size(); i++) { if (data[i].size() > data_limit) { if (data[i].size() > kLeMaximumGapDataLength) { log::warn("AD data len shall not greater than {}", data_limit); log::warn("AD data len shall not greater than {}", kLeMaximumGapDataLength); return false; return false; } } data_len += data[i].size(); data_len += data[i].size(); Loading Loading @@ -1053,13 +1050,10 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb } break; } break; case (AdvertisingApiType::EXTENDED): { case (AdvertisingApiType::EXTENDED): { uint16_t data_len = 0; uint16_t data_len = 0; bool divide_gap_flag = com::android::bluetooth::flags::divide_long_single_gap_data(); // check data size // check data size for (size_t i = 0; i < data.size(); i++) { for (size_t i = 0; i < data.size(); i++) { uint16_t data_limit = if (data[i].size() > kLeMaximumGapDataLength) { divide_gap_flag ? kLeMaximumGapDataLength : kLeMaximumFragmentLength; log::warn("AD data len shall not greater than {}", kLeMaximumGapDataLength); if (data[i].size() > data_limit) { log::warn("AD data len shall not greater than {}", data_limit); if (advertising_callbacks_ != nullptr) { if (advertising_callbacks_ != nullptr) { if (set_scan_rsp) { if (set_scan_rsp) { advertising_callbacks_->OnScanResponseDataSet( advertising_callbacks_->OnScanResponseDataSet( Loading Loading @@ -1101,7 +1095,6 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb uint16_t sub_data_len = 0; uint16_t sub_data_len = 0; Operation operation = Operation::FIRST_FRAGMENT; Operation operation = Operation::FIRST_FRAGMENT; if (divide_gap_flag) { std::vector<std::unique_ptr<packet::RawBuilder>> fragments; std::vector<std::unique_ptr<packet::RawBuilder>> fragments; packet::FragmentingInserter it( packet::FragmentingInserter it( kLeMaximumFragmentLength, std::back_insert_iterator(fragments)); kLeMaximumFragmentLength, std::back_insert_iterator(fragments)); Loading @@ -1118,27 +1111,16 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb (i == fragments.size() - 1) ? Operation::LAST_FRAGMENT : operation); (i == fragments.size() - 1) ? Operation::LAST_FRAGMENT : operation); operation = Operation::INTERMEDIATE_FRAGMENT; operation = Operation::INTERMEDIATE_FRAGMENT; } } } else { for (size_t i = 0; i < data.size(); i++) { if (sub_data_len + data[i].size() > kLeMaximumFragmentLength) { send_data_fragment(advertiser_id, set_scan_rsp, sub_data, operation); operation = Operation::INTERMEDIATE_FRAGMENT; sub_data_len = 0; sub_data.clear(); } sub_data.push_back(data[i]); sub_data_len += data[i].size(); } send_data_fragment(advertiser_id, set_scan_rsp, sub_data, Operation::LAST_FRAGMENT); } } } } break; } break; } } } } void send_data_fragment( void send_data_fragment( AdvertiserId advertiser_id, bool set_scan_rsp, std::vector<GapData> data, Operation operation) { AdvertiserId advertiser_id, if (com::android::bluetooth::flags::divide_long_single_gap_data()) { bool set_scan_rsp, std::vector<GapData> data, Operation operation) { // For first and intermediate fragment, do not trigger advertising_callbacks_. // For first and intermediate fragment, do not trigger advertising_callbacks_. bool send_callback = bool send_callback = (operation == Operation::COMPLETE_ADVERTISEMENT || operation == Operation::LAST_FRAGMENT); (operation == Operation::COMPLETE_ADVERTISEMENT || operation == Operation::LAST_FRAGMENT); Loading @@ -1161,42 +1143,6 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb send_callback, send_callback, advertiser_id)); advertiser_id)); } } } else { if (operation == Operation::COMPLETE_ADVERTISEMENT || operation == Operation::LAST_FRAGMENT) { if (set_scan_rsp) { le_advertising_interface_->EnqueueCommand( hci::LeSetExtendedScanResponseDataBuilder::Create( advertiser_id, operation, kFragment_preference, data), module_handler_->BindOnceOn( this, &impl::check_status_with_id<LeSetExtendedScanResponseDataCompleteView>, true, advertiser_id)); } else { le_advertising_interface_->EnqueueCommand( hci::LeSetExtendedAdvertisingDataBuilder::Create( advertiser_id, operation, kFragment_preference, data), module_handler_->BindOnceOn( this, &impl::check_status_with_id<LeSetExtendedAdvertisingDataCompleteView>, true, advertiser_id)); } } else { // For first and intermediate fragment, do not trigger advertising_callbacks_. if (set_scan_rsp) { le_advertising_interface_->EnqueueCommand( hci::LeSetExtendedScanResponseDataBuilder::Create( advertiser_id, operation, kFragment_preference, data), module_handler_->BindOnce(check_complete<LeSetExtendedScanResponseDataCompleteView>)); } else { le_advertising_interface_->EnqueueCommand( hci::LeSetExtendedAdvertisingDataBuilder::Create( advertiser_id, operation, kFragment_preference, data), module_handler_->BindOnce(check_complete<LeSetExtendedAdvertisingDataCompleteView>)); } } } } } void send_data_fragment_with_raw_builder( void send_data_fragment_with_raw_builder( Loading Loading @@ -1315,12 +1261,10 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb void set_periodic_data(AdvertiserId advertiser_id, std::vector<GapData> data) { void set_periodic_data(AdvertiserId advertiser_id, std::vector<GapData> data) { uint16_t data_len = 0; uint16_t data_len = 0; bool divide_gap_flag = com::android::bluetooth::flags::divide_long_single_gap_data(); // check data size // check data size for (size_t i = 0; i < data.size(); i++) { for (size_t i = 0; i < data.size(); i++) { uint16_t data_limit = divide_gap_flag ? kLeMaximumGapDataLength : kLeMaximumFragmentLength; if (data[i].size() > kLeMaximumGapDataLength) { if (data[i].size() > data_limit) { log::warn("AD data len shall not greater than {}", kLeMaximumGapDataLength); log::warn("AD data len shall not greater than {}", data_limit); if (advertising_callbacks_ != nullptr) { if (advertising_callbacks_ != nullptr) { advertising_callbacks_->OnPeriodicAdvertisingDataSet( advertising_callbacks_->OnPeriodicAdvertisingDataSet( advertiser_id, AdvertisingCallback::AdvertisingStatus::INTERNAL_ERROR); advertiser_id, AdvertisingCallback::AdvertisingStatus::INTERNAL_ERROR); Loading @@ -1341,16 +1285,13 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb return; return; } } uint16_t data_fragment_limit = if (data_len <= kLeMaximumPeriodicDataFragmentLength) { divide_gap_flag ? kLeMaximumPeriodicDataFragmentLength : kLeMaximumFragmentLength; if (data_len <= data_fragment_limit) { send_periodic_data_fragment(advertiser_id, data, Operation::COMPLETE_ADVERTISEMENT); send_periodic_data_fragment(advertiser_id, data, Operation::COMPLETE_ADVERTISEMENT); } else { } else { std::vector<GapData> sub_data; std::vector<GapData> sub_data; uint16_t sub_data_len = 0; uint16_t sub_data_len = 0; Operation operation = Operation::FIRST_FRAGMENT; Operation operation = Operation::FIRST_FRAGMENT; if (divide_gap_flag) { std::vector<std::unique_ptr<packet::RawBuilder>> fragments; std::vector<std::unique_ptr<packet::RawBuilder>> fragments; packet::FragmentingInserter it( packet::FragmentingInserter it( kLeMaximumPeriodicDataFragmentLength, std::back_insert_iterator(fragments)); kLeMaximumPeriodicDataFragmentLength, std::back_insert_iterator(fragments)); Loading @@ -1366,24 +1307,11 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb (i == fragments.size() - 1) ? Operation::LAST_FRAGMENT : operation); (i == fragments.size() - 1) ? Operation::LAST_FRAGMENT : operation); operation = Operation::INTERMEDIATE_FRAGMENT; operation = Operation::INTERMEDIATE_FRAGMENT; } } } else { for (size_t i = 0; i < data.size(); i++) { if (sub_data_len + data[i].size() > kLeMaximumFragmentLength) { send_periodic_data_fragment(advertiser_id, sub_data, operation); operation = Operation::INTERMEDIATE_FRAGMENT; sub_data_len = 0; sub_data.clear(); } sub_data.push_back(data[i]); sub_data_len += data[i].size(); } send_periodic_data_fragment(advertiser_id, sub_data, Operation::LAST_FRAGMENT); } } } } } void send_periodic_data_fragment(AdvertiserId advertiser_id, std::vector<GapData> data, Operation operation) { void send_periodic_data_fragment( if (com::android::bluetooth::flags::divide_long_single_gap_data()) { AdvertiserId advertiser_id, std::vector<GapData> data, Operation operation) { // For first and intermediate fragment, do not trigger advertising_callbacks_. // For first and intermediate fragment, do not trigger advertising_callbacks_. bool send_callback = bool send_callback = (operation == Operation::COMPLETE_ADVERTISEMENT || operation == Operation::LAST_FRAGMENT); (operation == Operation::COMPLETE_ADVERTISEMENT || operation == Operation::LAST_FRAGMENT); Loading @@ -1394,22 +1322,6 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb &impl::check_status_with_id<LeSetPeriodicAdvertisingDataCompleteView>, &impl::check_status_with_id<LeSetPeriodicAdvertisingDataCompleteView>, send_callback, send_callback, advertiser_id)); advertiser_id)); } else { if (operation == Operation::COMPLETE_ADVERTISEMENT || operation == Operation::LAST_FRAGMENT) { le_advertising_interface_->EnqueueCommand( hci::LeSetPeriodicAdvertisingDataBuilder::Create(advertiser_id, operation, data), module_handler_->BindOnceOn( this, &impl::check_status_with_id<LeSetPeriodicAdvertisingDataCompleteView>, true, advertiser_id)); } else { // For first and intermediate fragment, do not trigger advertising_callbacks_. le_advertising_interface_->EnqueueCommand( hci::LeSetPeriodicAdvertisingDataBuilder::Create(advertiser_id, operation, data), module_handler_->BindOnce(check_complete<LeSetPeriodicAdvertisingDataCompleteView>)); } } } } void send_periodic_data_fragment_with_raw_builder( void send_periodic_data_fragment_with_raw_builder( Loading Loading @@ -1772,12 +1684,10 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb return; return; } } if (com::android::bluetooth::flags::divide_long_single_gap_data()) { // Do not trigger callback if send_callback is false // Do not trigger callback if send_callback is false if (!send_callback) { if (!send_callback) { return; return; } } } OpCode opcode = view.GetCommandOpCode(); OpCode opcode = view.GetCommandOpCode(); Loading system/gd/hci/le_advertising_manager_test.cc +10 −35 Original line number Original line Diff line number Diff line Loading @@ -788,10 +788,7 @@ TEST_F(LeExtendedAdvertisingManagerTest, create_periodic_advertiser_test) { ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode()); ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode()); } } TEST_F_WITH_FLAGS( TEST_F(LeExtendedAdvertisingManagerTest, create_advertiser_valid_max_251_ad_data_length_test) { LeExtendedAdvertisingManagerTest, create_advertiser_valid_max_251_ad_data_length_test, REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) { AdvertisingConfig advertising_config{}; AdvertisingConfig advertising_config{}; advertising_config.advertising_type = AdvertisingType::ADV_IND; advertising_config.advertising_type = AdvertisingType::ADV_IND; advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC; advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC; Loading Loading @@ -849,10 +846,9 @@ TEST_F_WITH_FLAGS( ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode()); ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode()); } } TEST_F_WITH_FLAGS( TEST_F( LeExtendedAdvertisingManagerTest, LeExtendedAdvertisingManagerTest, create_advertiser_valid_max_252_ad_data_length_fragments_test, create_advertiser_valid_max_252_ad_data_length_fragments_test) { REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) { AdvertisingConfig advertising_config{}; AdvertisingConfig advertising_config{}; advertising_config.advertising_type = AdvertisingType::ADV_IND; advertising_config.advertising_type = AdvertisingType::ADV_IND; advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC; advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC; Loading Loading @@ -918,10 +914,7 @@ TEST_F_WITH_FLAGS( ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode()); ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode()); } } TEST_F_WITH_FLAGS( TEST_F(LeExtendedAdvertisingManagerTest, create_advertiser_test_invalid_256_ad_data_length_test) { LeExtendedAdvertisingManagerTest, create_advertiser_test_invalid_256_ad_data_length_test, REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) { AdvertisingConfig advertising_config{}; AdvertisingConfig advertising_config{}; advertising_config.advertising_type = AdvertisingType::ADV_IND; advertising_config.advertising_type = AdvertisingType::ADV_IND; advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC; advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC; Loading Loading @@ -1279,10 +1272,7 @@ TEST_F(LeExtendedAdvertisingAPITest, set_data_with_invalid_length) { sync_client_handler(); sync_client_handler(); } } TEST_F_WITH_FLAGS( TEST_F(LeExtendedAdvertisingAPITest, set_data_valid_max_251_ad_data_length_test) { LeExtendedAdvertisingAPITest, set_data_valid_max_251_ad_data_length_test, REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) { // Set advertising data // Set advertising data std::vector<GapData> advertising_data{}; std::vector<GapData> advertising_data{}; // set data 251 bytes // set data 251 bytes Loading Loading @@ -1317,10 +1307,7 @@ TEST_F_WITH_FLAGS( LeSetExtendedScanResponseDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS)); LeSetExtendedScanResponseDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS)); } } TEST_F_WITH_FLAGS( TEST_F(LeExtendedAdvertisingAPITest, set_data_valid_252_ad_data_length_fragments_test) { LeExtendedAdvertisingAPITest, set_data_valid_252_ad_data_length_fragments_test, REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) { // Set advertising data // Set advertising data std::vector<GapData> advertising_data{}; std::vector<GapData> advertising_data{}; // set data 252 bytes // set data 252 bytes Loading Loading @@ -1391,10 +1378,7 @@ TEST_F_WITH_FLAGS( LeSetExtendedScanResponseDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS)); LeSetExtendedScanResponseDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS)); } } TEST_F_WITH_FLAGS( TEST_F(LeExtendedAdvertisingAPITest, set_data_with_invalid_256_ad_data_length_test) { LeExtendedAdvertisingAPITest, set_data_with_invalid_256_ad_data_length_test, REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) { // Set advertising data with data that greater than le_maximum_advertising_data_length_ // Set advertising data with data that greater than le_maximum_advertising_data_length_ std::vector<GapData> advertising_data{}; std::vector<GapData> advertising_data{}; Loading Loading @@ -1586,10 +1570,7 @@ TEST_F(LeExtendedAdvertisingAPITest, set_periodic_data_fragments_test) { test_hci_layer_->IncomingEvent(LeSetPeriodicAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS)); test_hci_layer_->IncomingEvent(LeSetPeriodicAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS)); } } TEST_F_WITH_FLAGS( TEST_F(LeExtendedAdvertisingAPITest, set_periodic_data_valid_max_252_ad_data_length_test) { LeExtendedAdvertisingAPITest, set_periodic_data_valid_max_252_ad_data_length_test, REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) { // Set advertising data // Set advertising data std::vector<GapData> advertising_data{}; std::vector<GapData> advertising_data{}; Loading @@ -1612,10 +1593,7 @@ TEST_F_WITH_FLAGS( sync_client_handler(); sync_client_handler(); } } TEST_F_WITH_FLAGS( TEST_F(LeExtendedAdvertisingAPITest, set_periodic_data_valid_253_ad_data_length_fragments_test) { LeExtendedAdvertisingAPITest, set_periodic_data_valid_253_ad_data_length_fragments_test, REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) { // Set advertising data // Set advertising data std::vector<GapData> advertising_data{}; std::vector<GapData> advertising_data{}; Loading Loading @@ -1653,10 +1631,7 @@ TEST_F_WITH_FLAGS( LeSetPeriodicAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS)); LeSetPeriodicAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS)); } } TEST_F_WITH_FLAGS( TEST_F(LeExtendedAdvertisingAPITest, set_periodic_data_invalid_256_ad_data_length_test) { LeExtendedAdvertisingAPITest, set_periodic_data_invalid_256_ad_data_length_test, REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) { // Set advertising data // Set advertising data std::vector<GapData> advertising_data{}; std::vector<GapData> advertising_data{}; Loading Loading
flags/gap.aconfig +0 −7 Original line number Original line Diff line number Diff line Loading @@ -8,13 +8,6 @@ flag { bug: "308855997" bug: "308855997" } } flag { name: "divide_long_single_gap_data" namespace: "bluetooth" description: "Divide long single gap data if length is longer than HCI data length limit" bug: "310217895" } flag { flag { name: "fix_nonconnectable_scannable_advertisement" name: "fix_nonconnectable_scannable_advertisement" namespace: "bluetooth" namespace: "bluetooth" Loading
system/gd/hci/le_advertising_manager.cc +73 −163 Original line number Original line Diff line number Diff line Loading @@ -955,13 +955,10 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb bool check_extended_advertising_data(std::vector<GapData> data, bool include_flag) { bool check_extended_advertising_data(std::vector<GapData> data, bool include_flag) { uint16_t data_len = 0; uint16_t data_len = 0; uint16_t data_limit = com::android::bluetooth::flags::divide_long_single_gap_data() ? kLeMaximumGapDataLength : kLeMaximumFragmentLength; // check data size // check data size for (size_t i = 0; i < data.size(); i++) { for (size_t i = 0; i < data.size(); i++) { if (data[i].size() > data_limit) { if (data[i].size() > kLeMaximumGapDataLength) { log::warn("AD data len shall not greater than {}", data_limit); log::warn("AD data len shall not greater than {}", kLeMaximumGapDataLength); return false; return false; } } data_len += data[i].size(); data_len += data[i].size(); Loading Loading @@ -1053,13 +1050,10 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb } break; } break; case (AdvertisingApiType::EXTENDED): { case (AdvertisingApiType::EXTENDED): { uint16_t data_len = 0; uint16_t data_len = 0; bool divide_gap_flag = com::android::bluetooth::flags::divide_long_single_gap_data(); // check data size // check data size for (size_t i = 0; i < data.size(); i++) { for (size_t i = 0; i < data.size(); i++) { uint16_t data_limit = if (data[i].size() > kLeMaximumGapDataLength) { divide_gap_flag ? kLeMaximumGapDataLength : kLeMaximumFragmentLength; log::warn("AD data len shall not greater than {}", kLeMaximumGapDataLength); if (data[i].size() > data_limit) { log::warn("AD data len shall not greater than {}", data_limit); if (advertising_callbacks_ != nullptr) { if (advertising_callbacks_ != nullptr) { if (set_scan_rsp) { if (set_scan_rsp) { advertising_callbacks_->OnScanResponseDataSet( advertising_callbacks_->OnScanResponseDataSet( Loading Loading @@ -1101,7 +1095,6 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb uint16_t sub_data_len = 0; uint16_t sub_data_len = 0; Operation operation = Operation::FIRST_FRAGMENT; Operation operation = Operation::FIRST_FRAGMENT; if (divide_gap_flag) { std::vector<std::unique_ptr<packet::RawBuilder>> fragments; std::vector<std::unique_ptr<packet::RawBuilder>> fragments; packet::FragmentingInserter it( packet::FragmentingInserter it( kLeMaximumFragmentLength, std::back_insert_iterator(fragments)); kLeMaximumFragmentLength, std::back_insert_iterator(fragments)); Loading @@ -1118,27 +1111,16 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb (i == fragments.size() - 1) ? Operation::LAST_FRAGMENT : operation); (i == fragments.size() - 1) ? Operation::LAST_FRAGMENT : operation); operation = Operation::INTERMEDIATE_FRAGMENT; operation = Operation::INTERMEDIATE_FRAGMENT; } } } else { for (size_t i = 0; i < data.size(); i++) { if (sub_data_len + data[i].size() > kLeMaximumFragmentLength) { send_data_fragment(advertiser_id, set_scan_rsp, sub_data, operation); operation = Operation::INTERMEDIATE_FRAGMENT; sub_data_len = 0; sub_data.clear(); } sub_data.push_back(data[i]); sub_data_len += data[i].size(); } send_data_fragment(advertiser_id, set_scan_rsp, sub_data, Operation::LAST_FRAGMENT); } } } } break; } break; } } } } void send_data_fragment( void send_data_fragment( AdvertiserId advertiser_id, bool set_scan_rsp, std::vector<GapData> data, Operation operation) { AdvertiserId advertiser_id, if (com::android::bluetooth::flags::divide_long_single_gap_data()) { bool set_scan_rsp, std::vector<GapData> data, Operation operation) { // For first and intermediate fragment, do not trigger advertising_callbacks_. // For first and intermediate fragment, do not trigger advertising_callbacks_. bool send_callback = bool send_callback = (operation == Operation::COMPLETE_ADVERTISEMENT || operation == Operation::LAST_FRAGMENT); (operation == Operation::COMPLETE_ADVERTISEMENT || operation == Operation::LAST_FRAGMENT); Loading @@ -1161,42 +1143,6 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb send_callback, send_callback, advertiser_id)); advertiser_id)); } } } else { if (operation == Operation::COMPLETE_ADVERTISEMENT || operation == Operation::LAST_FRAGMENT) { if (set_scan_rsp) { le_advertising_interface_->EnqueueCommand( hci::LeSetExtendedScanResponseDataBuilder::Create( advertiser_id, operation, kFragment_preference, data), module_handler_->BindOnceOn( this, &impl::check_status_with_id<LeSetExtendedScanResponseDataCompleteView>, true, advertiser_id)); } else { le_advertising_interface_->EnqueueCommand( hci::LeSetExtendedAdvertisingDataBuilder::Create( advertiser_id, operation, kFragment_preference, data), module_handler_->BindOnceOn( this, &impl::check_status_with_id<LeSetExtendedAdvertisingDataCompleteView>, true, advertiser_id)); } } else { // For first and intermediate fragment, do not trigger advertising_callbacks_. if (set_scan_rsp) { le_advertising_interface_->EnqueueCommand( hci::LeSetExtendedScanResponseDataBuilder::Create( advertiser_id, operation, kFragment_preference, data), module_handler_->BindOnce(check_complete<LeSetExtendedScanResponseDataCompleteView>)); } else { le_advertising_interface_->EnqueueCommand( hci::LeSetExtendedAdvertisingDataBuilder::Create( advertiser_id, operation, kFragment_preference, data), module_handler_->BindOnce(check_complete<LeSetExtendedAdvertisingDataCompleteView>)); } } } } } void send_data_fragment_with_raw_builder( void send_data_fragment_with_raw_builder( Loading Loading @@ -1315,12 +1261,10 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb void set_periodic_data(AdvertiserId advertiser_id, std::vector<GapData> data) { void set_periodic_data(AdvertiserId advertiser_id, std::vector<GapData> data) { uint16_t data_len = 0; uint16_t data_len = 0; bool divide_gap_flag = com::android::bluetooth::flags::divide_long_single_gap_data(); // check data size // check data size for (size_t i = 0; i < data.size(); i++) { for (size_t i = 0; i < data.size(); i++) { uint16_t data_limit = divide_gap_flag ? kLeMaximumGapDataLength : kLeMaximumFragmentLength; if (data[i].size() > kLeMaximumGapDataLength) { if (data[i].size() > data_limit) { log::warn("AD data len shall not greater than {}", kLeMaximumGapDataLength); log::warn("AD data len shall not greater than {}", data_limit); if (advertising_callbacks_ != nullptr) { if (advertising_callbacks_ != nullptr) { advertising_callbacks_->OnPeriodicAdvertisingDataSet( advertising_callbacks_->OnPeriodicAdvertisingDataSet( advertiser_id, AdvertisingCallback::AdvertisingStatus::INTERNAL_ERROR); advertiser_id, AdvertisingCallback::AdvertisingStatus::INTERNAL_ERROR); Loading @@ -1341,16 +1285,13 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb return; return; } } uint16_t data_fragment_limit = if (data_len <= kLeMaximumPeriodicDataFragmentLength) { divide_gap_flag ? kLeMaximumPeriodicDataFragmentLength : kLeMaximumFragmentLength; if (data_len <= data_fragment_limit) { send_periodic_data_fragment(advertiser_id, data, Operation::COMPLETE_ADVERTISEMENT); send_periodic_data_fragment(advertiser_id, data, Operation::COMPLETE_ADVERTISEMENT); } else { } else { std::vector<GapData> sub_data; std::vector<GapData> sub_data; uint16_t sub_data_len = 0; uint16_t sub_data_len = 0; Operation operation = Operation::FIRST_FRAGMENT; Operation operation = Operation::FIRST_FRAGMENT; if (divide_gap_flag) { std::vector<std::unique_ptr<packet::RawBuilder>> fragments; std::vector<std::unique_ptr<packet::RawBuilder>> fragments; packet::FragmentingInserter it( packet::FragmentingInserter it( kLeMaximumPeriodicDataFragmentLength, std::back_insert_iterator(fragments)); kLeMaximumPeriodicDataFragmentLength, std::back_insert_iterator(fragments)); Loading @@ -1366,24 +1307,11 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb (i == fragments.size() - 1) ? Operation::LAST_FRAGMENT : operation); (i == fragments.size() - 1) ? Operation::LAST_FRAGMENT : operation); operation = Operation::INTERMEDIATE_FRAGMENT; operation = Operation::INTERMEDIATE_FRAGMENT; } } } else { for (size_t i = 0; i < data.size(); i++) { if (sub_data_len + data[i].size() > kLeMaximumFragmentLength) { send_periodic_data_fragment(advertiser_id, sub_data, operation); operation = Operation::INTERMEDIATE_FRAGMENT; sub_data_len = 0; sub_data.clear(); } sub_data.push_back(data[i]); sub_data_len += data[i].size(); } send_periodic_data_fragment(advertiser_id, sub_data, Operation::LAST_FRAGMENT); } } } } } void send_periodic_data_fragment(AdvertiserId advertiser_id, std::vector<GapData> data, Operation operation) { void send_periodic_data_fragment( if (com::android::bluetooth::flags::divide_long_single_gap_data()) { AdvertiserId advertiser_id, std::vector<GapData> data, Operation operation) { // For first and intermediate fragment, do not trigger advertising_callbacks_. // For first and intermediate fragment, do not trigger advertising_callbacks_. bool send_callback = bool send_callback = (operation == Operation::COMPLETE_ADVERTISEMENT || operation == Operation::LAST_FRAGMENT); (operation == Operation::COMPLETE_ADVERTISEMENT || operation == Operation::LAST_FRAGMENT); Loading @@ -1394,22 +1322,6 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb &impl::check_status_with_id<LeSetPeriodicAdvertisingDataCompleteView>, &impl::check_status_with_id<LeSetPeriodicAdvertisingDataCompleteView>, send_callback, send_callback, advertiser_id)); advertiser_id)); } else { if (operation == Operation::COMPLETE_ADVERTISEMENT || operation == Operation::LAST_FRAGMENT) { le_advertising_interface_->EnqueueCommand( hci::LeSetPeriodicAdvertisingDataBuilder::Create(advertiser_id, operation, data), module_handler_->BindOnceOn( this, &impl::check_status_with_id<LeSetPeriodicAdvertisingDataCompleteView>, true, advertiser_id)); } else { // For first and intermediate fragment, do not trigger advertising_callbacks_. le_advertising_interface_->EnqueueCommand( hci::LeSetPeriodicAdvertisingDataBuilder::Create(advertiser_id, operation, data), module_handler_->BindOnce(check_complete<LeSetPeriodicAdvertisingDataCompleteView>)); } } } } void send_periodic_data_fragment_with_raw_builder( void send_periodic_data_fragment_with_raw_builder( Loading Loading @@ -1772,12 +1684,10 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb return; return; } } if (com::android::bluetooth::flags::divide_long_single_gap_data()) { // Do not trigger callback if send_callback is false // Do not trigger callback if send_callback is false if (!send_callback) { if (!send_callback) { return; return; } } } OpCode opcode = view.GetCommandOpCode(); OpCode opcode = view.GetCommandOpCode(); Loading
system/gd/hci/le_advertising_manager_test.cc +10 −35 Original line number Original line Diff line number Diff line Loading @@ -788,10 +788,7 @@ TEST_F(LeExtendedAdvertisingManagerTest, create_periodic_advertiser_test) { ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode()); ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode()); } } TEST_F_WITH_FLAGS( TEST_F(LeExtendedAdvertisingManagerTest, create_advertiser_valid_max_251_ad_data_length_test) { LeExtendedAdvertisingManagerTest, create_advertiser_valid_max_251_ad_data_length_test, REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) { AdvertisingConfig advertising_config{}; AdvertisingConfig advertising_config{}; advertising_config.advertising_type = AdvertisingType::ADV_IND; advertising_config.advertising_type = AdvertisingType::ADV_IND; advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC; advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC; Loading Loading @@ -849,10 +846,9 @@ TEST_F_WITH_FLAGS( ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode()); ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode()); } } TEST_F_WITH_FLAGS( TEST_F( LeExtendedAdvertisingManagerTest, LeExtendedAdvertisingManagerTest, create_advertiser_valid_max_252_ad_data_length_fragments_test, create_advertiser_valid_max_252_ad_data_length_fragments_test) { REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) { AdvertisingConfig advertising_config{}; AdvertisingConfig advertising_config{}; advertising_config.advertising_type = AdvertisingType::ADV_IND; advertising_config.advertising_type = AdvertisingType::ADV_IND; advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC; advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC; Loading Loading @@ -918,10 +914,7 @@ TEST_F_WITH_FLAGS( ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode()); ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode()); } } TEST_F_WITH_FLAGS( TEST_F(LeExtendedAdvertisingManagerTest, create_advertiser_test_invalid_256_ad_data_length_test) { LeExtendedAdvertisingManagerTest, create_advertiser_test_invalid_256_ad_data_length_test, REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) { AdvertisingConfig advertising_config{}; AdvertisingConfig advertising_config{}; advertising_config.advertising_type = AdvertisingType::ADV_IND; advertising_config.advertising_type = AdvertisingType::ADV_IND; advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC; advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC; Loading Loading @@ -1279,10 +1272,7 @@ TEST_F(LeExtendedAdvertisingAPITest, set_data_with_invalid_length) { sync_client_handler(); sync_client_handler(); } } TEST_F_WITH_FLAGS( TEST_F(LeExtendedAdvertisingAPITest, set_data_valid_max_251_ad_data_length_test) { LeExtendedAdvertisingAPITest, set_data_valid_max_251_ad_data_length_test, REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) { // Set advertising data // Set advertising data std::vector<GapData> advertising_data{}; std::vector<GapData> advertising_data{}; // set data 251 bytes // set data 251 bytes Loading Loading @@ -1317,10 +1307,7 @@ TEST_F_WITH_FLAGS( LeSetExtendedScanResponseDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS)); LeSetExtendedScanResponseDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS)); } } TEST_F_WITH_FLAGS( TEST_F(LeExtendedAdvertisingAPITest, set_data_valid_252_ad_data_length_fragments_test) { LeExtendedAdvertisingAPITest, set_data_valid_252_ad_data_length_fragments_test, REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) { // Set advertising data // Set advertising data std::vector<GapData> advertising_data{}; std::vector<GapData> advertising_data{}; // set data 252 bytes // set data 252 bytes Loading Loading @@ -1391,10 +1378,7 @@ TEST_F_WITH_FLAGS( LeSetExtendedScanResponseDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS)); LeSetExtendedScanResponseDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS)); } } TEST_F_WITH_FLAGS( TEST_F(LeExtendedAdvertisingAPITest, set_data_with_invalid_256_ad_data_length_test) { LeExtendedAdvertisingAPITest, set_data_with_invalid_256_ad_data_length_test, REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) { // Set advertising data with data that greater than le_maximum_advertising_data_length_ // Set advertising data with data that greater than le_maximum_advertising_data_length_ std::vector<GapData> advertising_data{}; std::vector<GapData> advertising_data{}; Loading Loading @@ -1586,10 +1570,7 @@ TEST_F(LeExtendedAdvertisingAPITest, set_periodic_data_fragments_test) { test_hci_layer_->IncomingEvent(LeSetPeriodicAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS)); test_hci_layer_->IncomingEvent(LeSetPeriodicAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS)); } } TEST_F_WITH_FLAGS( TEST_F(LeExtendedAdvertisingAPITest, set_periodic_data_valid_max_252_ad_data_length_test) { LeExtendedAdvertisingAPITest, set_periodic_data_valid_max_252_ad_data_length_test, REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) { // Set advertising data // Set advertising data std::vector<GapData> advertising_data{}; std::vector<GapData> advertising_data{}; Loading @@ -1612,10 +1593,7 @@ TEST_F_WITH_FLAGS( sync_client_handler(); sync_client_handler(); } } TEST_F_WITH_FLAGS( TEST_F(LeExtendedAdvertisingAPITest, set_periodic_data_valid_253_ad_data_length_fragments_test) { LeExtendedAdvertisingAPITest, set_periodic_data_valid_253_ad_data_length_fragments_test, REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) { // Set advertising data // Set advertising data std::vector<GapData> advertising_data{}; std::vector<GapData> advertising_data{}; Loading Loading @@ -1653,10 +1631,7 @@ TEST_F_WITH_FLAGS( LeSetPeriodicAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS)); LeSetPeriodicAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS)); } } TEST_F_WITH_FLAGS( TEST_F(LeExtendedAdvertisingAPITest, set_periodic_data_invalid_256_ad_data_length_test) { LeExtendedAdvertisingAPITest, set_periodic_data_invalid_256_ad_data_length_test, REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) { // Set advertising data // Set advertising data std::vector<GapData> advertising_data{}; std::vector<GapData> advertising_data{}; Loading