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

Commit 49d5c730 authored by Jack He's avatar Jack He Committed by Android (Google) Code Review
Browse files

Merge changes Ibbc7b7c4,Ic533f0b2 into tm-qpr-dev

* changes:
  Ensure stack is operational for connection history
  Add gd::acl_manager dumpsys data
parents 5f9c0d40 f123eb3c
Loading
Loading
Loading
Loading
+38 −5
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

#include <atomic>
#include <future>
#include <mutex>
#include <set>

#include "common/bidi_queue.h"
@@ -64,14 +65,23 @@ struct AclManager::impl {
    hci_queue_end_->RegisterDequeue(
        handler_, common::Bind(&impl::dequeue_and_route_acl_packet_to_connection, common::Unretained(this)));
    bool crash_on_unknown_handle = false;
    {
      const std::lock_guard<std::mutex> lock(dumpsys_mutex_);
      classic_impl_ =
          new classic_impl(hci_layer_, controller_, handler_, round_robin_scheduler_, crash_on_unknown_handle);
      le_impl_ = new le_impl(hci_layer_, controller_, handler_, round_robin_scheduler_, crash_on_unknown_handle);
    }
  }

  void Stop() {
    {
      const std::lock_guard<std::mutex> lock(dumpsys_mutex_);
      delete le_impl_;
      delete classic_impl_;
      le_impl_ = nullptr;
      classic_impl_ = nullptr;
    }

    hci_queue_end_->UnregisterDequeue();
    delete round_robin_scheduler_;
    if (enqueue_registered_.exchange(false)) {
@@ -115,6 +125,7 @@ struct AclManager::impl {
  common::BidiQueueEnd<AclBuilder, AclView>* hci_queue_end_ = nullptr;
  std::atomic_bool enqueue_registered_ = false;
  uint16_t default_link_policy_settings_ = 0xffff;
  mutable std::mutex dumpsys_mutex_;
};

AclManager::AclManager() : pimpl_(std::make_unique<impl>(*this)) {}
@@ -324,9 +335,31 @@ AclManager::~AclManager() = default;

void AclManager::impl::Dump(
    std::promise<flatbuffers::Offset<AclManagerData>> promise, flatbuffers::FlatBufferBuilder* fb_builder) const {
  const std::lock_guard<std::mutex> lock(dumpsys_mutex_);
  const auto connect_list = (le_impl_ != nullptr) ? le_impl_->connect_list : std::unordered_set<AddressWithType>();
  const auto le_connectability_state_text =
      (le_impl_ != nullptr) ? connectability_state_machine_text(le_impl_->connectability_state_) : "INDETERMINATE";
  const auto le_create_connection_timeout_alarms_count =
      (le_impl_ != nullptr) ? (int)le_impl_->create_connection_timeout_alarms_.size() : 0;

  auto title = fb_builder->CreateString("----- Acl Manager Dumpsys -----");
  auto le_connectability_state = fb_builder->CreateString(le_connectability_state_text);

  flatbuffers::Offset<flatbuffers::String> strings[connect_list.size()];

  size_t cnt = 0;
  for (const auto& it : connect_list) {
    strings[cnt++] = fb_builder->CreateString(it.ToString());
  }
  auto vecofstrings = fb_builder->CreateVector(strings, connect_list.size());

  AclManagerDataBuilder builder(*fb_builder);
  builder.add_title(title);
  builder.add_le_filter_accept_list_count(connect_list.size());
  builder.add_le_filter_accept_list(vecofstrings);
  builder.add_le_connectability_state(le_connectability_state);
  builder.add_le_create_connection_timeout_alarms_count(le_create_connection_timeout_alarms_count);

  flatbuffers::Offset<AclManagerData> dumpsys_data = builder.Finish();
  promise.set_value(dumpsys_data);
}
+4 −0
Original line number Diff line number Diff line
@@ -4,6 +4,10 @@ attribute "privacy";

table AclManagerData {
    title:string (privacy:"Any");
    le_filter_accept_list_count:int (privacy:"Any");
    le_filter_accept_list:[string] (privacy:"Any");
    le_connectability_state:string (privacy:"Any");
    le_create_connection_timeout_alarms_count:int (privacy:"Any");
}

root_type AclManagerData;
+3 −1
Original line number Diff line number Diff line
@@ -1105,7 +1105,9 @@ void DumpsysAcl(int fd) {

  LOG_DUMPSYS_TITLE(fd, DUMPSYS_TAG);

  if (shim::Stack::GetInstance()->IsRunning()) {
    shim::Stack::GetInstance()->GetAcl()->DumpConnectionHistory(fd);
  }

  for (int i = 0; i < MAX_L2CAP_LINKS; i++) {
    const tACL_CONN& link = acl_cb.acl_db[i];
+25 −1
Original line number Diff line number Diff line
@@ -14,10 +14,12 @@
 *  limitations under the License.
 */

#include <fcntl.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include <cstddef>
#include <cstdio>
#include <future>
#include <map>

@@ -87,7 +89,25 @@ struct bluetooth::hci::LeScanningManager::impl

namespace {
std::map<std::string, std::promise<uint16_t>> mock_function_handle_promise_map;

// Utility to provide a file descriptor for /dev/null when possible, but
// defaulting to STDERR when not possible.
class DevNullOrStdErr {
 public:
  DevNullOrStdErr() { fd_ = open("/dev/null", O_CLOEXEC | O_WRONLY); }
  ~DevNullOrStdErr() {
    if (fd_ != -1) {
      close(fd_);
    }
    fd_ = -1;
  }
  int Fd() const { return (fd_ == -1) ? STDERR_FILENO : fd_; }

 private:
  int fd_{-1};
};

}  // namespace

uint8_t mock_get_ble_acceptlist_size() { return 123; }

@@ -728,3 +748,7 @@ TEST_F(MainShimTestWithClassicConnection, read_extended_feature) {

  raw_connection_->read_remote_extended_features_function_ = {};
}

TEST_F(MainShimTest, acl_dumpsys) {
  MakeAcl()->Dump(std::make_unique<DevNullOrStdErr>()->Fd());
}