wifi(interface): Add wifi debug packet fate related interface
The packet fate debug mechanism is used to track the state of all the
packets transmitted/received during the association process.
Also,
Add the various debug capabilities in the respective interfaces.
All ring buffer, driver/firmware dump, etc related capabilities are in
IWifiChip object.
The packet fate capability is exposed in IWifiStaIface object.
Bug: 32221997
Test: ./hardware/interfaces/update-makefiles.sh
Change-Id: Ic6bf49d682b70a1cdcd18c69fc25a544921bd548
diff --git a/wifi/1.0/Android.mk b/wifi/1.0/Android.mk
index e812272..a3901f4 100644
--- a/wifi/1.0/Android.mk
+++ b/wifi/1.0/Android.mk
@@ -1543,6 +1543,40 @@
LOCAL_GENERATED_SOURCES += $(GEN)
#
+# Build types.hal (WifiDebugPacketFateFrameInfo)
+#
+GEN := $(intermediates)/android/hardware/wifi/1.0/WifiDebugPacketFateFrameInfo.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 \
+ android.hardware.wifi@1.0::types.WifiDebugPacketFateFrameInfo
+
+$(GEN): $(LOCAL_PATH)/types.hal
+ $(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (WifiDebugPacketFateFrameType)
+#
+GEN := $(intermediates)/android/hardware/wifi/1.0/WifiDebugPacketFateFrameType.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 \
+ android.hardware.wifi@1.0::types.WifiDebugPacketFateFrameType
+
+$(GEN): $(LOCAL_PATH)/types.hal
+ $(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
# Build types.hal (WifiDebugRingBufferFlags)
#
GEN := $(intermediates)/android/hardware/wifi/1.0/WifiDebugRingBufferFlags.java
@@ -1747,6 +1781,74 @@
LOCAL_GENERATED_SOURCES += $(GEN)
#
+# Build types.hal (WifiDebugRxPacketFate)
+#
+GEN := $(intermediates)/android/hardware/wifi/1.0/WifiDebugRxPacketFate.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 \
+ android.hardware.wifi@1.0::types.WifiDebugRxPacketFate
+
+$(GEN): $(LOCAL_PATH)/types.hal
+ $(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (WifiDebugRxPacketFateReport)
+#
+GEN := $(intermediates)/android/hardware/wifi/1.0/WifiDebugRxPacketFateReport.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 \
+ android.hardware.wifi@1.0::types.WifiDebugRxPacketFateReport
+
+$(GEN): $(LOCAL_PATH)/types.hal
+ $(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (WifiDebugTxPacketFate)
+#
+GEN := $(intermediates)/android/hardware/wifi/1.0/WifiDebugTxPacketFate.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 \
+ android.hardware.wifi@1.0::types.WifiDebugTxPacketFate
+
+$(GEN): $(LOCAL_PATH)/types.hal
+ $(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (WifiDebugTxPacketFateReport)
+#
+GEN := $(intermediates)/android/hardware/wifi/1.0/WifiDebugTxPacketFateReport.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 \
+ android.hardware.wifi@1.0::types.WifiDebugTxPacketFateReport
+
+$(GEN): $(LOCAL_PATH)/types.hal
+ $(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
# Build types.hal (WifiInformationElement)
#
GEN := $(intermediates)/android/hardware/wifi/1.0/WifiInformationElement.java
@@ -3668,6 +3770,40 @@
LOCAL_GENERATED_SOURCES += $(GEN)
#
+# Build types.hal (WifiDebugPacketFateFrameInfo)
+#
+GEN := $(intermediates)/android/hardware/wifi/1.0/WifiDebugPacketFateFrameInfo.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 \
+ android.hardware.wifi@1.0::types.WifiDebugPacketFateFrameInfo
+
+$(GEN): $(LOCAL_PATH)/types.hal
+ $(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (WifiDebugPacketFateFrameType)
+#
+GEN := $(intermediates)/android/hardware/wifi/1.0/WifiDebugPacketFateFrameType.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 \
+ android.hardware.wifi@1.0::types.WifiDebugPacketFateFrameType
+
+$(GEN): $(LOCAL_PATH)/types.hal
+ $(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
# Build types.hal (WifiDebugRingBufferFlags)
#
GEN := $(intermediates)/android/hardware/wifi/1.0/WifiDebugRingBufferFlags.java
@@ -3872,6 +4008,74 @@
LOCAL_GENERATED_SOURCES += $(GEN)
#
+# Build types.hal (WifiDebugRxPacketFate)
+#
+GEN := $(intermediates)/android/hardware/wifi/1.0/WifiDebugRxPacketFate.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 \
+ android.hardware.wifi@1.0::types.WifiDebugRxPacketFate
+
+$(GEN): $(LOCAL_PATH)/types.hal
+ $(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (WifiDebugRxPacketFateReport)
+#
+GEN := $(intermediates)/android/hardware/wifi/1.0/WifiDebugRxPacketFateReport.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 \
+ android.hardware.wifi@1.0::types.WifiDebugRxPacketFateReport
+
+$(GEN): $(LOCAL_PATH)/types.hal
+ $(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (WifiDebugTxPacketFate)
+#
+GEN := $(intermediates)/android/hardware/wifi/1.0/WifiDebugTxPacketFate.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 \
+ android.hardware.wifi@1.0::types.WifiDebugTxPacketFate
+
+$(GEN): $(LOCAL_PATH)/types.hal
+ $(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (WifiDebugTxPacketFateReport)
+#
+GEN := $(intermediates)/android/hardware/wifi/1.0/WifiDebugTxPacketFateReport.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 \
+ android.hardware.wifi@1.0::types.WifiDebugTxPacketFateReport
+
+$(GEN): $(LOCAL_PATH)/types.hal
+ $(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
# Build types.hal (WifiInformationElement)
#
GEN := $(intermediates)/android/hardware/wifi/1.0/WifiInformationElement.java
diff --git a/wifi/1.0/IWifiChip.hal b/wifi/1.0/IWifiChip.hal
index 29425b1..487a5ae 100644
--- a/wifi/1.0/IWifiChip.hal
+++ b/wifi/1.0/IWifiChip.hal
@@ -131,6 +131,37 @@
};
/**
+ * Capabilities exposed by this chip.
+ */
+ enum ChipCapabilityMask : uint32_t {
+ /**
+ * Memory dump of Firmware.
+ */
+ DEBUG_MEMORY_FIRMWARE_DUMP_SUPPORTED = 1 << 0,
+ /**
+ * Memory dump of Driver.
+ */
+ DEBUG_MEMORY_DRIVER_DUMP_SUPPORTED = 1 << 1,
+ /**
+ * Connectivity events reported via debug ring buffer.
+ */
+ DEBUG_RING_BUFFER_CONNECT_EVENT_SUPPORTED = 1 << 2,
+ /**
+ * Power events reported via debug ring buffer.
+ */
+ DEBUG_RING_BUFFER_POWER_EVENT_SUPPORTED = 1 << 3,
+ /**
+ * Wakelock events reported via debug ring buffer.
+ */
+ DEBUG_RING_BUFFER_WAKELOCK_EVENT_SUPPORTED = 1 << 4,
+ /**
+ * Vendor data reported via debug ring buffer.
+ * This mostly contains firmware event logs.
+ */
+ DEBUG_RING_BUFFER_VENDOR_DATA_SUPPORTED = 1 << 5,
+ };
+
+ /**
* Get the id assigned to this chip.
*
* @return status WifiStatus of the operation.
@@ -156,6 +187,19 @@
registerEventCallback(IWifiChipEventCallback callback) generates (WifiStatus status);
/**
+ * Get the capabilities supported by this chip.
+ *
+ * @return status WifiStatus of the operation.
+ * Possible status codes:
+ * |WifiStatusCode.SUCCESS|,
+ * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
+ * |WifiStatusCode.ERROR_NOT_AVAILABLE|,
+ * |WifiStatusCode.ERROR_UNKNOWN|
+ * @return capabilities Bitset of |ChipCapabilityMask| values.
+ */
+ getCapabilities() generates (WifiStatus status, uint32_t capabilities);
+
+ /**
* Get the set of operation modes that the chip supports.
*
* @return status WifiStatus of the operation.
@@ -464,6 +508,7 @@
* Possible status codes:
* |WifiStatusCode.SUCCESS|,
* |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
+ * |WifiStatusCode.ERROR_NOT_SUPPORTED|,
* |WifiStatusCode.NOT_AVAILABLE|,
* |WifiStatusCode.UNKNOWN|
* @return ringBuffers Vector of |WifiDebugRingBufferStatus| corresponding to the
@@ -486,6 +531,7 @@
* Possible status codes:
* |WifiStatusCode.SUCCESS|,
* |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
+ * |WifiStatusCode.ERROR_NOT_SUPPORTED|,
* |WifiStatusCode.NOT_AVAILABLE|,
* |WifiStatusCode.UNKNOWN|
*/
@@ -506,6 +552,8 @@
* Possible status codes:
* |WifiStatusCode.SUCCESS|,
* |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
+ * |WifiStatusCode.ERROR_NOT_SUPPORTED|,
+ * |WifiStatusCode.ERROR_NOT_STARTED|,
* |WifiStatusCode.NOT_AVAILABLE|,
* |WifiStatusCode.UNKNOWN|
*/
diff --git a/wifi/1.0/IWifiStaIface.hal b/wifi/1.0/IWifiStaIface.hal
index 3ca9b7d..41b2bad 100644
--- a/wifi/1.0/IWifiStaIface.hal
+++ b/wifi/1.0/IWifiStaIface.hal
@@ -44,6 +44,10 @@
* If set indicates that the link layer stats APIs are supported.
*/
LINK_LAYER_STATS = 1 << 2,
+ /**
+ * Tracks connection packets' fate.
+ */
+ DEBUG_PACKET_FATE_SUPPORTED = 1 << 3
};
/**
@@ -195,6 +199,7 @@
* |WifiStatusCode.SUCCESS|,
* |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
* |WifiStatusCode.ERROR_NOT_SUPPORTED|,
+ * |WifiStatusCode.ERROR_NOT_STARTED|,
* |WifiStatusCode.ERROR_NOT_AVAILABLE|,
* |WifiStatusCode.ERROR_UNKNOWN|
*/
@@ -230,6 +235,7 @@
* |WifiStatusCode.SUCCESS|,
* |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
* |WifiStatusCode.ERROR_NOT_SUPPORTED|,
+ * |WifiStatusCode.ERROR_NOT_STARTED|,
* |WifiStatusCode.ERROR_NOT_AVAILABLE|,
* |WifiStatusCode.ERROR_UNKNOWN|
*/
@@ -245,9 +251,97 @@
* |WifiStatusCode.SUCCESS|,
* |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
* |WifiStatusCode.ERROR_NOT_SUPPORTED|,
+ * |WifiStatusCode.ERROR_NOT_STARTED|,
* |WifiStatusCode.ERROR_NOT_AVAILABLE|,
* |WifiStatusCode.ERROR_UNKNOWN|
* @return stats Instance of |LinkLayerStats|.
*/
getLinkLayerStats() generates (WifiStatus status, StaLinkLayerStats stats);
+
+ /**
+ * API to start packet fate monitoring.
+ * - Once stared, monitoring must remain active until HAL is unloaded.
+ * - When HAL is unloaded, all packet fate buffers must be cleared.
+ * - The packet fates are used to monitor the state of packets transmitted/
+ * received during association.
+ *
+ * @return status WifiStatus of the operation.
+ * Possible status codes:
+ * |WifiStatusCode.SUCCESS|,
+ * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
+ * |WifiStatusCode.ERROR_NOT_SUPPORTED|,
+ * |WifiStatusCode.ERROR_NOT_AVAILABLE|,
+ * |WifiStatusCode.ERROR_UNKNOWN|
+ */
+ startDebugPacketFateMonitoring() generates (WifiStatus status);
+
+ /**
+ * API to stop packet fate monitoring.
+ *
+ * @return status WifiStatus of the operation.
+ * Possible status codes:
+ * |WifiStatusCode.SUCCESS|,
+ * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
+ * |WifiStatusCode.ERROR_NOT_SUPPORTED|,
+ * |WifiStatusCode.ERROR_NOT_STARTED|,
+ * |WifiStatusCode.ERROR_NOT_AVAILABLE|,
+ * |WifiStatusCode.ERROR_UNKNOWN|
+ */
+ stopDebugPacketFateMonitoring() generates (WifiStatus status);
+
+ /**
+ * API to retrieve fates of outbound packets.
+ * - HAL implementation must return the fates of
+ * all the frames transmitted for the most recent association.
+ * The fate reports must follow the same order as their respective
+ * packets.
+ * - HAL implementation may choose (but is not required) to include
+ * reports for management frames.
+ * - Packets reported by firmware, but not recognized by driver,
+ * must be included. However, the ordering of the corresponding
+ * reports is at the discretion of HAL implementation.
+ * - Framework must be able to call this API multiple times for the same
+ * association.
+ *
+ * @return status WifiStatus of the operation.
+ * Possible status codes:
+ * |WifiStatusCode.SUCCESS|,
+ * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
+ * |WifiStatusCode.ERROR_NOT_SUPPORTED|,
+ * |WifiStatusCode.ERROR_NOT_STARTED|,
+ * |WifiStatusCode.ERROR_NOT_AVAILABLE|,
+ * |WifiStatusCode.ERROR_UNKNOWN|
+ * @return fates Vector of |WifiDebugTxPacketFateReport| instances corresponding
+ * to the packet fates.
+ */
+ getDebugTxPacketFates()
+ generates (WifiStatus status, vec<WifiDebugTxPacketFateReport> fates);
+
+ /**
+ * API to retrieve fates of inbound packets.
+ * - HAL implementation must return the fates of
+ * all the frames received for the most recent association.
+ * The fate reports must follow the same order as their respective
+ * packets.
+ * - HAL implementation may choose (but is not required) to include
+ * reports for management frames.
+ * - Packets reported by firmware, but not recognized by driver,
+ * must be included. However, the ordering of the corresponding
+ * reports is at the discretion of HAL implementation.
+ * - Framework must be able to call this API multiple times for the same
+ * association.
+ *
+ * @return status WifiStatus of the operation.
+ * Possible status codes:
+ * |WifiStatusCode.SUCCESS|,
+ * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
+ * |WifiStatusCode.ERROR_NOT_SUPPORTED|,
+ * |WifiStatusCode.ERROR_NOT_STARTED|,
+ * |WifiStatusCode.ERROR_NOT_AVAILABLE|,
+ * |WifiStatusCode.ERROR_UNKNOWN|
+ * @return fates Vector of |WifiDebugRxPacketFateReport| instances corresponding
+ * to the packet fates.
+ */
+ getDebugRxPacketFates()
+ generates (WifiStatus status, vec<WifiDebugRxPacketFateReport> fates);
};
diff --git a/wifi/1.0/types.hal b/wifi/1.0/types.hal
index a66e6fd..0c3a211 100644
--- a/wifi/1.0/types.hal
+++ b/wifi/1.0/types.hal
@@ -30,6 +30,7 @@
ERROR_WIFI_RTT_CONTROLLER_INVALID,
ERROR_NOT_SUPPORTED,
ERROR_NOT_AVAILABLE,
+ ERROR_NOT_STARTED,
ERROR_INVALID_ARGS,
ERROR_UNKNOWN
};
@@ -2887,3 +2888,178 @@
*/
EXCESSIVE = 3
};
+
+/**
+ * Enum describing the fate of the TX packets.
+ */
+enum WifiDebugTxPacketFate : uint32_t {
+ /**
+ * Sent over air and ACKed.
+ */
+ ACKED,
+ /**
+ * Sent over air but not ACKed. (Normal for broadcast/multicast.)
+ */
+ SENT,
+ /**
+ * Queued within firmware, but not yet sent over air.
+ */
+ FW_QUEUED,
+ /**
+ * Dropped by firmware as invalid. E.g. bad source address, bad checksum,
+ * or invalid for current state.
+ */
+ FW_DROP_INVALID,
+ /**
+ * Dropped by firmware due to lack of buffer space.
+ */
+ FW_DROP_NOBUFS,
+ /**
+ * Dropped by firmware for any other reason. Includes frames that were sent
+ * by driver to firmware, but unaccounted for by firmware.
+ */
+ FW_DROP_OTHER,
+ /**
+ * Queued within driver, not yet sent to firmware.
+ */
+ DRV_QUEUED,
+ /**
+ * Dropped by driver as invalid. E.g. bad source address, or invalid for
+ * current state.
+ */
+ DRV_DROP_INVALID,
+ /**
+ * Dropped by driver due to lack of buffer space.
+ */
+ DRV_DROP_NOBUFS,
+ /**
+ * Dropped by driver for any other reason.
+ */
+ DRV_DROP_OTHER,
+};
+
+/**
+ * Enum describing the fate of the TX packets.
+ */
+enum WifiDebugRxPacketFate : uint32_t {
+ /**
+ * Valid and delivered to network stack (e.g., netif_rx()).
+ */
+ SUCCESS,
+ /**
+ * Queued within firmware, but not yet sent to driver.
+ */
+ FW_QUEUED,
+ /**
+ * Dropped by firmware due to host-programmable filters.
+ */
+ FW_DROP_FILTER,
+ /**
+ * Dropped by firmware as invalid. E.g. bad checksum, decrypt failed,
+ * or invalid for current state.
+ */
+ FW_DROP_INVALID,
+ /**
+ * Dropped by firmware due to lack of buffer space.
+ */
+ FW_DROP_NOBUFS,
+ /**
+ * Dropped by firmware for any other reason.
+ */
+ FW_DROP_OTHER,
+ /**
+ * Queued within driver, not yet delivered to network stack.
+ */
+ DRV_QUEUED,
+ /**
+ * Dropped by driver due to filter rules.
+ */
+ DRV_DROP_FILTER,
+ /**
+ * Dropped by driver as invalid. E.g. not permitted in current state.
+ */
+ DRV_DROP_INVALID,
+ /**
+ * Dropped by driver due to lack of buffer space.
+ */
+ DRV_DROP_NOBUFS,
+ /**
+ * Dropped by driver for any other reason.
+ */
+ DRV_DROP_OTHER,
+};
+
+/**
+ * Type of frame transmitted/received.
+ */
+enum WifiDebugPacketFateFrameType : uint32_t {
+ UNKNOWN,
+ ETHERNET_II,
+ MGMT_80211,
+};
+
+/**
+ * Information regarding the frame transmitted/received.
+ */
+struct WifiDebugPacketFateFrameInfo {
+ /**
+ * The type of MAC-layer frame that this frame_info holds.
+ * - For data frames, use FRAME_TYPE_ETHERNET_II.
+ * - For management frames, use FRAME_TYPE_80211_MGMT.
+ * - If the type of the frame is unknown, use FRAME_TYPE_UNKNOWN.
+ */
+ WifiDebugPacketFateFrameType frameType;
+ /**
+ * The number of bytes included in |frameContent|.
+ * If the frame contents are missing (e.g. RX frame dropped in firmware),
+ * |frameLen| must be set to 0.
+ */
+ uint64_t frameLen;
+ /**
+ * Host clock when this frame was received by the driver (either outbound
+ * from the host network stack, or inbound from the firmware).
+ * - The timestamp must be taken from a clock which includes time the host
+ * spent suspended (e.g. ktime_get_boottime()).
+ * - If no host timestamp is available (e.g. RX frame was dropped in firmware),
+ * this field must be set to 0.
+ */
+ TimeStampInUs driverTimestampUsec;
+ /**
+ * Firmware clock when this frame was received by the firmware
+ * (either outbound from the host, or inbound from a remote station).
+ * - The timestamp must be taken from a clock which includes time firmware
+ * spent suspended (if applicable).
+ * - If no firmware timestamp is available (e.g. TX frame was dropped by
+ * driver), this field must be set to 0.
+ * - Consumers of |frameInfo| must not assume any synchronization between
+ * driver and firmware clocks.
+ */
+ TimeStampInUs firmwareTimestampUsec;
+ /**
+ * Actual frame content. This is the raw bytes of the corresponding packet.
+ * - Should be provided for TX frames originated by the host.
+ * - Should be provided for RX frames received by the driver.
+ * - Optionally provided for TX frames originated by firmware.
+ * (At discretion of HAL implementation.)
+ * - Optionally provided for RX frames dropped in firmware.
+ * (At discretion of HAL implementation.)
+ * - If frame content is not provided, |frameLen| must be set to 0.
+ */
+ vec<uint8_t> frameContent;
+};
+
+/**
+ * Struct describing packet fate report for each Rx frame.
+ */
+struct WifiDebugTxPacketFateReport {
+ WifiDebugTxPacketFate fate;
+ WifiDebugPacketFateFrameInfo frameInf;
+};
+
+/**
+ * Struct describing packet fate report for each Rx frame.
+ */
+struct WifiDebugRxPacketFateReport {
+ WifiDebugRxPacketFate fate;
+ WifiDebugPacketFateFrameInfo frameInfo;
+};