summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--android/app/src/com/android/bluetooth/pbap/BluetoothPbapSimVcardManager.java4
-rw-r--r--system/gd/hci/le_scanning_manager.cc41
-rw-r--r--system/gd/hci/le_scanning_manager.h2
-rw-r--r--system/gd/hci/le_scanning_manager_mock.h2
-rw-r--r--system/main/shim/le_scanning_manager.cc5
-rw-r--r--system/stack/acl/btm_acl.cc9
-rw-r--r--system/stack/avrc/avrc_pars_tg.cc6
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);