Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bd8cfa5b authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "GD: fix error of multi advertiser track"

parents 0ea847df f93fb791
Loading
Loading
Loading
Loading
+27 −14
Original line number Diff line number Diff line
@@ -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"
@@ -234,6 +236,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));
@@ -683,6 +686,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));
@@ -1041,16 +1045,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) {
@@ -1244,15 +1255,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();
@@ -1321,7 +1333,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()) {
@@ -1443,8 +1456,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) {
+1 −1
Original line number Diff line number Diff line
@@ -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);

+1 −1
Original line number Diff line number Diff line
@@ -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*));
};

+3 −2
Original line number Diff line number Diff line
@@ -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;