// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.wlan.stats;

// LINT.IfChange

/// Histogram bucket.
type HistBucket = struct {
    /// Index into a lookup table for each histogram type. The lookup table for each type is
    /// described below in the comments for each type.
    bucket_index uint16;
    /// The count of samples in the bucket.
    num_samples uint64;
};

/// All histograms have a fixed number of buckets. To save space, each histogram type
/// uses a vector to hold only non-empty buckets (a sparse histogram), with these constants as the
/// max size of each vector.
/// Noise floor values range from -255 to -1 dBm.
const MAX_NOISE_FLOOR_SAMPLES uint8 = 255;
/// Size of RxRateIndexHistogram lookup table (see comments in RxRateIndexHistogram).
const MAX_RX_RATE_INDEX_SAMPLES uint8 = 196;
/// RSSI values range from -255 to -1 dBm.
const MAX_RSSI_SAMPLES uint8 = 255;
/// SNR values range from 0 to 255 dB.
const MAX_SNR_SAMPLES uint16 = 256;

/// Antenna frequency.
type AntennaFreq = strict enum : uint8 {
    /// 2.4 GHz.
    ANTENNA_2_G = 1;
    /// 5 GHz.
    ANTENNA_5_G = 2;
};

/// Identifier for antenna.
type AntennaId = struct {
    freq AntennaFreq;
    /// 0 indexed antenna number of freq.
    index uint8;
};

/// The scope of the histogram, e.g. if the histogram contains data for the entire station, or has
/// data for just a single antenna.
type HistScope = strict enum : uint8 {
    STATION = 1;
    PER_ANTENNA = 2;
};

/// Histogram for noise floor samples.
type NoiseFloorHistogram = struct {
    hist_scope HistScope;
    /// If hist_scope is PER_ANTENNA, antenna_id must be provided.
    antenna_id box<AntennaId>;
    /// Sparse histogram of noise floor of current channel in dBm. Each sample's bucket_index is an
    /// index into this list of dBm values: [-255, -254, ... -1]. For example, if
    /// noise_floor_samples contains a HistBucket with bucket_index = 165 and num_samples = 50, that
    /// means there were 50 frames counted that had a noise floor of -90 dBm.
    noise_floor_samples vector<HistBucket>:MAX_NOISE_FLOOR_SAMPLES;
    /// Count of invalid samples encountered, if any.
    invalid_samples uint64;
};

/// Histogram for received data rate.
type RxRateIndexHistogram = struct {
    hist_scope HistScope;
    /// If hist_scope is PER_ANTENNA, antenna_id must be provided.
    antenna_id box<AntennaId>;
    /// Sparse histogram of count of received frames for each rate. Each sample's bucket_index is an
    /// index into this lookup table:
    /// 0-3: B-MCS 0-3
    /// 4-11: G-MCS 0-7
    /// 12-27: N-MCS 0-15 (BW20)
    /// 28-43: N-MCS 0-15 (BW40)
    /// 44-59: N-MCS 0-15 (BW20:SGI)
    /// 60-75: N-MCS 0-15 (BW40:SGI)
    /// 76-85: AC-MCS 0-9 (VHT:BW20:NSS1)
    /// 86-95: AC-MCS 0-9 (VHT:BW20:NSS2)
    /// 96-105: AC-MCS 0-9 (VHT:BW40:NSS1)
    /// 106-115: AC-MCS 0-9 (VHT:BW40:NSS2)
    /// 116-125: AC-MCS 0-9 (VHT:BW80:NSS1)
    /// 126-135: AC-MCS 0-9 (VHT:BW80:NSS2)
    /// 136-145: AC-MCS 0-9 (VHT:BW20:NSS1:SGI)
    /// 146-155: AC-MCS 0-9 (VHT:BW20:NSS2:SGI)
    /// 156-165: AC-MCS 0-9 (VHT:BW40:NSS1:SGI)
    /// 166-175: AC-MCS 0-9 (VHT:BW40:NSS2:SGI)
    /// 176-185: AC-MCS 0-9 (VHT:BW80:NSS1:SGI)
    /// 186-195: AC-MCS 0-9 (VHT:BW80:NSS2:SGI)
    ///
    /// For example, if rx_rate_index_samples contains a HistBucket with bucket_index = 75
    /// and num_samples = 50, that means there were 50 frames counted that had a rate corresponding
    /// to N-MCS 15 (BW40:SGI).
    rx_rate_index_samples vector<HistBucket>:MAX_RX_RATE_INDEX_SAMPLES;
    /// Count of invalid samples encountered, if any.
    invalid_samples uint64;
};

/// Histogram for received signal strength indicator (RSSI).
type RssiHistogram = struct {
    hist_scope HistScope;
    /// If hist_scope is PER_ANTENNA, antenna_id must be provided.
    antenna_id box<AntennaId>;
    /// Sparse histogram of RSSI of AP in dBm. Each sample's bucket_index is an index
    /// into this list of dBm values: [-255, -254, ... -1]. For example, if rssi_samples
    /// contains a HistBucket with bucket_index = 225 and num_samples = 50, that means
    /// there were 50 frames counted that had a signal level of -30 dBm.
    rssi_samples vector<HistBucket>:MAX_RSSI_SAMPLES;
    /// Count of invalid samples encountered, if any.
    invalid_samples uint64;
};

/// Histogram for signal to noise ratio (SNR).
type SnrHistogram = struct {
    hist_scope HistScope;
    /// If hist_scope is PER_ANTENNA, antenna_id must be provided.
    antenna_id box<AntennaId>;
    /// Sparse histogram of signal to noise ratio in dB. Each sample's bucket_index is an index
    /// into this list of dB values: [0, 1, ... 255]. For example, if snr_samples contains a
    /// HistBucket with value = 60 and num_samples = 50, that means there were 50 frames
    /// counted that had a SNR of 60 dB.
    snr_samples vector<HistBucket>:MAX_SNR_SAMPLES;
    /// Count of invalid samples encountered, if any.
    invalid_samples uint64;
};

/// For each histogram type (e.g. RSSI), there can be multiple histograms up to this limit. For
/// example, an interface might have 1 histogram for station-wide RSSI, but also 1 for each of the
/// antennas used by the interface.
const MAX_HISTOGRAMS_PER_TYPE uint8 = 8;

// LINT.ThenChange(//sdk/banjo/fuchsia.hardware.wlan.fullmac/wlanif.banjo)

type IfaceCounterStats = struct {
    rx_unicast_total uint64;
    rx_unicast_drop uint64;
    rx_multicast uint64;
    tx_total uint64;
    tx_drop uint64;
};

type IfaceHistogramStats = struct {
    /// Noise floor histogram(s).
    noise_floor_histograms vector<NoiseFloorHistogram>:MAX_HISTOGRAMS_PER_TYPE;
    /// Received signal strength indicator (RSSI) histogram(s).
    rssi_histograms vector<RssiHistogram>:MAX_HISTOGRAMS_PER_TYPE;
    /// Received rate index histogram(s).
    rx_rate_index_histograms vector<RxRateIndexHistogram>:MAX_HISTOGRAMS_PER_TYPE;
    /// Signal to noise ratio (SNR) histogram(s).
    snr_histograms vector<SnrHistogram>:MAX_HISTOGRAMS_PER_TYPE;
};
