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

#ifndef GARNET_LIB_WLAN_PROTOCOL_INCLUDE_WLAN_PROTOCOL_INFO_H_
#define GARNET_LIB_WLAN_PROTOCOL_INCLUDE_WLAN_PROTOCOL_INFO_H_

#include <stdint.h>

#include <zircon/compiler.h>

__BEGIN_CDECLS;

enum Band {
    // See IEEE Std 802.11-2016 Annex E
    // This is a simplified expression of channel starting frequencies.
    // Expand this list as Fuchsia evolves.
    WLAN_BAND_2GHZ = 0,  // Channel starting frequency: 2.407 GHz
    WLAN_BAND_5GHZ = 1,  // Channel starting frequency: 5.000 GHz

    WLAN_BAND_COUNT,
};

enum CBW {
    // Channel Bandwidth. See IEEE 802.11-2016 21.2.4 Table 21-2
    // VHT notation

    CBW20 = 0,  // Default. Corresponds to SecondaryChannelOffset-None
    CBW40 = 1,
    CBW40ABOVE = CBW40,  // Corresponds to SecondaryChannelOffset-Above
    CBW40BELOW = 2,      // Corresponds to SecondaryChannelOffset-Below
    CBW80 = 3,
    CBW160 = 4,
    CBW80P80 = 5,  // Non-contiguous frequency segments
};

typedef struct wlan_channel {
    uint8_t primary;
    uint8_t cbw;          // Channel Bandwidth
    uint8_t secondary80;  // Channel index corresponding to the center frequency
                          // of the secondary frequency segment
} wlan_channel_t;

enum {
    WLAN_RX_INFO_VALID_PHY = (1 << 0),
    WLAN_RX_INFO_VALID_DATA_RATE = (1 << 1),
    WLAN_RX_INFO_VALID_CHAN_WIDTH = (1 << 2),
    WLAN_RX_INFO_VALID_MCS = (1 << 3),
    WLAN_RX_INFO_VALID_RSSI = (1 << 4),
    WLAN_RX_INFO_VALID_RCPI = (1 << 5),
    WLAN_RX_INFO_VALID_SNR = (1 << 6),
    // Bits 7-31 reserved
};

// PHY values may be used in a bitfield (e.g., device capabilities) or as a value (e.g., rx/tx
// info and association context).
enum PHY {
    WLAN_PHY_DSSS = (1 << 0),  // IEEE 802.11 for 1, 2 Mbps
    WLAN_PHY_CCK = (1 << 1),   // IEEE 802.11 for 5.5, 11 Mbps. ERP-CCK.
    WLAN_PHY_ERP = (1 << 2),   // IEEE 802.11g, 1, 2, 5,5, 11, 12, 24 Mbps + [6, 54] Mbps
    WLAN_PHY_OFDM = (1 << 2),  // IEEE 802.11a/g
    WLAN_PHY_HT = (1 << 3),    // IEEE 802.11n
    WLAN_PHY_VHT = (1 << 4),   // IEEE 802.11ac
    WLAN_PHY_HEW = (1 << 5),   // IEEE 802.11ax
};

// Guard Interval
enum GI {
    WLAN_GI_800NS = (1 << 0),   // all 802.11 phy
    WLAN_GI_400NS = (1 << 1),   // 802.11n/ac
    WLAN_GI_200NS = (1 << 2),   // 802.11n/ac
    WLAN_GI_3200NS = (1 << 3),  // 802.11ax
    WLAN_GI_1600NS = (1 << 4),  // 802.11ax
};

enum {
    WLAN_BSS_TYPE_INFRASTRUCTURE = 1,
    WLAN_BSS_TYPE_IBSS = 2,  // Independent BSS
    WLAN_BSS_TYPE_PERSONAL = 3,
    WLAN_BSS_TYPE_MESH = 4,
    WLAN_BSS_TYPE_ANY_BSS = 5,
};

typedef struct wlan_bss_config {
    uint8_t bssid[6];
    // Whether this BSS is an infrastructure or independent BSS.
    uint8_t bss_type;
    // If 'remote' is 'true', the BSS is *not* managed by this device.
    bool remote;
} wlan_bss_config_t;

enum {
    // Device or driver implements scanning
    WLAN_DRIVER_FEATURE_SCAN_OFFLOAD = (1 << 0),
    // Device or driver implements rate selection. The data_rate and mcs fields of wlan_tx_info_t
    // should not be populated, unless the MLME wishes to force a given rate for a packet.
    WLAN_DRIVER_FEATURE_RATE_SELECTION = (1 << 1),
    // Device is not a physical device.
    WLAN_DRIVER_FEATURE_SYNTH = (1 << 2),
    // Driver supports transmission reports, and will use the wlanmac_ifc.report_tx_status()
    // callback to report the status of each queued transmission.
    WLAN_DRIVER_FEATURE_TX_STATUS_REPORT = (1 << 3),
};

// Mac roles: a device may support multiple roles, but an interface is instantiated with
// a single role.
enum {
    // Device operating as a non-AP station (i.e., a client of an AP).
    WLAN_MAC_ROLE_CLIENT = (1 << 0),
    // Device operating as an access point.
    WLAN_MAC_ROLE_AP = (1 << 1),
    // Device operating as a mesh node
    WLAN_MAC_ROLE_MESH = (1 << 2),
    // TODO: IBSS, PBSS
};

// Hardware capabilities.
// Some bits are inspired from IEEE Std 802.11-2016, 9.4.1.4
enum {
    WLAN_CAP_SHORT_PREAMBLE = (1 << 0),
    WLAN_CAP_SPECTRUM_MGMT = (1 << 1),
    WLAN_CAP_SHORT_SLOT_TIME = (1 << 2),
    WLAN_CAP_RADIO_MSMT = (1 << 3),
};

// HT capabilities. IEEE Std 802.11-2016, 9.4.2.56
typedef struct wlan_ht_caps {
    uint16_t ht_capability_info;
    uint8_t ampdu_params;
    union {
        uint8_t supported_mcs_set[16];
        struct {
            uint64_t rx_mcs_head;
            uint32_t rx_mcs_tail;
            uint32_t tx_mcs;
        } __PACKED mcs_set;
    };
    uint16_t ht_ext_capabilities;
    uint32_t tx_beamforming_capabilities;
    uint8_t asel_capabilities;
} __PACKED wlan_ht_caps_t;

// HT Operation. IEEE Std 802.11-2016,
typedef struct wlan_ht_op {
    uint8_t primary_chan;
    union {
        uint8_t info[5];
        struct {
            uint32_t head;
            uint8_t tail;
        } __PACKED;
    };
    union {
        uint8_t supported_mcs_set[16];
        struct {
            uint64_t rx_mcs_head;
            uint32_t rx_mcs_tail;
            uint32_t tx_mcs;
        } __PACKED basic_mcs_set;
    };
} __PACKED wlan_ht_op_t;

// VHT capabilities. IEEE Std 802.11-2016, 9.4.2.158
typedef struct wlan_vht_caps {
    uint32_t vht_capability_info;
    uint64_t supported_vht_mcs_and_nss_set;
} __PACKED wlan_vht_caps_t;

// VHT Operation. IEEE Std 802.11-2016, 9.4.2.159
typedef struct wlan_vht_op {
    uint8_t vht_cbw;
    uint8_t center_freq_seg0;
    uint8_t center_freq_seg1;
    uint16_t basic_mcs;
} __PACKED wlan_vht_op_t;

// Channels are numbered as in IEEE Std 802.11-2016, 17.3.8.4.2
// 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

#define WLAN_CHANNELS_MAX_LEN 64
typedef struct wlan_chan_list {
    uint16_t base_freq;
    // Each entry in this array represents a value of n in the above channel numbering formula.
    // The array size is roughly based on what is needed to represent the most common 5GHz
    // operating classes.
    // List up valid channels. A value of 0 indicates the end of the list if less than
    // WLAN_CHANNELS_MAX_LEN channels are defined.
    uint8_t channels[WLAN_CHANNELS_MAX_LEN];
} wlan_chan_list_t;

#define WLAN_BASIC_RATES_MAX_LEN 12

// Capabilities are grouped by band, by industry de facto standard.
typedef struct wlan_band_info {
    // Values from enum Band (WLAN_BAND_*)
    uint8_t band_id;
    // HT PHY capabilities.
    bool ht_supported;
    wlan_ht_caps_t ht_caps;
    // VHT PHY capabilities.
    bool vht_supported;
    wlan_vht_caps_t vht_caps;
    // Basic rates supported in this band, as defined in IEEE Std 802.11-2016, 9.4.2.3.
    // Each rate is given in units of 500 kbit/s, so 1 Mbit/s is represent as 0x02.
    uint8_t basic_rates[WLAN_BASIC_RATES_MAX_LEN];
    // Channels supported in this band.
    wlan_chan_list_t supported_channels;
} wlan_band_info_t;

// For now up to 2 bands are supported in order to keep the wlan_info struct a small, fixed
// size.
#define WLAN_MAX_BANDS 2

typedef struct wlan_info {
    uint8_t mac_addr[6];
    // Bitmask for MAC roles supported (WLAN_MAC_ROLE_*). For an interface, this will be a
    // single value.
    uint16_t mac_role;
    // Bitmask indicating the WLAN_PHY_* values supported by the hardware.
    uint16_t supported_phys;
    // Bitmask indicating the WLAN_DRIVER_FEATURE_* values supported by the driver and hardware.
    uint32_t driver_features;
    // Bitmask indicating WLAN_CAP_* capabilities. Note this differs from IEEE Std
    // 802.11-2016, 9.4.1.4.
    uint32_t caps;
    // Supported bands.
    uint8_t num_bands;
    wlan_band_info_t bands[WLAN_MAX_BANDS];
} wlan_info_t;

// Information defined only within a context of association
// Beware the subtle interpretation of each field: they are designed to
// reflect the parameters safe to use within an association
// Many parameters do not distinguish Rx capability from Tx capability.
// In those cases, a capability is commonly applied to both Rx and Tx.
// Some parameters are distinctively for Rx only, and some are Tx only.
#define WLAN_MAC_MAX_SUPP_RATES 8
#define WLAN_MAC_MAX_EXT_RATES 255
#define WLAN_MAC_MAX_RATES (8 + 255)
typedef struct wlan_assoc_ctx {
    uint8_t bssid[6];
    uint16_t aid;
    uint16_t listen_interval;
    uint8_t phy;  // a single enumerator from enum PHY.
    wlan_channel_t chan;
    bool qos;

    // Coincatenation of SupportedRates and ExtendedSupportedRates
    // IEEE Std 802.11-2016, 9.4.2.3 & 9.4.2.13
    uint16_t rates_cnt;
    uint8_t rates[WLAN_MAC_MAX_RATES];

    // IEEE Std 802.11-2016, 9.4.1.4
    uint8_t cap_info[2];

    // IEEE Std 802.11-2016, 9.4.2.56, 57
    // Rx MCS Bitmask in Supported MCS Set field represents the set of MCS
    // the peer can receive at from this device, considering this device's Tx capability.
    bool has_ht_cap;
    wlan_ht_caps_t ht_cap;
    bool has_ht_op;
    wlan_ht_op_t ht_op;

    // IEEE Std 802.11-2016, 9.4.2.158, 159
    bool has_vht_cap;
    wlan_vht_caps_t vht_cap;
    bool has_vht_op;
    wlan_vht_op_t vht_op;
} wlan_assoc_ctx_t;

__END_CDECLS;

#endif  // GARNET_LIB_WLAN_PROTOCOL_INCLUDE_WLAN_PROTOCOL_INFO_H_
