|  | /* | 
|  | * Copyright 2016 The Android Open Source Project | 
|  | * | 
|  | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | * you may not use this file except in compliance with the License. | 
|  | * You may obtain a copy of the License at | 
|  | * | 
|  | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, software | 
|  | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | * See the License for the specific language governing permissions and | 
|  | * limitations under the License. | 
|  | */ | 
|  |  | 
|  | package android.hardware.wifi@1.0; | 
|  |  | 
|  | import IWifiIface; | 
|  | import IWifiStaIfaceEventCallback; | 
|  |  | 
|  | /** | 
|  | * Interface used to represent a single STA iface. | 
|  | */ | 
|  | interface IWifiStaIface extends IWifiIface { | 
|  | /** | 
|  | * Mask of capabilities suported by this Iface. | 
|  | */ | 
|  | enum StaIfaceCapabilityMask : uint32_t { | 
|  | /** | 
|  | * If set indicates that the APF APIs are supported. | 
|  | * APF (Android Packet Filter) is a BPF like packet filtering | 
|  | * bytecode executed by the firmware. | 
|  | */ | 
|  | APF = 1 << 0, | 
|  | /** | 
|  | * If set indicates that the Background Scan APIs are supported. | 
|  | * Background scan allow the host to send a number of buckets down to the | 
|  | * firmware. Each bucket contains a set of channels, a period, and some | 
|  | * parameters about how and when to report results. | 
|  | */ | 
|  | BACKGROUND_SCAN = 1 << 1, | 
|  | /** | 
|  | * If set indicates that the link layer stats APIs are supported. | 
|  | */ | 
|  | LINK_LAYER_STATS = 1 << 2, | 
|  | /** | 
|  | * If set indicates that the RSSI monitor APIs are supported. | 
|  | */ | 
|  | RSSI_MONITOR = 1 << 3, | 
|  | /** | 
|  | * If set indicates that the roaming API's are supported. | 
|  | */ | 
|  | CONTROL_ROAMING = 1 << 4, | 
|  | /** | 
|  | * If set indicates support for Probe IE white listing. | 
|  | */ | 
|  | PROBE_IE_WHITELIST =  1 << 5, | 
|  | /** | 
|  | * If set indicates support for MAC & Probe Sequence Number randomization. | 
|  | */ | 
|  | SCAN_RAND = 1 << 6, | 
|  | /** | 
|  | * Support for 5 GHz Band. | 
|  | */ | 
|  | STA_5G = 1 << 7, | 
|  | /** | 
|  | * Support for GAS/ANQP queries. | 
|  | */ | 
|  | HOTSPOT = 1 << 8, | 
|  | /** | 
|  | * Support for Preferred Network Offload. | 
|  | */ | 
|  | PNO = 1 << 9, | 
|  | /** | 
|  | * Support for Tunneled Direct Link Setup. | 
|  | */ | 
|  | TDLS = 1 << 10, | 
|  | /** | 
|  | * Support for Tunneled Direct Link Setup off channel. | 
|  | */ | 
|  | TDLS_OFFCHANNEL = 1 << 11, | 
|  | /** | 
|  | * Support for neighbour discovery offload. | 
|  | */ | 
|  | ND_OFFLOAD = 1 << 12, | 
|  | /** | 
|  | * Support for keep alive packet offload. | 
|  | */ | 
|  | KEEP_ALIVE = 1 << 13, | 
|  | /** | 
|  | * Support for tracking connection packets' fate. | 
|  | */ | 
|  | DEBUG_PACKET_FATE = 1 << 14 | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Requests notifications of significant events on this iface. Multiple calls | 
|  | * to this must register multiple callbacks each of which must receive all | 
|  | * events. | 
|  | * | 
|  | * @param callback An instance of the |IWifiStaIfaceEventCallback| HIDL interface | 
|  | *        object. | 
|  | * @return status WifiStatus of the operation. | 
|  | *         Possible status codes: | 
|  | *         |WifiStatusCode.SUCCESS|, | 
|  | *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID| | 
|  | */ | 
|  | registerEventCallback(IWifiStaIfaceEventCallback callback) | 
|  | generates (WifiStatus status); | 
|  |  | 
|  | /** | 
|  | * Get the capabilities supported by this STA iface. | 
|  | * | 
|  | * @return status WifiStatus of the operation. | 
|  | *         Possible status codes: | 
|  | *         |WifiStatusCode.SUCCESS|, | 
|  | *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, | 
|  | *         |WifiStatusCode.ERROR_NOT_AVAILABLE|, | 
|  | *         |WifiStatusCode.ERROR_UNKNOWN| | 
|  | * @return capabilities Bitset of |StaIfaceCapabilityMask| values. | 
|  | */ | 
|  | getCapabilities() | 
|  | generates (WifiStatus status, | 
|  | bitfield<StaIfaceCapabilityMask> capabilities); | 
|  |  | 
|  | /** | 
|  | * Used to query additional information about the chip's APF capabilities. | 
|  | * Must fail if |StaIfaceCapabilityMask.APF| is not set. | 
|  | * | 
|  | * @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| | 
|  | * @return capabilities Instance of |StaApfPacketFilterCapabilities|. | 
|  | */ | 
|  | getApfPacketFilterCapabilities() | 
|  | generates (WifiStatus status, StaApfPacketFilterCapabilities capabilities); | 
|  |  | 
|  | /** | 
|  | * Installs an APF program on this iface, replacing an existing | 
|  | * program if present. | 
|  | * Must fail if |StaIfaceCapabilityMask.APF| is not set. | 
|  | * | 
|  | * APF docs | 
|  | * ========================================================================== | 
|  | * APF functionality, instructions and bytecode/binary format is described in: | 
|  | * http://android.googlesource.com/platform/hardware/google/apf/ | 
|  | * +/b75c9f3714cfae3dad3d976958e063150781437e/apf.h | 
|  | * | 
|  | * The interpreter API is described here: | 
|  | * http://android.googlesource.com/platform/hardware/google/apf/+/ | 
|  | * b75c9f3714cfae3dad3d976958e063150781437e/apf_interpreter.h#32 | 
|  | * | 
|  | * The assembler/generator API is described in javadocs here: | 
|  | * http://android.googlesource.com/platform/frameworks/base/+/ | 
|  | * 4456f33a958a7f09e608399da83c4d12b2e7d191/services/net/java/android/net/ | 
|  | * apf/ApfGenerator.java | 
|  | * | 
|  | * Disassembler usage is described here: | 
|  | * http://android.googlesource.com/platform/hardware/google/apf/+/ | 
|  | * b75c9f3714cfae3dad3d976958e063150781437e/apf_disassembler.c#65 | 
|  | * | 
|  | * The BPF to APF translator usage is described here: | 
|  | * http://android.googlesource.com/platform/frameworks/base/+/ | 
|  | * 4456f33a958a7f09e608399da83c4d12b2e7d191/tests/net/java/android/net/ | 
|  | * apf/Bpf2Apf.java | 
|  | * ========================================================================== | 
|  | * | 
|  | * @param cmdId command Id to use for this invocation. | 
|  | * @param APF Program to be set. | 
|  | * @return status WifiStatus of the operation. | 
|  | *         Possible status codes: | 
|  | *         |WifiStatusCode.SUCCESS|, | 
|  | *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, | 
|  | *         |WifiStatusCode.ERROR_INVALID_ARGS|, | 
|  | *         |WifiStatusCode.ERROR_NOT_SUPPORTED|, | 
|  | *         |WifiStatusCode.ERROR_NOT_AVAILABLE|, | 
|  | *         |WifiStatusCode.ERROR_UNKNOWN| | 
|  | */ | 
|  | installApfPacketFilter(CommandId cmdId, vec<uint8_t> program) | 
|  | generates (WifiStatus status); | 
|  |  | 
|  | /** | 
|  | * Used to query additional information about the chip's Background Scan capabilities. | 
|  | * Must fail if |StaIfaceCapabilityMask.BACKGROUND_SCAN| is not set. | 
|  | * | 
|  | * @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| | 
|  | * @return capabilities Instance of |StaBackgroundScanCapabilities|. | 
|  | */ | 
|  | getBackgroundScanCapabilities() | 
|  | generates (WifiStatus status, StaBackgroundScanCapabilities capabilities); | 
|  |  | 
|  | /** | 
|  | * Used to query the list of valid frequencies (depending on country code set) | 
|  | * for the provided band. These channels may be specifed in the | 
|  | * |BackgroundScanBucketParameters.frequenciesInMhz| for a background scan | 
|  | * request. | 
|  | * | 
|  | * @param band Band for which the frequency list is being generated. | 
|  | * @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| | 
|  | * @return frequencies vector of valid frequencies for the provided band. | 
|  | */ | 
|  | getValidFrequenciesForBand(WifiBand band) | 
|  | generates (WifiStatus status, vec<WifiChannelInMhz> frequencies); | 
|  |  | 
|  | /** | 
|  | * Start a background scan using the given cmdId as an identifier. Only one | 
|  | * active background scan need be supported. | 
|  | * Must fail if |StaIfaceCapabilityMask.BACKGROUND_SCAN| is not set. | 
|  | * | 
|  | * When this is called all requested buckets must be scanned, starting the | 
|  | * beginning of the cycle. | 
|  | * | 
|  | * For example: | 
|  | * If there are two buckets specified | 
|  | *  - Bucket 1: period=10s | 
|  | *  - Bucket 2: period=20s | 
|  | *  - Bucket 3: period=30s | 
|  | * Then the following scans must occur | 
|  | *  - t=0  buckets 1, 2, and 3 are scanned | 
|  | *  - t=10 bucket 1 is scanned | 
|  | *  - t=20 bucket 1 and 2 are scanned | 
|  | *  - t=30 bucket 1 and 3 are scanned | 
|  | *  - t=40 bucket 1 and 2 are scanned | 
|  | *  - t=50 bucket 1 is scanned | 
|  | *  - t=60 buckets 1, 2, and 3 are scanned | 
|  | *  - and the patter repeats | 
|  | * | 
|  | * If any scan does not occur or is incomplete (error, interrupted, etc) then | 
|  | * a cached scan result must still be recorded with the | 
|  | * WIFI_SCAN_FLAG_INTERRUPTED flag set. | 
|  | * | 
|  | * @param cmdId command Id to use for this invocation. | 
|  | * @params Background scan parameters. | 
|  | * @return status WifiStatus of the operation. | 
|  | *         Possible status codes: | 
|  | *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, | 
|  | *         |WifiStatusCode.ERROR_INVALID_ARGS|, | 
|  | *         |WifiStatusCode.ERROR_NOT_SUPPORTED|, | 
|  | *         |WifiStatusCode.ERROR_NOT_AVAILABLE|, | 
|  | *         |WifiStatusCode.ERROR_UNKNOWN| | 
|  | */ | 
|  | startBackgroundScan(CommandId cmdId, StaBackgroundScanParameters params) | 
|  | generates (WifiStatus status); | 
|  |  | 
|  | /** | 
|  | * Stop the background scan started. | 
|  | * Must fail if |StaIfaceCapabilityMask.BACKGROUND_SCAN| is not set. | 
|  | * | 
|  | * @param cmdId command Id corresponding to the request. | 
|  | * @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| | 
|  | */ | 
|  | stopBackgroundScan(CommandId cmdId) generates (WifiStatus status); | 
|  |  | 
|  | /** | 
|  | * Enable link layer stats collection. | 
|  | * Must fail if |StaIfaceCapabilityMask.LINK_LAYER_STATS| is not set. | 
|  | * | 
|  | * Radio statistics (once started) must not stop until disabled. | 
|  | * Iface statistics (once started) reset and start afresh after each | 
|  | * connection until disabled. | 
|  | * | 
|  | * @param debug Set for field debug mode. Driver must collect all | 
|  | *        statistics regardless of performance impact. | 
|  | * @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| | 
|  | */ | 
|  | enableLinkLayerStatsCollection(bool debug) | 
|  | generates (WifiStatus status); | 
|  |  | 
|  | /** | 
|  | * Disable link layer stats collection. | 
|  | * Must fail if |StaIfaceCapabilityMask.LINK_LAYER_STATS| is not set. | 
|  | * | 
|  | * @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| | 
|  | */ | 
|  | disableLinkLayerStatsCollection() generates (WifiStatus status); | 
|  |  | 
|  | /** | 
|  | * Retrieve the latest link layer stats. | 
|  | * Must fail if |StaIfaceCapabilityMask.LINK_LAYER_STATS| is not set or if | 
|  | * link layer stats collection hasn't been explicitly enabled. | 
|  | * | 
|  | * @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 stats Instance of |LinkLayerStats|. | 
|  | */ | 
|  | getLinkLayerStats() generates (WifiStatus status, StaLinkLayerStats stats); | 
|  |  | 
|  | /** | 
|  | * Start RSSI monitoring on the currently connected access point. | 
|  | * Once the monitoring is enabled, | 
|  | * |IWifiStaIfaceEventCallback.onRssiThresholdBreached| callback must be | 
|  | * invoked to indicate if the RSSI goes above |maxRssi| or below |minRssi|. | 
|  | * Must fail if |StaIfaceCapabilityMask.RSSI_MONITOR| is not set. | 
|  | * | 
|  | * @param cmdId command Id to use for this invocation. | 
|  | * @param maxRssi Maximum RSSI threshold. | 
|  | * @param minRssi Minimum RSSI threshold. | 
|  | * @return status WifiStatus of the operation. | 
|  | *         Possible status codes: | 
|  | *         |WifiStatusCode.SUCCESS|, | 
|  | *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, | 
|  | *         |WifiStatusCode.ERROR_ARGS_INVALID|, | 
|  | *         |WifiStatusCode.ERROR_NOT_SUPPORTED|, | 
|  | *         |WifiStatusCode.ERROR_NOT_AVAILABLE|, | 
|  | *         |WifiStatusCode.ERROR_UNKNOWN| | 
|  | */ | 
|  | startRssiMonitoring(CommandId cmdId, Rssi maxRssi, Rssi minRssi) | 
|  | generates (WifiStatus status); | 
|  |  | 
|  | /** | 
|  | * Stop RSSI monitoring. | 
|  | * Must fail if |StaIfaceCapabilityMask.RSSI_MONITOR| is not set. | 
|  | * | 
|  | * @param cmdId command Id corresponding to the request. | 
|  | * @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| | 
|  | */ | 
|  | stopRssiMonitoring(CommandId cmdId) generates (WifiStatus status); | 
|  |  | 
|  | /** | 
|  | * Get roaming control capabilities. | 
|  | * Must fail if |StaIfaceCapabilityMask.CONTROL_ROAMING| is not set. | 
|  | * | 
|  | * @return status WifiStatus of the operation. | 
|  | *         Possible status codes: | 
|  | *         |WifiStatusCode.SUCCESS|, | 
|  | *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, | 
|  | *         |WifiStatusCode.ERROR_NOT_SUPPORTED|, | 
|  | *         |WifiStatusCode.ERROR_UNKNOWN| | 
|  | * @return caps Instance of |StaRoamingCapabilities|. | 
|  | */ | 
|  | getRoamingCapabilities() | 
|  | generates (WifiStatus status, StaRoamingCapabilities caps); | 
|  |  | 
|  | /** | 
|  | * Configure roaming control parameters. | 
|  | * Must fail if |StaIfaceCapabilityMask.CONTROL_ROAMING| is not set. | 
|  | * | 
|  | * @param config Instance of |StaRoamingConfig|. | 
|  | * @return status WifiStatus of the operation. | 
|  | *         Possible status codes: | 
|  | *         |WifiStatusCode.SUCCESS|, | 
|  | *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, | 
|  | *         |WifiStatusCode.ERROR_NOT_SUPPORTED|, | 
|  | *         |WifiStatusCode.ERROR_UNKNOWN| | 
|  | */ | 
|  | configureRoaming(StaRoamingConfig config) generates (WifiStatus status); | 
|  |  | 
|  | /** | 
|  | * Set the roaming control state with the parameters configured | 
|  | * using |configureRoaming|. Depending on the roaming state set, the | 
|  | * driver/firmware would enable/disable control over roaming decisions. | 
|  | * Must fail if |StaIfaceCapabilityMask.CONTROL_ROAMING| is not set. | 
|  | * | 
|  | * @param state State of the roaming control. | 
|  | * @return status WifiStatus of the operation. | 
|  | *         Possible status codes: | 
|  | *         |WifiStatusCode.SUCCESS|, | 
|  | *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, | 
|  | *         |WifiStatusCode.ERROR_NOT_SUPPORTED|, | 
|  | *         |WifiStatusCode.ERROR_BUSY|, | 
|  | *         |WifiStatusCode.ERROR_UNKNOWN| | 
|  | */ | 
|  | setRoamingState(StaRoamingState state) generates (WifiStatus status); | 
|  |  | 
|  | /** | 
|  | * Enable/Disable Neighbour discovery offload functionality in the firmware. | 
|  | * | 
|  | * @param enable true to enable, false to disable. | 
|  | * @return status WifiStatus of the operation. | 
|  | *         Possible status codes: | 
|  | *         |WifiStatusCode.SUCCESS|, | 
|  | *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, | 
|  | *         |WifiStatusCode.ERROR_UNKNOWN| | 
|  | */ | 
|  | enableNdOffload(bool enable) generates (WifiStatus status); | 
|  |  | 
|  | /** | 
|  | * Start sending the specified keep alive packets periodically. | 
|  | * | 
|  | * @param cmdId command Id to use for this invocation. | 
|  | * @param ipPacketData IP packet contents to be transmitted. | 
|  | * @param etherType 16 bit ether type to be set in the ethernet frame | 
|  | *        transmitted. | 
|  | * @param srcAddress Source MAC address of the packet. | 
|  | * @param dstAddress Destination MAC address of the packet. | 
|  | * @param periodInMs Interval at which this packet must be transmitted. | 
|  | * @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| | 
|  | */ | 
|  | startSendingKeepAlivePackets( | 
|  | CommandId cmdId, vec<uint8_t> ipPacketData, uint16_t etherType, | 
|  | MacAddress srcAddress, MacAddress dstAddress, uint32_t periodInMs) | 
|  | generates (WifiStatus status); | 
|  |  | 
|  | /** | 
|  | * Stop sending the specified keep alive packets. | 
|  | * | 
|  | * @param cmdId command Id corresponding to the request. | 
|  | * @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| | 
|  | */ | 
|  | stopSendingKeepAlivePackets(CommandId cmdId) generates (WifiStatus status); | 
|  |  | 
|  | /** | 
|  | * Set the MAC OUI during scanning. | 
|  | * An OUI {Organizationally Unique Identifier} is a 24-bit number that | 
|  | * uniquely identifies a vendor or manufacturer. | 
|  | * | 
|  | * @return status WifiStatus of the operation. | 
|  | *         Possible status codes: | 
|  | *         |WifiStatusCode.SUCCESS|, | 
|  | *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, | 
|  | *         |WifiStatusCode.ERROR_UNKNOWN| | 
|  | */ | 
|  | setScanningMacOui(uint8_t[3] oui) generates (WifiStatus status); | 
|  |  | 
|  | /** | 
|  | * API to start packet fate monitoring. | 
|  | * - Once started, monitoring must remain active until HAL is stopped or the | 
|  | *   chip is reconfigured. | 
|  | * - 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 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); | 
|  | }; |