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 /**
     20  * Enum values indicating the status of operation.
     21  */
     22 enum WifiStatusCode : uint32_t {
     23   /** No errors. */
     24   SUCCESS,
     25   /** Method invoked on an invalid |IWifiChip| object. */
     26   ERROR_WIFI_CHIP_INVALID,
     27   /** Method invoked on an invalid |IWifiIface| object. */
     28   ERROR_WIFI_IFACE_INVALID,
     29   /** Method invoked on an invalid |IWifiRttController| object. */
     30   ERROR_WIFI_RTT_CONTROLLER_INVALID,
     31   ERROR_NOT_SUPPORTED,
     32   ERROR_NOT_AVAILABLE,
     33   ERROR_NOT_STARTED,
     34   ERROR_INVALID_ARGS,
     35   ERROR_BUSY,
     36   ERROR_UNKNOWN
     37 };
     38 
     39 /**
     40  * Generic structure to return the status of an operation.
     41  */
     42 struct WifiStatus {
     43   WifiStatusCode code;
     44   /**
     45    * A vendor specific error message from the vendor to provide more
     46    * information beyond the reason code.
     47    */
     48   string description;
     49 };
     50 
     51 /**
     52  * List of Iface types supported.
     53  */
     54 enum IfaceType : uint32_t {
     55   STA,
     56   AP,
     57   P2P,
     58   /**
     59    * NAN control interface. Datapath support must be queried and created
     60    * through this interface.
     61    */
     62   NAN,
     63 };
     64 
     65 /**
     66  * An identifier assigned to every chip on the device.
     67  */
     68 typedef uint32_t ChipId;
     69 
     70 /**
     71  * An identifier for a mode that the chip can be put in.
     72  */
     73 typedef uint32_t ChipModeId;
     74 
     75 /**
     76  * A unique handle provided by the client to identify individual invocations of
     77  * certain API's like |IWifiStaIface.startBackgroundScan|,
     78  * |IWifiStaIface.installApfPacketFilter|, etc.
     79  */
     80 typedef uint32_t CommandId;
     81 
     82 /**
     83  * Channel frequency in Mhz.
     84  */
     85 typedef uint32_t WifiChannelInMhz;
     86 
     87 /**
     88  * Channel operating width in Mhz.
     89  */
     90 enum WifiChannelWidthInMhz : uint32_t {
     91   WIDTH_20    = 0,
     92   WIDTH_40    = 1,
     93   WIDTH_80    = 2,
     94   WIDTH_160   = 3,
     95   WIDTH_80P80 = 4,
     96   WIDTH_5     = 5,
     97   WIDTH_10    = 6,
     98   WIDTH_INVALID = -1
     99 };
    100 
    101 /**
    102  * Channel information.
    103  */
    104 struct WifiChannelInfo {
    105   /**
    106    * Channel width (20, 40, 80, 80+80, 160).
    107    */
    108   WifiChannelWidthInMhz width;
    109   /**
    110    * Primary 20 MHz channel.
    111    */
    112   WifiChannelInMhz centerFreq;
    113   /**
    114    * Center frequency (MHz) first segment.
    115    */
    116   WifiChannelInMhz centerFreq0;
    117   /**
    118    * Center frequency (MHz) second segment.
    119    */
    120   WifiChannelInMhz centerFreq1;
    121 };
    122 
    123 /**
    124  * RSSI information.
    125  */
    126 typedef int32_t Rssi;
    127 
    128 /**
    129  * Mac Address type. 6 octets representing physical address of a device.
    130  */
    131 typedef uint8_t[6] MacAddress;
    132 
    133 /**
    134  * SSID type. 32 octets representing the network.
    135  */
    136 typedef uint8_t[32] Ssid;
    137 
    138 /**
    139  * BSSID type. 6 octets representing the physical address of an AP.
    140  */
    141 typedef MacAddress Bssid;
    142 
    143 /**
    144  * TimeStamp in milliseconds (ms).
    145  */
    146 typedef uint64_t TimeStampInMs;
    147 
    148 /**
    149  * TimeStamp in microseconds (us).
    150  */
    151 typedef uint64_t TimeStampInUs;
    152 
    153 /**
    154  * TimeStamp in picoseconds (ps).
    155  */
    156 typedef uint64_t TimeSpanInPs;
    157 
    158 /**
    159  * Information elements contained within the |ScanResult| structure.
    160  * These elements correspond to the IEEE_802.11 standard.
    161  */
    162 struct WifiInformationElement {
    163   uint8_t id;
    164   vec<uint8_t> data;
    165 };
    166 
    167 enum WifiRatePreamble : uint32_t {
    168   OFDM = 0,
    169   CCK = 1,
    170   HT = 2,
    171   VHT = 3,
    172   RESERVED = 4
    173 };
    174 
    175 /**
    176  * Number of spatial streams in VHT/HT.
    177  */
    178 enum WifiRateNss : uint32_t {
    179   NSS_1x1 = 0,
    180   NSS_2x2 = 1,
    181   NSS_3x3 = 2,
    182   NSS_4x4 = 3
    183 };
    184 
    185 /**
    186  * Wifi rate info.
    187  */
    188 struct WifiRateInfo {
    189   /**
    190    * Preamble used for RTT measurements.
    191    */
    192   WifiRatePreamble preamble;
    193   /**
    194    * Number of spatial streams.
    195    */
    196   WifiRateNss nss;
    197   /**
    198    * Bandwidth of channel.
    199    */
    200   WifiChannelWidthInMhz bw;
    201   /**
    202    * OFDM/CCK rate code would be as per ieee std in the units of 0.5mbps.
    203    * HT/VHT it would be mcs index.
    204    */
    205   uint8_t rateMcsIdx;
    206   /**
    207    * Bitrate in units of 100 Kbps.
    208    */
    209   uint32_t bitRateInKbps;
    210 };
    211 
    212 /**
    213  * Wifi bands defined in 80211 spec.
    214  */
    215 enum WifiBand : uint32_t {
    216   BAND_UNSPECIFIED = 0,
    217   /**
    218    * 2.4 GHz.
    219    */
    220   BAND_24GHZ = 1,
    221   /**
    222    * 5 GHz without DFS.
    223    */
    224   BAND_5GHZ = 2,
    225   /**
    226    * 5 GHz DFS only.
    227    */
    228   BAND_5GHZ_DFS = 4,
    229   /**
    230    * 5 GHz with DFS.
    231    */
    232   BAND_5GHZ_WITH_DFS = 6,
    233   /**
    234    * 2.4 GHz + 5 GHz; no DFS.
    235    */
    236   BAND_24GHZ_5GHZ = 3,
    237   /**
    238    * 2.4 GHz + 5 GHz with DFS
    239    */
    240   BAND_24GHZ_5GHZ_WITH_DFS = 7
    241 };
    242 
    243 /**
    244  * STA specific types.
    245  * TODO(b/32159498): Move to a separate sta_types.hal.
    246  */
    247 /**
    248  * Parameters to specify the APF capabilities of this iface.
    249  */
    250 struct StaApfPacketFilterCapabilities {
    251   /**
    252    * Version of the packet filter interpreter supported
    253    */
    254   uint32_t version;
    255   /**
    256    * Maximum size of the filter bytecodes in byte for an iface.
    257    */
    258   uint32_t maxLength;
    259 };
    260 
    261 /**
    262  * Parameters to specify the Background Scan capabilities of this iface.
    263  */
    264 struct StaBackgroundScanCapabilities {
    265   /**
    266    * Maximum number of byte available for cached scan results
    267    */
    268   uint32_t maxCacheSize;
    269   /**
    270    * Maximum number of buckets that can be supplied for a scan
    271    */
    272   uint32_t maxBuckets;
    273   /**
    274    * Maximum number of APs that must be stored for each scan.
    275    */
    276   uint32_t maxApCachePerScan;
    277   /**
    278    * Max reporting number of scans threshold that can be specified in the scan
    279    * parameters.
    280    */
    281   int32_t maxReportingThreshold;
    282 };
    283 
    284 /**
    285  * Mask of event reporting schemes that can be specified in background scan
    286  * requests.
    287  */
    288 enum StaBackgroundScanBucketEventReportSchemeMask : uint32_t {
    289   /**
    290    * Report a scan completion event after scan. If this is not set then scan
    291    * completion events must be reported if report_threshold_percent or
    292    * report_threshold_num_scans is reached.
    293    */
    294   EACH_SCAN = 1 << 0,
    295   /**
    296    * Forward scan results (beacons/probe responses + IEs) in real time to HAL,
    297    * in addition to completion events.
    298    * Note: To keep backward compatibility, fire completion events regardless
    299    * of REPORT_EVENTS_EACH_SCAN.
    300    */
    301   FULL_RESULTS = 1 << 1,
    302   /**
    303    * Controls if scans for this bucket must be placed in the results buffer.
    304    */
    305   NO_BATCH = 1 << 2,
    306 };
    307 
    308 /**
    309  * Max limits for background scan.
    310  */
    311 enum StaScanLimits : uint32_t {
    312   MAX_CHANNELS = 16,
    313   MAX_BUCKETS = 16,
    314   MAX_AP_CACHE_PER_SCAN = 32
    315 };
    316 
    317 /**
    318  * Background Scan parameters per bucket that can be specified in background
    319  * scan requests.
    320  */
    321 struct StaBackgroundScanBucketParameters {
    322   /**
    323    * Bucket index. This index is used to report results in
    324    * |StaScanData.bucketsScanned|.
    325    */
    326   uint32_t bucketIdx;
    327   /**
    328    * Bands to scan or |BAND_UNSPECIFIED| if frequencies list must be used
    329    * instead.
    330    */
    331   WifiBand band;
    332   /**
    333    * Channel frequencies (in Mhz) to scan if |band| is set to
    334    * |BAND_UNSPECIFIED|.
    335    * Max length: |StaScanLimits.MAX_CHANNELS|.
    336    */
    337   vec<WifiChannelInMhz> frequencies;
    338   /**
    339    * Period at which this bucket must be scanned (in milliseconds). Must be an integer
    340    * multiple of the |basePeriodInMs| specified in the BackgroundScanParameters.
    341    */
    342   uint32_t periodInMs;
    343   /**
    344    * Bitset of |StaBackgroundScanBucketEventReportSchemeMask| values controlling
    345    * when events for this bucket must be reported.
    346    */
    347   bitfield<StaBackgroundScanBucketEventReportSchemeMask> eventReportScheme;
    348   /**
    349    * For exponential back off. If |exponentialMaxPeriodInMs| is non zero or
    350    * different than period, then this bucket is an exponential backoff bucket
    351    * and the scan period must grow exponentially as per formula:
    352    *   actual_period(N) = period * (base ^ (N/step_count))
    353    * to this maximum period (in milliseconds).
    354    */
    355   uint32_t exponentialMaxPeriodInMs;
    356   /**
    357    * For exponential back off. multiplier: new_period=old_period * base
    358    */
    359   uint32_t exponentialBase;
    360   /**
    361    * For exponential back off. Number of scans to perform for a given
    362    * period.
    363    */
    364   uint32_t exponentialStepCount;
    365 };
    366 
    367 /**
    368  * Background Scan parameters that can be specified in background scan
    369  * requests.
    370  */
    371 struct StaBackgroundScanParameters {
    372   /**
    373    * GCD of all bucket periods (in milliseconds).
    374    */
    375   uint32_t basePeriodInMs;
    376   /**
    377    * Maximum number of APs that must be stored for each scan. If the maximum
    378    * is reached the highest RSSI results must be returned.
    379    * Max length: |StaScanLimits.MAX_AP_CACHE_PER_SCAN|.
    380    */
    381   uint32_t maxApPerScan;
    382   /**
    383    * % cache buffer filled threshold at which the host must be notified of
    384    * batched scan results.
    385    */
    386   uint32_t reportThresholdPercent;
    387   /**
    388    * Threshold at which the AP must be woken up, in number of scans.
    389    */
    390   uint32_t reportThresholdNumScans;
    391   /**
    392    * List of buckets to be scheduled.
    393    * Max length: |StaScanLimits.MAX_BUCKETS|.
    394    */
    395   vec<StaBackgroundScanBucketParameters> buckets;
    396 };
    397 
    398 /**
    399  * Packet stats for different traffic categories.
    400  */
    401 struct StaLinkLayerIfacePacketStats {
    402   /**
    403    * Number of received unicast data packets.
    404    */
    405   uint64_t rxMpdu;
    406   /**
    407    * Number of successfully transmitted unicast data pkts (ACK rcvd).
    408    */
    409   uint64_t txMpdu;
    410   /**
    411    * Number of transmitted unicast data pkt losses (no ACK).
    412    */
    413   uint64_t lostMpdu;
    414   /**
    415    * Number of transmitted unicast data retry pkts.
    416    */
    417   uint64_t retries;
    418 };
    419 
    420 /**
    421  * Iface statistics for the current connection.
    422  */
    423 struct StaLinkLayerIfaceStats {
    424   /**
    425    * Number beacons received from the connected AP.
    426    */
    427   uint32_t beaconRx;
    428   /**
    429    * Access Point Beacon and Management frames RSSI (averaged).
    430    */
    431   int32_t avgRssiMgmt;
    432   /**
    433    * WME Best Effort Access Category packet counters.
    434    */
    435   StaLinkLayerIfacePacketStats wmeBePktStats;
    436   /**
    437    * WME Background Access Category packet counters.
    438    */
    439   StaLinkLayerIfacePacketStats wmeBkPktStats;
    440   /**
    441    * WME Video Access Category packet counters.
    442    */
    443   StaLinkLayerIfacePacketStats wmeViPktStats;
    444   /**
    445    * WME Voice Access Category packet counters.
    446    */
    447   StaLinkLayerIfacePacketStats wmeVoPktStats;
    448 };
    449 
    450 /**
    451  * Cumulative radio statistics since collection was enabled.
    452  */
    453 struct StaLinkLayerRadioStats {
    454   /**
    455    * Time for which the radio is awake.
    456    */
    457   uint32_t onTimeInMs;
    458   /**
    459    * Total time for which the radio is in active transmission.
    460    */
    461   uint32_t txTimeInMs;
    462   /**
    463    * Time for which the radio is in active tranmission per tx level.
    464    */
    465   vec<uint32_t> txTimeInMsPerLevel;
    466   /**
    467    * Time for which the radio is in active receive.
    468    */
    469   uint32_t rxTimeInMs;
    470   /**
    471    *  Total time for which the radio is awake due to scan.
    472    */
    473   uint32_t onTimeInMsForScan;
    474 };
    475 
    476 /**
    477  * Link layer stats retrieved via |getLinkLayerStats|.
    478  */
    479 struct StaLinkLayerStats {
    480   StaLinkLayerIfaceStats iface;
    481   vec<StaLinkLayerRadioStats> radios;
    482   /**
    483    * TimeStamp for each stats sample.
    484    * This is the absolute milliseconds from boot when these stats were
    485    * sampled.
    486    */
    487   TimeStampInMs timeStampInMs;
    488 };
    489 
    490 /**
    491  * Structure describing all the information about a single access point seen
    492  * during the scan.
    493  */
    494 struct StaScanResult {
    495   TimeStampInUs timeStampInUs;
    496   vec<uint8_t> ssid;
    497   Bssid bssid;
    498   Rssi rssi;
    499   WifiChannelInMhz frequency;
    500   uint16_t beaconPeriodInMs;
    501   uint16_t capability;
    502   vec<WifiInformationElement> informationElements;
    503 };
    504 
    505 /**
    506  * Mask of flags set in the |ScanData| instance.
    507  */
    508 enum StaScanDataFlagMask : int32_t {
    509   /**
    510    * Indicates that a scan was interrupted/did not occur so results may be
    511    * incomplete.
    512    */
    513   INTERRUPTED = 1 << 0,
    514 };
    515 
    516 /**
    517  * Structure describing all the information about all the access points seen during
    518  * the scan.
    519  */
    520 struct StaScanData {
    521   /**
    522    * Bitset containing |ScanDataFlagMask| values.
    523    */
    524   bitfield<StaScanDataFlagMask> flags;
    525   /**
    526    * Bitset where each bit indicates if the bucket with that index (starting at
    527    * 0) was scanned.
    528    */
    529   uint32_t bucketsScanned;
    530   /**
    531    * List of scan results.
    532    */
    533   vec<StaScanResult> results;
    534 };
    535 
    536 /**
    537  * Structure describing the roaming control capabilities supported.
    538  */
    539 struct StaRoamingCapabilities {
    540   /**
    541    * Maximum number of BSSID's that may be blacklisted.
    542    */
    543   uint32_t maxBlacklistSize;
    544   /**
    545    * Maximum number of SSID's that may be whitelisted.
    546    */
    547   uint32_t maxWhitelistSize;
    548 };
    549 
    550 /**
    551  * Structure describing the roaming control configuration.
    552  */
    553 struct StaRoamingConfig {
    554   /**
    555    * List of BSSID's that are blacklisted for roaming.
    556    */
    557   vec<Bssid> bssidBlacklist;
    558   /**
    559    * List of SSID's that are whitelisted for roaming.
    560    */
    561   vec<Ssid> ssidWhitelist;
    562 };
    563 
    564 /**
    565  * Enum describing the various states to set the roaming
    566  * control to.
    567  */
    568 enum StaRoamingState : uint8_t {
    569   /**
    570    * Driver/Firmware must not perform any roaming.
    571    */
    572   DISABLED = 0,
    573   /**
    574    * Driver/Firmware is allowed to perform roaming respecting
    575    * the |StaRoamingConfig| parameters set using |configureRoaming|.
    576    */
    577   ENABLED = 1
    578 };
    579 
    580 /**
    581  * NAN specific types.
    582  * TODO(b/32159498): Move to a separate nan_types.hal.
    583  *
    584  * References to "NAN Spec" are to the Wi-Fi Alliance "Wi-Fi Neighbor Awareness
    585  * Networking (NAN) Technical Specification".
    586  */
    587 
    588 /**
    589  * Size limits for parameters used in the NAN interface.
    590  */
    591 @export
    592 enum NanParamSizeLimits : uint32_t {
    593   /** Minimum length of Passphrase argument for data-path configuration */
    594   MIN_PASSPHRASE_LENGTH = 8,
    595 
    596   /** Maximum length of Passphrase argument for data-path configuration */
    597   MAX_PASSPHRASE_LENGTH = 63,
    598 };
    599 
    600 /**
    601  * A unique short handle provided by the client to identify individual invocations of
    602  * certain API's like |IWifiNanIface.*|.
    603  */
    604 typedef uint16_t CommandIdShort;
    605 
    606 /**
    607  * NAN API response codes used in request notifications and events.
    608  */
    609 enum NanStatusType : uint32_t {
    610   SUCCESS = 0,
    611   /** NAN Discovery Engine/Host driver failures */
    612   INTERNAL_FAILURE = 1,
    613   /** NAN OTA failures */
    614   PROTOCOL_FAILURE = 2,
    615   /** The publish/subscribe discovery session id is invalid */
    616   INVALID_SESSION_ID = 3,
    617   /** Out of resources to fufill request */
    618   NO_RESOURCES_AVAILABLE = 4,
    619   /** Invalid arguments passed */
    620   INVALID_ARGS = 5,
    621   /** Invalid peer id */
    622   INVALID_PEER_ID = 6,
    623   /** Invalid NAN data-path (ndp) id */
    624   INVALID_NDP_ID = 7,
    625   /** Attempting to enable NAN when not available, e.g. wifi is disabled */
    626   NAN_NOT_ALLOWED = 8,
    627   /** Over the air ACK not received */
    628   NO_OTA_ACK = 9,
    629   /** Attempting to enable NAN when already enabled */
    630   ALREADY_ENABLED = 10,
    631   /** Can't queue tx followup message foor transmission */
    632   FOLLOWUP_TX_QUEUE_FULL = 11,
    633   /** Unsupported concurrency of NAN and another feature - NAN disabled */
    634   UNSUPPORTED_CONCURRENCY_NAN_DISABLED = 12
    635 };
    636 
    637 /**
    638  * The discovery bands supported by NAN.
    639  */
    640 enum NanBandIndex : uint32_t {
    641   NAN_BAND_24GHZ = 0,
    642   NAN_BAND_5GHZ
    643 };
    644 
    645 /**
    646  * The status information returned in NAN notifications.
    647  */
    648 struct WifiNanStatus {
    649   /**
    650    * Status of the command request.
    651    */
    652   NanStatusType status;
    653   /**
    654    * Further description of the issue causing a failure.
    655    */
    656   string description;
    657 };
    658 
    659 /**
    660  * NAN Match indication type: control how often to trigger |IWifiNanIfaceEventCallback.eventMatch|
    661  * for a single discovery session - i.e. continuously discovering the same publisher with no new
    662  * data.
    663  */
    664 enum NanMatchAlg : uint32_t {
    665   MATCH_ONCE = 0,   // Only trigger |IWifiNanIfaceEventCallback.eventMatch| once
    666   MATCH_CONTINUOUS, // Trigger |IWifiNanIfaceEventCallback.eventMatch| every time
    667   MATCH_NEVER,      // Never trigger |IWifiNanIfaceEventCallback.eventMatch|
    668 };
    669 
    670 /**
    671  * NAN publish discovery session types.
    672  */
    673 enum NanPublishType : uint32_t {
    674   UNSOLICITED = 0,       // Publish session broadcasts discovery packets
    675   SOLICITED,             // Publish session silent, responds to active subscribes queries
    676   UNSOLICITED_SOLICITED, // Both
    677 };
    678 
    679 /**
    680  * NAN transmit type used in |NanPublishType.SOLICITED| or |NanPublishType.UNSOLICITED_SOLICITED|
    681  * publish discovery sessions. Describes the addressing of the packet responding to an ACTIVE
    682  * subscribe query.
    683  */
    684 enum NanTxType : uint32_t {
    685   BROADCAST = 0, // Respond with a broadcast packet
    686   UNICAST,       // Respond with a unicast packet
    687 };
    688 
    689 /**
    690  * NAN subscribe discovery session types.
    691  */
    692 enum NanSubscribeType : uint32_t {
    693   PASSIVE = 0, // Subscribe session scans for |NanPublishType.UNSOLICITED| publish sessions.
    694   ACTIVE,      // Subscribe session probes for |NanPublishType.SOLICITED| publish sessions.
    695 };
    696 
    697 /**
    698  * NAN Service Response Filter Attribute Bit.
    699  */
    700 enum NanSrfType : uint32_t {
    701   BLOOM_FILTER = 0, // Use a Bloom filter.
    702   PARTIAL_MAC_ADDR, // Use a list of MAC addresses.
    703 };
    704 
    705 /**
    706  * NAN DP (data-path) channel config options.
    707  */
    708 enum NanDataPathChannelCfg : uint32_t {
    709   CHANNEL_NOT_REQUESTED = 0, // No channel request is specified.
    710   REQUEST_CHANNEL_SETUP,     // Channel request is specified - but may be overridden by firmware.
    711   FORCE_CHANNEL_SETUP,       // Channel request is specified and must be respected. If the firmware
    712                              // cannot honor the request then the data-path request is rejected.
    713 };
    714 
    715 /**
    716  * NAN DP (data-path) security configuration options.
    717  */
    718 enum NanDataPathSecurityType : uint32_t {
    719   OPEN,       // no security
    720   PMK,        // security: PMK
    721   PASSPHRASE, // security: passphrase
    722 };
    723 
    724 /**
    725  * NAN band-specific configuration.
    726  */
    727 struct NanBandSpecificConfig {
    728   /**
    729    * RSSI values controlling clustering behavior per spec. RSSI values are specified without a sign,
    730    * e.g. a value of -65dBm would be specified as 65.
    731    */
    732   uint8_t rssiClose;  // NAN Spec: RSSI_close
    733   uint8_t rssiMiddle; // NAN Spec: RSSI_middle
    734   /**
    735    * RSSI value determining whether discovery is near (used if enabled in discovery by
    736    * |NanDiscoveryCommonConfig.useRssiThreshold|).
    737    * RSSI values are specified without a sign, e.g. a value of -65dBm would be specified as 65.
    738    * NAN Spec: RSSI_close_proximity
    739    */
    740   uint8_t rssiCloseProximity;
    741   /**
    742    * Dwell time of each discovery channel in milliseconds. If set to 0 then the firmware determines
    743    * the dwell time to use.
    744    */
    745   uint8_t dwellTimeMs;
    746   /**
    747    * Scan period of each discovery channel in seconds. If set to 0 then the firmware determines
    748    * the scan period to use.
    749    */
    750   uint16_t scanPeriodSec;
    751    /**
    752     * Specifies the discovery window interval for Sync beacons and SDF's.
    753     * Valid values of DW Interval are: 1, 2, 3, 4 and 5 corresponding to 1, 2, 4, 8, and 16 DWs.
    754     * Value of 0:
    755     *  - reserved in 2.4GHz band
    756     *  - no wakeup at all in 5GHz band
    757     * The publish/subscribe period values don't override this device level configurations if
    758     * it is specified.
    759     * Configuration is only used only if |validDiscoveryWindowIntervalVal| is set to true.
    760     * NAN Spec: Device Capability Attribute / 2.4 GHz DW, Device Capability Attribute / 5 GHz DW
    761     */
    762   bool validDiscoveryWindowIntervalVal;
    763   uint8_t discoveryWindowIntervalVal;
    764 };
    765 
    766 /**
    767  * Debug configuration parameters. Many of these allow non-standard-compliant operation and are
    768  * not intended for normal operational mode.
    769  */
    770 struct NanDebugConfig {
    771   /**
    772    * Specification of the lower 2 bytes of the cluster ID. The cluster ID is 50-60-9a-01-00-00 to
    773    * 50-60-9a-01-FF-FF. Configuration of the bottom and top values of the range (which defaults to
    774    * 0x0000 and 0xFFFF respectively).
    775    * Configuration is only used if |validClusterIdVals| is set to true.
    776    */
    777   bool validClusterIdVals;
    778   uint16_t clusterIdBottomRangeVal;
    779   uint16_t clusterIdTopRangeVal;
    780   /**
    781    * NAN management interface address, if specified (|validIntfAddrVal| is true) then overrides any
    782    * other configuration (specifically the default randomization configured by
    783    * |NanConfigRequest.macAddressRandomizationIntervalSec|).
    784    */
    785   bool validIntfAddrVal;
    786   MacAddress intfAddrVal;
    787   /**
    788    * Combination of the 24 bit Organizationally Unique ID (OUI) and the 8 bit OUI Type.
    789    * Used if |validOuiVal| is set to true.
    790    */
    791   bool validOuiVal;
    792   uint32_t ouiVal;
    793   /**
    794    * Force the Random Factor to the specified value for all transmitted Sync/Discovery beacons.
    795    * Used if |validRandomFactorForceVal| is set to true.
    796    * NAN Spec: Master Indication Attribute / Random Factor
    797    */
    798   bool validRandomFactorForceVal;
    799   uint8_t randomFactorForceVal;
    800   /**
    801    * Forces the hop-count for all transmitted Sync and Discovery Beacons NO matter the real
    802    * hop-count being received over the air. Used if the |validHopCountForceVal}| flag is set to
    803    * true.
    804    * NAN Spec: Cluster Attribute / Anchor Master Information / Hop Count to Anchor Master
    805    */
    806   bool validHopCountForceVal;
    807   uint8_t hopCountForceVal;
    808   /**
    809    * Frequency in MHz to of the discovery channel in the specified band. Indexed by |NanBandIndex|.
    810    * Used if the |validDiscoveryChannelVal| is set to true.
    811    */
    812   bool validDiscoveryChannelVal;
    813   WifiChannelInMhz[2] discoveryChannelMhzVal;
    814   /**
    815    * Specifies whether sync/discovery beacons are transmitted in the specified band. Indexed by
    816    * |NanBandIndex|. Used if the |validUseBeaconsInBandVal| is set to true.
    817    */
    818   bool validUseBeaconsInBandVal;
    819   bool[2] useBeaconsInBandVal;
    820   /**
    821    * Specifies whether SDF (service discovery frames) are transmitted in the specified band. Indexed
    822    * by |NanBandIndex|. Used if the |validUseSdfInBandVal| is set to true.
    823    */
    824   bool validUseSdfInBandVal;
    825   bool[2] useSdfInBandVal;
    826 };
    827 
    828 /**
    829  * Configuration parameters of NAN: used when enabling and re-configuring a NAN cluster.
    830  */
    831 struct NanConfigRequest {
    832   /**
    833    * Master preference of this device.
    834    * NAN Spec: Master Indication Attribute / Master Preference
    835    */
    836   uint8_t masterPref;
    837   /**
    838    * Controls whether or not the |IWifiNanIfaceEventCallback.eventClusterEvent| will be delivered
    839    * for |NanClusterEventType.DISCOVERY_MAC_ADDRESS_CHANGED|.
    840    */
    841   bool disableDiscoveryAddressChangeIndication;
    842   /**
    843    * Controls whether or not the |IWifiNanIfaceEventCallback.eventClusterEvent| will be delivered
    844    * for |NanClusterEventType.STARTED_CLUSTER|.
    845    */
    846   bool disableStartedClusterIndication;
    847   /**
    848    * Controls whether or not the |IWifiNanIfaceEventCallback.eventClusterEvent| will be delivered
    849    * for |NanClusterEventType.JOINED_CLUSTER|.
    850    */
    851   bool disableJoinedClusterIndication;
    852   /**
    853    * Control whether publish service IDs are included in Sync/Discovery beacons.
    854    * NAN Spec: Service ID List Attribute
    855    */
    856   bool includePublishServiceIdsInBeacon;
    857   /**
    858    * If |includePublishServiceIdsInBeacon| is true then specifies the number of publish service IDs
    859    * to include in the Sync/Discovery beacons:
    860    *  Value = 0: include as many service IDs as will fit into the maximum allowed beacon frame size.
    861    *  Value must fit within 7 bits - i.e. <= 127.
    862    */
    863   uint8_t numberOfPublishServiceIdsInBeacon;
    864   /**
    865    * Control whether subscribe service IDs are included in Sync/Discovery beacons.
    866    * Spec: Subscribe Service ID List Attribute
    867    */
    868   bool includeSubscribeServiceIdsInBeacon;
    869   /**
    870    * If |includeSubscribeServiceIdsInBeacon| is true then specifies the number of subscribe service
    871    * IDs to include in the Sync/Discovery beacons:
    872    *  Value = 0: include as many service IDs as will fit into the maximum allowed beacon frame size.
    873    *  Value must fit within 7 bits - i.e. <= 127.
    874    */
    875   uint8_t numberOfSubscribeServiceIdsInBeacon;
    876   /**
    877    * Number of samples used to calculate RSSI.
    878    */
    879   uint16_t rssiWindowSize;
    880   /**
    881    * Specifies the interval in seconds that the NAN management interface MAC address is randomized.
    882    * A value of 0 is used to disable the MAC address randomization
    883    */
    884   uint32_t macAddressRandomizationIntervalSec;
    885   /**
    886    * Additional configuration provided per band: indexed by |NanBandIndex|.
    887    */
    888   NanBandSpecificConfig[2] bandSpecificConfig;
    889 };
    890 
    891 /**
    892  * Enable requests for NAN: start-up configuration |IWifiNanIface.enableRequest|.
    893  */
    894 struct NanEnableRequest {
    895   /**
    896    * Enable operation in a specific band: indexed by |NanBandIndex|.
    897    */
    898   bool[2] operateInBand;
    899   /**
    900    * Specify extent of cluster by specifying the max hop count.
    901    */
    902   uint8_t hopCountMax;
    903   /**
    904    * Configurations of NAN cluster operation. Can also be modified at run-time using
    905    * |IWifiNanIface.configRequest|.
    906    */
    907   NanConfigRequest configParams;
    908   /**
    909    * Non-standard configurations of NAN cluster operation - useful for debugging operations.
    910    */
    911   NanDebugConfig debugConfigs;
    912 };
    913 
    914 /**
    915  * Cipher suite flags.
    916  */
    917 enum NanCipherSuiteType : uint32_t {
    918   NONE = 0, // No (open) security
    919   SHARED_KEY_128_MASK = 1 << 0, // NCS-SK-128
    920   SHARED_KEY_256_MASK = 1 << 1  // NCS-SK-256
    921 };
    922 
    923 /**
    924  * Ranging in the context of discovery sessions indication controls. Controls the frequency of
    925  * ranging-driven |IWifiNanIfaceEventCallback.eventMatch|.
    926  */
    927 enum NanRangingIndication : uint32_t {
    928   CONTINUOUS_INDICATION_MASK = 1 << 0, // trigger event on every RTT measurement
    929   INGRESS_MET_MASK = 1 << 1,           // trigger event only when ingress conditions met
    930   EGRESS_MET_MASK = 1 << 2             // trigger event only when egress conditions met
    931 };
    932 
    933 /**
    934  * Configuration of NAN data-path security.
    935  */
    936 struct NanDataPathSecurityConfig {
    937   /**
    938    * Security configuration of the data-path (NDP). Security is required if not equal to
    939    * |NanDataPathSecurityType.OPEN|.
    940    * NAN Spec: Service Discovery Extension Attribute (SDEA) / Control / Security Required
    941    */
    942   NanDataPathSecurityType securityType;
    943   /**
    944    * Cipher type for data-paths. If |securityType| is |NanDataPathSecurityType.OPEN| then must
    945    * be set to |NanCipherSuiteType.NONE|, otherwise a non-|NanCipherSuiteType.NONE| cipher suite
    946    * must be specified.
    947    */
    948   NanCipherSuiteType cipherType;
    949   /**
    950    * Optional Pairwise Master Key (PMK). Must be specified (and is only used) if |securityType| is
    951    * set to |NanDataPathSecurityType.PMK|.
    952    * Ref: IEEE 802.11i
    953    */
    954   uint8_t[32] pmk;
    955   /**
    956    * Optional Passphrase. Must be specified (and is only used) if |securityType| is set to
    957    * |NanDataPathSecurityType.PASSPHRASE|.
    958    * Min length: |MIN_PASSPHRASE_LENGTH|
    959    * Max length: |MAX_PASSPHRASE_LENGTH|
    960    * NAN Spec: Appendix: Mapping pass-phrase to PMK for NCS-SK Cipher Suites
    961    */
    962   vec<uint8_t> passphrase;
    963 };
    964 
    965 /**
    966  * Configurations of NAN discovery sessions: common to publish and subscribe discovery.
    967  */
    968 struct NanDiscoveryCommonConfig {
    969   /**
    970    * The ID of the discovery session being configured. A value of 0 specifies a request to create
    971    * a new discovery session. The new discovery session ID is returned with
    972    * |IWifiNanIfaceEventCallback.notifyStartPublishResponse| or
    973    * |IWifiNanIfaceEventCallback.notifyStartSubscribeResponse|.
    974    * NAN Spec: Service Descriptor Attribute (SDA) / Instance ID
    975    */
    976   uint8_t sessionId;
    977   /**
    978    * The lifetime of the discovery session in seconds. A value of 0 means run forever or until
    979    * canceled using |IWifiIface.stopPublishRequest| or |IWifiIface.stopSubscribeRequest|.
    980    */
    981   uint16_t ttlSec;
    982   /**
    983    * Indicates the interval between two Discovery Windows in which the device supporting the
    984    * service is awake to transmit or receive the Service Discovery frames. Valid values of Awake
    985    * DW Interval are: 1, 2, 4, 8 and 16. A value of 0 will default to 1. Does not override
    986    * |NanBandSpecificConfig.discoveryWindowIntervalVal| configurations if those are specified.
    987    */
    988   uint16_t discoveryWindowPeriod;
    989   /**
    990    * The lifetime of the discovery session in number of transmitted SDF discovery packets. A value
    991    * of 0 means forever or until canceled using |IWifiIface.stopPublishRequest| or
    992    * |IWifiIface.stopSubscribeRequest|.
    993    */
    994   uint8_t discoveryCount;
    995   /**
    996    * UTF-8 encoded string identifying the service.
    997    * Max length: |NanCapabilities.maxServiceNameLen|.
    998    * NAN Spec: The only acceptable single-byte UTF-8 symbols for a Service Name are alphanumeric
    999    * values (A-Z, a-z, 0-9), the hyphen ('-'), and the period ('.'). All valid multi-byte UTF-8
   1000    * characters are acceptable in a Service Name.
   1001    */
   1002   vec<uint8_t> serviceName;
   1003   /**
   1004    * Specifies how often to trigger |IWifiNanIfaceEventCallback.eventMatch| when continuously
   1005    * discovering the same discovery session (with no changes).
   1006    */
   1007   NanMatchAlg discoveryMatchIndicator;
   1008   /**
   1009    * Arbitrary information communicated in discovery packets - there is no semantic meaning to these
   1010    * bytes. They are passed-through from publisher to subscriber as-is with no parsing.
   1011    * Max length: |NanCapabilities.maxServiceSpecificInfoLen|.
   1012    * NAN Spec: Service Descriptor Attribute (SDA) / Service Info
   1013    */
   1014   vec<uint8_t> serviceSpecificInfo;
   1015   /**
   1016    * Arbitrary information communicated in discovery packets - there is no semantic meaning to these
   1017    * bytes. They are passed-through from publisher to subscriber as-is with no parsing.
   1018    * Max length: |NanCapabilities.maxExtendedServiceSpecificInfoLen|.
   1019    * Spec: Service Descriptor Extension Attribute (SDEA) / Service Info
   1020    */
   1021   vec<uint8_t> extendedServiceSpecificInfo;
   1022   /**
   1023    * Ordered sequence of <length, value> pairs (|length| uses 1 byte and contains the number of
   1024    * bytes in the |value| field) which specify further match criteria (beyond the service name).
   1025    * The match behavior is specified in details in the NAN spec.
   1026    * Publisher: used in SOLICITED or SOLICITED_UNSOLICITED sessions.
   1027    * Subscriber: used in ACTIVE or PASSIVE sessions.
   1028    * Max length: |NanCapabilities.maxMatchFilterLen|.
   1029    * NAN Spec: matching_filter_rx
   1030    */
   1031   vec<uint8_t> rxMatchFilter;
   1032   /**
   1033    * Ordered sequence of <length, value> pairs (|length| uses 1 byte and contains the number of
   1034    * bytes in the |value| field) which specify further match criteria (beyond the service name).
   1035    * The match behavior is specified in details in the NAN spec.
   1036    * Publisher: used if provided.
   1037    * Subscriber: used (if provided) only in ACTIVE sessions.
   1038    * Max length: |NanCapabilities.maxMatchFilterLen|.
   1039    * NAN Spec: matching_filter_tx and Service Descriptor Attribute (SDA) / Matching Filter
   1040    */
   1041   vec<uint8_t> txMatchFilter;
   1042   /**
   1043    * Specifies whether or not the discovery session uses the
   1044    * |NanBandSpecificConfig.rssiCloseProximity| value (configured in enable/configure requests) to
   1045    * filter out matched discovered peers.
   1046    * NAN Spec: Service Descriptor Attribute / Service Control / Discovery Range Limited.
   1047    */
   1048   bool useRssiThreshold;
   1049   /**
   1050    * Controls whether or not the |IWifiNanIfaceEventCallback.eventPublishTerminated| (for publish
   1051    * discovery sessions) or |IWifiNanIfaceEventCallback.eventSubscribeTerminated| (for subscribe
   1052    * discovery sessions) will be delivered.
   1053    */
   1054   bool disableDiscoveryTerminationIndication;
   1055   /**
   1056    * Controls whether or not the |IWifiNanIfaceEventCallback.eventMatchExpired| will be delivered.
   1057    */
   1058   bool disableMatchExpirationIndication;
   1059   /**
   1060    * Controls whether or not the |IWifiNanIfaceEventCallback.eventFollowupReceived| will be
   1061    * delivered.
   1062    */
   1063   bool disableFollowupReceivedIndication;
   1064   /**
   1065    * Security configuration of data-paths created in the context of this discovery session. Security
   1066    * parameters can be overridden during the actual construction of the data-path - allowing
   1067    * individual data-paths to have unique PMKs or Passphrases.
   1068    */
   1069   NanDataPathSecurityConfig securityConfig;
   1070   /**
   1071    * Specifies whether or not there is a ranging requirement in this discovery session.
   1072    * Ranging is only performed if all other match criteria with the peer are met. Ranging must
   1073    * be performed if both peers in the discovery session (publisher and subscriber) set this
   1074    * flag to true. Otherwise, if either peer sets this flag to false, ranging must not be performed
   1075    * and must not impact discovery decisions.
   1076    * Note: specifying that ranging is required also implies that this device must automatically
   1077    * accept ranging requests from peers.
   1078    * NAN Spec: Service Discovery Extension Attribute (SDEA) / Control / Ranging Require.
   1079    */
   1080   bool rangingRequired;
   1081    /**
   1082     * Interval in msec between two ranging measurements. Only relevant if |rangingRequired| is true.
   1083     * If the Awake DW interval specified either in |discoveryWindowPeriod| or in
   1084     * |NanBandSpecificConfig.discoveryWindowIntervalVal| is larger than the ranging interval then
   1085     * priority is given to Awake DW interval.
   1086     */
   1087   uint32_t rangingIntervalMsec;
   1088   /**
   1089    * The type of ranging feedback to be provided by discovery session matches
   1090    * |IWifiNanIfaceEventCallback.eventMatch|. Only relevant if |rangingRequired| is true.
   1091    */
   1092    bitfield<NanRangingIndication> configRangingIndications;
   1093    /**
   1094     * The ingress and egress distance in cm. If ranging is enabled (|rangingEnabled| is true) then
   1095     * |configRangingIndications| is used to determine whether ingress and/or egress (or neither)
   1096     * are used to determine whether a match has occurred.
   1097     * NAN Spec: Service Discovery Extension Attribute (SDEA) / Ingress & Egress Range Limit
   1098     */
   1099    uint16_t distanceIngressCm;
   1100    uint16_t distanceEgressCm;
   1101 };
   1102 
   1103 /**
   1104  * Publish request: specifies a publish discovery operation.
   1105  */
   1106 struct NanPublishRequest {
   1107   /**
   1108    * Common configuration of discovery sessions.
   1109    */
   1110   NanDiscoveryCommonConfig baseConfigs;
   1111   /**
   1112    * The type of the publish discovery session.
   1113    */
   1114   NanPublishType publishType;
   1115   /**
   1116    * For publishType of |NanPublishType.SOLICITED| or |NanPublishType.UNSOLICITED_SOLICITED|
   1117    * specifies the type of transmission used for responding to the probing subscribe discovery
   1118    * peer.
   1119    */
   1120   NanTxType txType;
   1121   /**
   1122    * Specifies whether data-path requests |IWifiNanIfaceEventCallback.eventDataPathRequest| (in
   1123    * the context of this discovery session) are automatically accepted (if true) - in which case
   1124    * the Responder must not call the |IWifiNanIface.respondToDataPathIndicationRequest| method and
   1125    * the device must automatically accept the data-path request and complete the negotiation.
   1126    */
   1127   bool autoAcceptDataPathRequests;
   1128 };
   1129 
   1130 /**
   1131  * Subscribe request: specifies a subscribe discovery operation.
   1132  */
   1133 struct NanSubscribeRequest {
   1134   /**
   1135    * Common configuration of discovery sessions.
   1136    */
   1137   NanDiscoveryCommonConfig baseConfigs;
   1138   /**
   1139    * The type of the subscribe discovery session.
   1140    */
   1141   NanSubscribeType subscribeType;
   1142   /**
   1143    * For |NanSubscribeType.ACTIVE| subscribe discovery sessions specify how the Service Response
   1144    * Filter (SRF) attribute is populated. Relevant only if |shouldUseSrf| is set to true.
   1145    * NAN Spec: Service Descriptor Attribute (SDA) / Service Response Filter / SRF Control / SRF Type
   1146    */
   1147   NanSrfType srfType;
   1148   /**
   1149    * Configure whether inclusion of an address in |intfAddr| indicates that those devices should
   1150    * respond or the reverse. Relevant only if |shouldUseSrf| is set to true and |srfType| is set to
   1151    * |NanSrfType.PARTIAL_MAC_ADDR|.
   1152    * NAN Spec: Service Descriptor Attribute (SDA) / Service Response Filter / SRF Control / Include
   1153    */
   1154   bool srfRespondIfInAddressSet;
   1155   /**
   1156    * Control whether the Service Response Filter (SRF) is used.
   1157    * NAN Spec: Service Descriptor Attribute (SDA) / Service Control /
   1158    *           Service Response Filter Present
   1159    */
   1160   bool shouldUseSrf;
   1161   /**
   1162    * Control whether the presence of |NanDiscoveryCommonConfig.serviceSpecificInfo| data is needed
   1163    * in the publisher in order to trigger service discovery, i.e. a
   1164    * |IWifiNanIfaceEventCallback.eventMatch|. The test is for presence of data - not for the
   1165    * specific contents of the data.
   1166    */
   1167   bool isSsiRequiredForMatch;
   1168   /**
   1169    * NAN Interface Addresses constituting the Service Response Filter (SRF).
   1170    * Max length (number of addresses): |NanCapabilities.maxSubscribeInterfaceAddresses|.
   1171    * NAN Spec: Service Descriptor Attribute (SDA) / Service Response Filter / Address Set
   1172    */
   1173   vec<MacAddress> intfAddr;
   1174 };
   1175 
   1176 /**
   1177  * Transmit follow up message request.
   1178  */
   1179 struct NanTransmitFollowupRequest {
   1180   /**
   1181    * ID of an active publish or subscribe discovery session. Follow-up message is transmitted in the
   1182    * context of the discovery session.
   1183    * NAN Spec: Service Descriptor Attribute (SDA) / Instance ID
   1184    */
   1185   uint8_t discoverySessionId;
   1186   /**
   1187    * ID of the peer. Obtained as part of an earlier |IWifiNanIfaceEventCallback.eventMatch| or
   1188    * |IWifiNanIfaceEventCallback.eventFollowupReceived|.
   1189    */
   1190   uint32_t peerId;
   1191   /**
   1192    * MAC address of the peer. Obtained as part of an earlier |IWifiNanIfaceEventCallback.eventMatch|
   1193    * or |IWifiNanIfaceEventCallback.eventFollowupReceived|.
   1194    */
   1195   MacAddress addr;
   1196   /**
   1197    * Should the follow-up message be transmitted with a high priority.
   1198    */
   1199   bool isHighPriority;
   1200   /**
   1201    * Should the follow-up message be transmitted in a discovery window (true) or a further
   1202    * availability window (false).
   1203    */
   1204   bool shouldUseDiscoveryWindow;
   1205   /**
   1206    * Arbitrary information communicated to the peer - there is no semantic meaning to these
   1207    * bytes. They are passed-through from sender to receiver as-is with no parsing.
   1208    * Max length: |NanCapabilities.maxServiceSpecificInfoLen|.
   1209    * NAN Spec: Service Descriptor Attribute (SDA) / Service Info
   1210    */
   1211   vec<uint8_t> serviceSpecificInfo;
   1212   /**
   1213    * Arbitrary information communicated in discovery packets - there is no semantic meaning to these
   1214    * bytes. They are passed-through from publisher to subscriber as-is with no parsing.
   1215    * Max length: |NanCapabilities.maxExtendedServiceSpecificInfoLen|.
   1216    * Spec: Service Descriptor Extension Attribute (SDEA) / Service Info
   1217    */
   1218   vec<uint8_t> extendedServiceSpecificInfo;
   1219   /**
   1220    * Disable |IWifiNanIfaceEventCallback.eventTransmitFollowup| - i.e. do not get indication on
   1221    * whether the follow-up was transmitted and received successfully.
   1222    */
   1223   bool disableFollowupResultIndication;
   1224 };
   1225 
   1226 /**
   1227  *  Data Path Initiator requesting a data-path.
   1228  */
   1229 struct NanInitiateDataPathRequest {
   1230   /**
   1231    * ID of the peer. Obtained as part of an earlier |IWifiNanIfaceEventCallback.eventMatch| or
   1232    * |IWifiNanIfaceEventCallback.eventFollowupReceived|.
   1233    */
   1234   uint32_t peerId;
   1235   /**
   1236    * NAN management interface MAC address of the peer. Obtained as part of an earlier
   1237    * |IWifiNanIfaceEventCallback.eventMatch| or |IWifiNanIfaceEventCallback.eventFollowupReceived|.
   1238    */
   1239   MacAddress peerDiscMacAddr;
   1240   /**
   1241    * Config flag for channel request.
   1242    */
   1243   NanDataPathChannelCfg channelRequestType;
   1244   /**
   1245    * Channel frequency in MHz to start data-path. Not relevant if |channelRequestType| is
   1246    * |NanDataPathChannelCfg.CHANNEL_NOT_REQUESTED|.
   1247    */
   1248   WifiChannelInMhz channel;
   1249   /**
   1250    * NAN data interface name on which this data-path session is to be initiated.
   1251    * This must be an interface created using |IWifiNanIface.createDataInterfaceRequest|.
   1252    */
   1253   string ifaceName;
   1254   /**
   1255    * Security configuration of the requested data-path.
   1256    */
   1257   NanDataPathSecurityConfig securityConfig;
   1258   /**
   1259    * Arbitrary information communicated to the peer as part of the data-path setup process - there
   1260    * is no semantic meaning to these bytes. They are passed-through from sender to receiver as-is
   1261    * with no parsing.
   1262    * Max length: |NanCapabilities.maxAppInfoLen|.
   1263    * NAN Spec: Data Path Attributes / NDP Attribute / NDP Specific Info
   1264    */
   1265   vec<uint8_t> appInfo;
   1266   /**
   1267    * A service name to be used with |passphrase| to construct a Pairwise Master Key (PMK) for the
   1268    * data-path. Only relevant when a data-path is requested which is not associated with a NAN
   1269    * discovery session - e.g. using out-of-band discovery.
   1270    * Constraints: same as |NanDiscoveryCommonConfig.serviceName|
   1271    * NAN Spec: Appendix: Mapping pass-phrase to PMK for NCS-SK Cipher Suites
   1272    */
   1273   vec<uint8_t> serviceNameOutOfBand;
   1274 };
   1275 
   1276 /**
   1277  * Response to a data-path request from a peer.
   1278  */
   1279 struct NanRespondToDataPathIndicationRequest {
   1280   /**
   1281    * Accept (true) or reject (false) the request.
   1282    * NAN Spec: Data Path Attributes / NDP Attribute / Type and Status
   1283    */
   1284   bool acceptRequest;
   1285   /**
   1286    * ID of the data-path (NDP) for which we're responding - obtained as part of the request in
   1287    * |IWifiNanIfaceEventCallback.eventDataPathRequest|.
   1288    */
   1289   uint32_t ndpInstanceId;
   1290   /**
   1291    * NAN data interface name on which this data-path session is to be started.
   1292    * This must be an interface created using |IWifiNanIface.createDataInterfaceRequest|.
   1293    */
   1294   string ifaceName;
   1295   /**
   1296    * Security configuration of the requested data-path.
   1297    */
   1298   NanDataPathSecurityConfig securityConfig;
   1299   /**
   1300    * Arbitrary information communicated to the peer as part of the data-path setup process - there
   1301    * is no semantic meaning to these bytes. They are passed-through from sender to receiver as-is
   1302    * with no parsing.
   1303    * Max length: |NanCapabilities.maxAppInfoLen|.
   1304    * NAN Spec: Data Path Attributes / NDP Attribute / NDP Specific Info
   1305    */
   1306   vec<uint8_t> appInfo;
   1307   /**
   1308    * A service name to be used with |passphrase| to construct a Pairwise Master Key (PMK) for the
   1309    * data-path. Only relevant when a data-path is requested which is not associated with a NAN
   1310    * discovery session - e.g. using out-of-band discovery.
   1311    * Constraints: same as |NanDiscoveryCommonConfig.serviceName|
   1312    * NAN Spec: Appendix: Mapping pass-phrase to PMK for NCS-SK Cipher Suites
   1313    */
   1314   vec<uint8_t> serviceNameOutOfBand;
   1315 };
   1316 
   1317 /**
   1318  * NDP Capabilities response.
   1319  */
   1320 struct NanCapabilities {
   1321   /**
   1322    * Maximum number of clusters which the device can join concurrently.
   1323    */
   1324   uint32_t maxConcurrentClusters;
   1325   /**
   1326    * Maximum number of concurrent publish discovery sessions.
   1327    */
   1328   uint32_t maxPublishes;
   1329   /**
   1330    * Maximum number of concurrent subscribe discovery sessions.
   1331    */
   1332   uint32_t maxSubscribes;
   1333   /**
   1334    * Maximum length (in bytes) of service name.
   1335    */
   1336   uint32_t maxServiceNameLen;
   1337   /**
   1338    * Maximum length (in bytes) of individual match filters.
   1339    */
   1340   uint32_t maxMatchFilterLen;
   1341   /**
   1342    * Maximum length (in bytes) of aggregate match filters across all active sessions.
   1343    */
   1344   uint32_t maxTotalMatchFilterLen;
   1345   /**
   1346    * Maximum length (in bytes) of the service specific info field.
   1347    */
   1348   uint32_t maxServiceSpecificInfoLen;
   1349   /**
   1350    * Maximum length (in bytes) of the extended service specific info field.
   1351    */
   1352   uint32_t maxExtendedServiceSpecificInfoLen;
   1353   /**
   1354    * Maximum number of data interfaces (NDI) which can be created concurrently on the device.
   1355    */
   1356   uint32_t maxNdiInterfaces;
   1357   /**
   1358    * Maximum number of data paths (NDP) which can be created concurrently on the device, across all
   1359    * data interfaces (NDI).
   1360    */
   1361   uint32_t maxNdpSessions;
   1362   /**
   1363    * Maximum length (in bytes) of application info field (used in data-path negotiations).
   1364    */
   1365   uint32_t maxAppInfoLen;
   1366   /**
   1367    * Maximum number of transmitted followup messages which can be queued by the firmware.
   1368    */
   1369   uint32_t maxQueuedTransmitFollowupMsgs;
   1370   /**
   1371    * Maximum number MAC interface addresses which can be specified to a subscribe discovery session.
   1372    */
   1373   uint32_t maxSubscribeInterfaceAddresses;
   1374   /**
   1375    * The set of supported Cipher suites. The |NanCipherSuiteType| bit fields are used.
   1376    */
   1377   bitfield<NanCipherSuiteType> supportedCipherSuites;
   1378 };
   1379 
   1380 /**
   1381  * Match indication structure
   1382  */
   1383 struct NanMatchInd {
   1384   /**
   1385    * Publish or subscribe discovery session ID of an existing discovery session.
   1386    * NAN Spec: Service Descriptor Attribute (SDA) / Instance ID
   1387    */
   1388   uint8_t discoverySessionId;
   1389   /**
   1390    * A unique ID of the peer. Can be subsequently used in |IWifiNanIface.transmitFollowupRequest| or
   1391    * to set up a data-path.
   1392    */
   1393   uint32_t peerId;
   1394   /**
   1395    * The NAN Discovery (management) MAC address of the peer.
   1396    */
   1397   MacAddress addr;
   1398   /**
   1399    * The arbitrary information contained in the |NanDiscoveryCommonConfig.serviceSpecificInfo| of
   1400    * the peer's discovery session configuration.
   1401    * Max length: |NanCapabilities.maxServiceSpecificInfoLen|.
   1402    * NAN Spec: Service Descriptor Attribute (SDA) / Service Info
   1403    */
   1404   vec<uint8_t> serviceSpecificInfo;
   1405   /**
   1406    * Arbitrary information communicated in discovery packets - there is no semantic meaning to these
   1407    * bytes. They are passed-through from publisher to subscriber as-is with no parsing.
   1408    * Max length: |NanCapabilities.maxExtendedServiceSpecificInfoLen|.
   1409    * Spec: Service Descriptor Extension Attribute (SDEA) / Service Info
   1410    */
   1411   vec<uint8_t> extendedServiceSpecificInfo;
   1412   /**
   1413    * The match filter from the discovery packet (publish or subscribe) which caused service
   1414    * discovery. Matches the |NanDiscoveryCommonConfig.txMatchFilter| of the peer's Unsolicited
   1415    * publish message or of the local device's Active subscribe message.
   1416    * Max length: |NanCapabilities.maxMatchFilterLen|.
   1417    * NAN Spec: Service Descriptor Attribute (SDA) / Matching Filter
   1418    */
   1419   vec<uint8_t> matchFilter;
   1420   /**
   1421    * Indicates the type of discovery: true if match occurred on a Beacon frame, false if the match
   1422    * occurred on a Service Discovery Frames (SDF).
   1423    */
   1424   bool matchOccuredInBeaconFlag;
   1425   /**
   1426    * Flag to indicate firmware is out of resource and that it can no longer track this Service Name.
   1427    * Indicates that while |IWifiNanIfaceEventCallback.eventMatch| will be received, the
   1428    * |NanDiscoveryCommonConfig.discoveryMatchIndicator| configuration will not be honored.
   1429    */
   1430   bool outOfResourceFlag;
   1431   /**
   1432    * If RSSI filtering was enabled using |NanDiscoveryCommonConfig.useRssiThreshold| in discovery
   1433    * session setup then this field contains the received RSSI value. It will contain 0 if RSSI
   1434    * filtering was not enabled.
   1435    * RSSI values are returned without sign, e.g. -70dBm will be returned as 70.
   1436    */
   1437   uint8_t rssiValue;
   1438   /**
   1439    * Cipher type for data-paths constructed in the context of this discovery session. Valid if
   1440    * |peerRequiresSecurityEnabledInNdp| is true.
   1441    */
   1442   NanCipherSuiteType peerCipherType;
   1443   /**
   1444    * Indicates whether or not the peer requires security enabled in any data-path (NDP) constructed
   1445    * in the context of this discovery session. The |cipherType| specifies the cipher type for such
   1446    * data-paths.
   1447    * NAN Spec: Service Discovery Extension Attribute (SDEA) / Control / Security Required
   1448    */
   1449   bool peerRequiresSecurityEnabledInNdp;
   1450   /**
   1451    * Indicates whether or not the peer requires (and hence allows) ranging in the context of this
   1452    * discovery session.
   1453    * Note that ranging is only performed if all other match criteria with the peer are met.
   1454    * NAN Spec: Service Discovery Extension Attribute (SDEA) / Control / Ranging Require.
   1455    */
   1456   bool peerRequiresRanging;
   1457   /**
   1458    * Ranging indication supersedes the NanMatchAlg specification.
   1459    * Ex: If NanMatchAlg is MATCH_ONCE, but ranging indications is continuous then continuous
   1460    * match notifications will be received (with ranging information).
   1461    * Ranging indication data is provided if Ranging required is enabled in the discovery
   1462    * specification and:
   1463    *   1) continuous ranging specified.
   1464    *   2) ingress/egress specified and:
   1465    *       - notify once for ingress >= ingress_distance and egress <= egress_distance,
   1466    *       - same for ingress_egress_both
   1467    * If the Awake DW intervals are larger than the ranging intervals then priority is given to the
   1468    * device DW intervals.
   1469    *
   1470    * If ranging was required and executed contains the distance to the peer in CM. The
   1471    * |rangingIndicationType| field specifies the event which triggered ranging.
   1472    */
   1473   uint32_t rangingMeasurementInCm;
   1474   /**
   1475    * The ranging event(s) which triggered the ranging. E.g. can indicate that continuous ranging was
   1476    * requested, or else that an ingress event occurred.
   1477    */
   1478    bitfield<NanRangingIndication> rangingIndicationType;
   1479 };
   1480 
   1481 /**
   1482  * Followup message received from peer indication structure.
   1483  */
   1484 struct NanFollowupReceivedInd {
   1485   /**
   1486    * Discovery session (publish or subscribe) ID of a previously created discovery session. The
   1487    * message is received in the context of this discovery session.
   1488    * NAN Spec: Service Descriptor Attribute (SDA) / Instance ID
   1489    */
   1490   uint8_t discoverySessionId;
   1491   /**
   1492    * A unique ID of the peer. Can be subsequently used in |IWifiNanIface.transmitFollowupRequest| or
   1493    * to set up a data-path.
   1494    */
   1495   uint32_t peerId;
   1496   /**
   1497    * The NAN Discovery (management) MAC address of the peer.
   1498    */
   1499   MacAddress addr;
   1500   /**
   1501    * Indicates whether received in a further availability window (FAW) if true, or in a discovery
   1502    * window (DW) if false.
   1503    */
   1504   bool receivedInFaw;
   1505   /**
   1506    * Received message from the peer - there is no semantic meaning to these bytes. They are
   1507    * passed-through from sender to receiver as-is with no parsing.
   1508    * Max length: |NanCapabilities.maxServiceSpecificInfoLen|.
   1509    * NAN Spec: Service Descriptor Attribute (SDA) / Service Info
   1510    */
   1511   vec<uint8_t> serviceSpecificInfo;
   1512   /**
   1513    * Arbitrary information communicated in discovery packets - there is no semantic meaning to these
   1514    * bytes. They are passed-through from publisher to subscriber as-is with no parsing.
   1515    * Max length: |NanCapabilities.maxExtendedServiceSpecificInfoLen|.
   1516    * Spec: Service Descriptor Extension Attribute (SDEA) / Service Info
   1517    */
   1518   vec<uint8_t> extendedServiceSpecificInfo;
   1519 };
   1520 
   1521 /**
   1522  * Event types for a cluster event indication.
   1523  */
   1524 enum NanClusterEventType : uint32_t {
   1525   /**
   1526    * Management/discovery interface MAC address has changed (e.g. due to randomization or at
   1527    * startup).
   1528    */
   1529   DISCOVERY_MAC_ADDRESS_CHANGED = 0,
   1530   /**
   1531    * A new cluster has been formed by this device.
   1532    */
   1533   STARTED_CLUSTER,
   1534   /**
   1535    * This device has joined an existing cluster.
   1536    */
   1537   JOINED_CLUSTER,
   1538 };
   1539 
   1540 /**
   1541  * Cluster event indication structure: triggered on events impacting how this device is
   1542  * visible to peers - cluster forming, joining a new cluster, or changing of the MAC address.
   1543  */
   1544 struct NanClusterEventInd {
   1545   /**
   1546    * Event type causing the cluster event indication to be triggered.
   1547    */
   1548   NanClusterEventType eventType;
   1549   /**
   1550    * MAC Address associated with the corresponding event.
   1551    */
   1552   MacAddress addr;
   1553 };
   1554 
   1555 /**
   1556  * NAN Data path request Indication Message structure.
   1557  * Event indication received by an intended Responder when a Nan Data request initiated by an
   1558  * Initiator.
   1559  */
   1560 struct NanDataPathRequestInd {
   1561   /**
   1562    * ID of an active publish or subscribe discovery session - the data-path request is in the
   1563    * context of this discovery session.
   1564    * NAN Spec: Data Path Attributes / NDP Attribute / Publish ID
   1565    */
   1566   uint8_t discoverySessionId;
   1567   /**
   1568    * MAC address of the Initiator peer. This is the MAC address of the peer's management/discovery
   1569    * NAN interface.
   1570    */
   1571   MacAddress peerDiscMacAddr;
   1572   /**
   1573    * ID of the data-path - used to identify the data-path in further negotiation/APIs.
   1574    */
   1575   uint32_t ndpInstanceId;
   1576   /**
   1577    * Specifies whether or not security is required by the peer for the data-path being created.
   1578    * NAN Spec: Data Path Attributes / NDP Attribute / NDP Control / Security Present
   1579    */
   1580   bool securityRequired;
   1581   /**
   1582    * Arbitrary information communicated from the peer as part of the data-path setup process - there
   1583    * is no semantic meaning to these bytes. They are passed-through from sender to receiver as-is
   1584    * with no parsing.
   1585    * Max length: |NanCapabilities.maxAppInfoLen|.
   1586    * NAN Spec: Data Path Attributes / NDP Attribute / NDP Specific Info
   1587    */
   1588   vec<uint8_t> appInfo;
   1589 };
   1590 
   1591 /**
   1592  * NAN Data path confirmation Indication structure.
   1593  * Event indication is received on both initiator and responder side when negotiation for a
   1594  * data-path finish: on success or failure.
   1595  */
   1596 struct NanDataPathConfirmInd {
   1597   /**
   1598    * ID of the data-path.
   1599    */
   1600   uint32_t ndpInstanceId;
   1601   /**
   1602    * Indicates whether the data-path setup succeeded (true) or failed (false).
   1603    */
   1604   bool dataPathSetupSuccess;
   1605   /**
   1606    * MAC address of the peer's data-interface (not it's management/discovery interface).
   1607    */
   1608   MacAddress peerNdiMacAddr;
   1609   /**
   1610    * Arbitrary information communicated from the peer as part of the data-path setup process - there
   1611    * is no semantic meaning to these bytes. They are passed-through from sender to receiver as-is
   1612    * with no parsing.
   1613    * Max length: |NanCapabilities.maxAppInfoLen|.
   1614    * NAN Spec: Data Path Attributes / NDP Attribute / NDP Specific Info
   1615    */
   1616   vec<uint8_t> appInfo;
   1617   /**
   1618    * Failure reason if |dataPathSetupSuccess| is false.
   1619    */
   1620   WifiNanStatus status;
   1621 };
   1622 
   1623 /**
   1624  * RTT specific types.
   1625  * TODO(b/32159498): Move to a separate rtt_types.hal.
   1626  */
   1627 /**
   1628  * Ranging status.
   1629  */
   1630 enum RttStatus : uint32_t {
   1631   SUCCESS = 0,
   1632   /** General failure status */
   1633   FAILURE = 1,
   1634   /** Target STA does not respond to request */
   1635   FAIL_NO_RSP = 2,
   1636   /** Request rejected. Applies to 2-sided RTT only */
   1637   FAIL_REJECTED = 3,
   1638   FAIL_NOT_SCHEDULED_YET = 4,
   1639   /** Timing measurement times out */
   1640   FAIL_TM_TIMEOUT = 5,
   1641   /** Target on different channel, cannot range */
   1642   FAIL_AP_ON_DIFF_CHANNEL = 6,
   1643   /** Ranging not supported */
   1644   FAIL_NO_CAPABILITY = 7,
   1645   /** Request aborted for unknown reason */
   1646   ABORTED = 8,
   1647   /** Invalid T1-T4 timestamp */
   1648   FAIL_INVALID_TS = 9,
   1649   /** 11mc protocol failed */
   1650   FAIL_PROTOCOL = 10,
   1651   /** Request could not be scheduled */
   1652   FAIL_SCHEDULE = 11,
   1653   /** Responder cannot collaborate at time of request */
   1654   FAIL_BUSY_TRY_LATER = 12,
   1655   /** Bad request args */
   1656   INVALID_REQ = 13,
   1657   /** WiFi not enabled. */
   1658   NO_WIFI = 14,
   1659   /** Responder overrides param info, cannot range with new params */
   1660   FAIL_FTM_PARAM_OVERRIDE = 15,
   1661 };
   1662 
   1663 /**
   1664  * RTT peer types.
   1665  */
   1666 enum RttPeerType : uint32_t {
   1667   AP = 0x1,
   1668   STA = 0x2,
   1669   P2P_GO = 0x3,
   1670   P2P_CLIENT = 0x4,
   1671   NAN = 0x5,
   1672 };
   1673 
   1674 /**
   1675  * RTT Measurement Bandwidth.
   1676  */
   1677 enum RttBw : uint32_t {
   1678   BW_5MHZ = 0x01,
   1679   BW_10MHZ = 0x02,
   1680   BW_20MHZ = 0x04,
   1681   BW_40MHZ = 0x08,
   1682   BW_80MHZ = 0x10,
   1683   BW_160MHZ = 0x20,
   1684 };
   1685 
   1686 /**
   1687  * RTT Measurement Preamble.
   1688  */
   1689 enum RttPreamble : uint32_t {
   1690   LEGACY = 0x1,
   1691   HT = 0x2,
   1692   VHT = 0x4,
   1693 };
   1694 
   1695 /**
   1696  * RTT Types.
   1697  */
   1698 enum RttType : uint32_t {
   1699   ONE_SIDED = 0x1,
   1700   TWO_SIDED = 0x2,
   1701 };
   1702 
   1703 /**
   1704  * RTT configuration.
   1705  */
   1706 struct RttConfig {
   1707   /**
   1708    * Peer device mac address.
   1709    */
   1710   MacAddress addr;
   1711   /**
   1712    * 1-sided or 2-sided RTT.
   1713    */
   1714   RttType type;
   1715   /**
   1716    * Optional - peer device hint (STA, P2P, AP).
   1717    */
   1718   RttPeerType peer;
   1719   /**
   1720    * Required for STA-AP mode, optional for P2P, NBD etc.
   1721    */
   1722   WifiChannelInfo channel;
   1723   /**
   1724    * Time interval between bursts (units: 100 ms).
   1725    * Applies to 1-sided and 2-sided RTT multi-burst requests.
   1726    * Range: 0-31, 0: no preference by initiator (2-sided RTT).
   1727    */
   1728   uint32_t burstPeriod;
   1729   /**
   1730    * Total number of RTT bursts to be executed. It will be
   1731    * specified in the same way as the parameter "Number of
   1732    * Burst Exponent" found in the FTM frame format. It
   1733    * applies to both: 1-sided RTT and 2-sided RTT. Valid
   1734    * values are 0 to 15 as defined in 802.11mc std.
   1735    * 0 means single shot
   1736    * The implication of this parameter on the maximum
   1737    * number of RTT results is the following:
   1738    * for 1-sided RTT: max num of RTT results = (2^num_burst)*(num_frames_per_burst)
   1739    * for 2-sided RTT: max num of RTT results = (2^num_burst)*(num_frames_per_burst - 1)
   1740    */
   1741   uint32_t numBurst;
   1742   /**
   1743    * Num of frames per burst.
   1744    * Minimum value = 1, Maximum value = 31
   1745    * For 2-sided this equals the number of FTM frames
   1746    * to be attempted in a single burst. This also
   1747    * equals the number of FTM frames that the
   1748    * initiator will request that the responder send
   1749    * in a single frame.
   1750    */
   1751   uint32_t numFramesPerBurst;
   1752   /**
   1753    * Number of retries for a failed RTT frame.
   1754    * Applies to 1-sided RTT only. Minimum value = 0, Maximum value = 3
   1755    */
   1756   uint32_t numRetriesPerRttFrame;
   1757   /** Following fields are only valid for 2-side RTT. */
   1758   /**
   1759    * Maximum number of retries that the initiator can
   1760    * retry an FTMR frame.
   1761    * Minimum value = 0, Maximum value = 3
   1762    */
   1763   uint32_t numRetriesPerFtmr;
   1764   /**
   1765    * Whether to request location civic info or not.
   1766    */
   1767   bool mustRequestLci;
   1768   /**
   1769    * Whether to request location civic records or not.
   1770    */
   1771   bool mustRequestLcr;
   1772   /**
   1773    * Applies to 1-sided and 2-sided RTT. Valid values will
   1774    * be 2-11 and 15 as specified by the 802.11mc std for
   1775    * the FTM parameter burst duration. In a multi-burst
   1776    * request, if responder overrides with larger value,
   1777    * the initiator will return failure. In a single-burst
   1778    * request if responder overrides with larger value,
   1779    * the initiator will sent TMR_STOP to terminate RTT
   1780    * at the end of the burst_duration it requested.
   1781    */
   1782   uint32_t burstDuration;
   1783   /**
   1784    * RTT preamble to be used in the RTT frames.
   1785    */
   1786   RttPreamble preamble;
   1787   /**
   1788    * RTT BW to be used in the RTT frames.
   1789    */
   1790   RttBw bw;
   1791 };
   1792 
   1793 /**
   1794  * RTT results.
   1795  */
   1796 struct RttResult {
   1797   /**
   1798    * Peer device mac address.
   1799    */
   1800   MacAddress addr;
   1801   /**
   1802    * Burst number in a multi-burst request.
   1803    */
   1804   uint32_t burstNum;
   1805   /**
   1806    * Total RTT measurement frames attempted.
   1807    */
   1808   uint32_t measurementNumber;
   1809   /**
   1810    * Total successful RTT measurement frames.
   1811    */
   1812   uint32_t successNumber;
   1813   /**
   1814    * Maximum number of "FTM frames per burst" supported by
   1815    * the responder STA. Applies to 2-sided RTT only.
   1816    * If reponder overrides with larger value:
   1817    * - for single-burst request initiator will truncate the
   1818    * larger value and send a TMR_STOP after receiving as
   1819    * many frames as originally requested.
   1820    * - for multi-burst request, initiator will return
   1821    * failure right away.
   1822    */
   1823   uint8_t numberPerBurstPeer;
   1824   /**
   1825    * Ranging status.
   1826    */
   1827   RttStatus status;
   1828   /**
   1829    * When status == RTT_STATUS_FAIL_BUSY_TRY_LATER,
   1830    * this will be the time provided by the responder as to
   1831    * when the request can be tried again. Applies to 2-sided
   1832    * RTT only. In sec, 1-31sec.
   1833    */
   1834   uint8_t retryAfterDuration;
   1835   /**
   1836    * RTT type.
   1837    */
   1838   RttType type;
   1839   /**
   1840    * Average rssi in 0.5 dB steps e.g. 143 implies -71.5 dB.
   1841    */
   1842   Rssi rssi;
   1843   /**
   1844    * Rssi spread in 0.5 dB steps e.g. 5 implies 2.5 dB spread (optional).
   1845    */
   1846   Rssi rssiSpread;
   1847   /**
   1848    * 1-sided RTT: TX rate of RTT frame.
   1849    * 2-sided RTT: TX rate of initiator's Ack in response to FTM frame.
   1850    */
   1851   WifiRateInfo txRate;
   1852   /**
   1853    * 1-sided RTT: TX rate of Ack from other side.
   1854    * 2-sided RTT: TX rate of FTM frame coming from responder.
   1855    */
   1856   WifiRateInfo rxRate;
   1857   /**
   1858    * Round trip time in picoseconds
   1859    */
   1860   TimeSpanInPs rtt;
   1861   /**
   1862    * Rtt standard deviation in picoseconds.
   1863    */
   1864   TimeSpanInPs rttSd;
   1865   /**
   1866    * Difference between max and min rtt times recorded in picoseconds.
   1867    */
   1868   TimeSpanInPs rttSpread;
   1869   /**
   1870    * Distance in mm (optional).
   1871    */
   1872   int32_t distanceInMm;
   1873   /**
   1874    * Standard deviation in mm (optional).
   1875    */
   1876   int32_t distanceSdInMm;
   1877   /**
   1878    * Difference between max and min distance recorded in mm (optional).
   1879    */
   1880   int32_t distanceSpreadInMm;
   1881   /**
   1882    * Time of the measurement (in microseconds since boot).
   1883    */
   1884   TimeStampInUs timeStampInUs;
   1885   /**
   1886    * in ms, actual time taken by the FW to finish one burst
   1887    * measurement. Applies to 1-sided and 2-sided RTT.
   1888    */
   1889   uint32_t burstDurationInMs;
   1890   /**
   1891    * Number of bursts allowed by the responder. Applies
   1892    * to 2-sided RTT only.
   1893    */
   1894   uint32_t negotiatedBurstNum;
   1895   /**
   1896    * for 11mc only.
   1897    */
   1898   WifiInformationElement lci;
   1899   /**
   1900    * for 11mc only.
   1901    */
   1902   WifiInformationElement lcr;
   1903 };
   1904 
   1905 /**
   1906  * RTT Capabilities.
   1907  */
   1908 struct RttCapabilities {
   1909   /**
   1910    * if 1-sided rtt data collection is supported.
   1911    */
   1912   bool rttOneSidedSupported;
   1913   /**
   1914    * if ftm rtt data collection is supported.
   1915    */
   1916   bool rttFtmSupported;
   1917   /**
   1918    * if initiator supports LCI request. Applies to 2-sided RTT.
   1919    */
   1920   bool lciSupported;
   1921   /**
   1922    * if initiator supports LCR request. Applies to 2-sided RTT.
   1923    */
   1924   bool lcrSupported;
   1925   /**
   1926    * if 11mc responder mode is supported.
   1927    */
   1928   bool responderSupported;
   1929   /**
   1930    * Bit mask indicates what preamble is supported by initiator.
   1931    * Combination of |RttPreamble| values.
   1932    */
   1933   bitfield<RttPreamble> preambleSupport;
   1934   /**
   1935    * Bit mask indicates what BW is supported by initiator.
   1936    * Combination of |RttBw| values.
   1937    */
   1938   bitfield<RttBw> bwSupport;
   1939   /**
   1940    * Draft 11mc spec version supported by chip.
   1941    * For instance, version 4.0 must be 40 and version 4.3 must be 43 etc.
   1942    */
   1943   uint8_t mcVersion;
   1944 };
   1945 
   1946 /**
   1947  * Structs for setting LCI/LCR information to be provided to a requestor.
   1948  */
   1949 enum RttMotionPattern : uint32_t {
   1950   /**
   1951    * Not expected to change location.
   1952    */
   1953   NOT_EXPECTED = 0,
   1954   /**
   1955    * Expected to change location.
   1956    */
   1957   EXPECTED = 1,
   1958   /**
   1959    * Movement pattern unknown.
   1960    */
   1961   UNKNOWN = 2,
   1962 };
   1963 
   1964 /**
   1965  * Movement pattern unknown.
   1966  */
   1967 struct RttLciInformation {
   1968   /**
   1969    * latitude in degrees * 2^25 , 2's complement.
   1970    */
   1971   int64_t latitude;
   1972   /**
   1973    * longitude in degrees * 2^25 , 2's complement.
   1974    */
   1975   int64_t longitude;
   1976   /**
   1977    * Altitude in units of 1/256 m.
   1978    */
   1979   int32_t altitude;
   1980   /**
   1981    * As defined in Section 2.3.2 of IETF RFC 6225.
   1982    */
   1983   uint8_t latitudeUnc;
   1984   /**
   1985    * As defined in Section 2.3.2 of IETF RFC 6225.
   1986    */
   1987   uint8_t longitudeUnc;
   1988   /**
   1989    * As defined in Section 2.4.5 from IETF RFC 6225.
   1990    */
   1991   uint8_t altitudeUnc;
   1992   /** Following element for configuring the Z subelement. */
   1993   /**
   1994    * Motion pattern type.
   1995    */
   1996   RttMotionPattern motionPattern;
   1997   /**
   1998    * Floor in units of 1/16th of floor. 0x80000000 if unknown.
   1999    */
   2000   int32_t floor;
   2001   /**
   2002    * in units of 1/64 m.
   2003    */
   2004   int32_t heightAboveFloor;
   2005   /**
   2006    * in units of 1/64 m. 0 if unknown
   2007    */
   2008   int32_t heightUnc;
   2009 };
   2010 
   2011 struct RttLcrInformation {
   2012   /**
   2013    * Country code symbol.
   2014    */
   2015   int8_t[2] countryCode;
   2016   /**
   2017    * Civic info to be copied in FTM frame.
   2018    */
   2019   string civicInfo;
   2020 };
   2021 
   2022 /***
   2023  * RTT Responder information
   2024  */
   2025 struct RttResponder {
   2026   WifiChannelInfo channel;
   2027   RttPreamble preamble;
   2028 };
   2029 
   2030 /**
   2031  * Debug data specific types.
   2032  * TODO(b/32159498): Move to a separate debug_types.hal.
   2033  */
   2034 typedef uint32_t WifiRingBufferId;
   2035 
   2036 /**
   2037  * Flags describing each debug ring buffer.
   2038  */
   2039 enum WifiDebugRingBufferFlags : uint32_t {
   2040   HAS_BINARY_ENTRIES = 1 << 0,
   2041   HAS_ASCII_ENTRIES = 1 << 1,
   2042   HAS_PER_PACKET_ENTRIES = 1 << 2,
   2043 };
   2044 
   2045 /**
   2046  * Struct describing each debug ring buffer supported by
   2047  * the device.
   2048  */
   2049 struct WifiDebugRingBufferStatus {
   2050   /**
   2051    * Name of this debug ring buffer.
   2052    */
   2053   string ringName;
   2054   /**
   2055    * Combination of |WifiDebugRingBufferFlags| values.
   2056    */
   2057   uint32_t flags;
   2058   /**
   2059    * Unique integer representing the ring.
   2060    */
   2061   WifiRingBufferId ringId;
   2062   /**
   2063    * Total memory size allocated for the buffer.
   2064    */
   2065   uint32_t sizeInBytes;
   2066   /**
   2067    * Amount of free space in the buffer.
   2068    */
   2069   uint32_t freeSizeInBytes;
   2070   /**
   2071    * Verbose level for ring buffer.
   2072    */
   2073   uint32_t verboseLevel;
   2074 };
   2075 
   2076 /**
   2077  * Verbose logging level to set for each debug ring buffer supported
   2078  * by the device.
   2079  */
   2080 enum WifiDebugRingBufferVerboseLevel : uint32_t {
   2081   /**
   2082    * Level 0 corresponds to no collection, and it makes log handler
   2083    * stop by no more events from driver.
   2084    */
   2085   NONE = 0,
   2086   /**
   2087    * Level 1 correspond to normal log level, with minimal user impact.
   2088    * This is the default value.
   2089    */
   2090   DEFAULT = 1,
   2091   /**
   2092    * Level 2 is enabled when user is lazily trying to reproduce a problem,
   2093    * wifi performances and power can be impacted but device should not
   2094    * otherwise be significantly impacted.
   2095    */
   2096   VERBOSE = 2,
   2097   /**
   2098    * Level 3 is used when trying to actively debug a problem.
   2099    * This will cause sever performance degradation.
   2100    */
   2101   EXCESSIVE = 3
   2102 };
   2103 
   2104 /**
   2105  * Enum describing the fate of the TX packets.
   2106  */
   2107 enum WifiDebugTxPacketFate : uint32_t {
   2108   /**
   2109    * Sent over air and ACKed.
   2110    */
   2111   ACKED,
   2112   /**
   2113    * Sent over air but not ACKed. (Normal for broadcast/multicast.)
   2114    */
   2115   SENT,
   2116   /**
   2117    * Queued within firmware, but not yet sent over air.
   2118    */
   2119   FW_QUEUED,
   2120   /**
   2121    * Dropped by firmware as invalid. E.g. bad source address, bad checksum,
   2122    * or invalid for current state.
   2123    */
   2124   FW_DROP_INVALID,
   2125   /**
   2126    * Dropped by firmware due to lack of buffer space.
   2127    */
   2128   FW_DROP_NOBUFS,
   2129   /**
   2130    * Dropped by firmware for any other reason. Includes frames that  were sent
   2131    * by driver to firmware, but unaccounted for by  firmware.
   2132    */
   2133   FW_DROP_OTHER,
   2134   /**
   2135    * Queued within driver, not yet sent to firmware.
   2136    */
   2137   DRV_QUEUED,
   2138   /**
   2139    * Dropped by driver as invalid. E.g. bad source address, or invalid for
   2140    * current state.
   2141    */
   2142   DRV_DROP_INVALID,
   2143   /**
   2144    * Dropped by driver due to lack of buffer space.
   2145    */
   2146   DRV_DROP_NOBUFS,
   2147   /**
   2148    * Dropped by driver for any other reason.
   2149    */
   2150   DRV_DROP_OTHER,
   2151 };
   2152 
   2153 /**
   2154  * Enum describing the fate of the TX packets.
   2155  */
   2156 enum WifiDebugRxPacketFate : uint32_t {
   2157   /**
   2158    * Valid and delivered to network stack (e.g., netif_rx()).
   2159    */
   2160   SUCCESS,
   2161   /**
   2162    * Queued within firmware, but not yet sent to driver.
   2163    */
   2164   FW_QUEUED,
   2165   /**
   2166    * Dropped by firmware due to host-programmable filters.
   2167    */
   2168   FW_DROP_FILTER,
   2169   /**
   2170    * Dropped by firmware as invalid. E.g. bad checksum, decrypt failed,
   2171    * or invalid for current state.
   2172    */
   2173   FW_DROP_INVALID,
   2174   /**
   2175    * Dropped by firmware due to lack of buffer space.
   2176    */
   2177   FW_DROP_NOBUFS,
   2178   /**
   2179    * Dropped by firmware for any other reason.
   2180    */
   2181   FW_DROP_OTHER,
   2182   /**
   2183    * Queued within driver, not yet delivered to network stack.
   2184    */
   2185   DRV_QUEUED,
   2186   /**
   2187    * Dropped by driver due to filter rules.
   2188    */
   2189   DRV_DROP_FILTER,
   2190   /**
   2191    * Dropped by driver as invalid. E.g. not permitted in current state.
   2192    */
   2193   DRV_DROP_INVALID,
   2194   /**
   2195    * Dropped by driver due to lack of buffer space.
   2196    */
   2197   DRV_DROP_NOBUFS,
   2198   /**
   2199    * Dropped by driver for any other reason.
   2200    */
   2201   DRV_DROP_OTHER,
   2202 };
   2203 
   2204 /**
   2205  * Type of frame transmitted/received.
   2206  */
   2207 enum WifiDebugPacketFateFrameType : uint32_t {
   2208   UNKNOWN,
   2209   ETHERNET_II,
   2210   MGMT_80211,
   2211 };
   2212 
   2213 /**
   2214  * Information regarding the frame transmitted/received.
   2215  */
   2216 struct WifiDebugPacketFateFrameInfo {
   2217   /**
   2218    * The type of MAC-layer frame that this frame_info holds.
   2219    * - For data frames, use FRAME_TYPE_ETHERNET_II.
   2220    * - For management frames, use FRAME_TYPE_80211_MGMT.
   2221    * - If the type of the frame is unknown, use FRAME_TYPE_UNKNOWN.
   2222    */
   2223   WifiDebugPacketFateFrameType frameType;
   2224   /**
   2225    * The number of bytes included in |frameContent|.
   2226    * If the frame  contents are missing (e.g. RX frame dropped in firmware),
   2227    * |frameLen| must be set to 0.
   2228    */
   2229   uint64_t frameLen;
   2230   /**
   2231    * Host clock when this frame was received by the driver (either  outbound
   2232    * from the host network stack, or inbound from the firmware).
   2233    * - The timestamp must be taken from a clock which includes time the host
   2234    *   spent suspended (e.g. ktime_get_boottime()).
   2235    * - If no host timestamp is available (e.g. RX frame was dropped in firmware),
   2236    *   this field must be set to 0.
   2237    */
   2238   TimeStampInUs driverTimestampUsec;
   2239   /**
   2240    * Firmware clock when this frame was received by the firmware
   2241    * (either outbound from the host, or inbound from a remote  station).
   2242    * - The timestamp must be taken from a clock which includes time firmware
   2243    *   spent suspended (if applicable).
   2244    * - If no firmware timestamp is available (e.g. TX frame was dropped by
   2245    *   driver), this field must be set to 0.
   2246    * - Consumers of |frameInfo| must not assume any synchronization between
   2247    *   driver and firmware clocks.
   2248    */
   2249   TimeStampInUs firmwareTimestampUsec;
   2250   /**
   2251    * Actual frame content. This is the raw bytes of the corresponding packet.
   2252    * - Should be provided for TX frames originated by the host.
   2253    * - Should be provided for RX frames received by the driver.
   2254    * - Optionally provided for TX frames originated by firmware.
   2255    *   (At discretion of HAL implementation.)
   2256    * - Optionally provided for RX frames dropped in firmware.
   2257    *   (At discretion of HAL implementation.)
   2258    * - If frame content is not provided, |frameLen| must be set to 0.
   2259    */
   2260   vec<uint8_t> frameContent;
   2261 };
   2262 
   2263 /**
   2264  * Struct describing packet fate report for each Tx frame.
   2265  */
   2266 struct WifiDebugTxPacketFateReport {
   2267   WifiDebugTxPacketFate fate;
   2268   WifiDebugPacketFateFrameInfo frameInfo;
   2269 };
   2270 
   2271 /**
   2272  * Struct describing packet fate report for each Rx frame.
   2273  */
   2274 struct WifiDebugRxPacketFateReport {
   2275   WifiDebugRxPacketFate fate;
   2276   WifiDebugPacketFateFrameInfo frameInfo;
   2277 };
   2278 
   2279 /**
   2280  * Struct capturing the count of all rx packets that caused
   2281  * host wakeup.
   2282  */
   2283 struct WifiDebugHostWakeReasonRxPacketDetails {
   2284   /**
   2285    * Total rx unicast packet which woke up host.
   2286    */
   2287   uint32_t rxUnicastCnt;
   2288   /**
   2289    * Total rx multicast packet which woke up host.
   2290    */
   2291   uint32_t rxMulticastCnt;
   2292   /**
   2293    * Total rx broadcast packet which woke up host.
   2294    */
   2295   uint32_t rxBroadcastCnt;
   2296 };
   2297 
   2298 /**
   2299  * Struct capturing the count of all rx multicast packets that caused
   2300  * host wakeup.
   2301  */
   2302 struct WifiDebugHostWakeReasonRxMulticastPacketDetails {
   2303   /**
   2304    * Rx wake packet was ipv4 multicast.
   2305    */
   2306   uint32_t ipv4RxMulticastAddrCnt;
   2307   /**
   2308    * Rx wake packet was ipv6 multicast.
   2309    */
   2310   uint32_t ipv6RxMulticastAddrCnt;
   2311   /**
   2312    * Rx wake packet was non-ipv4 and non-ipv6.
   2313    */
   2314   uint32_t otherRxMulticastAddrCnt;
   2315 };
   2316 
   2317 /**
   2318  * Struct capturing the count of all rx ICMP packets that caused
   2319  * host wakeup.
   2320  */
   2321 struct WifiDebugHostWakeReasonRxIcmpPacketDetails {
   2322   /**
   2323    * Wake icmp packet count.
   2324    */
   2325   uint32_t icmpPkt;
   2326   /**
   2327    * Wake icmp6 packet count.
   2328    */
   2329   uint32_t icmp6Pkt;
   2330   /**
   2331    * Wake icmp6 RA packet count.
   2332    */
   2333   uint32_t icmp6Ra;
   2334   /**
   2335    * Wake icmp6 NA packet count.
   2336    */
   2337   uint32_t icmp6Na;
   2338   /**
   2339    * Wake icmp6 NS packet count.
   2340    */
   2341   uint32_t icmp6Ns;
   2342 };
   2343 
   2344 /**
   2345  * Structure capturing the count of all the wireless related host wakeup.
   2346  * This is used to capture all the reasons why the host processor
   2347  * (WLAN driver) was woken up by the WLAN firmware.
   2348  * These stats may be used to debug any power issues caused due to frequent
   2349  * wakeup of the host processor by the WLAN firmware.
   2350  */
   2351 struct WifiDebugHostWakeReasonStats {
   2352   /**
   2353    * Total count of cmd/event wakes.
   2354    * These must account for all wakeups due to WLAN management
   2355    * commands/events received over the air.
   2356    */
   2357   uint32_t totalCmdEventWakeCnt;
   2358   /**
   2359    * Vector of wake counts per cmd/event type.
   2360    * The number of command types and their meaning is only understood by the
   2361    * vendor.
   2362    */
   2363   vec<uint32_t> cmdEventWakeCntPerType;
   2364   /**
   2365    * Total count of drive/fw wakes.
   2366    * These must account for all wakeups due to local driver/firmware
   2367    * interactions. These include all vendor implementation specific
   2368    * interactions like any heart-beat monitoring, Bus management, etc.
   2369    */
   2370   uint32_t totalDriverFwLocalWakeCnt;
   2371   /**
   2372    * Vector of wake counts per driver/firmware interaction type.
   2373    * The number of command types and their meaning is only understood by the
   2374    * vendor.
   2375    */
   2376   vec<uint32_t> driverFwLocalWakeCntPerType;
   2377   /**
   2378    * Total data rx packets, that woke up host.
   2379    */
   2380   uint32_t totalRxPacketWakeCnt;
   2381   WifiDebugHostWakeReasonRxPacketDetails rxPktWakeDetails;
   2382   WifiDebugHostWakeReasonRxMulticastPacketDetails rxMulticastPkWakeDetails;
   2383   WifiDebugHostWakeReasonRxIcmpPacketDetails rxIcmpPkWakeDetails;
   2384 };
   2385