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

Commit 48185b2a authored by Roshan Pius's avatar Roshan Pius
Browse files

wifi: Debug ring buffer data collection

Implementation of the debug ring buffer data collection mechanism.
Changed the interface to pass the raw bytes sent by the driver. This
will be captured as is into the bugreport.

Note: Please see the associated bug on why this data is not being parsed.

Also,
Fixed a bug in the legacy HAL API for retrieving ring buffer status.

Bug: 33638159
Test: Compiles
Change-Id: I9d8f400142b1be4fbf8c85679e8a52d6af17b09e
parent 2c06a3f8
Loading
Loading
Loading
Loading
+0 −342
Original line number Diff line number Diff line
@@ -1878,177 +1878,6 @@ $(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (WifiDebugRingEntryConnectivityEvent)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryConnectivityEvent.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.WifiDebugRingEntryConnectivityEvent

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (WifiDebugRingEntryEventTlv)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryEventTlv.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.WifiDebugRingEntryEventTlv

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (WifiDebugRingEntryEventTlvType)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryEventTlvType.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.WifiDebugRingEntryEventTlvType

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (WifiDebugRingEntryEventType)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryEventType.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.WifiDebugRingEntryEventType

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (WifiDebugRingEntryFlags)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryFlags.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.WifiDebugRingEntryFlags

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (WifiDebugRingEntryHeader)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryHeader.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.WifiDebugRingEntryHeader

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (WifiDebugRingEntryPowerEvent)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryPowerEvent.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.WifiDebugRingEntryPowerEvent

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (WifiDebugRingEntryVendorData)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryVendorData.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.WifiDebugRingEntryVendorData

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (WifiDebugRingEntryWakelockEvent)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryWakelockEvent.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.WifiDebugRingEntryWakelockEvent

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (WifiDebugRxPacketFate)
#
@@ -4420,177 +4249,6 @@ $(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (WifiDebugRingEntryConnectivityEvent)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryConnectivityEvent.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.WifiDebugRingEntryConnectivityEvent

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (WifiDebugRingEntryEventTlv)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryEventTlv.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.WifiDebugRingEntryEventTlv

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (WifiDebugRingEntryEventTlvType)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryEventTlvType.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.WifiDebugRingEntryEventTlvType

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (WifiDebugRingEntryEventType)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryEventType.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.WifiDebugRingEntryEventType

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (WifiDebugRingEntryFlags)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryFlags.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.WifiDebugRingEntryFlags

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (WifiDebugRingEntryHeader)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryHeader.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.WifiDebugRingEntryHeader

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (WifiDebugRingEntryPowerEvent)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryPowerEvent.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.WifiDebugRingEntryPowerEvent

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (WifiDebugRingEntryVendorData)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryVendorData.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.WifiDebugRingEntryVendorData

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (WifiDebugRingEntryWakelockEvent)
#
GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryWakelockEvent.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
        -Ljava \
        -randroid.hardware:hardware/interfaces \
        -randroid.hidl:system/libhidl/transport \
        android.hardware.wifi@1.0::types.WifiDebugRingEntryWakelockEvent

$(GEN): $(LOCAL_PATH)/types.hal
	$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)

#
# Build types.hal (WifiDebugRxPacketFate)
#
+1 −1
Original line number Diff line number Diff line
@@ -558,7 +558,7 @@ interface IWifiChip {
   *   ring. The vebose level for each ring buffer can be specified in this API.
   * - During wifi operations, driver must periodically report per ring data to
   *   framework by invoking the
   *   |IWifiChipEventCallback.onDebugRingBuffer<Type>EntriesAvailable| callback.
   *   |IWifiChipEventCallback.onDebugRingBufferDataAvailable| callback.
   * - When capturing a bug report, framework must indicate to driver that all
   *   the data has to be uploaded urgently by calling
   *   |forceDumpToDebugRingBuffer|.
+4 −21
Original line number Diff line number Diff line
@@ -74,28 +74,11 @@ interface IWifiChipEventCallback {
   * @return status Status of the corresponding ring buffer. This should
   *         contain the name of the ring buffer on which the data is
   *         available.
   * @return entries Vector of debug ring buffer data entries. These
   *         should be parsed based on the type of entry.
   * @return data Raw bytes of data sent by the driver. Must be dumped
   *         out to a bugreport and post processed.
   */
  /** Connectivity event data callback */
  oneway onDebugRingBufferConnectivityEventEntriesAvailable(
      WifiDebugRingBufferStatus status,
      vec<WifiDebugRingEntryConnectivityEvent> entries);

  /** Power event data callback */
  oneway onDebugRingBufferPowerEventEntriesAvailable(
      WifiDebugRingBufferStatus status,
      vec<WifiDebugRingEntryPowerEvent> entries);

  /** Wakelock event data callback */
  oneway onDebugRingBufferWakelockEventEntriesAvailable(
      WifiDebugRingBufferStatus status,
      vec<WifiDebugRingEntryWakelockEvent> entries);

  /** Vendor data event data callback */
  oneway onDebugRingBufferVendorDataEntriesAvailable(
      WifiDebugRingBufferStatus status,
      vec<WifiDebugRingEntryVendorData> entries);
  oneway onDebugRingBufferDataAvailable(
      WifiDebugRingBufferStatus status, vec<uint8_t> data);

  /**
   * Callback indicating that the chip has encountered a fatal error.
+3 −0
Original line number Diff line number Diff line
@@ -39,6 +39,9 @@ namespace hidl_struct_util {
// Chip conversion methods.
bool convertLegacyFeaturesToHidlChipCapabilities(
    uint32_t legacy_logger_feature_set, uint32_t* hidl_caps);
bool convertLegacyDebugRingBufferStatusToHidl(
    const legacy_hal::wifi_ring_buffer_status& legacy_status,
    WifiDebugRingBufferStatus* hidl_status);
bool convertLegacyVectorOfDebugRingBufferStatusToHidl(
    const std::vector<legacy_hal::wifi_ring_buffer_status>& legacy_status_vec,
    std::vector<WifiDebugRingBufferStatus>* hidl_status_vec);
+46 −1
Original line number Diff line number Diff line
@@ -57,7 +57,8 @@ WifiChip::WifiChip(
      legacy_hal_(legacy_hal),
      mode_controller_(mode_controller),
      is_valid_(true),
      current_mode_id_(kInvalidModeId) {}
      current_mode_id_(kInvalidModeId),
      debug_ring_buffer_cb_registered_(false) {}

void WifiChip::invalidate() {
  invalidateAndRemoveAllIfaces();
@@ -687,6 +688,10 @@ WifiStatus WifiChip::startLoggingToDebugRingBufferInternal(
    WifiDebugRingBufferVerboseLevel verbose_level,
    uint32_t max_interval_in_sec,
    uint32_t min_data_size_in_bytes) {
  WifiStatus status = registerDebugRingBufferCallback();
  if (status.code != WifiStatusCode::SUCCESS) {
    return status;
  }
  legacy_hal::wifi_error legacy_status =
      legacy_hal_.lock()->startRingBufferLogging(
          ring_name,
@@ -700,6 +705,10 @@ WifiStatus WifiChip::startLoggingToDebugRingBufferInternal(

WifiStatus WifiChip::forceDumpToDebugRingBufferInternal(
    const hidl_string& ring_name) {
  WifiStatus status = registerDebugRingBufferCallback();
  if (status.code != WifiStatusCode::SUCCESS) {
    return status;
  }
  legacy_hal::wifi_error legacy_status =
      legacy_hal_.lock()->getRingBufferData(ring_name);
  return createWifiStatusFromLegacyError(legacy_status);
@@ -774,6 +783,42 @@ WifiStatus WifiChip::handleChipConfiguration(ChipModeId mode_id) {
  }
  return createWifiStatus(WifiStatusCode::SUCCESS);
}

WifiStatus WifiChip::registerDebugRingBufferCallback() {
  if (debug_ring_buffer_cb_registered_) {
    return createWifiStatus(WifiStatusCode::SUCCESS);
  }

  android::wp<WifiChip> weak_ptr_this(this);
  const auto& on_ring_buffer_data_callback = [weak_ptr_this](
      const std::string& /* name */,
      const std::vector<uint8_t>& data,
      const legacy_hal::wifi_ring_buffer_status& status) {
    const auto shared_ptr_this = weak_ptr_this.promote();
    if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
      LOG(ERROR) << "Callback invoked on an invalid object";
      return;
    }
    WifiDebugRingBufferStatus hidl_status;
    if (!hidl_struct_util::convertLegacyDebugRingBufferStatusToHidl(
            status, &hidl_status)) {
      LOG(ERROR) << "Error converting ring buffer status";
      return;
    }
    for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
      callback->onDebugRingBufferDataAvailable(hidl_status, data);
    }
  };
  legacy_hal::wifi_error legacy_status =
      legacy_hal_.lock()->registerRingBufferCallbackHandler(
          on_ring_buffer_data_callback);

  if (legacy_status == legacy_hal::WIFI_SUCCESS) {
    debug_ring_buffer_cb_registered_ = true;
  }
  return createWifiStatusFromLegacyError(legacy_status);
}

}  // namespace implementation
}  // namespace V1_0
}  // namespace wifi
Loading