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

// LINT.IfChange
@available(added=13)
type WlanKeyType = flexible enum : uint8 {
    PAIRWISE = 1;
    GROUP = 2;
    IGTK = 3;
    PEER = 4;
};
// LINT.ThenChange(//src/connectivity/wlan/lib/mlme/rust/src/key.rs)
@available(added=13)
type WlanWmmParameters = struct {
    apsd bool;
    ac_be_params WlanWmmAccessCategoryParameters;
    ac_bk_params WlanWmmAccessCategoryParameters;
    ac_vi_params WlanWmmAccessCategoryParameters;
    ac_vo_params WlanWmmAccessCategoryParameters;
};

/// WFA WMM v1.2, 2.2.2
@available(added=13)
type WlanWmmAccessCategoryParameters = struct {
    /// Lower bound of contention window in exponential form
    /// `cw_min = 2^(ecw_min) - 1`. The unit for contention window is "slot time", which
    /// is different for each standard (e.g. 9 microseconds, 13 microseconds, etc.)
    ecw_min uint8;
    /// Upper bound of contention window in exponential form
    /// `cw_max = 2^(ecw_max) - 1`. The unit for contention window is "slot time", which
    /// is different for each standard (e.g. 9 microseconds, 13 microseconds, etc.)
    ecw_max uint8;
    /// Arbitration Interframe Spacing Number (control wait time between sending each frame)
    aifsn uint8;
    /// TXOP limit in unit of 32 microseconds
    txop_limit uint16;
    /// Whether admission control is mandatory
    acm bool;
};

/// 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.
@namespaced
@available(added=13)
const WLAN_MAC_MAX_SUPP_RATES uint32 = 8;
@namespaced
@available(added=13)
const WLAN_MAC_MAX_EXT_RATES uint32 = 255;
