blob: 57f46f16d1d1c4fcf0c38fc327065eecd0c026a3 [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_PLATFORM_DRIVER_INSPECTOR_H_
#define SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_PLATFORM_DRIVER_INSPECTOR_H_
#include <lib/inspect/cpp/inspector.h>
#include <lib/inspect/cpp/vmo/types.h>
#include <lib/stdcompat/span.h>
#include <zircon/compiler.h>
#include <zircon/types.h>
#include <deque>
#include <memory>
#include <mutex>
namespace wlan::iwlwifi {
// Options object for the DriverInspector.
struct DriverInspectorOptions final {
// Name of the root node of this DriverInspector.
const char* root_name = "driver_inspector";
// Total size of the Inspect VMO to allocate. The total usable size will be slightly smaller than
// this, due to Inspect file format overhead.
size_t vmo_size = 8 * 1024 * 1024;
// Size reserved in the VMO for core dumps.
size_t core_dump_capacity = 4 * 1024 * 1024;
};
// DriverInspector manages the Inspect tree hierarchy for a driver.
// Thread-safety: this class is thread-safe.
class DriverInspector {
public:
explicit DriverInspector(DriverInspectorOptions options = {});
~DriverInspector();
// Publish a core dump under `core_dump_name`. Old core dumps may be removed to make room.
zx_status_t PublishCoreDump(const char* core_dump_name, cpp20::span<const char> core_dump);
// Get the root of this drivers' Inspect tree hierarchy.
::inspect::Node& GetRoot();
const ::inspect::Node& GetRoot() const;
// Get a read-only copy of this Inspect tree's backing VMO.
::zx::vmo DuplicateVmo() const;
private:
struct CoreDumpEntry {
::inspect::ByteVectorProperty dump_ = {};
size_t dump_size_ = 0;
};
std::unique_ptr<::inspect::Inspector> inspector_;
::inspect::Node root_node_;
std::mutex core_dump_mutex_;
const size_t core_dump_capacity_ = 0;
std::deque<CoreDumpEntry> core_dumps_ __TA_GUARDED(core_dump_mutex_);
};
} // namespace wlan::iwlwifi
// This subclass-as-an-alias exists purely to be compatible with C code that uses the
// `driver_inspector` type as a struct pointer.
struct driver_inspector final : public wlan::iwlwifi::DriverInspector {};
#endif // SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_PLATFORM_DRIVER_INSPECTOR_H_