// Copyright 2022 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.fullmac;

using fuchsia.wlan.common;
using fuchsia.wlan.internal;
using fuchsia.wlan.ieee80211 as ieee80211;
using zx;

type WlanScanType = flexible enum : uint8 {
    ACTIVE = 1;
    PASSIVE = 2;
};

/// Max length for vendor IEs to be added to the association request. This is currently
/// used for WPA.
const WLAN_VIE_MAX_LEN uint32 = 514;

type WlanAuthType = flexible enum : uint8 {
    OPEN_SYSTEM = 1;
    SHARED_KEY = 2;
    FAST_BSS_TRANSITION = 3;
    SAE = 4;
};

type WlanFullmacAuthInd = struct {
    peer_sta_address ieee80211.MacAddr;
    auth_type WlanAuthType;
};

type WlanFullmacAssocInd = struct {
    peer_sta_address ieee80211.MacAddr;
    // Interval specified in time units.
    listen_interval uint16;
    ssid ieee80211.CSsid;
    rsne_len uint64;
    rsne array<uint8, ieee80211.WLAN_IE_MAX_LEN>;
    vendor_ie_len uint64;
    vendor_ie array<uint8, WLAN_VIE_MAX_LEN>;
};

const WLAN_MAX_KEYLIST_SIZE uint32 = 4;

type WlanFullmacSetKeysReq = struct {
    num_keys uint64;
    keylist array<fuchsia.wlan.common.WlanKeyConfig, WLAN_MAX_KEYLIST_SIZE>;
};

type WlanFullmacSetKeysResp = struct {
    num_keys uint64;
    statuslist array<zx.Status, WLAN_MAX_KEYLIST_SIZE>;
};

type DeleteKeyDescriptor = struct {
    key_id uint16;
    key_type fuchsia.wlan.common.WlanKeyType;
    address ieee80211.MacAddr;
};

type WlanFullmacDelKeysReq = struct {
    num_keys uint64;
    keylist array<DeleteKeyDescriptor, WLAN_MAX_KEYLIST_SIZE>;
};

/// This struct is sent from SME to wlanif, indicating the result of SAE handshake process.
type WlanFullmacSaeHandshakeResp = struct {
    peer_sta_address ieee80211.MacAddr;
    status_code ieee80211.StatusCode;
};

/// This struct is sent in both directions, containing the information of SAE authentication
/// frames, sae_fields maps to challenge text, see IEEE Std 802.11-2016, 9.3.3.12.
type WlanFullmacSaeFrame = struct {
    peer_sta_address ieee80211.MacAddr;
    status_code ieee80211.StatusCode;
    seq_num uint16;
    sae_fields vector<uint8>:MAX;
};

type WlanFullmacScanResult = struct {
    txn_id uint64;
    // Time of the scan result relative to when the system was powered on.
    // See https://fuchsia.dev/fuchsia-src/concepts/time/language_support#monotonic_time
    timestamp_nanos zx.Time;
    bss fuchsia.wlan.internal.BssDescription;
};

type WlanScanResult = flexible enum : uint8 {
    SUCCESS = 0;
    NOT_SUPPORTED = 1;
    INVALID_ARGS = 2;
    INTERNAL_ERROR = 3;
    SHOULD_WAIT = 4;
    CANCELED_BY_DRIVER_OR_FIRMWARE = 5;
};

type WlanFullmacScanEnd = struct {
    txn_id uint64;
    code WlanScanResult;
};

type WlanFullmacConnectConfirm = struct {
    peer_sta_address ieee80211.MacAddr;
    result_code ieee80211.StatusCode;

    // These fields are only valid if the result is success.
    association_id uint16;
    association_ies vector<uint8>:MAX;
};

/// Result of a roam attempt.
/// Note that an unsuccessful roam attempt does not imply disassociation. Where a roam
/// failure causes a fullmac driver to disassociate, the fullmac driver must explicitly
/// disassociate.
type WlanFullmacRoamConfirm = struct {
    target_bssid ieee80211.MacAddr;
    result_code ieee80211.StatusCode;
    /// Full BSS description.
    /// This field is only valid if the result is success.
    selected_bss fuchsia.wlan.internal.BssDescription;
};

type WlanAuthResult = flexible enum : uint8 {
    SUCCESS = 0;
    REFUSED = 1;
    ANTI_CLOGGING_TOKEN_REQUIRED = 2;
    FINITE_CYCLIC_GROUP_NOT_SUPPORTED = 3;
    REJECTED = 4;
    FAILURE_TIMEOUT = 5;
};

type WlanFullmacDeauthIndication = struct {
    peer_sta_address ieee80211.MacAddr;
    reason_code ieee80211.ReasonCode;
    /// locally_initiated is true if deauth is initiated from the device,
    /// and is false if it's initiated remotely (e.g. due to deauth frame)
    locally_initiated bool;
};

type WlanAssocResult = flexible enum : uint8 {
    SUCCESS = 0;
    REFUSED_REASON_UNSPECIFIED = 1;
    REFUSED_NOT_AUTHENTICATED = 2;
    REFUSED_CAPABILITIES_MISMATCH = 3;
    REFUSED_EXTERNAL_REASON = 4;
    REFUSED_AP_OUT_OF_MEMORY = 5;
    REFUSED_BASIC_RATES_MISMATCH = 6;
    REJECTED_EMERGENCY_SERVICES_NOT_SUPPORTED = 7;
    REFUSED_TEMPORARILY = 8;
};


type WlanFullmacDisassocConfirm = struct {
    status zx.Status;
};

type WlanFullmacDisassocIndication = struct {
    peer_sta_address ieee80211.MacAddr;
    reason_code ieee80211.ReasonCode;
    /// locally_initiated is true if diassoc is initiated from the device,
    /// and is false if it's initiated remotely (e.g. due to disassoc frame)
    locally_initiated bool;
};

type WlanStartResult = flexible enum : uint8 {
    SUCCESS = 0;
    BSS_ALREADY_STARTED_OR_JOINED = 1;
    RESET_REQUIRED_BEFORE_START = 2;
    NOT_SUPPORTED = 3;
};

type WlanFullmacStartConfirm = struct {
    result_code WlanStartResult;
};

type WlanStopResult = flexible enum : uint8 {
    SUCCESS = 0;
    BSS_ALREADY_STOPPED = 1;
    INTERNAL_ERROR = 2;
};

type WlanFullmacStopConfirm = struct {
    result_code WlanStopResult;
};

type WlanEapolResult = flexible enum : uint8 {
    SUCCESS = 0;
    TRANSMISSION_FAILURE = 1;
};

type WlanFullmacEapolConfirm = struct {
    result_code WlanEapolResult;
    /// This value corresponds to the dst_addr in the EapolTxRequest we're confirming.
    /// IEEE 802.11-2016 does not include this field, but we need it to disambiguate
    /// if multiple EAPoL handshakes are ongoing.
    dst_addr ieee80211.MacAddr;
};

type WlanFullmacSignalReportIndication = struct {
    rssi_dbm int8;
    snr_db int8;
};

type WlanFullmacEapolIndication = struct {
    src_addr ieee80211.MacAddr;
    dst_addr ieee80211.MacAddr;
    data vector<uint8>:MAX;
};

type WlanFullmacSaeHandshakeInd = struct {
    peer_sta_address ieee80211.MacAddr;
};

type WlanFullmacBandCapability = struct {
    /// The values of this struct apply to the band indicated in this field.
    band fuchsia.wlan.common.WlanBand;

    /// Basic rates supported in units of 500 kbit/s (as defined in
    /// IEEE Std 802.11-2016, 9.4.2.3), e.g., 0x02 represents 1 Mbps.
    /// The value returned by this type indicates all the non-HT rates
    /// the device supports transmitting and receiving.
    basic_rate_count uint8;
    basic_rate_list array<uint8, ieee80211.MAX_SUPPORTED_BASIC_RATES>;

    /// If the device supports the HT PHY mode in this band, then ht_supported is
    /// set to true, and the value in ht_caps indicates the capabilities. Otherwise,
    /// ht_supported is set to false.
    ht_supported bool;
    ht_caps ieee80211.HtCapabilities;

    /// If the device supports the VHT PHY mode in this band, then vht_supported is
    /// set to true, and the value in vht_caps indicates the capabilities. Otherwise,
    /// vht_supported is set to false.
    vht_supported bool;
    vht_caps ieee80211.VhtCapabilities;

    /// A list of operating channels considered valid by hardware, in the context of
    /// regulatory information known to the device driver, at the time of its
    /// construction during iface creation. In this context, an operating channel
    /// means a channel which APs may transmit Beacon frames on in the current
    /// regulatory domain.
    ///
    /// This list should be used to determine efficacy of subsequent requests to
    /// scan a subset of channels using the iface, or to determine which operating
    /// channel to use when starting an AP.
    operating_channel_count uint16;
    operating_channel_list array<uint8, ieee80211.MAX_UNIQUE_CHANNEL_NUMBERS>;
};

type WlanFullmacQueryInfo = struct {
    sta_addr ieee80211.MacAddr;
    /// WLAN_MAC_ROLE_*
    role fuchsia.wlan.common.WlanMacRole;
    band_cap_list array<WlanFullmacBandCapability, fuchsia.wlan.common.MAX_BANDS>;
    band_cap_count uint8;
};

type WlanFullmacRssiStats = struct {
    hist vector<uint64>:MAX;
};

// LINT.IfChange
/// Histogram bucket.
type WlanFullmacHistBucket = struct {
    /// Index into a lookup table for each histogram type. The lookup table for each type is
    /// described below in the comments for each type.
    bucket_index uint16;
    /// The count of samples in the bucket.
    num_samples uint64;
};

/// All histograms have a fixed number of buckets. To save space, each histogram type
/// uses a vector to hold only non-empty buckets (a sparse histogram), with these constants as the
/// max size of each vector.
/// Noise floor values range from -255 to -1 dBm.
const WLAN_FULLMAC_MAX_NOISE_FLOOR_SAMPLES uint8 = 255;
/// Size of RX_RATE_INDEX lookup table (see comments in RxRateIndexHistogram).
const WLAN_FULLMAC_MAX_RX_RATE_INDEX_SAMPLES uint8 = 196;
/// RSSI values range from -255 to -1 dBm.
const WLAN_FULLMAC_MAX_RSSI_SAMPLES uint8 = 255;
/// SNR values range from 0 to 255 dB.
const WLAN_FULLMAC_MAX_SNR_SAMPLES uint16 = 256;

/// Antenna frequency.
type WlanFullmacAntennaFreq = strict enum : uint8 {
    /// 2.4 GHz.
    ANTENNA_2_G = 1;
    /// 5 GHz.
    ANTENNA_5_G = 2;
};

/// Identifier for antenna.
type WlanFullmacAntennaId = struct {
    freq WlanFullmacAntennaFreq;
    /// 0 indexed antenna number of freq.
    index uint8;
};

/// The scope of the histogram, e.g. if the histogram contains data for the entire station, or has
/// data for just a single antenna.
type WlanFullmacHistScope = strict enum : uint8 {
    STATION = 1;
    PER_ANTENNA = 2;
};

/// Histogram for noise floor samples.
type WlanFullmacNoiseFloorHistogram = struct {
    hist_scope WlanFullmacHistScope;
    /// If hist_scope is PER_ANTENNA, antenna_id must be provided.
    antenna_id WlanFullmacAntennaId;
    /// Sparse histogram of noise floor of current channel in dBm. Each sample's bucket_index is an
    /// index into this list of dBm values: [-255, -254, ... -1]. For example, if
    /// noise_floor_samples contains a WlanFullmacHistBucket with bucket_index = 165 and num_samples =
    /// 50, that means there were 50 frames counted that had a noise floor of -90 dBm.
    noise_floor_samples vector<WlanFullmacHistBucket>:WLAN_FULLMAC_MAX_NOISE_FLOOR_SAMPLES;
    /// Count of invalid samples encountered, if any.
    invalid_samples uint64;
};

/// Histogram for received data rate.
type WlanFullmacRxRateIndexHistogram = struct {
    hist_scope WlanFullmacHistScope;
    /// If hist_scope is PER_ANTENNA, antenna_id must be provided.
    antenna_id WlanFullmacAntennaId;
    /// Sparse histogram of count of received frames for each rate. Each sample's bucket_index is an
    /// index into this lookup table:
    /// 0-3: B-MCS 0-3
    /// 4-11: G-MCS 0-7
    /// 12-27: N-MCS 0-15 (BW20)
    /// 28-43: N-MCS 0-15 (BW40)
    /// 44-59: N-MCS 0-15 (BW20:SGI)
    /// 60-75: N-MCS 0-15 (BW40:SGI)
    /// 76-85: AC-MCS 0-9 (VHT:BW20:NSS1)
    /// 86-95: AC-MCS 0-9 (VHT:BW20:NSS2)
    /// 96-105: AC-MCS 0-9 (VHT:BW40:NSS1)
    /// 106-115: AC-MCS 0-9 (VHT:BW40:NSS2)
    /// 116-125: AC-MCS 0-9 (VHT:BW80:NSS1)
    /// 126-135: AC-MCS 0-9 (VHT:BW80:NSS2)
    /// 136-145: AC-MCS 0-9 (VHT:BW20:NSS1:SGI)
    /// 146-155: AC-MCS 0-9 (VHT:BW20:NSS2:SGI)
    /// 156-165: AC-MCS 0-9 (VHT:BW40:NSS1:SGI)
    /// 166-175: AC-MCS 0-9 (VHT:BW40:NSS2:SGI)
    /// 176-185: AC-MCS 0-9 (VHT:BW80:NSS1:SGI)
    /// 186-195: AC-MCS 0-9 (VHT:BW80:NSS2:SGI)
    ///
    /// For example, if rx_rate_index_samples contains a WlanFullmacHistBucket with bucket_index = 75
    /// and num_samples = 50, that means there were 50 frames counted that had a rate corresponding
    /// to N-MCS 15 (BW40:SGI).
    rx_rate_index_samples vector<WlanFullmacHistBucket>:WLAN_FULLMAC_MAX_RX_RATE_INDEX_SAMPLES;
    /// Count of invalid samples encountered, if any.
    invalid_samples uint64;
};

/// Histogram for received signal strength indicator (RSSI).
type WlanFullmacRssiHistogram = struct {
    hist_scope WlanFullmacHistScope;
    /// If hist_scope is PER_ANTENNA, antenna_id must be provided.
    antenna_id WlanFullmacAntennaId;
    /// Sparse histogram of RSSI of AP in dBm. Each sample's bucket_index is an index
    /// into this list of dBm values: [-255, -254, ... -1]. For example, if rssi_samples
    /// contains a WlanFullmacHistBucket with bucket_index = 225 and num_samples = 50, that means
    /// there were 50 frames counted that had a signal level of -30 dBm.
    rssi_samples vector<WlanFullmacHistBucket>:WLAN_FULLMAC_MAX_RSSI_SAMPLES;
    /// Count of invalid samples encountered, if any.
    invalid_samples uint64;
};

/// Histogram for signal to noise ratio (SNR).
type WlanFullmacSnrHistogram = struct {
    hist_scope WlanFullmacHistScope;
    /// If hist_scope is PER_ANTENNA, antenna_id must be provided.
    antenna_id WlanFullmacAntennaId;
    /// Sparse histogram of signal to noise ratio in dB. Each sample's bucket_index is an index
    /// into this list of dB values: [0, 1, ... 255]. For example, if snr_samples contains a
    /// WlanFullmacHistBucket with value = 60 and num_samples = 50, that means there were 50 frames
    /// counted that had a SNR of 60 dB.
    snr_samples vector<WlanFullmacHistBucket>:WLAN_FULLMAC_MAX_SNR_SAMPLES;
    /// Count of invalid samples encountered, if any.
    @allow_deprecated_struct_defaults
    invalid_samples uint64 = 0;
};

/// For each histogram type (e.g. RSSI), there can be multiple histograms up to this limit. For
/// example, an interface might have 1 histogram for station-wide RSSI, but also 1 for each of the
/// antennas used by the interface.
const WLAN_FULLMAC_MAX_HISTOGRAMS_PER_TYPE uint8 = 8;
// LINT.ThenChange(//sdk/fidl/fuchsia.wlan.stats/wlan_stats.fidl)

/// The number of 802.11B rates in the WlanFullmacRxRateIndexHistogram lookup table.
const WLAN_FULLMAC_NUM_RATES_B uint8 = 4;
/// The number of 802.11G rates in the WlanFullmacRxRateIndexHistogram lookup table.
const WLAN_FULLMAC_NUM_RATES_G uint8 = 8;
/// The number of 802.11N rates in the WlanFullmacRxRateIndexHistogram lookup table.
const WLAN_FULLMAC_NUM_RATES_N uint8 = 64;
/// The number of 802.11AC rates in the WlanFullmacRxRateIndexHistogram lookup table.
const WLAN_FULLMAC_NUM_RATES_AC uint8 = 120;

// TODO(https://fxbug.dev/42164319): Use wlan_stats.fidl structure after https://fxbug.dev/42166364 is fixed
type WlanFullmacIfaceCounterStats = struct {
    rx_unicast_total uint64;
    rx_unicast_drop uint64;
    rx_multicast uint64;
    tx_total uint64;
    tx_drop uint64;
};

// TODO(https://fxbug.dev/42164319): Use wlan_stats.fidl structure after https://fxbug.dev/42166364 is fixed
type WlanFullmacIfaceHistogramStats = table {
    /// Noise floor histogram(s).
    1: noise_floor_histograms
            vector<WlanFullmacNoiseFloorHistogram>:WLAN_FULLMAC_MAX_HISTOGRAMS_PER_TYPE;
    /// Received signal strength indicator (RSSI) histogram(s).
    2: rssi_histograms vector<WlanFullmacRssiHistogram>:WLAN_FULLMAC_MAX_HISTOGRAMS_PER_TYPE;
    /// Received rate index histogram(s).
    3: rx_rate_index_histograms
            vector<WlanFullmacRxRateIndexHistogram>:WLAN_FULLMAC_MAX_HISTOGRAMS_PER_TYPE;
    /// Signal to noise ratio (SNR) histogram(s).
    4: snr_histograms vector<WlanFullmacSnrHistogram>:WLAN_FULLMAC_MAX_HISTOGRAMS_PER_TYPE;
};

type WlanFullmacChannelSwitchInfo = struct {
    new_channel uint8;
};

type WlanFullmacPmkInfo = struct {
    pmk vector<uint8>:MAX;
    pmkid vector<uint8>:MAX;
};

/// Protocol definition for communication from the fullmac vendor driver to the platform.
///
/// This base protocol is composed into WlanFullmacImplIfc and WlanFullmacImplIfcBridge
/// below to share common methods definitions.
closed protocol WlanFullmacImplIfcBase {
    // MLME operations
    strict OnScanResult(struct {
        result WlanFullmacScanResult;
    }) -> ();
    strict OnScanEnd(struct {
        end WlanFullmacScanEnd;
    }) -> ();
    strict ConnectConf(struct {
        resp WlanFullmacConnectConfirm;
    }) -> ();
    /// Result of a roam attempt.
    strict RoamConf(struct {
        resp WlanFullmacRoamConfirm;
    }) -> ();
    strict AuthInd(struct {
        resp WlanFullmacAuthInd;
    }) -> ();
    strict DeauthConf(table {
        1: peer_sta_address ieee80211.MacAddr;
    }) -> ();
    strict DeauthInd(struct {
        ind WlanFullmacDeauthIndication;
    }) -> ();
    strict AssocInd(struct {
        resp WlanFullmacAssocInd;
    }) -> ();
    strict DisassocConf(struct {
        resp WlanFullmacDisassocConfirm;
    }) -> ();
    strict DisassocInd(struct {
        ind WlanFullmacDisassocIndication;
    }) -> ();
    strict StartConf(struct {
        resp WlanFullmacStartConfirm;
    }) -> ();
    strict StopConf(struct {
        resp WlanFullmacStopConfirm;
    }) -> ();
    strict EapolConf(struct {
        resp WlanFullmacEapolConfirm;
    }) -> ();
    strict OnChannelSwitch(struct {
        ind WlanFullmacChannelSwitchInfo;
    }) -> ();

    // MLME extensions
    strict SignalReport(struct {
        ind WlanFullmacSignalReportIndication;
    }) -> ();
    strict EapolInd(struct {
        ind WlanFullmacEapolIndication;
    }) -> ();
    strict OnPmkAvailable(struct {
        info WlanFullmacPmkInfo;
    }) -> ();
    strict SaeHandshakeInd(struct {
        ind WlanFullmacSaeHandshakeInd;
    }) -> ();
    strict SaeFrameRx(struct {
        frame WlanFullmacSaeFrame;
    }) -> ();
    strict OnWmmStatusResp(struct {
        status zx.Status;
        wmm_params fuchsia.wlan.common.WlanWmmParameters;
    }) -> ();
};

@discoverable
closed protocol WlanFullmacImplIfcBridge {
    compose WlanFullmacImplIfcBase;
};

@discoverable
@transport("Driver")
@banjo_layout("ddk-interface")
closed protocol WlanFullmacImplIfc {
    compose WlanFullmacImplIfcBase;
};

/// Protocol definition for communication from the platform to the fullmac
/// vendor driver.
///
/// This base protocol is composed into WlanFullmacImpl and WlanFullmacImplBridge
/// below to share common methods definitions.
@discoverable
closed protocol WlanFullmacImplBase {
    // Lifecycle operations
    strict Stop() -> ();

    // State operation
    strict Query() -> (struct {
        info WlanFullmacQueryInfo;
    }) error zx.Status;
    strict QueryMacSublayerSupport() -> (struct {
        resp fuchsia.wlan.common.MacSublayerSupport;
    }) error zx.Status;
    strict QuerySecuritySupport() -> (struct {
        resp fuchsia.wlan.common.SecuritySupport;
    }) error zx.Status;
    strict QuerySpectrumManagementSupport() -> (struct {
        resp fuchsia.wlan.common.SpectrumManagementSupport;
    }) error zx.Status;

    // MLME operations
    strict StartScan(table {
        /// Unique transaction id (will be indicated in corresponding scan results).
        1: txn_id uint64;
        2: scan_type WlanScanType;
        /// List of channels to scan on. An empty list of channels will cause a
        /// scan request to immediately return a WlanFullmacScanEnd with code INVALID_ARGS.
        ///
        /// Invalid channel numbers will be silently ignored. The validity of a channel
        /// number depends on the current regulatory region, and a FullMAC driver cannot
        /// always determine the region setting. This is especially the case when
        /// firmware changes the region setting dynamically.
        3: channels vector<uint8>:ieee80211.MAX_UNIQUE_CHANNEL_NUMBERS;
        /// List of SSIDs to scan for. An empty list of ssids is the same as specifying
        /// a list containing only the wildcard SSID.
        ///
        /// There is no limit on the number of SSIDs specified. A large number of
        /// SSIDs may result in extended scan times because of hardware limitations on
        /// the number of SSIDs permitted per scan request and the technical limitation
        /// in IEEE 802.11-2016 that limits the number of SSIDs in a single Probe Request
        /// frame to ieee80211.SSID_LIST_MAX SSIDs.
        4: ssids vector<ieee80211.CSsid>:MAX;
        /// Minimum amount of time in msecs spent on a channel during scan.
        5: min_channel_time uint32;
        /// Maximum amount of time in msecs spent on a channel during scan.
        6: max_channel_time uint32;
    }) -> ();
    strict Connect(table {
        1: selected_bss fuchsia.wlan.internal.BssDescription;
        /// Timeout specified in beacon interval.
        2: connect_failure_timeout uint32;

        /// Additional parameters specific to the authentication exchange.
        3: auth_type WlanAuthType;
        /// sae_password is ignored except when SAE_DRIVER_AUTH is enabled and the
        /// auth_type is SAE.
        4: sae_password vector<uint8>:MAX;

        /// WEP key used in the authentication exchange. Only included for WEP security type.
        // TODO(https://fxbug.dev/42166364): this should be optional, but we can't because
        // Banjo code generation would give us "a field has incomplete type" error
        5: wep_key fuchsia.wlan.common.WlanKeyConfig;

        /// Additional parameters specific to the association exchange.
        6: security_ie vector<uint8>:ieee80211.WLAN_IE_MAX_LEN;
    }) -> ();
    strict Reconnect(table {
        1: peer_sta_address ieee80211.MacAddr;
    }) -> ();
    strict AuthResp(table {
        1: peer_sta_address ieee80211.MacAddr;
        2: result_code WlanAuthResult;
    }) -> ();
    strict Deauth(table {
        1: peer_sta_address ieee80211.MacAddr;
        2: reason_code ieee80211.ReasonCode;
    }) -> ();
    strict AssocResp(table {
        1: peer_sta_address ieee80211.MacAddr;
        2: result_code WlanAssocResult;
        3: association_id uint16;
    }) -> ();
    strict Disassoc(table {
        1: peer_sta_address ieee80211.MacAddr;
        2: reason_code ieee80211.ReasonCode;
    }) -> ();
    strict Reset(table {
        1: sta_address ieee80211.MacAddr;
        2: set_default_mib bool;
    }) -> ();
    strict StartBss(table {
        1: ssid ieee80211.CSsid;
        2: bss_type fuchsia.wlan.common.BssType;
        3: beacon_period uint32;
        4: dtim_period uint32;
        5: channel uint8;
        6: rsne vector<uint8>:ieee80211.WLAN_IE_BODY_MAX_LEN;
        7: vendor_ie vector<uint8>:WLAN_VIE_MAX_LEN;
    }) -> ();
    strict StopBss(table {
        1: ssid ieee80211.CSsid;
    }) -> ();
    strict SetKeysReq(struct {
        req WlanFullmacSetKeysReq;
    }) -> (struct {
        resp WlanFullmacSetKeysResp;
    });
    strict DelKeysReq(struct {
        req WlanFullmacDelKeysReq;
    }) -> ();
    strict EapolTx(table {
        1: src_addr ieee80211.MacAddr;
        2: dst_addr ieee80211.MacAddr;
        3: data vector<uint8>:MAX;
    }) -> ();

    // MLME extensions
    strict GetIfaceCounterStats() -> (struct {
        stats WlanFullmacIfaceCounterStats;
    }) error zx.Status;
    strict GetIfaceHistogramStats() -> (struct {
        stats WlanFullmacIfaceHistogramStats;
    }) error zx.Status;
    strict SaeHandshakeResp(struct {
        resp WlanFullmacSaeHandshakeResp;
    }) -> ();
    strict SaeFrameTx(struct {
        frame WlanFullmacSaeFrame;
    }) -> ();
    strict WmmStatusReq() -> ();

    // Configuration operations
    strict SetMulticastPromisc(struct {
        enable bool;
    }) -> () error zx.Status;

    // Notify the interface whether it's online or offline. For client interfaces the online status
    // changes based on such things as being associated/disassociated with an AP. For encrypted
    // connections this will be regulated by MLME calls to SetControlledPort, for open connections
    // the interface is considered online as soon as association is confirmed.
    //
    // A SoftAP interface is set to online when:
    // 1) The driver confirms that a request to start a SoftAP succeeded.
    // A SoftAP interface is set to offline when:
    // 1) A request to stop a SoftAP is received.
    // 2) The driver indicates that the SoftAP has stopped (possibly already offline because of 1).
    //
    // The call will ONLY be made when the state actually changes. For example in the situation
    // above where a call to stop an AP has been made there will be a call to OnLinkStateChanged.
    // However when the driver confirms this there will be no additional call to OnLinkStateChanged
    // because it was already offline.
    strict OnLinkStateChanged(struct {
        online bool;
    }) -> ();
};

@discoverable
closed protocol WlanFullmacImplBridge {
    compose WlanFullmacImplBase;

    strict Start(resource struct {
        ifc client_end:WlanFullmacImplIfcBridge;
    }) -> (resource struct {
        sme_channel zx.Handle:CHANNEL;
    }) error zx.Status;
};

@discoverable
@transport("Driver")
closed protocol WlanFullmacImpl {
    compose WlanFullmacImplBase;

    strict Start(resource struct {
        ifc client_end:WlanFullmacImplIfc;
    }) -> (resource struct {
        sme_channel zx.Handle:CHANNEL;
    }) error zx.Status;
};


service Service {
    wlan_fullmac_impl client_end:WlanFullmacImpl;
};
