// 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;

struct Counter {
    uint64 count;
    string name;
};

struct PacketCounter {
    Counter in;
    Counter out;
    Counter drop;
    Counter in_bytes;
    Counter out_bytes;
    Counter drop_bytes;
};

// LINT.IfChange
struct DispatcherStats {
    PacketCounter any_packet;
    PacketCounter mgmt_frame;
    PacketCounter ctrl_frame;
    PacketCounter data_frame;
};

const uint8 RSSI_BINS = 129;

/// RssiStats count the occurrence of the RSSIs.
/// RSSI value r's occurrence is counted in the bin[-r],
/// where r is defined in [-128, 0] in dBm.
struct RssiStats {
    // TODO(alexandrew): Change this to array.
    vector<uint64>:RSSI_BINS hist;
};

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

/// 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 uint8 MAX_NOISE_FLOOR_SAMPLES = 255;
/// Size of RxRateIndexHistogram lookup table (see comments in RxRateIndexHistogram).
const uint8 MAX_RX_RATE_INDEX_SAMPLES = 196;
/// RSSI values range from -255 to -1 dBm.
const uint8 MAX_RSSI_SAMPLES = 255;
/// SNR values range from 0 to 255 dB.
const uint16 MAX_SNR_SAMPLES = 256;

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

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

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

/// Histogram for noise floor samples.
struct NoiseFloorHistogram {
    HistScope hist_scope;
    /// If hist_scope is PER_ANTENNA, antenna_id must be provided.
    AntennaId? antenna_id;
    /// 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.
    vector<HistBucket>:MAX_NOISE_FLOOR_SAMPLES noise_floor_samples;
    /// Count of invalid samples encountered, if any.
    uint64 invalid_samples = 0;
};

/// Histogram for received data rate.
struct RxRateIndexHistogram {
    HistScope hist_scope;
    /// If hist_scope is PER_ANTENNA, antenna_id must be provided.
    AntennaId? antenna_id;
    /// 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).
    vector<HistBucket>:MAX_RX_RATE_INDEX_SAMPLES rx_rate_index_samples;
    /// Count of invalid samples encountered, if any.
    uint64 invalid_samples = 0;
};

/// Histogram for received signal strength indicator (RSSI).
struct RssiHistogram {
    HistScope hist_scope;
    /// If hist_scope is PER_ANTENNA, antenna_id must be provided.
    AntennaId? antenna_id;
    /// 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.
    vector<HistBucket>:MAX_RSSI_SAMPLES rssi_samples;
    /// Count of invalid samples encountered, if any.
    uint64 invalid_samples = 0;
};

/// Histogram for signal to noise ratio (SNR).
struct SnrHistogram {
    HistScope hist_scope;
    /// If hist_scope is PER_ANTENNA, antenna_id must be provided.
    AntennaId? antenna_id;
    /// 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.
    vector<HistBucket>:MAX_SNR_SAMPLES snr_samples;
    /// Count of invalid samples encountered, if any.
    uint64 invalid_samples;
};

/// 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 uint8 MAX_HISTOGRAMS_PER_TYPE = 8;
// LINT.ThenChange(//sdk/banjo/fuchsia.hardware.wlanif/wlanif.banjo)

struct ClientMlmeStats {
    PacketCounter svc_msg;
    PacketCounter data_frame;
    PacketCounter mgmt_frame;
    PacketCounter tx_frame;
    PacketCounter rx_frame;
    RssiStats assoc_data_rssi;
    RssiStats beacon_rssi;
    /// Noise floor histogram(s).
    vector<NoiseFloorHistogram>:MAX_HISTOGRAMS_PER_TYPE noise_floor_histograms;
    /// Received signal strength indicator (RSSI) histogram(s).
    vector<RssiHistogram>:MAX_HISTOGRAMS_PER_TYPE rssi_histograms;
    /// Received rate index histogram(s).
    vector<RxRateIndexHistogram>:MAX_HISTOGRAMS_PER_TYPE rx_rate_index_histograms;
    /// Signal to noise ratio (SNR) histogram(s).
    vector<SnrHistogram>:MAX_HISTOGRAMS_PER_TYPE snr_histograms;
};

struct ApMlmeStats {
    PacketCounter not_used;
};

// LINT.ThenChange(//src/connectivity/wlan/lib/common/cpp/include/wlan/common/stats.h)

union MlmeStats {
    1: ClientMlmeStats client_mlme_stats;
    2: ApMlmeStats ap_mlme_stats;
};

struct IfaceStats {
    DispatcherStats dispatcher_stats;
    MlmeStats? mlme_stats;
};
