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

enum WlanInfoMacRole {
    /// 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 {
    /// 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;

    /// Temporary feature flag for incrementally transitioning drivers to use SME
    /// channel on iface creation.
    temp_direct_sme_channel = 0x40000000;
};

enum WlanInfoHardwareCapability {
    /// Short packet preamble.
    short_preamble = 0x01;

    /// Spectrum management.
    spectrum_mgmt = 0x02;

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

    /// Radio measurement.
    radio_msmt = 0x08;

    // Supports simutaneous client-ap use
    simultaneous_client_ap = 0x10;
};

/// 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 usize 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 usize 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 usize WLAN_INFO_MAX_BANDS = 2;

struct WlanInfo {
    /// MAC address.
    array<uint8>:6 mac_addr;

    /// Bitmask for MAC roles supported. For an interface, this will be a single
    /// value.
    WlanInfoMacRole mac_role;

    /// Bitmask indicating the WlanInfoPhyType values supported by the hardware.
    WlanInfoPhyType supported_phys;

    /// Bitmask indicating the WlanInfoDriverFeature values supported by the driver
    /// and hardware.
    WlanInfoDriverFeature driver_features;

    /// Bitmask indicating WlanInfoHardwareCapability values.
    WlanInfoHardwareCapability caps;

    /// Supported bands.
    array<WlanInfoBandInfo>:WLAN_INFO_MAX_BANDS bands;
    usize bands_count;
};
