diff --git a/wifi/1.0/Android.mk b/wifi/1.0/Android.mk index e8122724c0..a3901f4647 100644 --- a/wifi/1.0/Android.mk +++ b/wifi/1.0/Android.mk @@ -1542,6 +1542,40 @@ $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) 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) # @@ -1746,6 +1780,74 @@ $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) 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) # @@ -3667,6 +3769,40 @@ $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) 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) # @@ -3871,6 +4007,74 @@ $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) 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) # diff --git a/wifi/1.0/IWifiChip.hal b/wifi/1.0/IWifiChip.hal index 29425b1f5e..487a5aefc1 100644 --- a/wifi/1.0/IWifiChip.hal +++ b/wifi/1.0/IWifiChip.hal @@ -130,6 +130,37 @@ interface IWifiChip { string firmwareDescription; }; + /** + * 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. * @@ -155,6 +186,19 @@ interface IWifiChip { */ 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. * @@ -464,6 +508,7 @@ interface IWifiChip { * 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 @@ interface IWifiChip { * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_NOT_SUPPORTED|, * |WifiStatusCode.NOT_AVAILABLE|, * |WifiStatusCode.UNKNOWN| */ @@ -506,6 +552,8 @@ interface IWifiChip { * 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 3ca9b7d084..41b2bad7f6 100644 --- a/wifi/1.0/IWifiStaIface.hal +++ b/wifi/1.0/IWifiStaIface.hal @@ -44,6 +44,10 @@ interface IWifiStaIface extends IWifiIface { * 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 @@ interface IWifiStaIface extends IWifiIface { * |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 @@ interface IWifiStaIface extends IWifiIface { * |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 @@ interface IWifiStaIface extends IWifiIface { * |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 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 fates); }; diff --git a/wifi/1.0/types.hal b/wifi/1.0/types.hal index a66e6fdd3a..0c3a2119ef 100644 --- a/wifi/1.0/types.hal +++ b/wifi/1.0/types.hal @@ -30,6 +30,7 @@ enum WifiStatusCode : uint32_t { ERROR_WIFI_RTT_CONTROLLER_INVALID, ERROR_NOT_SUPPORTED, ERROR_NOT_AVAILABLE, + ERROR_NOT_STARTED, ERROR_INVALID_ARGS, ERROR_UNKNOWN }; @@ -2887,3 +2888,178 @@ enum WifiDebugRingBufferVerboseLevel : uint32_t { */ 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 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; +};