diff options
-rw-r--r-- | android/app/src/com/android/bluetooth/pbap/BluetoothPbapSimVcardManager.java | 4 | ||||
-rw-r--r-- | system/gd/hci/le_scanning_manager.cc | 41 | ||||
-rw-r--r-- | system/gd/hci/le_scanning_manager.h | 2 | ||||
-rw-r--r-- | system/gd/hci/le_scanning_manager_mock.h | 2 | ||||
-rw-r--r-- | system/main/shim/le_scanning_manager.cc | 5 | ||||
-rw-r--r-- | system/stack/acl/btm_acl.cc | 9 | ||||
-rw-r--r-- | system/stack/avrc/avrc_pars_tg.cc | 6 |
7 files changed, 49 insertions, 20 deletions
diff --git a/android/app/src/com/android/bluetooth/pbap/BluetoothPbapSimVcardManager.java b/android/app/src/com/android/bluetooth/pbap/BluetoothPbapSimVcardManager.java index 267ce5bf28..6eb6aa1ab5 100644 --- a/android/app/src/com/android/bluetooth/pbap/BluetoothPbapSimVcardManager.java +++ b/android/app/src/com/android/bluetooth/pbap/BluetoothPbapSimVcardManager.java @@ -266,7 +266,7 @@ public class BluetoothPbapSimVcardManager { try { contactCursor = mContentResolver.query(myUri, SIM_PROJECTION, null,null, null); if (contactCursor != null) { - size = contactCursor.getCount() +1; //always has the 0.vcf + size = contactCursor.getCount(); } } finally { if (contactCursor != null) { @@ -397,7 +397,7 @@ public class BluetoothPbapSimVcardManager { String vcard = composer.createOneEntry(vcardType21); if (vcard == null) { Log.e(TAG, "Failed to read a contact. Error reason: " - + composer.getErrorReason()); + + composer.getErrorReason() + ", count:" + count); return ResponseCodes.OBEX_HTTP_INTERNAL_ERROR; } buffer.onEntryCreated(vcard); diff --git a/system/gd/hci/le_scanning_manager.cc b/system/gd/hci/le_scanning_manager.cc index 1ee248fd43..c3400e7a5c 100644 --- a/system/gd/hci/le_scanning_manager.cc +++ b/system/gd/hci/le_scanning_manager.cc @@ -13,16 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include "hci/le_scanning_manager.h" + #include <memory> #include <mutex> #include <set> +#include <unordered_map> #include "hci/acl_manager.h" #include "hci/controller.h" #include "hci/hci_layer.h" #include "hci/hci_packets.h" #include "hci/le_scanning_interface.h" -#include "hci/le_scanning_manager.h" #include "hci/vendor_specific_event_manager.h" #include "module.h" #include "os/handler.h" @@ -232,6 +234,7 @@ struct LeScanningManager::impl : public bluetooth::hci::LeAddressManagerCallback } is_filter_support_ = controller_->IsSupported(OpCode::LE_ADV_FILTER); is_batch_scan_support_ = controller->IsSupported(OpCode::LE_BATCH_SCAN); + total_num_of_advt_tracked_ = controller->GetVendorCapabilities().total_num_of_advt_tracked_; if (is_batch_scan_support_) { vendor_specific_event_manager_->RegisterEventHandler( VseSubeventCode::BLE_THRESHOLD, handler->BindOn(this, &LeScanningManager::impl::on_storage_threshold_breach)); @@ -681,6 +684,7 @@ struct LeScanningManager::impl : public bluetooth::hci::LeAddressManagerCallback module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete)); break; case ApcfAction::DELETE: + tracker_id_map_.erase(filter_index); le_scanning_interface_->EnqueueCommand( LeAdvFilterDeleteFilteringParametersBuilder::Create(filter_index), module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete)); @@ -1039,16 +1043,23 @@ struct LeScanningManager::impl : public bluetooth::hci::LeAddressManagerCallback module_handler_->BindOnceOn(this, &impl::on_batch_scan_read_result_complete, scanner_id, total_num_of_records)); } - void track_advertiser(ScannerId scanner_id) { - if (!is_batch_scan_support_) { - LOG_WARN("Batch scan is not supported"); + void track_advertiser(uint8_t filter_index, ScannerId scanner_id) { + if (total_num_of_advt_tracked_ <= 0) { + LOG_WARN("advertisement tracking is not supported"); + AdvertisingFilterOnFoundOnLostInfo on_found_on_lost_info = {}; + on_found_on_lost_info.scanner_id = scanner_id; + on_found_on_lost_info.advertiser_info_present = AdvtInfoPresent::NO_ADVT_INFO_PRESENT; + scanning_callbacks_->OnTrackAdvFoundLost(on_found_on_lost_info); + return; + } else if (tracker_id_map_.size() >= total_num_of_advt_tracked_) { AdvertisingFilterOnFoundOnLostInfo on_found_on_lost_info = {}; on_found_on_lost_info.scanner_id = scanner_id; on_found_on_lost_info.advertiser_info_present = AdvtInfoPresent::NO_ADVT_INFO_PRESENT; scanning_callbacks_->OnTrackAdvFoundLost(on_found_on_lost_info); return; } - tracker_id = scanner_id; + LOG_INFO("track_advertiser scanner_id %d, filter_index %d", (uint16_t)scanner_id, (uint16_t)filter_index); + tracker_id_map_[filter_index] = scanner_id; } void register_scanning_callback(ScanningCallback* scanning_callbacks) { @@ -1242,15 +1253,16 @@ struct LeScanningManager::impl : public bluetooth::hci::LeAddressManagerCallback } void on_advertisement_tracking(VendorSpecificEventView event) { - if (tracker_id == kInvalidScannerId) { - LOG_WARN("Advertisement track is not register"); - return; - } auto view = LEAdvertisementTrackingEventView::Create(event); ASSERT(view.IsValid()); + uint8_t filter_index = view.GetApcfFilterIndex(); + if (tracker_id_map_.find(filter_index) == tracker_id_map_.end()) { + LOG_WARN("Advertisement track for filter_index %d is not register", (uint16_t)filter_index); + return; + } AdvertisingFilterOnFoundOnLostInfo on_found_on_lost_info = {}; - on_found_on_lost_info.scanner_id = tracker_id; - on_found_on_lost_info.filter_index = view.GetApcfFilterIndex(); + on_found_on_lost_info.scanner_id = tracker_id_map_[filter_index]; + on_found_on_lost_info.filter_index = filter_index; on_found_on_lost_info.advertiser_state = view.GetAdvertiserState(); on_found_on_lost_info.advertiser_address = view.GetAdvertiserAddress(); on_found_on_lost_info.advertiser_address_type = view.GetAdvertiserAddressType(); @@ -1319,7 +1331,8 @@ struct LeScanningManager::impl : public bluetooth::hci::LeAddressManagerCallback LeScanningFilterPolicy filter_policy_{LeScanningFilterPolicy::ACCEPT_ALL}; BatchScanConfig batch_scan_config_; std::map<ScannerId, std::vector<uint8_t>> batch_scan_result_cache_; - ScannerId tracker_id = kInvalidScannerId; + std::unordered_map<uint8_t, ScannerId> tracker_id_map_; + uint16_t total_num_of_advt_tracked_ = 0x00; static void check_status(CommandCompleteView view) { switch (view.GetCommandOpCode()) { @@ -1441,8 +1454,8 @@ void LeScanningManager::BatchScanReadReport(ScannerId scanner_id, BatchScanMode CallOn(pimpl_.get(), &impl::batch_scan_read_results, scanner_id, 0, scan_mode); } -void LeScanningManager::TrackAdvertiser(ScannerId scanner_id) { - CallOn(pimpl_.get(), &impl::track_advertiser, scanner_id); +void LeScanningManager::TrackAdvertiser(uint8_t filter_index, ScannerId scanner_id) { + CallOn(pimpl_.get(), &impl::track_advertiser, filter_index, scanner_id); } void LeScanningManager::RegisterScanningCallback(ScanningCallback* scanning_callback) { diff --git a/system/gd/hci/le_scanning_manager.h b/system/gd/hci/le_scanning_manager.h index 6d5c6ac6fa..6d4f8f1405 100644 --- a/system/gd/hci/le_scanning_manager.h +++ b/system/gd/hci/le_scanning_manager.h @@ -76,7 +76,7 @@ class LeScanningManager : public bluetooth::Module { virtual void BatchScanDisable(); virtual void BatchScanReadReport(ScannerId scanner_id, BatchScanMode scan_mode); - virtual void TrackAdvertiser(ScannerId scanner_id); + virtual void TrackAdvertiser(uint8_t filter_index, ScannerId scanner_id); virtual void RegisterScanningCallback(ScanningCallback* scanning_callback); diff --git a/system/gd/hci/le_scanning_manager_mock.h b/system/gd/hci/le_scanning_manager_mock.h index 530d38d27c..3e104d5576 100644 --- a/system/gd/hci/le_scanning_manager_mock.h +++ b/system/gd/hci/le_scanning_manager_mock.h @@ -56,7 +56,7 @@ class MockLeScanningManager : public LeScanningManager { MOCK_METHOD(void, BatchScanEnable, (BatchScanMode, uint32_t, uint32_t, BatchScanDiscardRule)); MOCK_METHOD(void, BatchScanDisable, ()); MOCK_METHOD(void, BatchScanReadReport, (ScannerId, BatchScanMode)); - MOCK_METHOD(void, TrackAdvertiser, (ScannerId)); + MOCK_METHOD(void, TrackAdvertiser, (uint8_t, ScannerId)); MOCK_METHOD(void, RegisterScanningCallback, (ScanningCallback*)); }; diff --git a/system/main/shim/le_scanning_manager.cc b/system/main/shim/le_scanning_manager.cc index be8cde5be0..868f251d15 100644 --- a/system/main/shim/le_scanning_manager.cc +++ b/system/main/shim/le_scanning_manager.cc @@ -149,8 +149,9 @@ void BleScannerInterfaceImpl::ScanFilterParamSetup( bluetooth::hci::AdvertisingFilterParameter advertising_filter_parameter; if (filt_param != nullptr) { - if (filt_param && filt_param->dely_mode == 1) { - bluetooth::shim::GetScanning()->TrackAdvertiser(client_if); + if (filt_param && filt_param->dely_mode == 1 && + apcf_action == hci::ApcfAction::ADD) { + bluetooth::shim::GetScanning()->TrackAdvertiser(filter_index, client_if); } advertising_filter_parameter.feature_selection = filt_param->feat_seln; advertising_filter_parameter.list_logic_type = filt_param->list_logic_type; diff --git a/system/stack/acl/btm_acl.cc b/system/stack/acl/btm_acl.cc index 9713b349ad..df6ec164b5 100644 --- a/system/stack/acl/btm_acl.cc +++ b/system/stack/acl/btm_acl.cc @@ -2768,6 +2768,15 @@ bool acl_create_le_connection_with_id(uint8_t id, const RawAddress& bd_addr) { gatt_find_in_device_record(bd_addr, &address_with_type); LOG_DEBUG("Creating le direct connection to:%s", PRIVATE_ADDRESS(address_with_type)); + + if (address_with_type.type == BLE_ADDR_ANONYMOUS) { + LOG_WARN( + "Creating le direct connection to:%s, address type 'anonymous' is " + "invalid", + PRIVATE_ADDRESS(address_with_type)); + return false; + } + bluetooth::shim::ACL_AcceptLeConnectionFrom(address_with_type, /* is_direct */ true); return true; diff --git a/system/stack/avrc/avrc_pars_tg.cc b/system/stack/avrc/avrc_pars_tg.cc index 71cebef1f2..39f501002f 100644 --- a/system/stack/avrc/avrc_pars_tg.cc +++ b/system/stack/avrc/avrc_pars_tg.cc @@ -43,6 +43,12 @@ static tAVRC_STS avrc_ctrl_pars_vendor_cmd(tAVRC_MSG_VENDOR* p_msg, tAVRC_COMMAND* p_result) { tAVRC_STS status = AVRC_STS_NO_ERROR; + if (p_msg->vendor_len < 4) { // 4 == pdu + reserved byte + len as uint16 + AVRC_TRACE_WARNING("%s: message length %d too short: must be at least 4", + __func__, p_msg->vendor_len); + android_errorWriteLog(0x534e4554, "205571133"); + return AVRC_STS_INTERNAL_ERR; + } uint8_t* p = p_msg->p_vendor_data; p_result->pdu = *p++; AVRC_TRACE_DEBUG("%s pdu:0x%x", __func__, p_result->pdu); |