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

enum RequestStatus {
    ACKNOWLEDGED = 0;
    REJECTED_NOT_SUPPORTED = 1;
    REJECTED_INCOMPATIBLE_MODE = 2;
    REJECTED_ALREADY_IN_USE = 3;
    REJECTED_DUPLICATE_REQUEST = 4;
};

// LINT analyzer keyword intended for humans:
// LINT.IfChange

enum PHY {
    /// IEEE 802.11b, used for DSSS, HR/DSSS, ERP-DSSS/CCK
    HR = 1;
    /// IEEE 802.11a/g, used for ERP-OFDM
    ERP = 2;
    /// IEEE 802.11n
    HT = 3;
    /// IEEE 802.11ac
    VHT = 4;
    /// IEEE 802.11ax
    HEW = 5;
};

enum CBW {	// Channel Bandwidth
    CBW20 = 0;
    CBW40 = 1;
    //CBW40ABOVE = CBW40;
    CBW40BELOW = 2;
    CBW80 = 3;
    CBW160 = 4;
    CBW80P80 = 5;
};

struct WlanChan {
    uint8 primary;
    CBW cbw;
    uint8 secondary80;
};

enum Band : uint8 {
    WLAN_BAND_2GHZ = 0;
    WLAN_BAND_5GHZ = 1;
    WLAN_BAND_COUNT = 2;
};

// LINT.ThenChange(//zircon/system/banjo/fuchsia.hardware.wlan.info/info.banjo)

enum ScanType {
    ACTIVE = 1;
    PASSIVE = 2;
};

enum DriverFeature {
    SCAN_OFFLOAD = 0;
    RATE_SELECTION = 1;
    SYNTH = 2;
    TX_STATUS_REPORT = 3;
    DFS = 4;
    PROBE_RESP_OFFLOAD = 5;
    SAE_SME_AUTH = 6;
    SAE_DRIVER_AUTH = 7;
    /// Indicates support for management frame protection and IGTK.
    MFP = 8;
    /// Temporary feature flag for driver to indicate this iface a SoftMAC device.
    /// TODO(fxbug.dev/41640): Remove this flag once FullMAC drivers no longer use SME.
    TEMP_SOFTMAC = 2718281828;
};

/// HT and VHT guard interval.
/// See IEEE 802.11-2016 Table 19-1 and Table 21-1.
enum GuardInterval : uint8 {
    LONG_GI = 1; // 800 ns
    SHORT_GI = 2; // 400 ns
};
