// Copyright 2019 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 ddk.hw.wlan.wlaninfo;

using ddk.hw.wlan.ieee80211;

/// Role of a WLAN device.
enum WlanInfoMacRole : uint8 {
    /// Device operating as a non-AP station (i.e., a client of an AP).
    client = 0x1;

    /// Device operating as an access point.
    ap = 0x2;

    /// Device operating as a mesh node.
    mesh = 0x4;
};

enum WlanInfoPhyType {
    /// IEEE 802.11 for 1, 2 Mbps.
    dsss = 0x01;

    /// IEEE 802.11 for 5.5, 11 Mbps. ERP-CCK.
    cck = 0x02;

    /// IEEE 802.11g, 1, 2, 5,5, 11, 12, 24 Mbps + [6, 54] Mbps.
    erp = 0x04;

    /// IEEE 802.11a/g.
    ofdm = 0x4;

    /// IEEE 802.11n.
    ht = 0x08;

    /// IEEE 802.11ac.
    vht = 0x10;

    /// IEEE 802.11ax.
    hew = 0x20;
};

enum WlanInfoDriverFeature : uint32 {
    /// Device or driver implements scanning.
    scan_offload = 0x00000001;

    /// Device or driver implements rate selection.
    rate_selection = 0x00000002;

    /// Device is not a physical device.
    synth = 0x00000004;

    /// Driver supports transmission reports, and will use the
    /// wlanmac_ifc.report_tx_status() callback to report the status of each queued
    /// transmission.
    tx_status_report = 0x00000008;

    /// Set this flag to indicate whether SME should trust this device or driver to
    /// handle DFS channels correctly in an active scan (e.g. it makes sure DFS
    /// channel is safe to transmit before doing so).
    dfs = 0x00000010;

    /// Driver responds to probe requests in hardware.
    probe_resp_offload = 0x00000020;

    /// Driver supports running the SAE handshake in SME.
    sae_sme_auth = 0x00000040;

    /// Driver implements the SAE handshake.
    sae_driver_auth = 0x00000080;

    /// Driver supports management frame protection and IGTK installation.
    mfp = 0x00000100;
};

/// IEEE Std 802.11-206 Section 9.4.1.4 Capability Information Field
enum WlanInfoHardwareCapability : uint32 {
    /// Short packet preamble.
    short_preamble = 0x0020;

    /// Spectrum management.
    spectrum_mgmt = 0x0100;

    // QoS capable.
    qos = 0x0200;

    /// Short slot times after packet collision.
    short_slot_time = 0x0400;

    /// Radio measurement.
    radio_msmt = 0x1000;

    // Supports simutaneous client-ap use
    // TODO(fxbug.dev/54923): Move SIMULTANEOUS_CLIENT_AP to a different Fuchsia specific capability enum.
    // This enum should only be used for IEEE 802.11 fields. This type should also be reduced
    // to uint16_t once this is done.
    simultaneous_client_ap = 0x10000;
};

/// This is a simplified expression of channel starting frequencies. Expand this
/// list as Fuchsia evolves.
enum WlanInfoBand {
    /// Channel starting frequency: 2.407 GHz.
    2ghz = 0;

    /// Channel starting frequency: 5.000 GHz.
    5ghz = 1;

    /// The number of defined bands.
    count = 2;
};

/// The maximum number of supported channels in a WlanInfoChannelList.
const uint32 WLAN_INFO_CHANNEL_LIST_MAX_CHANNELS = 64;

/// A list of channels in a band. Channels are numbered as in IEEE Std 802.11-2016,
/// 17.3.8.4.2, where each channel is defined as:
///
///   (base_freq + 5 * n) MHz
///
/// where n is between 1 and 200 (inclusive). Here n represents the channel number.
///
/// Example:
///   Standard 2.4GHz channels:
///     base_freq = 2407 MHz
///     n = 1-14
struct WlanInfoChannelList {
    /// The base frequency in this band.
    uint16 base_freq;

    /// A list of channel center frequencies, as multiples of 5 MHz above base_freq.
    array<uint8>:WLAN_INFO_CHANNEL_LIST_MAX_CHANNELS channels;
};

/// The maximum number of rates in WlanInfoBandInfo.
// IEEE Std 802.11-2016 defines 12 values in dot11SupportedDataRatesRxTable
const uint32 WLAN_INFO_BAND_INFO_MAX_RATES = 12;

/// Information about a particular WLAN band. Capabilities are grouped by band, by
/// de facto industry standard.
struct WlanInfoBandInfo {
    /// The supported band.
    WlanInfoBand band;

    /// HT PHY capabilities, if supported.
    bool ht_supported;
    ddk.hw.wlan.ieee80211.Ieee80211HtCapabilities ht_caps;

    /// VHT PHY capabilities, if supported.
    bool vht_supported;
    ddk.hw.wlan.ieee80211.Ieee80211VhtCapabilities vht_caps;

    /// Rates supported in this band, in units of 500 kbit/s (as defined in
    /// IEEE Std 802.11-2016, 9.4.2.3). For example, 1 Mbit/s is represented as 0x02.
    array<uint8>:WLAN_INFO_BAND_INFO_MAX_RATES rates;

    /// Channels supported in this band.
    WlanInfoChannelList supported_channels;
};

/// The maximum number of bands supported in a WlanInfo struct. For now this is 2
/// to keep the struct a small, fixed size.
const uint32 WLAN_INFO_MAX_BANDS = 2;
