Home | History | Annotate | Download | only in 1.0
      1 /*
      2  * Copyright 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.hardware.wifi@1.0;
     18 
     19 import IWifiIface;
     20 import IWifiStaIfaceEventCallback;
     21 
     22 /**
     23  * Interface used to represent a single STA iface.
     24  */
     25 interface IWifiStaIface extends IWifiIface {
     26   /**
     27    * Mask of capabilities suported by this Iface.
     28    */
     29   enum StaIfaceCapabilityMask : uint32_t {
     30     /**
     31      * If set indicates that the APF APIs are supported.
     32      * APF (Android Packet Filter) is a BPF like packet filtering
     33      * bytecode executed by the firmware.
     34      */
     35     APF = 1 << 0,
     36     /**
     37      * If set indicates that the Background Scan APIs are supported.
     38      * Background scan allow the host to send a number of buckets down to the
     39      * firmware. Each bucket contains a set of channels, a period, and some
     40      * parameters about how and when to report results.
     41      */
     42     BACKGROUND_SCAN = 1 << 1,
     43     /**
     44      * If set indicates that the link layer stats APIs are supported.
     45      */
     46     LINK_LAYER_STATS = 1 << 2,
     47     /**
     48      * If set indicates that the RSSI monitor APIs are supported.
     49      */
     50     RSSI_MONITOR = 1 << 3,
     51     /**
     52      * If set indicates that the roaming API's are supported.
     53      */
     54     CONTROL_ROAMING = 1 << 4,
     55     /**
     56      * If set indicates support for Probe IE white listing.
     57      */
     58     PROBE_IE_WHITELIST =  1 << 5,
     59     /**
     60      * If set indicates support for MAC & Probe Sequence Number randomization.
     61      */
     62     SCAN_RAND = 1 << 6,
     63     /**
     64      * Support for 5 GHz Band.
     65      */
     66     STA_5G = 1 << 7,
     67     /**
     68      * Support for GAS/ANQP queries.
     69      */
     70     HOTSPOT = 1 << 8,
     71     /**
     72      * Support for Preferred Network Offload.
     73      */
     74     PNO = 1 << 9,
     75     /**
     76      * Support for Tunneled Direct Link Setup.
     77      */
     78     TDLS = 1 << 10,
     79     /**
     80      * Support for Tunneled Direct Link Setup off channel.
     81      */
     82     TDLS_OFFCHANNEL = 1 << 11,
     83     /**
     84      * Support for neighbour discovery offload.
     85      */
     86     ND_OFFLOAD = 1 << 12,
     87     /**
     88      * Support for keep alive packet offload.
     89      */
     90     KEEP_ALIVE = 1 << 13,
     91     /**
     92      * Support for tracking connection packets' fate.
     93      */
     94     DEBUG_PACKET_FATE = 1 << 14
     95   };
     96 
     97   /**
     98    * Requests notifications of significant events on this iface. Multiple calls
     99    * to this must register multiple callbacks each of which must receive all
    100    * events.
    101    *
    102    * @param callback An instance of the |IWifiStaIfaceEventCallback| HIDL interface
    103    *        object.
    104    * @return status WifiStatus of the operation.
    105    *         Possible status codes:
    106    *         |WifiStatusCode.SUCCESS|,
    107    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|
    108    */
    109   registerEventCallback(IWifiStaIfaceEventCallback callback)
    110       generates (WifiStatus status);
    111 
    112   /**
    113    * Get the capabilities supported by this STA iface.
    114    *
    115    * @return status WifiStatus of the operation.
    116    *         Possible status codes:
    117    *         |WifiStatusCode.SUCCESS|,
    118    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
    119    *         |WifiStatusCode.ERROR_NOT_AVAILABLE|,
    120    *         |WifiStatusCode.ERROR_UNKNOWN|
    121    * @return capabilities Bitset of |StaIfaceCapabilityMask| values.
    122    */
    123   getCapabilities()
    124       generates (WifiStatus status,
    125                  bitfield<StaIfaceCapabilityMask> capabilities);
    126 
    127   /**
    128    * Used to query additional information about the chip's APF capabilities.
    129    * Must fail if |StaIfaceCapabilityMask.APF| is not set.
    130    *
    131    * @return status WifiStatus of the operation.
    132    *         Possible status codes:
    133    *         |WifiStatusCode.SUCCESS|,
    134    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
    135    *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
    136    *         |WifiStatusCode.ERROR_NOT_AVAILABLE|,
    137    *         |WifiStatusCode.ERROR_UNKNOWN|
    138    * @return capabilities Instance of |StaApfPacketFilterCapabilities|.
    139    */
    140   getApfPacketFilterCapabilities()
    141       generates (WifiStatus status, StaApfPacketFilterCapabilities capabilities);
    142 
    143   /**
    144    * Installs an APF program on this iface, replacing an existing
    145    * program if present.
    146    * Must fail if |StaIfaceCapabilityMask.APF| is not set.
    147    *
    148    * APF docs
    149    * ==========================================================================
    150    * APF functionality, instructions and bytecode/binary format is described in:
    151    * http://android.googlesource.com/platform/hardware/google/apf/
    152    * +/b75c9f3714cfae3dad3d976958e063150781437e/apf.h
    153    *
    154    * The interpreter API is described here:
    155    * http://android.googlesource.com/platform/hardware/google/apf/+/
    156    * b75c9f3714cfae3dad3d976958e063150781437e/apf_interpreter.h#32
    157    *
    158    * The assembler/generator API is described in javadocs here:
    159    * http://android.googlesource.com/platform/frameworks/base/+/
    160    * 4456f33a958a7f09e608399da83c4d12b2e7d191/services/net/java/android/net/
    161    * apf/ApfGenerator.java
    162    *
    163    * Disassembler usage is described here:
    164    * http://android.googlesource.com/platform/hardware/google/apf/+/
    165    * b75c9f3714cfae3dad3d976958e063150781437e/apf_disassembler.c#65
    166    *
    167    * The BPF to APF translator usage is described here:
    168    * http://android.googlesource.com/platform/frameworks/base/+/
    169    * 4456f33a958a7f09e608399da83c4d12b2e7d191/tests/net/java/android/net/
    170    * apf/Bpf2Apf.java
    171    * ==========================================================================
    172    *
    173    * @param cmdId command Id to use for this invocation.
    174    * @param APF Program to be set.
    175    * @return status WifiStatus of the operation.
    176    *         Possible status codes:
    177    *         |WifiStatusCode.SUCCESS|,
    178    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
    179    *         |WifiStatusCode.ERROR_INVALID_ARGS|,
    180    *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
    181    *         |WifiStatusCode.ERROR_NOT_AVAILABLE|,
    182    *         |WifiStatusCode.ERROR_UNKNOWN|
    183    */
    184   installApfPacketFilter(CommandId cmdId, vec<uint8_t> program)
    185       generates (WifiStatus status);
    186 
    187   /**
    188    * Used to query additional information about the chip's Background Scan capabilities.
    189    * Must fail if |StaIfaceCapabilityMask.BACKGROUND_SCAN| is not set.
    190    *
    191    * @return status WifiStatus of the operation.
    192    *         Possible status codes:
    193    *         |WifiStatusCode.SUCCESS|,
    194    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
    195    *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
    196    *         |WifiStatusCode.ERROR_NOT_AVAILABLE|,
    197    *         |WifiStatusCode.ERROR_UNKNOWN|
    198    * @return capabilities Instance of |StaBackgroundScanCapabilities|.
    199    */
    200   getBackgroundScanCapabilities()
    201       generates (WifiStatus status, StaBackgroundScanCapabilities capabilities);
    202 
    203   /**
    204    * Used to query the list of valid frequencies (depending on country code set)
    205    * for the provided band. These channels may be specifed in the
    206    * |BackgroundScanBucketParameters.frequenciesInMhz| for a background scan
    207    * request.
    208    *
    209    * @param band Band for which the frequency list is being generated.
    210    * @return status WifiStatus of the operation.
    211    *         Possible status codes:
    212    *         |WifiStatusCode.SUCCESS|,
    213    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
    214    *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
    215    *         |WifiStatusCode.ERROR_NOT_AVAILABLE|,
    216    *         |WifiStatusCode.ERROR_UNKNOWN|
    217    * @return frequencies vector of valid frequencies for the provided band.
    218    */
    219   getValidFrequenciesForBand(WifiBand band)
    220       generates (WifiStatus status, vec<WifiChannelInMhz> frequencies);
    221 
    222   /**
    223    * Start a background scan using the given cmdId as an identifier. Only one
    224    * active background scan need be supported.
    225    * Must fail if |StaIfaceCapabilityMask.BACKGROUND_SCAN| is not set.
    226    *
    227    * When this is called all requested buckets must be scanned, starting the
    228    * beginning of the cycle.
    229    *
    230    * For example:
    231    * If there are two buckets specified
    232    *  - Bucket 1: period=10s
    233    *  - Bucket 2: period=20s
    234    *  - Bucket 3: period=30s
    235    * Then the following scans must occur
    236    *  - t=0  buckets 1, 2, and 3 are scanned
    237    *  - t=10 bucket 1 is scanned
    238    *  - t=20 bucket 1 and 2 are scanned
    239    *  - t=30 bucket 1 and 3 are scanned
    240    *  - t=40 bucket 1 and 2 are scanned
    241    *  - t=50 bucket 1 is scanned
    242    *  - t=60 buckets 1, 2, and 3 are scanned
    243    *  - and the patter repeats
    244    *
    245    * If any scan does not occur or is incomplete (error, interrupted, etc) then
    246    * a cached scan result must still be recorded with the
    247    * WIFI_SCAN_FLAG_INTERRUPTED flag set.
    248    *
    249    * @param cmdId command Id to use for this invocation.
    250    * @params Background scan parameters.
    251    * @return status WifiStatus of the operation.
    252    *         Possible status codes:
    253    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
    254    *         |WifiStatusCode.ERROR_INVALID_ARGS|,
    255    *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
    256    *         |WifiStatusCode.ERROR_NOT_AVAILABLE|,
    257    *         |WifiStatusCode.ERROR_UNKNOWN|
    258    */
    259   startBackgroundScan(CommandId cmdId, StaBackgroundScanParameters params)
    260       generates (WifiStatus status);
    261 
    262   /**
    263    * Stop the background scan started.
    264    * Must fail if |StaIfaceCapabilityMask.BACKGROUND_SCAN| is not set.
    265    *
    266    * @param cmdId command Id corresponding to the request.
    267    * @return status WifiStatus of the operation.
    268    *         Possible status codes:
    269    *         |WifiStatusCode.SUCCESS|,
    270    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
    271    *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
    272    *         |WifiStatusCode.ERROR_NOT_STARTED|,
    273    *         |WifiStatusCode.ERROR_NOT_AVAILABLE|,
    274    *         |WifiStatusCode.ERROR_UNKNOWN|
    275    */
    276   stopBackgroundScan(CommandId cmdId) generates (WifiStatus status);
    277 
    278   /**
    279    * Enable link layer stats collection.
    280    * Must fail if |StaIfaceCapabilityMask.LINK_LAYER_STATS| is not set.
    281    *
    282    * Radio statistics (once started) must not stop until disabled.
    283    * Iface statistics (once started) reset and start afresh after each
    284    * connection until disabled.
    285    *
    286    * @param debug Set for field debug mode. Driver must collect all
    287    *        statistics regardless of performance impact.
    288    * @return status WifiStatus of the operation.
    289    *         Possible status codes:
    290    *         |WifiStatusCode.SUCCESS|,
    291    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
    292    *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
    293    *         |WifiStatusCode.ERROR_NOT_AVAILABLE|,
    294    *         |WifiStatusCode.ERROR_UNKNOWN|
    295    */
    296   enableLinkLayerStatsCollection(bool debug)
    297       generates (WifiStatus status);
    298 
    299   /**
    300    * Disable link layer stats collection.
    301    * Must fail if |StaIfaceCapabilityMask.LINK_LAYER_STATS| is not set.
    302    *
    303    * @return status WifiStatus of the operation.
    304    *         Possible status codes:
    305    *         |WifiStatusCode.SUCCESS|,
    306    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
    307    *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
    308    *         |WifiStatusCode.ERROR_NOT_STARTED|,
    309    *         |WifiStatusCode.ERROR_NOT_AVAILABLE|,
    310    *         |WifiStatusCode.ERROR_UNKNOWN|
    311    */
    312   disableLinkLayerStatsCollection() generates (WifiStatus status);
    313 
    314   /**
    315    * Retrieve the latest link layer stats.
    316    * Must fail if |StaIfaceCapabilityMask.LINK_LAYER_STATS| is not set or if
    317    * link layer stats collection hasn't been explicitly enabled.
    318    *
    319    * @return status WifiStatus of the operation.
    320    *         Possible status codes:
    321    *         |WifiStatusCode.SUCCESS|,
    322    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
    323    *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
    324    *         |WifiStatusCode.ERROR_NOT_STARTED|,
    325    *         |WifiStatusCode.ERROR_NOT_AVAILABLE|,
    326    *         |WifiStatusCode.ERROR_UNKNOWN|
    327    * @return stats Instance of |LinkLayerStats|.
    328    */
    329   getLinkLayerStats() generates (WifiStatus status, StaLinkLayerStats stats);
    330 
    331   /**
    332    * Start RSSI monitoring on the currently connected access point.
    333    * Once the monitoring is enabled,
    334    * |IWifiStaIfaceEventCallback.onRssiThresholdBreached| callback must be
    335    * invoked to indicate if the RSSI goes above |maxRssi| or below |minRssi|.
    336    * Must fail if |StaIfaceCapabilityMask.RSSI_MONITOR| is not set.
    337    *
    338    * @param cmdId command Id to use for this invocation.
    339    * @param maxRssi Maximum RSSI threshold.
    340    * @param minRssi Minimum RSSI threshold.
    341    * @return status WifiStatus of the operation.
    342    *         Possible status codes:
    343    *         |WifiStatusCode.SUCCESS|,
    344    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
    345    *         |WifiStatusCode.ERROR_ARGS_INVALID|,
    346    *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
    347    *         |WifiStatusCode.ERROR_NOT_AVAILABLE|,
    348    *         |WifiStatusCode.ERROR_UNKNOWN|
    349    */
    350   startRssiMonitoring(CommandId cmdId, Rssi maxRssi, Rssi minRssi)
    351       generates (WifiStatus status);
    352 
    353   /**
    354    * Stop RSSI monitoring.
    355    * Must fail if |StaIfaceCapabilityMask.RSSI_MONITOR| is not set.
    356    *
    357    * @param cmdId command Id corresponding to the request.
    358    * @return status WifiStatus of the operation.
    359    *         Possible status codes:
    360    *         |WifiStatusCode.SUCCESS|,
    361    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
    362    *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
    363    *         |WifiStatusCode.ERROR_NOT_STARTED|,
    364    *         |WifiStatusCode.ERROR_NOT_AVAILABLE|,
    365    *         |WifiStatusCode.ERROR_UNKNOWN|
    366    */
    367   stopRssiMonitoring(CommandId cmdId) generates (WifiStatus status);
    368 
    369   /**
    370    * Get roaming control capabilities.
    371    * Must fail if |StaIfaceCapabilityMask.CONTROL_ROAMING| is not set.
    372    *
    373    * @return status WifiStatus of the operation.
    374    *         Possible status codes:
    375    *         |WifiStatusCode.SUCCESS|,
    376    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
    377    *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
    378    *         |WifiStatusCode.ERROR_UNKNOWN|
    379    * @return caps Instance of |StaRoamingCapabilities|.
    380    */
    381   getRoamingCapabilities()
    382       generates (WifiStatus status, StaRoamingCapabilities caps);
    383 
    384   /**
    385    * Configure roaming control parameters.
    386    * Must fail if |StaIfaceCapabilityMask.CONTROL_ROAMING| is not set.
    387    *
    388    * @param config Instance of |StaRoamingConfig|.
    389    * @return status WifiStatus of the operation.
    390    *         Possible status codes:
    391    *         |WifiStatusCode.SUCCESS|,
    392    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
    393    *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
    394    *         |WifiStatusCode.ERROR_UNKNOWN|
    395    */
    396   configureRoaming(StaRoamingConfig config) generates (WifiStatus status);
    397 
    398   /**
    399    * Set the roaming control state with the parameters configured
    400    * using |configureRoaming|. Depending on the roaming state set, the
    401    * driver/firmware would enable/disable control over roaming decisions.
    402    * Must fail if |StaIfaceCapabilityMask.CONTROL_ROAMING| is not set.
    403    *
    404    * @param state State of the roaming control.
    405    * @return status WifiStatus of the operation.
    406    *         Possible status codes:
    407    *         |WifiStatusCode.SUCCESS|,
    408    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
    409    *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
    410    *         |WifiStatusCode.ERROR_BUSY|,
    411    *         |WifiStatusCode.ERROR_UNKNOWN|
    412    */
    413   setRoamingState(StaRoamingState state) generates (WifiStatus status);
    414 
    415   /**
    416    * Enable/Disable Neighbour discovery offload functionality in the firmware.
    417    *
    418    * @param enable true to enable, false to disable.
    419    * @return status WifiStatus of the operation.
    420    *         Possible status codes:
    421    *         |WifiStatusCode.SUCCESS|,
    422    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
    423    *         |WifiStatusCode.ERROR_UNKNOWN|
    424    */
    425   enableNdOffload(bool enable) generates (WifiStatus status);
    426 
    427   /**
    428    * Start sending the specified keep alive packets periodically.
    429    *
    430    * @param cmdId command Id to use for this invocation.
    431    * @param ipPacketData IP packet contents to be transmitted.
    432    * @param etherType 16 bit ether type to be set in the ethernet frame
    433    *        transmitted.
    434    * @param srcAddress Source MAC address of the packet.
    435    * @param dstAddress Destination MAC address of the packet.
    436    * @param periodInMs Interval at which this packet must be transmitted.
    437    * @return status WifiStatus of the operation.
    438    *         Possible status codes:
    439    *         |WifiStatusCode.SUCCESS|,
    440    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
    441    *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
    442    *         |WifiStatusCode.ERROR_NOT_AVAILABLE|,
    443    *         |WifiStatusCode.ERROR_UNKNOWN|
    444    */
    445   startSendingKeepAlivePackets(
    446       CommandId cmdId, vec<uint8_t> ipPacketData, uint16_t etherType,
    447       MacAddress srcAddress, MacAddress dstAddress, uint32_t periodInMs)
    448       generates (WifiStatus status);
    449 
    450   /**
    451    * Stop sending the specified keep alive packets.
    452    *
    453    * @param cmdId command Id corresponding to the request.
    454    * @return status WifiStatus of the operation.
    455    *         Possible status codes:
    456    *         |WifiStatusCode.SUCCESS|,
    457    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
    458    *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
    459    *         |WifiStatusCode.ERROR_NOT_AVAILABLE|,
    460    *         |WifiStatusCode.ERROR_UNKNOWN|
    461    */
    462   stopSendingKeepAlivePackets(CommandId cmdId) generates (WifiStatus status);
    463 
    464   /**
    465    * Set the MAC OUI during scanning.
    466    * An OUI {Organizationally Unique Identifier} is a 24-bit number that
    467    * uniquely identifies a vendor or manufacturer.
    468    *
    469    * @return status WifiStatus of the operation.
    470    *         Possible status codes:
    471    *         |WifiStatusCode.SUCCESS|,
    472    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
    473    *         |WifiStatusCode.ERROR_UNKNOWN|
    474    */
    475   setScanningMacOui(uint8_t[3] oui) generates (WifiStatus status);
    476 
    477   /**
    478    * API to start packet fate monitoring.
    479    * - Once started, monitoring must remain active until HAL is stopped or the
    480    *   chip is reconfigured.
    481    * - When HAL is unloaded, all packet fate buffers must be cleared.
    482    * - The packet fates are used to monitor the state of packets transmitted/
    483    *   received during association.
    484    *
    485    * @return status WifiStatus of the operation.
    486    *         Possible status codes:
    487    *         |WifiStatusCode.SUCCESS|,
    488    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
    489    *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
    490    *         |WifiStatusCode.ERROR_NOT_AVAILABLE|,
    491    *         |WifiStatusCode.ERROR_UNKNOWN|
    492    */
    493   startDebugPacketFateMonitoring() generates (WifiStatus status);
    494 
    495   /**
    496    * API to retrieve fates of outbound packets.
    497    * - HAL implementation must return the fates of
    498    *   all the frames transmitted for the most recent association.
    499    *   The fate reports must follow the same order as their respective
    500    *   packets.
    501    * - HAL implementation may choose (but is not required) to include
    502    *   reports for management frames.
    503    * - Packets reported by firmware, but not recognized by driver,
    504    *   must be included. However, the ordering of the corresponding
    505    *   reports is at the discretion of HAL implementation.
    506    * - Framework must be able to call this API multiple times for the same
    507    *   association.
    508    *
    509    * @return status WifiStatus of the operation.
    510    *         Possible status codes:
    511    *         |WifiStatusCode.SUCCESS|,
    512    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
    513    *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
    514    *         |WifiStatusCode.ERROR_NOT_STARTED|,
    515    *         |WifiStatusCode.ERROR_NOT_AVAILABLE|,
    516    *         |WifiStatusCode.ERROR_UNKNOWN|
    517    * @return fates Vector of |WifiDebugTxPacketFateReport| instances corresponding
    518    *         to the packet fates.
    519    */
    520   getDebugTxPacketFates()
    521       generates (WifiStatus status, vec<WifiDebugTxPacketFateReport> fates);
    522 
    523   /**
    524    * API to retrieve fates of inbound packets.
    525    * - HAL implementation must return the fates of
    526    *   all the frames received for the most recent association.
    527    *   The fate reports must follow the same order as their respective
    528    *   packets.
    529    * - HAL implementation may choose (but is not required) to include
    530    *   reports for management frames.
    531    * - Packets reported by firmware, but not recognized by driver,
    532    *   must be included. However, the ordering of the corresponding
    533    *   reports is at the discretion of HAL implementation.
    534    * - Framework must be able to call this API multiple times for the same
    535    *   association.
    536    *
    537    * @return status WifiStatus of the operation.
    538    *         Possible status codes:
    539    *         |WifiStatusCode.SUCCESS|,
    540    *         |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
    541    *         |WifiStatusCode.ERROR_NOT_SUPPORTED|,
    542    *         |WifiStatusCode.ERROR_NOT_STARTED|,
    543    *         |WifiStatusCode.ERROR_NOT_AVAILABLE|,
    544    *         |WifiStatusCode.ERROR_UNKNOWN|
    545    * @return fates Vector of |WifiDebugRxPacketFateReport| instances corresponding
    546    *         to the packet fates.
    547    */
    548   getDebugRxPacketFates()
    549       generates (WifiStatus status, vec<WifiDebugRxPacketFateReport> fates);
    550 };
    551