/*
 * Copyright 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.hardware.wifi@1.0;

/**
 * Enum values indicating the status of operation.
 */
enum WifiStatusCode : uint32_t {
  /** No errors. */
  SUCCESS,
  /** Method invoked on an invalid |IWifiChip| object. */
  ERROR_WIFI_CHIP_INVALID,
  /** Method invoked on an invalid |IWifiIface| object. */
  ERROR_WIFI_IFACE_INVALID,
  /** Method invoked on an invalid |IWifiRttController| object. */
  ERROR_WIFI_RTT_CONTROLLER_INVALID,
  ERROR_NOT_SUPPORTED,
  ERROR_NOT_AVAILABLE,
  ERROR_NOT_STARTED,
  ERROR_INVALID_ARGS,
  ERROR_BUSY,
  ERROR_UNKNOWN
};

/**
 * Generic structure to return the status of an operation.
 */
struct WifiStatus {
  WifiStatusCode code;
  /**
   * A vendor specific error message from the vendor to provide more
   * information beyond the reason code.
   */
  string description;
};

/**
 * List of Iface types supported.
 */
enum IfaceType : uint32_t {
  STA,
  AP,
  P2P,
  /**
   * NAN control interface. Datapath support must be queried and created
   * through this interface.
   */
  NAN,
};

/**
 * An identifier assigned to every chip on the device.
 */
typedef uint32_t ChipId;

/**
 * An identifier for a mode that the chip can be put in.
 */
typedef uint32_t ChipModeId;

/**
 * A unique handle provided by the client to identify individual invocations of
 * certain API's like |IWifiStaIface.startBackgroundScan|,
 * |IWifiStaIface.installApfPacketFilter|, etc.
 */
typedef uint32_t CommandId;

/**
 * Channel frequency in Mhz.
 */
typedef uint32_t WifiChannelInMhz;

/**
 * Channel operating width in Mhz.
 */
enum WifiChannelWidthInMhz : uint32_t {
  WIDTH_20    = 0,
  WIDTH_40    = 1,
  WIDTH_80    = 2,
  WIDTH_160   = 3,
  WIDTH_80P80 = 4,
  WIDTH_5     = 5,
  WIDTH_10    = 6,
  WIDTH_INVALID = -1
};

/**
 * Channel information.
 */
struct WifiChannelInfo {
  /**
   * Channel width (20, 40, 80, 80+80, 160).
   */
  WifiChannelWidthInMhz width;
  /**
   * Primary 20 MHz channel.
   */
  WifiChannelInMhz centerFreq;
  /**
   * Center frequency (MHz) first segment.
   */
  WifiChannelInMhz centerFreq0;
  /**
   * Center frequency (MHz) second segment.
   */
  WifiChannelInMhz centerFreq1;
};

/**
 * RSSI information.
 */
typedef int32_t Rssi;

/**
 * Mac Address type. 6 octets representing physical address of a device.
 */
typedef uint8_t[6] MacAddress;

/**
 * SSID type. 32 octets representing the network.
 */
typedef uint8_t[32] Ssid;

/**
 * BSSID type. 6 octets representing the physical address of an AP.
 */
typedef MacAddress Bssid;

/**
 * TimeStamp in milliseconds (ms).
 */
typedef uint64_t TimeStampInMs;

/**
 * TimeStamp in microseconds (us).
 */
typedef uint64_t TimeStampInUs;

/**
 * TimeStamp in picoseconds (ps).
 */
typedef uint64_t TimeSpanInPs;

/**
 * Information elements contained within the |ScanResult| structure.
 * These elements correspond to the IEEE_802.11 standard.
 */
struct WifiInformationElement {
  uint8_t id;
  vec<uint8_t> data;
};

enum WifiRatePreamble : uint32_t {
  OFDM = 0,
  CCK = 1,
  HT = 2,
  VHT = 3,
  RESERVED = 4
};

/**
 * Number of spatial streams in VHT/HT.
 */
enum WifiRateNss : uint32_t {
  NSS_1x1 = 0,
  NSS_2x2 = 1,
  NSS_3x3 = 2,
  NSS_4x4 = 3
};

/**
 * Wifi rate info.
 */
struct WifiRateInfo {
  /**
   * Preamble used for RTT measurements.
   */
  WifiRatePreamble preamble;
  /**
   * Number of spatial streams.
   */
  WifiRateNss nss;
  /**
   * Bandwidth of channel.
   */
  WifiChannelWidthInMhz bw;
  /**
   * OFDM/CCK rate code would be as per ieee std in the units of 0.5mbps.
   * HT/VHT it would be mcs index.
   */
  uint8_t rateMcsIdx;
  /**
   * Bitrate in units of 100 Kbps.
   */
  uint32_t bitRateInKbps;
};

/**
 * Wifi bands defined in 80211 spec.
 */
enum WifiBand : uint32_t {
  BAND_UNSPECIFIED = 0,
  /**
   * 2.4 GHz.
   */
  BAND_24GHZ = 1,
  /**
   * 5 GHz without DFS.
   */
  BAND_5GHZ = 2,
  /**
   * 5 GHz DFS only.
   */
  BAND_5GHZ_DFS = 4,
  /**
   * 5 GHz with DFS.
   */
  BAND_5GHZ_WITH_DFS = 6,
  /**
   * 2.4 GHz + 5 GHz; no DFS.
   */
  BAND_24GHZ_5GHZ = 3,
  /**
   * 2.4 GHz + 5 GHz with DFS
   */
  BAND_24GHZ_5GHZ_WITH_DFS = 7
};

/**
 * STA specific types.
 * TODO(b/32159498): Move to a separate sta_types.hal.
 */
/**
 * Parameters to specify the APF capabilities of this iface.
 */
struct StaApfPacketFilterCapabilities {
  /**
   * Version of the packet filter interpreter supported
   */
  uint32_t version;
  /**
   * Maximum size of the filter bytecodes in byte for an iface.
   */
  uint32_t maxLength;
};

/**
 * Parameters to specify the Background Scan capabilities of this iface.
 */
struct StaBackgroundScanCapabilities {
  /**
   * Maximum number of byte available for cached scan results
   */
  uint32_t maxCacheSize;
  /**
   * Maximum number of buckets that can be supplied for a scan
   */
  uint32_t maxBuckets;
  /**
   * Maximum number of APs that must be stored for each scan.
   */
  uint32_t maxApCachePerScan;
  /**
   * Max reporting number of scans threshold that can be specified in the scan
   * parameters.
   */
  int32_t maxReportingThreshold;
};

/**
 * Mask of event reporting schemes that can be specified in background scan
 * requests.
 */
enum StaBackgroundScanBucketEventReportSchemeMask : uint32_t {
  /**
   * Report a scan completion event after scan. If this is not set then scan
   * completion events must be reported if report_threshold_percent or
   * report_threshold_num_scans is reached.
   */
  EACH_SCAN = 1 << 0,
  /**
   * Forward scan results (beacons/probe responses + IEs) in real time to HAL,
   * in addition to completion events.
   * Note: To keep backward compatibility, fire completion events regardless
   * of REPORT_EVENTS_EACH_SCAN.
   */
  FULL_RESULTS = 1 << 1,
  /**
   * Controls if scans for this bucket must be placed in the results buffer.
   */
  NO_BATCH = 1 << 2,
};

/**
 * Max limits for background scan.
 */
enum StaScanLimits : uint32_t {
  MAX_CHANNELS = 16,
  MAX_BUCKETS = 16,
  MAX_AP_CACHE_PER_SCAN = 32
};

/**
 * Background Scan parameters per bucket that can be specified in background
 * scan requests.
 */
struct StaBackgroundScanBucketParameters {
  /**
   * Bucket index. This index is used to report results in
   * |StaScanData.bucketsScanned|.
   */
  uint32_t bucketIdx;
  /**
   * Bands to scan or |BAND_UNSPECIFIED| if frequencies list must be used
   * instead.
   */
  WifiBand band;
  /**
   * Channel frequencies (in Mhz) to scan if |band| is set to
   * |BAND_UNSPECIFIED|.
   * Max length: |StaScanLimits.MAX_CHANNELS|.
   */
  vec<WifiChannelInMhz> frequencies;
  /**
   * Period at which this bucket must be scanned (in milliseconds). Must be an integer
   * multiple of the |basePeriodInMs| specified in the BackgroundScanParameters.
   */
  uint32_t periodInMs;
  /**
   * Bitset of |StaBackgroundScanBucketEventReportSchemeMask| values controlling
   * when events for this bucket must be reported.
   */
  bitfield<StaBackgroundScanBucketEventReportSchemeMask> eventReportScheme;
  /**
   * For exponential back off. If |exponentialMaxPeriodInMs| is non zero or
   * different than period, then this bucket is an exponential backoff bucket
   * and the scan period must grow exponentially as per formula:
   *   actual_period(N) = period * (base ^ (N/step_count))
   * to this maximum period (in milliseconds).
   */
  uint32_t exponentialMaxPeriodInMs;
  /**
   * For exponential back off. multiplier: new_period=old_period * base
   */
  uint32_t exponentialBase;
  /**
   * For exponential back off. Number of scans to perform for a given
   * period.
   */
  uint32_t exponentialStepCount;
};

/**
 * Background Scan parameters that can be specified in background scan
 * requests.
 */
struct StaBackgroundScanParameters {
  /**
   * GCD of all bucket periods (in milliseconds).
   */
  uint32_t basePeriodInMs;
  /**
   * Maximum number of APs that must be stored for each scan. If the maximum
   * is reached the highest RSSI results must be returned.
   * Max length: |StaScanLimits.MAX_AP_CACHE_PER_SCAN|.
   */
  uint32_t maxApPerScan;
  /**
   * % cache buffer filled threshold at which the host must be notified of
   * batched scan results.
   */
  uint32_t reportThresholdPercent;
  /**
   * Threshold at which the AP must be woken up, in number of scans.
   */
  uint32_t reportThresholdNumScans;
  /**
   * List of buckets to be scheduled.
   * Max length: |StaScanLimits.MAX_BUCKETS|.
   */
  vec<StaBackgroundScanBucketParameters> buckets;
};

/**
 * Packet stats for different traffic categories.
 */
struct StaLinkLayerIfacePacketStats {
  /**
   * Number of received unicast data packets.
   */
  uint64_t rxMpdu;
  /**
   * Number of successfully transmitted unicast data pkts (ACK rcvd).
   */
  uint64_t txMpdu;
  /**
   * Number of transmitted unicast data pkt losses (no ACK).
   */
  uint64_t lostMpdu;
  /**
   * Number of transmitted unicast data retry pkts.
   */
  uint64_t retries;
};

/**
 * Iface statistics for the current connection.
 */
struct StaLinkLayerIfaceStats {
  /**
   * Number beacons received from the connected AP.
   */
  uint32_t beaconRx;
  /**
   * Access Point Beacon and Management frames RSSI (averaged).
   */
  int32_t avgRssiMgmt;
  /**
   * WME Best Effort Access Category packet counters.
   */
  StaLinkLayerIfacePacketStats wmeBePktStats;
  /**
   * WME Background Access Category packet counters.
   */
  StaLinkLayerIfacePacketStats wmeBkPktStats;
  /**
   * WME Video Access Category packet counters.
   */
  StaLinkLayerIfacePacketStats wmeViPktStats;
  /**
   * WME Voice Access Category packet counters.
   */
  StaLinkLayerIfacePacketStats wmeVoPktStats;
};

/**
 * Cumulative radio statistics since collection was enabled.
 */
struct StaLinkLayerRadioStats {
  /**
   * Time for which the radio is awake.
   */
  uint32_t onTimeInMs;
  /**
   * Total time for which the radio is in active transmission.
   */
  uint32_t txTimeInMs;
  /**
   * Time for which the radio is in active tranmission per tx level.
   */
  vec<uint32_t> txTimeInMsPerLevel;
  /**
   * Time for which the radio is in active receive.
   */
  uint32_t rxTimeInMs;
  /**
   *  Total time for which the radio is awake due to scan.
   */
  uint32_t onTimeInMsForScan;
};

/**
 * Link layer stats retrieved via |getLinkLayerStats|.
 */
struct StaLinkLayerStats {
  StaLinkLayerIfaceStats iface;
  vec<StaLinkLayerRadioStats> radios;
  /**
   * TimeStamp for each stats sample.
   * This is the absolute milliseconds from boot when these stats were
   * sampled.
   */
  TimeStampInMs timeStampInMs;
};

/**
 * Structure describing all the information about a single access point seen
 * during the scan.
 */
struct StaScanResult {
  TimeStampInUs timeStampInUs;
  vec<uint8_t> ssid;
  Bssid bssid;
  Rssi rssi;
  WifiChannelInMhz frequency;
  uint16_t beaconPeriodInMs;
  uint16_t capability;
  vec<WifiInformationElement> informationElements;
};

/**
 * Mask of flags set in the |ScanData| instance.
 */
enum StaScanDataFlagMask : int32_t {
  /**
   * Indicates that a scan was interrupted/did not occur so results may be
   * incomplete.
   */
  INTERRUPTED = 1 << 0,
};

/**
 * Structure describing all the information about all the access points seen during
 * the scan.
 */
struct StaScanData {
  /**
   * Bitset containing |ScanDataFlagMask| values.
   */
  bitfield<StaScanDataFlagMask> flags;
  /**
   * Bitset where each bit indicates if the bucket with that index (starting at
   * 0) was scanned.
   */
  uint32_t bucketsScanned;
  /**
   * List of scan results.
   */
  vec<StaScanResult> results;
};

/**
 * Structure describing the roaming control capabilities supported.
 */
struct StaRoamingCapabilities {
  /**
   * Maximum number of BSSID's that may be blacklisted.
   */
  uint32_t maxBlacklistSize;
  /**
   * Maximum number of SSID's that may be whitelisted.
   */
  uint32_t maxWhitelistSize;
};

/**
 * Structure describing the roaming control configuration.
 */
struct StaRoamingConfig {
  /**
   * List of BSSID's that are blacklisted for roaming.
   */
  vec<Bssid> bssidBlacklist;
  /**
   * List of SSID's that are whitelisted for roaming.
   */
  vec<Ssid> ssidWhitelist;
};

/**
 * Enum describing the various states to set the roaming
 * control to.
 */
enum StaRoamingState : uint8_t {
  /**
   * Driver/Firmware must not perform any roaming.
   */
  DISABLED = 0,
  /**
   * Driver/Firmware is allowed to perform roaming respecting
   * the |StaRoamingConfig| parameters set using |configureRoaming|.
   */
  ENABLED = 1
};

/**
 * NAN specific types.
 * TODO(b/32159498): Move to a separate nan_types.hal.
 *
 * References to "NAN Spec" are to the Wi-Fi Alliance "Wi-Fi Neighbor Awareness
 * Networking (NAN) Technical Specification".
 */

/**
 * Size limits for parameters used in the NAN interface.
 */
@export
enum NanParamSizeLimits : uint32_t {
  /** Minimum length of Passphrase argument for data-path configuration */
  MIN_PASSPHRASE_LENGTH = 8,

  /** Maximum length of Passphrase argument for data-path configuration */
  MAX_PASSPHRASE_LENGTH = 63,
};

/**
 * A unique short handle provided by the client to identify individual invocations of
 * certain API's like |IWifiNanIface.*|.
 */
typedef uint16_t CommandIdShort;

/**
 * NAN API response codes used in request notifications and events.
 */
enum NanStatusType : uint32_t {
  SUCCESS = 0,
  /** NAN Discovery Engine/Host driver failures */
  INTERNAL_FAILURE = 1,
  /** NAN OTA failures */
  PROTOCOL_FAILURE = 2,
  /** The publish/subscribe discovery session id is invalid */
  INVALID_SESSION_ID = 3,
  /** Out of resources to fufill request */
  NO_RESOURCES_AVAILABLE = 4,
  /** Invalid arguments passed */
  INVALID_ARGS = 5,
  /** Invalid peer id */
  INVALID_PEER_ID = 6,
  /** Invalid NAN data-path (ndp) id */
  INVALID_NDP_ID = 7,
  /** Attempting to enable NAN when not available, e.g. wifi is disabled */
  NAN_NOT_ALLOWED = 8,
  /** Over the air ACK not received */
  NO_OTA_ACK = 9,
  /** Attempting to enable NAN when already enabled */
  ALREADY_ENABLED = 10,
  /** Can't queue tx followup message foor transmission */
  FOLLOWUP_TX_QUEUE_FULL = 11,
  /** Unsupported concurrency of NAN and another feature - NAN disabled */
  UNSUPPORTED_CONCURRENCY_NAN_DISABLED = 12
};

/**
 * The discovery bands supported by NAN.
 */
enum NanBandIndex : uint32_t {
  NAN_BAND_24GHZ = 0,
  NAN_BAND_5GHZ
};

/**
 * The status information returned in NAN notifications.
 */
struct WifiNanStatus {
  /**
   * Status of the command request.
   */
  NanStatusType status;
  /**
   * Further description of the issue causing a failure.
   */
  string description;
};

/**
 * NAN Match indication type: control how often to trigger |IWifiNanIfaceEventCallback.eventMatch|
 * for a single discovery session - i.e. continuously discovering the same publisher with no new
 * data.
 */
enum NanMatchAlg : uint32_t {
  MATCH_ONCE = 0,   // Only trigger |IWifiNanIfaceEventCallback.eventMatch| once
  MATCH_CONTINUOUS, // Trigger |IWifiNanIfaceEventCallback.eventMatch| every time
  MATCH_NEVER,      // Never trigger |IWifiNanIfaceEventCallback.eventMatch|
};

/**
 * NAN publish discovery session types.
 */
enum NanPublishType : uint32_t {
  UNSOLICITED = 0,       // Publish session broadcasts discovery packets
  SOLICITED,             // Publish session silent, responds to active subscribes queries
  UNSOLICITED_SOLICITED, // Both
};

/**
 * NAN transmit type used in |NanPublishType.SOLICITED| or |NanPublishType.UNSOLICITED_SOLICITED|
 * publish discovery sessions. Describes the addressing of the packet responding to an ACTIVE
 * subscribe query.
 */
enum NanTxType : uint32_t {
  BROADCAST = 0, // Respond with a broadcast packet
  UNICAST,       // Respond with a unicast packet
};

/**
 * NAN subscribe discovery session types.
 */
enum NanSubscribeType : uint32_t {
  PASSIVE = 0, // Subscribe session scans for |NanPublishType.UNSOLICITED| publish sessions.
  ACTIVE,      // Subscribe session probes for |NanPublishType.SOLICITED| publish sessions.
};

/**
 * NAN Service Response Filter Attribute Bit.
 */
enum NanSrfType : uint32_t {
  BLOOM_FILTER = 0, // Use a Bloom filter.
  PARTIAL_MAC_ADDR, // Use a list of MAC addresses.
};

/**
 * NAN DP (data-path) channel config options.
 */
enum NanDataPathChannelCfg : uint32_t {
  CHANNEL_NOT_REQUESTED = 0, // No channel request is specified.
  REQUEST_CHANNEL_SETUP,     // Channel request is specified - but may be overridden by firmware.
  FORCE_CHANNEL_SETUP,       // Channel request is specified and must be respected. If the firmware
                             // cannot honor the request then the data-path request is rejected.
};

/**
 * NAN DP (data-path) security configuration options.
 */
enum NanDataPathSecurityType : uint32_t {
  OPEN,       // no security
  PMK,        // security: PMK
  PASSPHRASE, // security: passphrase
};

/**
 * NAN band-specific configuration.
 */
struct NanBandSpecificConfig {
  /**
   * RSSI values controlling clustering behavior per spec. RSSI values are specified without a sign,
   * e.g. a value of -65dBm would be specified as 65.
   */
  uint8_t rssiClose;  // NAN Spec: RSSI_close
  uint8_t rssiMiddle; // NAN Spec: RSSI_middle
  /**
   * RSSI value determining whether discovery is near (used if enabled in discovery by
   * |NanDiscoveryCommonConfig.useRssiThreshold|).
   * RSSI values are specified without a sign, e.g. a value of -65dBm would be specified as 65.
   * NAN Spec: RSSI_close_proximity
   */
  uint8_t rssiCloseProximity;
  /**
   * Dwell time of each discovery channel in milliseconds. If set to 0 then the firmware determines
   * the dwell time to use.
   */
  uint8_t dwellTimeMs;
  /**
   * Scan period of each discovery channel in seconds. If set to 0 then the firmware determines
   * the scan period to use.
   */
  uint16_t scanPeriodSec;
   /**
    * Specifies the discovery window interval for Sync beacons and SDF's.
    * Valid values of DW Interval are: 1, 2, 3, 4 and 5 corresponding to 1, 2, 4, 8, and 16 DWs.
    * Value of 0:
    *  - reserved in 2.4GHz band
    *  - no wakeup at all in 5GHz band
    * The publish/subscribe period values don't override this device level configurations if
    * it is specified.
    * Configuration is only used only if |validDiscoveryWindowIntervalVal| is set to true.
    * NAN Spec: Device Capability Attribute / 2.4 GHz DW, Device Capability Attribute / 5 GHz DW
    */
  bool validDiscoveryWindowIntervalVal;
  uint8_t discoveryWindowIntervalVal;
};

/**
 * Debug configuration parameters. Many of these allow non-standard-compliant operation and are
 * not intended for normal operational mode.
 */
struct NanDebugConfig {
  /**
   * Specification of the lower 2 bytes of the cluster ID. The cluster ID is 50-60-9a-01-00-00 to
   * 50-60-9a-01-FF-FF. Configuration of the bottom and top values of the range (which defaults to
   * 0x0000 and 0xFFFF respectively).
   * Configuration is only used if |validClusterIdVals| is set to true.
   */
  bool validClusterIdVals;
  uint16_t clusterIdBottomRangeVal;
  uint16_t clusterIdTopRangeVal;
  /**
   * NAN management interface address, if specified (|validIntfAddrVal| is true) then overrides any
   * other configuration (specifically the default randomization configured by
   * |NanConfigRequest.macAddressRandomizationIntervalSec|).
   */
  bool validIntfAddrVal;
  MacAddress intfAddrVal;
  /**
   * Combination of the 24 bit Organizationally Unique ID (OUI) and the 8 bit OUI Type.
   * Used if |validOuiVal| is set to true.
   */
  bool validOuiVal;
  uint32_t ouiVal;
  /**
   * Force the Random Factor to the specified value for all transmitted Sync/Discovery beacons.
   * Used if |validRandomFactorForceVal| is set to true.
   * NAN Spec: Master Indication Attribute / Random Factor
   */
  bool validRandomFactorForceVal;
  uint8_t randomFactorForceVal;
  /**
   * Forces the hop-count for all transmitted Sync and Discovery Beacons NO matter the real
   * hop-count being received over the air. Used if the |validHopCountForceVal}| flag is set to
   * true.
   * NAN Spec: Cluster Attribute / Anchor Master Information / Hop Count to Anchor Master
   */
  bool validHopCountForceVal;
  uint8_t hopCountForceVal;
  /**
   * Frequency in MHz to of the discovery channel in the specified band. Indexed by |NanBandIndex|.
   * Used if the |validDiscoveryChannelVal| is set to true.
   */
  bool validDiscoveryChannelVal;
  WifiChannelInMhz[2] discoveryChannelMhzVal;
  /**
   * Specifies whether sync/discovery beacons are transmitted in the specified band. Indexed by
   * |NanBandIndex|. Used if the |validUseBeaconsInBandVal| is set to true.
   */
  bool validUseBeaconsInBandVal;
  bool[2] useBeaconsInBandVal;
  /**
   * Specifies whether SDF (service discovery frames) are transmitted in the specified band. Indexed
   * by |NanBandIndex|. Used if the |validUseSdfInBandVal| is set to true.
   */
  bool validUseSdfInBandVal;
  bool[2] useSdfInBandVal;
};

/**
 * Configuration parameters of NAN: used when enabling and re-configuring a NAN cluster.
 */
struct NanConfigRequest {
  /**
   * Master preference of this device.
   * NAN Spec: Master Indication Attribute / Master Preference
   */
  uint8_t masterPref;
  /**
   * Controls whether or not the |IWifiNanIfaceEventCallback.eventClusterEvent| will be delivered
   * for |NanClusterEventType.DISCOVERY_MAC_ADDRESS_CHANGED|.
   */
  bool disableDiscoveryAddressChangeIndication;
  /**
   * Controls whether or not the |IWifiNanIfaceEventCallback.eventClusterEvent| will be delivered
   * for |NanClusterEventType.STARTED_CLUSTER|.
   */
  bool disableStartedClusterIndication;
  /**
   * Controls whether or not the |IWifiNanIfaceEventCallback.eventClusterEvent| will be delivered
   * for |NanClusterEventType.JOINED_CLUSTER|.
   */
  bool disableJoinedClusterIndication;
  /**
   * Control whether publish service IDs are included in Sync/Discovery beacons.
   * NAN Spec: Service ID List Attribute
   */
  bool includePublishServiceIdsInBeacon;
  /**
   * If |includePublishServiceIdsInBeacon| is true then specifies the number of publish service IDs
   * to include in the Sync/Discovery beacons:
   *  Value = 0: include as many service IDs as will fit into the maximum allowed beacon frame size.
   *  Value must fit within 7 bits - i.e. <= 127.
   */
  uint8_t numberOfPublishServiceIdsInBeacon;
  /**
   * Control whether subscribe service IDs are included in Sync/Discovery beacons.
   * Spec: Subscribe Service ID List Attribute
   */
  bool includeSubscribeServiceIdsInBeacon;
  /**
   * If |includeSubscribeServiceIdsInBeacon| is true then specifies the number of subscribe service
   * IDs to include in the Sync/Discovery beacons:
   *  Value = 0: include as many service IDs as will fit into the maximum allowed beacon frame size.
   *  Value must fit within 7 bits - i.e. <= 127.
   */
  uint8_t numberOfSubscribeServiceIdsInBeacon;
  /**
   * Number of samples used to calculate RSSI.
   */
  uint16_t rssiWindowSize;
  /**
   * Specifies the interval in seconds that the NAN management interface MAC address is randomized.
   * A value of 0 is used to disable the MAC address randomization
   */
  uint32_t macAddressRandomizationIntervalSec;
  /**
   * Additional configuration provided per band: indexed by |NanBandIndex|.
   */
  NanBandSpecificConfig[2] bandSpecificConfig;
};

/**
 * Enable requests for NAN: start-up configuration |IWifiNanIface.enableRequest|.
 */
struct NanEnableRequest {
  /**
   * Enable operation in a specific band: indexed by |NanBandIndex|.
   */
  bool[2] operateInBand;
  /**
   * Specify extent of cluster by specifying the max hop count.
   */
  uint8_t hopCountMax;
  /**
   * Configurations of NAN cluster operation. Can also be modified at run-time using
   * |IWifiNanIface.configRequest|.
   */
  NanConfigRequest configParams;
  /**
   * Non-standard configurations of NAN cluster operation - useful for debugging operations.
   */
  NanDebugConfig debugConfigs;
};

/**
 * Cipher suite flags.
 */
enum NanCipherSuiteType : uint32_t {
  NONE = 0, // No (open) security
  SHARED_KEY_128_MASK = 1 << 0, // NCS-SK-128
  SHARED_KEY_256_MASK = 1 << 1  // NCS-SK-256
};

/**
 * Ranging in the context of discovery sessions indication controls. Controls the frequency of
 * ranging-driven |IWifiNanIfaceEventCallback.eventMatch|.
 */
enum NanRangingIndication : uint32_t {
  CONTINUOUS_INDICATION_MASK = 1 << 0, // trigger event on every RTT measurement
  INGRESS_MET_MASK = 1 << 1,           // trigger event only when ingress conditions met
  EGRESS_MET_MASK = 1 << 2             // trigger event only when egress conditions met
};

/**
 * Configuration of NAN data-path security.
 */
struct NanDataPathSecurityConfig {
  /**
   * Security configuration of the data-path (NDP). Security is required if not equal to
   * |NanDataPathSecurityType.OPEN|.
   * NAN Spec: Service Discovery Extension Attribute (SDEA) / Control / Security Required
   */
  NanDataPathSecurityType securityType;
  /**
   * Cipher type for data-paths. If |securityType| is |NanDataPathSecurityType.OPEN| then must
   * be set to |NanCipherSuiteType.NONE|, otherwise a non-|NanCipherSuiteType.NONE| cipher suite
   * must be specified.
   */
  NanCipherSuiteType cipherType;
  /**
   * Optional Pairwise Master Key (PMK). Must be specified (and is only used) if |securityType| is
   * set to |NanDataPathSecurityType.PMK|.
   * Ref: IEEE 802.11i
   */
  uint8_t[32] pmk;
  /**
   * Optional Passphrase. Must be specified (and is only used) if |securityType| is set to
   * |NanDataPathSecurityType.PASSPHRASE|.
   * Min length: |MIN_PASSPHRASE_LENGTH|
   * Max length: |MAX_PASSPHRASE_LENGTH|
   * NAN Spec: Appendix: Mapping pass-phrase to PMK for NCS-SK Cipher Suites
   */
  vec<uint8_t> passphrase;
};

/**
 * Configurations of NAN discovery sessions: common to publish and subscribe discovery.
 */
struct NanDiscoveryCommonConfig {
  /**
   * The ID of the discovery session being configured. A value of 0 specifies a request to create
   * a new discovery session. The new discovery session ID is returned with
   * |IWifiNanIfaceEventCallback.notifyStartPublishResponse| or
   * |IWifiNanIfaceEventCallback.notifyStartSubscribeResponse|.
   * NAN Spec: Service Descriptor Attribute (SDA) / Instance ID
   */
  uint8_t sessionId;
  /**
   * The lifetime of the discovery session in seconds. A value of 0 means run forever or until
   * canceled using |IWifiIface.stopPublishRequest| or |IWifiIface.stopSubscribeRequest|.
   */
  uint16_t ttlSec;
  /**
   * Indicates the interval between two Discovery Windows in which the device supporting the
   * service is awake to transmit or receive the Service Discovery frames. Valid values of Awake
   * DW Interval are: 1, 2, 4, 8 and 16. A value of 0 will default to 1. Does not override
   * |NanBandSpecificConfig.discoveryWindowIntervalVal| configurations if those are specified.
   */
  uint16_t discoveryWindowPeriod;
  /**
   * The lifetime of the discovery session in number of transmitted SDF discovery packets. A value
   * of 0 means forever or until canceled using |IWifiIface.stopPublishRequest| or
   * |IWifiIface.stopSubscribeRequest|.
   */
  uint8_t discoveryCount;
  /**
   * UTF-8 encoded string identifying the service.
   * Max length: |NanCapabilities.maxServiceNameLen|.
   * NAN Spec: The only acceptable single-byte UTF-8 symbols for a Service Name are alphanumeric
   * values (A-Z, a-z, 0-9), the hyphen ('-'), and the period ('.'). All valid multi-byte UTF-8
   * characters are acceptable in a Service Name.
   */
  vec<uint8_t> serviceName;
  /**
   * Specifies how often to trigger |IWifiNanIfaceEventCallback.eventMatch| when continuously
   * discovering the same discovery session (with no changes).
   */
  NanMatchAlg discoveryMatchIndicator;
  /**
   * Arbitrary information communicated in discovery packets - there is no semantic meaning to these
   * bytes. They are passed-through from publisher to subscriber as-is with no parsing.
   * Max length: |NanCapabilities.maxServiceSpecificInfoLen|.
   * NAN Spec: Service Descriptor Attribute (SDA) / Service Info
   */
  vec<uint8_t> serviceSpecificInfo;
  /**
   * Arbitrary information communicated in discovery packets - there is no semantic meaning to these
   * bytes. They are passed-through from publisher to subscriber as-is with no parsing.
   * Max length: |NanCapabilities.maxExtendedServiceSpecificInfoLen|.
   * Spec: Service Descriptor Extension Attribute (SDEA) / Service Info
   */
  vec<uint8_t> extendedServiceSpecificInfo;
  /**
   * Ordered sequence of <length, value> pairs (|length| uses 1 byte and contains the number of
   * bytes in the |value| field) which specify further match criteria (beyond the service name).
   * The match behavior is specified in details in the NAN spec.
   * Publisher: used in SOLICITED or SOLICITED_UNSOLICITED sessions.
   * Subscriber: used in ACTIVE or PASSIVE sessions.
   * Max length: |NanCapabilities.maxMatchFilterLen|.
   * NAN Spec: matching_filter_rx
   */
  vec<uint8_t> rxMatchFilter;
  /**
   * Ordered sequence of <length, value> pairs (|length| uses 1 byte and contains the number of
   * bytes in the |value| field) which specify further match criteria (beyond the service name).
   * The match behavior is specified in details in the NAN spec.
   * Publisher: used if provided.
   * Subscriber: used (if provided) only in ACTIVE sessions.
   * Max length: |NanCapabilities.maxMatchFilterLen|.
   * NAN Spec: matching_filter_tx and Service Descriptor Attribute (SDA) / Matching Filter
   */
  vec<uint8_t> txMatchFilter;
  /**
   * Specifies whether or not the discovery session uses the
   * |NanBandSpecificConfig.rssiCloseProximity| value (configured in enable/configure requests) to
   * filter out matched discovered peers.
   * NAN Spec: Service Descriptor Attribute / Service Control / Discovery Range Limited.
   */
  bool useRssiThreshold;
  /**
   * Controls whether or not the |IWifiNanIfaceEventCallback.eventPublishTerminated| (for publish
   * discovery sessions) or |IWifiNanIfaceEventCallback.eventSubscribeTerminated| (for subscribe
   * discovery sessions) will be delivered.
   */
  bool disableDiscoveryTerminationIndication;
  /**
   * Controls whether or not the |IWifiNanIfaceEventCallback.eventMatchExpired| will be delivered.
   */
  bool disableMatchExpirationIndication;
  /**
   * Controls whether or not the |IWifiNanIfaceEventCallback.eventFollowupReceived| will be
   * delivered.
   */
  bool disableFollowupReceivedIndication;
  /**
   * Security configuration of data-paths created in the context of this discovery session. Security
   * parameters can be overridden during the actual construction of the data-path - allowing
   * individual data-paths to have unique PMKs or Passphrases.
   */
  NanDataPathSecurityConfig securityConfig;
  /**
   * Specifies whether or not there is a ranging requirement in this discovery session.
   * Ranging is only performed if all other match criteria with the peer are met. Ranging must
   * be performed if both peers in the discovery session (publisher and subscriber) set this
   * flag to true. Otherwise, if either peer sets this flag to false, ranging must not be performed
   * and must not impact discovery decisions.
   * Note: specifying that ranging is required also implies that this device must automatically
   * accept ranging requests from peers.
   * NAN Spec: Service Discovery Extension Attribute (SDEA) / Control / Ranging Require.
   */
  bool rangingRequired;
   /**
    * Interval in msec between two ranging measurements. Only relevant if |rangingRequired| is true.
    * If the Awake DW interval specified either in |discoveryWindowPeriod| or in
    * |NanBandSpecificConfig.discoveryWindowIntervalVal| is larger than the ranging interval then
    * priority is given to Awake DW interval.
    */
  uint32_t rangingIntervalMsec;
  /**
   * The type of ranging feedback to be provided by discovery session matches
   * |IWifiNanIfaceEventCallback.eventMatch|. Only relevant if |rangingRequired| is true.
   */
   bitfield<NanRangingIndication> configRangingIndications;
   /**
    * The ingress and egress distance in cm. If ranging is enabled (|rangingEnabled| is true) then
    * |configRangingIndications| is used to determine whether ingress and/or egress (or neither)
    * are used to determine whether a match has occurred.
    * NAN Spec: Service Discovery Extension Attribute (SDEA) / Ingress & Egress Range Limit
    */
   uint16_t distanceIngressCm;
   uint16_t distanceEgressCm;
};

/**
 * Publish request: specifies a publish discovery operation.
 */
struct NanPublishRequest {
  /**
   * Common configuration of discovery sessions.
   */
  NanDiscoveryCommonConfig baseConfigs;
  /**
   * The type of the publish discovery session.
   */
  NanPublishType publishType;
  /**
   * For publishType of |NanPublishType.SOLICITED| or |NanPublishType.UNSOLICITED_SOLICITED|
   * specifies the type of transmission used for responding to the probing subscribe discovery
   * peer.
   */
  NanTxType txType;
  /**
   * Specifies whether data-path requests |IWifiNanIfaceEventCallback.eventDataPathRequest| (in
   * the context of this discovery session) are automatically accepted (if true) - in which case
   * the Responder must not call the |IWifiNanIface.respondToDataPathIndicationRequest| method and
   * the device must automatically accept the data-path request and complete the negotiation.
   */
  bool autoAcceptDataPathRequests;
};

/**
 * Subscribe request: specifies a subscribe discovery operation.
 */
struct NanSubscribeRequest {
  /**
   * Common configuration of discovery sessions.
   */
  NanDiscoveryCommonConfig baseConfigs;
  /**
   * The type of the subscribe discovery session.
   */
  NanSubscribeType subscribeType;
  /**
   * For |NanSubscribeType.ACTIVE| subscribe discovery sessions specify how the Service Response
   * Filter (SRF) attribute is populated. Relevant only if |shouldUseSrf| is set to true.
   * NAN Spec: Service Descriptor Attribute (SDA) / Service Response Filter / SRF Control / SRF Type
   */
  NanSrfType srfType;
  /**
   * Configure whether inclusion of an address in |intfAddr| indicates that those devices should
   * respond or the reverse. Relevant only if |shouldUseSrf| is set to true and |srfType| is set to
   * |NanSrfType.PARTIAL_MAC_ADDR|.
   * NAN Spec: Service Descriptor Attribute (SDA) / Service Response Filter / SRF Control / Include
   */
  bool srfRespondIfInAddressSet;
  /**
   * Control whether the Service Response Filter (SRF) is used.
   * NAN Spec: Service Descriptor Attribute (SDA) / Service Control /
   *           Service Response Filter Present
   */
  bool shouldUseSrf;
  /**
   * Control whether the presence of |NanDiscoveryCommonConfig.serviceSpecificInfo| data is needed
   * in the publisher in order to trigger service discovery, i.e. a
   * |IWifiNanIfaceEventCallback.eventMatch|. The test is for presence of data - not for the
   * specific contents of the data.
   */
  bool isSsiRequiredForMatch;
  /**
   * NAN Interface Addresses constituting the Service Response Filter (SRF).
   * Max length (number of addresses): |NanCapabilities.maxSubscribeInterfaceAddresses|.
   * NAN Spec: Service Descriptor Attribute (SDA) / Service Response Filter / Address Set
   */
  vec<MacAddress> intfAddr;
};

/**
 * Transmit follow up message request.
 */
struct NanTransmitFollowupRequest {
  /**
   * ID of an active publish or subscribe discovery session. Follow-up message is transmitted in the
   * context of the discovery session.
   * NAN Spec: Service Descriptor Attribute (SDA) / Instance ID
   */
  uint8_t discoverySessionId;
  /**
   * ID of the peer. Obtained as part of an earlier |IWifiNanIfaceEventCallback.eventMatch| or
   * |IWifiNanIfaceEventCallback.eventFollowupReceived|.
   */
  uint32_t peerId;
  /**
   * MAC address of the peer. Obtained as part of an earlier |IWifiNanIfaceEventCallback.eventMatch|
   * or |IWifiNanIfaceEventCallback.eventFollowupReceived|.
   */
  MacAddress addr;
  /**
   * Should the follow-up message be transmitted with a high priority.
   */
  bool isHighPriority;
  /**
   * Should the follow-up message be transmitted in a discovery window (true) or a further
   * availability window (false).
   */
  bool shouldUseDiscoveryWindow;
  /**
   * Arbitrary information communicated to the peer - there is no semantic meaning to these
   * bytes. They are passed-through from sender to receiver as-is with no parsing.
   * Max length: |NanCapabilities.maxServiceSpecificInfoLen|.
   * NAN Spec: Service Descriptor Attribute (SDA) / Service Info
   */
  vec<uint8_t> serviceSpecificInfo;
  /**
   * Arbitrary information communicated in discovery packets - there is no semantic meaning to these
   * bytes. They are passed-through from publisher to subscriber as-is with no parsing.
   * Max length: |NanCapabilities.maxExtendedServiceSpecificInfoLen|.
   * Spec: Service Descriptor Extension Attribute (SDEA) / Service Info
   */
  vec<uint8_t> extendedServiceSpecificInfo;
  /**
   * Disable |IWifiNanIfaceEventCallback.eventTransmitFollowup| - i.e. do not get indication on
   * whether the follow-up was transmitted and received successfully.
   */
  bool disableFollowupResultIndication;
};

/**
 *  Data Path Initiator requesting a data-path.
 */
struct NanInitiateDataPathRequest {
  /**
   * ID of the peer. Obtained as part of an earlier |IWifiNanIfaceEventCallback.eventMatch| or
   * |IWifiNanIfaceEventCallback.eventFollowupReceived|.
   */
  uint32_t peerId;
  /**
   * NAN management interface MAC address of the peer. Obtained as part of an earlier
   * |IWifiNanIfaceEventCallback.eventMatch| or |IWifiNanIfaceEventCallback.eventFollowupReceived|.
   */
  MacAddress peerDiscMacAddr;
  /**
   * Config flag for channel request.
   */
  NanDataPathChannelCfg channelRequestType;
  /**
   * Channel frequency in MHz to start data-path. Not relevant if |channelRequestType| is
   * |NanDataPathChannelCfg.CHANNEL_NOT_REQUESTED|.
   */
  WifiChannelInMhz channel;
  /**
   * NAN data interface name on which this data-path session is to be initiated.
   * This must be an interface created using |IWifiNanIface.createDataInterfaceRequest|.
   */
  string ifaceName;
  /**
   * Security configuration of the requested data-path.
   */
  NanDataPathSecurityConfig securityConfig;
  /**
   * Arbitrary information communicated to the peer as part of the data-path setup process - there
   * is no semantic meaning to these bytes. They are passed-through from sender to receiver as-is
   * with no parsing.
   * Max length: |NanCapabilities.maxAppInfoLen|.
   * NAN Spec: Data Path Attributes / NDP Attribute / NDP Specific Info
   */
  vec<uint8_t> appInfo;
  /**
   * A service name to be used with |passphrase| to construct a Pairwise Master Key (PMK) for the
   * data-path. Only relevant when a data-path is requested which is not associated with a NAN
   * discovery session - e.g. using out-of-band discovery.
   * Constraints: same as |NanDiscoveryCommonConfig.serviceName|
   * NAN Spec: Appendix: Mapping pass-phrase to PMK for NCS-SK Cipher Suites
   */
  vec<uint8_t> serviceNameOutOfBand;
};

/**
 * Response to a data-path request from a peer.
 */
struct NanRespondToDataPathIndicationRequest {
  /**
   * Accept (true) or reject (false) the request.
   * NAN Spec: Data Path Attributes / NDP Attribute / Type and Status
   */
  bool acceptRequest;
  /**
   * ID of the data-path (NDP) for which we're responding - obtained as part of the request in
   * |IWifiNanIfaceEventCallback.eventDataPathRequest|.
   */
  uint32_t ndpInstanceId;
  /**
   * NAN data interface name on which this data-path session is to be started.
   * This must be an interface created using |IWifiNanIface.createDataInterfaceRequest|.
   */
  string ifaceName;
  /**
   * Security configuration of the requested data-path.
   */
  NanDataPathSecurityConfig securityConfig;
  /**
   * Arbitrary information communicated to the peer as part of the data-path setup process - there
   * is no semantic meaning to these bytes. They are passed-through from sender to receiver as-is
   * with no parsing.
   * Max length: |NanCapabilities.maxAppInfoLen|.
   * NAN Spec: Data Path Attributes / NDP Attribute / NDP Specific Info
   */
  vec<uint8_t> appInfo;
  /**
   * A service name to be used with |passphrase| to construct a Pairwise Master Key (PMK) for the
   * data-path. Only relevant when a data-path is requested which is not associated with a NAN
   * discovery session - e.g. using out-of-band discovery.
   * Constraints: same as |NanDiscoveryCommonConfig.serviceName|
   * NAN Spec: Appendix: Mapping pass-phrase to PMK for NCS-SK Cipher Suites
   */
  vec<uint8_t> serviceNameOutOfBand;
};

/**
 * NDP Capabilities response.
 */
struct NanCapabilities {
  /**
   * Maximum number of clusters which the device can join concurrently.
   */
  uint32_t maxConcurrentClusters;
  /**
   * Maximum number of concurrent publish discovery sessions.
   */
  uint32_t maxPublishes;
  /**
   * Maximum number of concurrent subscribe discovery sessions.
   */
  uint32_t maxSubscribes;
  /**
   * Maximum length (in bytes) of service name.
   */
  uint32_t maxServiceNameLen;
  /**
   * Maximum length (in bytes) of individual match filters.
   */
  uint32_t maxMatchFilterLen;
  /**
   * Maximum length (in bytes) of aggregate match filters across all active sessions.
   */
  uint32_t maxTotalMatchFilterLen;
  /**
   * Maximum length (in bytes) of the service specific info field.
   */
  uint32_t maxServiceSpecificInfoLen;
  /**
   * Maximum length (in bytes) of the extended service specific info field.
   */
  uint32_t maxExtendedServiceSpecificInfoLen;
  /**
   * Maximum number of data interfaces (NDI) which can be created concurrently on the device.
   */
  uint32_t maxNdiInterfaces;
  /**
   * Maximum number of data paths (NDP) which can be created concurrently on the device, across all
   * data interfaces (NDI).
   */
  uint32_t maxNdpSessions;
  /**
   * Maximum length (in bytes) of application info field (used in data-path negotiations).
   */
  uint32_t maxAppInfoLen;
  /**
   * Maximum number of transmitted followup messages which can be queued by the firmware.
   */
  uint32_t maxQueuedTransmitFollowupMsgs;
  /**
   * Maximum number MAC interface addresses which can be specified to a subscribe discovery session.
   */
  uint32_t maxSubscribeInterfaceAddresses;
  /**
   * The set of supported Cipher suites. The |NanCipherSuiteType| bit fields are used.
   */
  bitfield<NanCipherSuiteType> supportedCipherSuites;
};

/**
 * Match indication structure
 */
struct NanMatchInd {
  /**
   * Publish or subscribe discovery session ID of an existing discovery session.
   * NAN Spec: Service Descriptor Attribute (SDA) / Instance ID
   */
  uint8_t discoverySessionId;
  /**
   * A unique ID of the peer. Can be subsequently used in |IWifiNanIface.transmitFollowupRequest| or
   * to set up a data-path.
   */
  uint32_t peerId;
  /**
   * The NAN Discovery (management) MAC address of the peer.
   */
  MacAddress addr;
  /**
   * The arbitrary information contained in the |NanDiscoveryCommonConfig.serviceSpecificInfo| of
   * the peer's discovery session configuration.
   * Max length: |NanCapabilities.maxServiceSpecificInfoLen|.
   * NAN Spec: Service Descriptor Attribute (SDA) / Service Info
   */
  vec<uint8_t> serviceSpecificInfo;
  /**
   * Arbitrary information communicated in discovery packets - there is no semantic meaning to these
   * bytes. They are passed-through from publisher to subscriber as-is with no parsing.
   * Max length: |NanCapabilities.maxExtendedServiceSpecificInfoLen|.
   * Spec: Service Descriptor Extension Attribute (SDEA) / Service Info
   */
  vec<uint8_t> extendedServiceSpecificInfo;
  /**
   * The match filter from the discovery packet (publish or subscribe) which caused service
   * discovery. Matches the |NanDiscoveryCommonConfig.txMatchFilter| of the peer's Unsolicited
   * publish message or of the local device's Active subscribe message.
   * Max length: |NanCapabilities.maxMatchFilterLen|.
   * NAN Spec: Service Descriptor Attribute (SDA) / Matching Filter
   */
  vec<uint8_t> matchFilter;
  /**
   * Indicates the type of discovery: true if match occurred on a Beacon frame, false if the match
   * occurred on a Service Discovery Frames (SDF).
   */
  bool matchOccuredInBeaconFlag;
  /**
   * Flag to indicate firmware is out of resource and that it can no longer track this Service Name.
   * Indicates that while |IWifiNanIfaceEventCallback.eventMatch| will be received, the
   * |NanDiscoveryCommonConfig.discoveryMatchIndicator| configuration will not be honored.
   */
  bool outOfResourceFlag;
  /**
   * If RSSI filtering was enabled using |NanDiscoveryCommonConfig.useRssiThreshold| in discovery
   * session setup then this field contains the received RSSI value. It will contain 0 if RSSI
   * filtering was not enabled.
   * RSSI values are returned without sign, e.g. -70dBm will be returned as 70.
   */
  uint8_t rssiValue;
  /**
   * Cipher type for data-paths constructed in the context of this discovery session. Valid if
   * |peerRequiresSecurityEnabledInNdp| is true.
   */
  NanCipherSuiteType peerCipherType;
  /**
   * Indicates whether or not the peer requires security enabled in any data-path (NDP) constructed
   * in the context of this discovery session. The |cipherType| specifies the cipher type for such
   * data-paths.
   * NAN Spec: Service Discovery Extension Attribute (SDEA) / Control / Security Required
   */
  bool peerRequiresSecurityEnabledInNdp;
  /**
   * Indicates whether or not the peer requires (and hence allows) ranging in the context of this
   * discovery session.
   * Note that ranging is only performed if all other match criteria with the peer are met.
   * NAN Spec: Service Discovery Extension Attribute (SDEA) / Control / Ranging Require.
   */
  bool peerRequiresRanging;
  /**
   * Ranging indication supersedes the NanMatchAlg specification.
   * Ex: If NanMatchAlg is MATCH_ONCE, but ranging indications is continuous then continuous
   * match notifications will be received (with ranging information).
   * Ranging indication data is provided if Ranging required is enabled in the discovery
   * specification and:
   *   1) continuous ranging specified.
   *   2) ingress/egress specified and:
   *       - notify once for ingress >= ingress_distance and egress <= egress_distance,
   *       - same for ingress_egress_both
   * If the Awake DW intervals are larger than the ranging intervals then priority is given to the
   * device DW intervals.
   *
   * If ranging was required and executed contains the distance to the peer in CM. The
   * |rangingIndicationType| field specifies the event which triggered ranging.
   */
  uint32_t rangingMeasurementInCm;
  /**
   * The ranging event(s) which triggered the ranging. E.g. can indicate that continuous ranging was
   * requested, or else that an ingress event occurred.
   */
   bitfield<NanRangingIndication> rangingIndicationType;
};

/**
 * Followup message received from peer indication structure.
 */
struct NanFollowupReceivedInd {
  /**
   * Discovery session (publish or subscribe) ID of a previously created discovery session. The
   * message is received in the context of this discovery session.
   * NAN Spec: Service Descriptor Attribute (SDA) / Instance ID
   */
  uint8_t discoverySessionId;
  /**
   * A unique ID of the peer. Can be subsequently used in |IWifiNanIface.transmitFollowupRequest| or
   * to set up a data-path.
   */
  uint32_t peerId;
  /**
   * The NAN Discovery (management) MAC address of the peer.
   */
  MacAddress addr;
  /**
   * Indicates whether received in a further availability window (FAW) if true, or in a discovery
   * window (DW) if false.
   */
  bool receivedInFaw;
  /**
   * Received message from the peer - there is no semantic meaning to these bytes. They are
   * passed-through from sender to receiver as-is with no parsing.
   * Max length: |NanCapabilities.maxServiceSpecificInfoLen|.
   * NAN Spec: Service Descriptor Attribute (SDA) / Service Info
   */
  vec<uint8_t> serviceSpecificInfo;
  /**
   * Arbitrary information communicated in discovery packets - there is no semantic meaning to these
   * bytes. They are passed-through from publisher to subscriber as-is with no parsing.
   * Max length: |NanCapabilities.maxExtendedServiceSpecificInfoLen|.
   * Spec: Service Descriptor Extension Attribute (SDEA) / Service Info
   */
  vec<uint8_t> extendedServiceSpecificInfo;
};

/**
 * Event types for a cluster event indication.
 */
enum NanClusterEventType : uint32_t {
  /**
   * Management/discovery interface MAC address has changed (e.g. due to randomization or at
   * startup).
   */
  DISCOVERY_MAC_ADDRESS_CHANGED = 0,
  /**
   * A new cluster has been formed by this device.
   */
  STARTED_CLUSTER,
  /**
   * This device has joined an existing cluster.
   */
  JOINED_CLUSTER,
};

/**
 * Cluster event indication structure: triggered on events impacting how this device is
 * visible to peers - cluster forming, joining a new cluster, or changing of the MAC address.
 */
struct NanClusterEventInd {
  /**
   * Event type causing the cluster event indication to be triggered.
   */
  NanClusterEventType eventType;
  /**
   * MAC Address associated with the corresponding event.
   */
  MacAddress addr;
};

/**
 * NAN Data path request Indication Message structure.
 * Event indication received by an intended Responder when a Nan Data request initiated by an
 * Initiator.
 */
struct NanDataPathRequestInd {
  /**
   * ID of an active publish or subscribe discovery session - the data-path request is in the
   * context of this discovery session.
   * NAN Spec: Data Path Attributes / NDP Attribute / Publish ID
   */
  uint8_t discoverySessionId;
  /**
   * MAC address of the Initiator peer. This is the MAC address of the peer's management/discovery
   * NAN interface.
   */
  MacAddress peerDiscMacAddr;
  /**
   * ID of the data-path - used to identify the data-path in further negotiation/APIs.
   */
  uint32_t ndpInstanceId;
  /**
   * Specifies whether or not security is required by the peer for the data-path being created.
   * NAN Spec: Data Path Attributes / NDP Attribute / NDP Control / Security Present
   */
  bool securityRequired;
  /**
   * Arbitrary information communicated from the peer as part of the data-path setup process - there
   * is no semantic meaning to these bytes. They are passed-through from sender to receiver as-is
   * with no parsing.
   * Max length: |NanCapabilities.maxAppInfoLen|.
   * NAN Spec: Data Path Attributes / NDP Attribute / NDP Specific Info
   */
  vec<uint8_t> appInfo;
};

/**
 * NAN Data path confirmation Indication structure.
 * Event indication is received on both initiator and responder side when negotiation for a
 * data-path finish: on success or failure.
 */
struct NanDataPathConfirmInd {
  /**
   * ID of the data-path.
   */
  uint32_t ndpInstanceId;
  /**
   * Indicates whether the data-path setup succeeded (true) or failed (false).
   */
  bool dataPathSetupSuccess;
  /**
   * MAC address of the peer's data-interface (not it's management/discovery interface).
   */
  MacAddress peerNdiMacAddr;
  /**
   * Arbitrary information communicated from the peer as part of the data-path setup process - there
   * is no semantic meaning to these bytes. They are passed-through from sender to receiver as-is
   * with no parsing.
   * Max length: |NanCapabilities.maxAppInfoLen|.
   * NAN Spec: Data Path Attributes / NDP Attribute / NDP Specific Info
   */
  vec<uint8_t> appInfo;
  /**
   * Failure reason if |dataPathSetupSuccess| is false.
   */
  WifiNanStatus status;
};

/**
 * RTT specific types.
 * TODO(b/32159498): Move to a separate rtt_types.hal.
 */
/**
 * Ranging status.
 */
enum RttStatus : uint32_t {
  SUCCESS = 0,
  /** General failure status */
  FAILURE = 1,
  /** Target STA does not respond to request */
  FAIL_NO_RSP = 2,
  /** Request rejected. Applies to 2-sided RTT only */
  FAIL_REJECTED = 3,
  FAIL_NOT_SCHEDULED_YET = 4,
  /** Timing measurement times out */
  FAIL_TM_TIMEOUT = 5,
  /** Target on different channel, cannot range */
  FAIL_AP_ON_DIFF_CHANNEL = 6,
  /** Ranging not supported */
  FAIL_NO_CAPABILITY = 7,
  /** Request aborted for unknown reason */
  ABORTED = 8,
  /** Invalid T1-T4 timestamp */
  FAIL_INVALID_TS = 9,
  /** 11mc protocol failed */
  FAIL_PROTOCOL = 10,
  /** Request could not be scheduled */
  FAIL_SCHEDULE = 11,
  /** Responder cannot collaborate at time of request */
  FAIL_BUSY_TRY_LATER = 12,
  /** Bad request args */
  INVALID_REQ = 13,
  /** WiFi not enabled. */
  NO_WIFI = 14,
  /** Responder overrides param info, cannot range with new params */
  FAIL_FTM_PARAM_OVERRIDE = 15,
};

/**
 * RTT peer types.
 */
enum RttPeerType : uint32_t {
  AP = 0x1,
  STA = 0x2,
  P2P_GO = 0x3,
  P2P_CLIENT = 0x4,
  NAN = 0x5,
};

/**
 * RTT Measurement Bandwidth.
 */
enum RttBw : uint32_t {
  BW_5MHZ = 0x01,
  BW_10MHZ = 0x02,
  BW_20MHZ = 0x04,
  BW_40MHZ = 0x08,
  BW_80MHZ = 0x10,
  BW_160MHZ = 0x20,
};

/**
 * RTT Measurement Preamble.
 */
enum RttPreamble : uint32_t {
  LEGACY = 0x1,
  HT = 0x2,
  VHT = 0x4,
};

/**
 * RTT Types.
 */
enum RttType : uint32_t {
  ONE_SIDED = 0x1,
  TWO_SIDED = 0x2,
};

/**
 * RTT configuration.
 */
struct RttConfig {
  /**
   * Peer device mac address.
   */
  MacAddress addr;
  /**
   * 1-sided or 2-sided RTT.
   */
  RttType type;
  /**
   * Optional - peer device hint (STA, P2P, AP).
   */
  RttPeerType peer;
  /**
   * Required for STA-AP mode, optional for P2P, NBD etc.
   */
  WifiChannelInfo channel;
  /**
   * Time interval between bursts (units: 100 ms).
   * Applies to 1-sided and 2-sided RTT multi-burst requests.
   * Range: 0-31, 0: no preference by initiator (2-sided RTT).
   */
  uint32_t burstPeriod;
  /**
   * Total number of RTT bursts to be executed. It will be
   * specified in the same way as the parameter "Number of
   * Burst Exponent" found in the FTM frame format. It
   * applies to both: 1-sided RTT and 2-sided RTT. Valid
   * values are 0 to 15 as defined in 802.11mc std.
   * 0 means single shot
   * The implication of this parameter on the maximum
   * number of RTT results is the following:
   * for 1-sided RTT: max num of RTT results = (2^num_burst)*(num_frames_per_burst)
   * for 2-sided RTT: max num of RTT results = (2^num_burst)*(num_frames_per_burst - 1)
   */
  uint32_t numBurst;
  /**
   * Num of frames per burst.
   * Minimum value = 1, Maximum value = 31
   * For 2-sided this equals the number of FTM frames
   * to be attempted in a single burst. This also
   * equals the number of FTM frames that the
   * initiator will request that the responder send
   * in a single frame.
   */
  uint32_t numFramesPerBurst;
  /**
   * Number of retries for a failed RTT frame.
   * Applies to 1-sided RTT only. Minimum value = 0, Maximum value = 3
   */
  uint32_t numRetriesPerRttFrame;
  /** Following fields are only valid for 2-side RTT. */
  /**
   * Maximum number of retries that the initiator can
   * retry an FTMR frame.
   * Minimum value = 0, Maximum value = 3
   */
  uint32_t numRetriesPerFtmr;
  /**
   * Whether to request location civic info or not.
   */
  bool mustRequestLci;
  /**
   * Whether to request location civic records or not.
   */
  bool mustRequestLcr;
  /**
   * Applies to 1-sided and 2-sided RTT. Valid values will
   * be 2-11 and 15 as specified by the 802.11mc std for
   * the FTM parameter burst duration. In a multi-burst
   * request, if responder overrides with larger value,
   * the initiator will return failure. In a single-burst
   * request if responder overrides with larger value,
   * the initiator will sent TMR_STOP to terminate RTT
   * at the end of the burst_duration it requested.
   */
  uint32_t burstDuration;
  /**
   * RTT preamble to be used in the RTT frames.
   */
  RttPreamble preamble;
  /**
   * RTT BW to be used in the RTT frames.
   */
  RttBw bw;
};

/**
 * RTT results.
 */
struct RttResult {
  /**
   * Peer device mac address.
   */
  MacAddress addr;
  /**
   * Burst number in a multi-burst request.
   */
  uint32_t burstNum;
  /**
   * Total RTT measurement frames attempted.
   */
  uint32_t measurementNumber;
  /**
   * Total successful RTT measurement frames.
   */
  uint32_t successNumber;
  /**
   * Maximum number of "FTM frames per burst" supported by
   * the responder STA. Applies to 2-sided RTT only.
   * If reponder overrides with larger value:
   * - for single-burst request initiator will truncate the
   * larger value and send a TMR_STOP after receiving as
   * many frames as originally requested.
   * - for multi-burst request, initiator will return
   * failure right away.
   */
  uint8_t numberPerBurstPeer;
  /**
   * Ranging status.
   */
  RttStatus status;
  /**
   * When status == RTT_STATUS_FAIL_BUSY_TRY_LATER,
   * this will be the time provided by the responder as to
   * when the request can be tried again. Applies to 2-sided
   * RTT only. In sec, 1-31sec.
   */
  uint8_t retryAfterDuration;
  /**
   * RTT type.
   */
  RttType type;
  /**
   * Average rssi in 0.5 dB steps e.g. 143 implies -71.5 dB.
   */
  Rssi rssi;
  /**
   * Rssi spread in 0.5 dB steps e.g. 5 implies 2.5 dB spread (optional).
   */
  Rssi rssiSpread;
  /**
   * 1-sided RTT: TX rate of RTT frame.
   * 2-sided RTT: TX rate of initiator's Ack in response to FTM frame.
   */
  WifiRateInfo txRate;
  /**
   * 1-sided RTT: TX rate of Ack from other side.
   * 2-sided RTT: TX rate of FTM frame coming from responder.
   */
  WifiRateInfo rxRate;
  /**
   * Round trip time in picoseconds
   */
  TimeSpanInPs rtt;
  /**
   * Rtt standard deviation in picoseconds.
   */
  TimeSpanInPs rttSd;
  /**
   * Difference between max and min rtt times recorded in picoseconds.
   */
  TimeSpanInPs rttSpread;
  /**
   * Distance in mm (optional).
   */
  int32_t distanceInMm;
  /**
   * Standard deviation in mm (optional).
   */
  int32_t distanceSdInMm;
  /**
   * Difference between max and min distance recorded in mm (optional).
   */
  int32_t distanceSpreadInMm;
  /**
   * Time of the measurement (in microseconds since boot).
   */
  TimeStampInUs timeStampInUs;
  /**
   * in ms, actual time taken by the FW to finish one burst
   * measurement. Applies to 1-sided and 2-sided RTT.
   */
  uint32_t burstDurationInMs;
  /**
   * Number of bursts allowed by the responder. Applies
   * to 2-sided RTT only.
   */
  uint32_t negotiatedBurstNum;
  /**
   * for 11mc only.
   */
  WifiInformationElement lci;
  /**
   * for 11mc only.
   */
  WifiInformationElement lcr;
};

/**
 * RTT Capabilities.
 */
struct RttCapabilities {
  /**
   * if 1-sided rtt data collection is supported.
   */
  bool rttOneSidedSupported;
  /**
   * if ftm rtt data collection is supported.
   */
  bool rttFtmSupported;
  /**
   * if initiator supports LCI request. Applies to 2-sided RTT.
   */
  bool lciSupported;
  /**
   * if initiator supports LCR request. Applies to 2-sided RTT.
   */
  bool lcrSupported;
  /**
   * if 11mc responder mode is supported.
   */
  bool responderSupported;
  /**
   * Bit mask indicates what preamble is supported by initiator.
   * Combination of |RttPreamble| values.
   */
  bitfield<RttPreamble> preambleSupport;
  /**
   * Bit mask indicates what BW is supported by initiator.
   * Combination of |RttBw| values.
   */
  bitfield<RttBw> bwSupport;
  /**
   * Draft 11mc spec version supported by chip.
   * For instance, version 4.0 must be 40 and version 4.3 must be 43 etc.
   */
  uint8_t mcVersion;
};

/**
 * Structs for setting LCI/LCR information to be provided to a requestor.
 */
enum RttMotionPattern : uint32_t {
  /**
   * Not expected to change location.
   */
  NOT_EXPECTED = 0,
  /**
   * Expected to change location.
   */
  EXPECTED = 1,
  /**
   * Movement pattern unknown.
   */
  UNKNOWN = 2,
};

/**
 * Movement pattern unknown.
 */
struct RttLciInformation {
  /**
   * latitude in degrees * 2^25 , 2's complement.
   */
  int64_t latitude;
  /**
   * longitude in degrees * 2^25 , 2's complement.
   */
  int64_t longitude;
  /**
   * Altitude in units of 1/256 m.
   */
  int32_t altitude;
  /**
   * As defined in Section 2.3.2 of IETF RFC 6225.
   */
  uint8_t latitudeUnc;
  /**
   * As defined in Section 2.3.2 of IETF RFC 6225.
   */
  uint8_t longitudeUnc;
  /**
   * As defined in Section 2.4.5 from IETF RFC 6225.
   */
  uint8_t altitudeUnc;
  /** Following element for configuring the Z subelement. */
  /**
   * Motion pattern type.
   */
  RttMotionPattern motionPattern;
  /**
   * Floor in units of 1/16th of floor. 0x80000000 if unknown.
   */
  int32_t floor;
  /**
   * in units of 1/64 m.
   */
  int32_t heightAboveFloor;
  /**
   * in units of 1/64 m. 0 if unknown
   */
  int32_t heightUnc;
};

struct RttLcrInformation {
  /**
   * Country code symbol.
   */
  int8_t[2] countryCode;
  /**
   * Civic info to be copied in FTM frame.
   */
  string civicInfo;
};

/***
 * RTT Responder information
 */
struct RttResponder {
  WifiChannelInfo channel;
  RttPreamble preamble;
};

/**
 * Debug data specific types.
 * TODO(b/32159498): Move to a separate debug_types.hal.
 */
typedef uint32_t WifiRingBufferId;

/**
 * Flags describing each debug ring buffer.
 */
enum WifiDebugRingBufferFlags : uint32_t {
  HAS_BINARY_ENTRIES = 1 << 0,
  HAS_ASCII_ENTRIES = 1 << 1,
  HAS_PER_PACKET_ENTRIES = 1 << 2,
};

/**
 * Struct describing each debug ring buffer supported by
 * the device.
 */
struct WifiDebugRingBufferStatus {
  /**
   * Name of this debug ring buffer.
   */
  string ringName;
  /**
   * Combination of |WifiDebugRingBufferFlags| values.
   */
  uint32_t flags;
  /**
   * Unique integer representing the ring.
   */
  WifiRingBufferId ringId;
  /**
   * Total memory size allocated for the buffer.
   */
  uint32_t sizeInBytes;
  /**
   * Amount of free space in the buffer.
   */
  uint32_t freeSizeInBytes;
  /**
   * Verbose level for ring buffer.
   */
  uint32_t verboseLevel;
};

/**
 * Verbose logging level to set for each debug ring buffer supported
 * by the device.
 */
enum WifiDebugRingBufferVerboseLevel : uint32_t {
  /**
   * Level 0 corresponds to no collection, and it makes log handler
   * stop by no more events from driver.
   */
  NONE = 0,
  /**
   * Level 1 correspond to normal log level, with minimal user impact.
   * This is the default value.
   */
  DEFAULT = 1,
  /**
   * Level 2 is enabled when user is lazily trying to reproduce a problem,
   * wifi performances and power can be impacted but device should not
   * otherwise be significantly impacted.
   */
  VERBOSE = 2,
  /**
   * Level 3 is used when trying to actively debug a problem.
   * This will cause sever performance degradation.
   */
  EXCESSIVE = 3
};

/**
 * Enum describing the fate of the TX packets.
 */
enum WifiDebugTxPacketFate : uint32_t {
  /**
   * Sent over air and ACKed.
   */
  ACKED,
  /**
   * Sent over air but not ACKed. (Normal for broadcast/multicast.)
   */
  SENT,
  /**
   * Queued within firmware, but not yet sent over air.
   */
  FW_QUEUED,
  /**
   * Dropped by firmware as invalid. E.g. bad source address, bad checksum,
   * or invalid for current state.
   */
  FW_DROP_INVALID,
  /**
   * Dropped by firmware due to lack of buffer space.
   */
  FW_DROP_NOBUFS,
  /**
   * Dropped by firmware for any other reason. Includes frames that  were sent
   * by driver to firmware, but unaccounted for by  firmware.
   */
  FW_DROP_OTHER,
  /**
   * Queued within driver, not yet sent to firmware.
   */
  DRV_QUEUED,
  /**
   * Dropped by driver as invalid. E.g. bad source address, or invalid for
   * current state.
   */
  DRV_DROP_INVALID,
  /**
   * Dropped by driver due to lack of buffer space.
   */
  DRV_DROP_NOBUFS,
  /**
   * Dropped by driver for any other reason.
   */
  DRV_DROP_OTHER,
};

/**
 * Enum describing the fate of the TX packets.
 */
enum WifiDebugRxPacketFate : uint32_t {
  /**
   * Valid and delivered to network stack (e.g., netif_rx()).
   */
  SUCCESS,
  /**
   * Queued within firmware, but not yet sent to driver.
   */
  FW_QUEUED,
  /**
   * Dropped by firmware due to host-programmable filters.
   */
  FW_DROP_FILTER,
  /**
   * Dropped by firmware as invalid. E.g. bad checksum, decrypt failed,
   * or invalid for current state.
   */
  FW_DROP_INVALID,
  /**
   * Dropped by firmware due to lack of buffer space.
   */
  FW_DROP_NOBUFS,
  /**
   * Dropped by firmware for any other reason.
   */
  FW_DROP_OTHER,
  /**
   * Queued within driver, not yet delivered to network stack.
   */
  DRV_QUEUED,
  /**
   * Dropped by driver due to filter rules.
   */
  DRV_DROP_FILTER,
  /**
   * Dropped by driver as invalid. E.g. not permitted in current state.
   */
  DRV_DROP_INVALID,
  /**
   * Dropped by driver due to lack of buffer space.
   */
  DRV_DROP_NOBUFS,
  /**
   * Dropped by driver for any other reason.
   */
  DRV_DROP_OTHER,
};

/**
 * Type of frame transmitted/received.
 */
enum WifiDebugPacketFateFrameType : uint32_t {
  UNKNOWN,
  ETHERNET_II,
  MGMT_80211,
};

/**
 * Information regarding the frame transmitted/received.
 */
struct WifiDebugPacketFateFrameInfo {
  /**
   * The type of MAC-layer frame that this frame_info holds.
   * - For data frames, use FRAME_TYPE_ETHERNET_II.
   * - For management frames, use FRAME_TYPE_80211_MGMT.
   * - If the type of the frame is unknown, use FRAME_TYPE_UNKNOWN.
   */
  WifiDebugPacketFateFrameType frameType;
  /**
   * The number of bytes included in |frameContent|.
   * If the frame  contents are missing (e.g. RX frame dropped in firmware),
   * |frameLen| must be set to 0.
   */
  uint64_t frameLen;
  /**
   * Host clock when this frame was received by the driver (either  outbound
   * from the host network stack, or inbound from the firmware).
   * - The timestamp must be taken from a clock which includes time the host
   *   spent suspended (e.g. ktime_get_boottime()).
   * - If no host timestamp is available (e.g. RX frame was dropped in firmware),
   *   this field must be set to 0.
   */
  TimeStampInUs driverTimestampUsec;
  /**
   * Firmware clock when this frame was received by the firmware
   * (either outbound from the host, or inbound from a remote  station).
   * - The timestamp must be taken from a clock which includes time firmware
   *   spent suspended (if applicable).
   * - If no firmware timestamp is available (e.g. TX frame was dropped by
   *   driver), this field must be set to 0.
   * - Consumers of |frameInfo| must not assume any synchronization between
   *   driver and firmware clocks.
   */
  TimeStampInUs firmwareTimestampUsec;
  /**
   * Actual frame content. This is the raw bytes of the corresponding packet.
   * - Should be provided for TX frames originated by the host.
   * - Should be provided for RX frames received by the driver.
   * - Optionally provided for TX frames originated by firmware.
   *   (At discretion of HAL implementation.)
   * - Optionally provided for RX frames dropped in firmware.
   *   (At discretion of HAL implementation.)
   * - If frame content is not provided, |frameLen| must be set to 0.
   */
  vec<uint8_t> frameContent;
};

/**
 * Struct describing packet fate report for each Tx frame.
 */
struct WifiDebugTxPacketFateReport {
  WifiDebugTxPacketFate fate;
  WifiDebugPacketFateFrameInfo frameInfo;
};

/**
 * Struct describing packet fate report for each Rx frame.
 */
struct WifiDebugRxPacketFateReport {
  WifiDebugRxPacketFate fate;
  WifiDebugPacketFateFrameInfo frameInfo;
};

/**
 * Struct capturing the count of all rx packets that caused
 * host wakeup.
 */
struct WifiDebugHostWakeReasonRxPacketDetails {
  /**
   * Total rx unicast packet which woke up host.
   */
  uint32_t rxUnicastCnt;
  /**
   * Total rx multicast packet which woke up host.
   */
  uint32_t rxMulticastCnt;
  /**
   * Total rx broadcast packet which woke up host.
   */
  uint32_t rxBroadcastCnt;
};

/**
 * Struct capturing the count of all rx multicast packets that caused
 * host wakeup.
 */
struct WifiDebugHostWakeReasonRxMulticastPacketDetails {
  /**
   * Rx wake packet was ipv4 multicast.
   */
  uint32_t ipv4RxMulticastAddrCnt;
  /**
   * Rx wake packet was ipv6 multicast.
   */
  uint32_t ipv6RxMulticastAddrCnt;
  /**
   * Rx wake packet was non-ipv4 and non-ipv6.
   */
  uint32_t otherRxMulticastAddrCnt;
};

/**
 * Struct capturing the count of all rx ICMP packets that caused
 * host wakeup.
 */
struct WifiDebugHostWakeReasonRxIcmpPacketDetails {
  /**
   * Wake icmp packet count.
   */
  uint32_t icmpPkt;
  /**
   * Wake icmp6 packet count.
   */
  uint32_t icmp6Pkt;
  /**
   * Wake icmp6 RA packet count.
   */
  uint32_t icmp6Ra;
  /**
   * Wake icmp6 NA packet count.
   */
  uint32_t icmp6Na;
  /**
   * Wake icmp6 NS packet count.
   */
  uint32_t icmp6Ns;
};

/**
 * Structure capturing the count of all the wireless related host wakeup.
 * This is used to capture all the reasons why the host processor
 * (WLAN driver) was woken up by the WLAN firmware.
 * These stats may be used to debug any power issues caused due to frequent
 * wakeup of the host processor by the WLAN firmware.
 */
struct WifiDebugHostWakeReasonStats {
  /**
   * Total count of cmd/event wakes.
   * These must account for all wakeups due to WLAN management
   * commands/events received over the air.
   */
  uint32_t totalCmdEventWakeCnt;
  /**
   * Vector of wake counts per cmd/event type.
   * The number of command types and their meaning is only understood by the
   * vendor.
   */
  vec<uint32_t> cmdEventWakeCntPerType;
  /**
   * Total count of drive/fw wakes.
   * These must account for all wakeups due to local driver/firmware
   * interactions. These include all vendor implementation specific
   * interactions like any heart-beat monitoring, Bus management, etc.
   */
  uint32_t totalDriverFwLocalWakeCnt;
  /**
   * Vector of wake counts per driver/firmware interaction type.
   * The number of command types and their meaning is only understood by the
   * vendor.
   */
  vec<uint32_t> driverFwLocalWakeCntPerType;
  /**
   * Total data rx packets, that woke up host.
   */
  uint32_t totalRxPacketWakeCnt;
  WifiDebugHostWakeReasonRxPacketDetails rxPktWakeDetails;
  WifiDebugHostWakeReasonRxMulticastPacketDetails rxMulticastPkWakeDetails;
  WifiDebugHostWakeReasonRxIcmpPacketDetails rxIcmpPkWakeDetails;
};
