// 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.hardware.wlan.softmac;

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

type WlanSoftmacBandCapability = 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, fuchsia.wlan.internal.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 WlanSoftmacInfo = struct {
    /// Station address.
    sta_addr ieee80211.MacAddr;

    /// MAC role
    mac_role fuchsia.wlan.common.WlanMacRole;

    /// Bitmask indicating WlanInfoPhyType values supported by the hardware.
    supported_phys_list
            array<fuchsia.wlan.common.WlanPhyType, fuchsia.wlan.common.MAX_SUPPORTED_PHY_TYPES>;
    supported_phys_count uint8;

    /// Bitmask indicating enabled WlanInfoHardwareCapability values.
    hardware_capability fuchsia.wlan.common.WlanSoftmacHardwareCapability;

    /// Supported bands.
    band_cap_list array<WlanSoftmacBandCapability, fuchsia.wlan.common.MAX_BANDS>;
    band_cap_count uint8;
};

/// These flags are used as a bitfield.
type WlanRxInfoFlags = strict enum : uint32 {
    /// The FCS for the received frame was invalid.
    FCS_INVALID = 0x1;
    /// Padding was added after the MAC header to align the frame body to 4 bytes.
    FRAME_BODY_PADDING_4 = 0x2;
};

type WlanRxInfo = struct {
    /// Boolean receive flags. Enums and value-based info are represented below.
    rx_flags WlanRxInfoFlags;

    /// Bitmask indicating which of the following fields are valid in this struct. Reserved flags
    /// must be zero.
    valid_fields uint32;
    /// The PHY format of the device at the time of the operation.
    phy fuchsia.wlan.common.WlanPhyType;
    /// The data rate of the device, measured in units of 0.5 Mb/s.
    data_rate uint32;
    /// The channel of the device at the time of the operation. This field must be included.
    channel fuchsia.wlan.common.WlanChannel;
    /// The modulation and coding scheme index of the device at the time of the operation. Depends
    /// on the PHY format and channel width.
    mcs uint8;

    /// Received Signal Strength Indicator.
    rssi_dbm int8;
    /// Signal-to-Noise Ratio, in 0.5 dB.
    snr_dbh int16;
};

type WlanTxInfoFlags = strict enum : uint8 {
    PROTECTED = 0x1;
    /// For rate control: indicate an important data frame, such as EAPOL, which should be sent
    /// _reliably_ rather than fast, and is exempt from rate probing
    FAVOR_RELIABILITY = 0x2;
    /// Indicate that this packet should be sent out with QoS header when possible (11n+).
    // TODO(fxbug.dev/29622): remove this when MLME supports QoS tag.
    QOS = 0x4;
};

type WlanTxInfoValid = strict enum : uint8 {
    DATA_RATE = 0x1;
    TX_VECTOR_IDX = 0x2;
    PHY = 0x4;
    CHANNEL_BANDWIDTH = 0x8;
    MCS = 0x10;
};

type WlanTxInfo = struct {
    /// Transmit flags. These represent boolean options as opposed to enums or other value-based
    /// info which are represented below. Values should be taken from the WLAN_TX_INFO_FLAGS_* enum.
    tx_flags WlanTxInfoFlags;

    /// Bitmask indicating which of the following fields are valid in this struct. Reserved flags
    /// must be zero. Values for fields not indicated by a flag may be chosen at the discretion of
    /// the softmac driver.
    valid_fields uint32;
    // Will be sent back in wlan_tx_status_t if Minstrel is enabled for the device, indicated by
    // WLAN_TX_INFO_VALID_TX_VECTOR_IDX.
    tx_vector_idx uint16;
    // The PHY format to be used to transmit this packet.
    phy fuchsia.wlan.common.WlanPhyType;
    // The channel width to be used to transmit this packet.
    channel_bandwidth fuchsia.wlan.common.ChannelBandwidth;
    /// The modulation and coding scheme index for this packet. Depends on the PHY format and
    /// channel width.
    mcs uint8;
};

type WlanProtection = strict enum : uint8 {
    NONE = 0;
    RX = 1;
    TX = 2;
    RX_TX = 3;
};

type WlanKeyConfig = struct {
    /// The BSSID for which this key is relevant.
    bssid uint8;
    /// Which path to protect: None, TX, RX, or TX and RX.
    protection WlanProtection;
    /// IEEE Cipher suite selector.
    /// See IEEE Std 802.11-2016, 9.4.2.25.2, Table 9-131
    cipher_oui array<uint8, 3>;
    cipher_type uint8;
    /// Whether this key is a pairwise, group or peer key.
    key_type fuchsia.hardware.wlan.associnfo.WlanKeyType;
    /// The peer MAC address for pairwise and peer keys.
    /// For group keys this value is always the broadcast address.
    peer_addr ieee80211.MacAddr;
    /// Index for rotating keys, e.g. group keys.
    /// This value is always 0 for key types which aren't rotating, e.g. pairwise keys.
    key_idx uint8;
    // Length of the supplied key.
    key_len uint8;
    // They key's actual bytes.
    key array<uint8, 32>;
    /// Receive Sequence Counter for group keys only.
    /// In all other cases the RSC will be 0.
    rsc uint64;
};

type WlanRxPacket = struct {
    @buffer
    mac_frame vector<uint8>:MAX;
    info WlanRxInfo;
};

type WlanTxPacket = struct {
    @buffer
    mac_frame vector<uint8>:MAX;
    /// Additional data needed to transmit the packet.
    info WlanTxInfo;
};

/// Includes the information about beacon template.
type WlanBcnConfig = struct {
    /// Points to the beacon template. Since this is just the template, some packet content can
    /// contain only minimum valid info. They will be changed later by hardware/firmware or software.
    /// Note that the driver must copy the packet content into its own memory and cannot rely on
    /// the pointers in the struct.
    packet_template WlanTxPacket;

    /// TIM offset (in bytes) to the start of |bcn_tmpl|. This points to the first byte of TIM IE,
    /// which is the tag ID.
    tim_ele_offset uint64;

    /// in TU
    beacon_interval uint16;
};

@transport("Banjo")
@banjo_layout("ddk-interface")
protocol WlanSoftmacIfc {
    /// Report the status of the softmac device.
    Status(struct {
        status uint32;
    }) -> ();

    /// Submit received data to the next driver.
    Recv(struct {
        packet WlanRxPacket;
    });

    /// complete_tx() is called to return ownership of a packet to the wlan driver.
    /// Return status indicates queue state:
    ///   ZX_OK: Packet has been enqueued.
    ///   Other: Packet could not be enqueued.
    ///
    /// Upon a return of ZX_OK, the packet has been enqueued, but no information is returned as to
    /// the completion state of the transmission itself.
    CompleteTx(struct {
        packet WlanTxPacket;
        status zx.status;
    }) -> ();

    /// Reports the status of an attempted transmission.
    /// |tx_status|: contains status info of one transmitted packet to one peer at one specific rate.
    ReportTxStatus(struct {
        tx_status fuchsia.wlan.common.WlanTxStatus;
    });

    /// Reports completion of a scan associated with the unique `scan_id`. The status
    /// `ZX_ERR_OUT_OF_RANGE` implies the scan request included a prohibited channel.
    /// The channel may be prohibited because of the current country setting.
    ScanComplete(struct {
        status zx.status;
        scan_id uint64;
    });
};

/// Argument struct to be passed as the single argument to WlanSoftmac.StartPassiveScan.
type WlanSoftmacPassiveScanArgs = struct {
    /// List of channels to scan on. An empty list of channels will cause a
    /// scan request to immediately return ZX_ERR_INVALID_ARGS.
    ///
    /// Invalid channel numbers will be silently ignored. The validity of a channel
    /// number depends on the current regulatory region, and a SoftMAC driver cannot
    /// always determine the region setting. This is especially the case when
    /// firmware changes the region setting dynamically.
    channels vector<uint8>:ieee80211.MAX_UNIQUE_CHANNEL_NUMBERS;

    /// Minimum duration to spend on each channel during the scan.
    min_channel_time zx.duration;

    /// Maximum duration to spend on each channel during the scan.
    max_channel_time zx.duration;

    /// Minimum duration to spend on the home channel(s) between the dwell time on each channel
    /// where a home channel corresponds to channels the device should otherwise be present
    /// on while not scanning.
    min_home_time zx.duration;
};

/// Argument struct to be passed as the single argument to WlanSoftmac.StartActiveScan
type WlanSoftmacActiveScanArgs = struct {
    /// List of channels to scan on. An empty list of channels will cause a
    /// scan request to immediately return ZX_ERR_INVALID_ARGS.
    ///
    /// Invalid channel numbers will be silently ignored. The validity of a channel
    /// number depends on the current regulatory region, and a SoftMAC driver cannot
    /// always determine the region setting. This is especially the case when
    /// firmware changes the region setting dynamically.
    channels vector<uint8>:ieee80211.MAX_UNIQUE_CHANNEL_NUMBERS;

    /// List of SSIDs to scan for. For a list with a single SSID, the SSID will be placed in
    /// the SSID element in the Probe Request frame. For a list with more than one SSID,
    /// all SSIDs will be placed in an SSID List element in the Probe Request frame with the
    /// first SSID in the list in the required SSID element. An empty list is the same as
    /// specifying a list containing only the wildcard SSID.
    ssids vector<ieee80211.CSsid>:ieee80211.SSID_LIST_MAX;

    /// Buffer containing a MAC header (as defined in IEEE Std 802.11-2016, 9.3.3.2) to
    /// include in each Probe Request frame.
    @buffer
    mac_header vector<uint8>:ieee80211.MAX_MGMT_FRAME_MAC_HEADER_BYTE_LEN;

    /// Buffer containing IE bytes to include in each Probe Request frame.
    @buffer
    ies vector<uint8>:ieee80211.MAX_VHT_MPDU_BYTE_LEN_2;

    /// Minimum duration to spend on each channel during the scan.
    min_channel_time zx.duration;

    /// Maximum duration to spend on each channel during the scan.
    max_channel_time zx.duration;

    /// Minimum duration to spend on the home channel(s) between the dwell time on each channel
    /// where a home channel corresponds to channels the device should otherwise be present
    /// on while not scanning.
    min_home_time zx.duration;

    /// Minimum number of Probe Request frames to transmit per channel visit during a scan.
    /// The definition of a channel visit may differ between device drivers, but it is roughly
    /// the interval of time spent on a specific channel during a scan.
    ///
    /// Sending more than one Probe Request frame on a channel may increase the probability that
    /// it is received in a noisy environment.
    min_probes_per_channel uint8;

    /// Maximum number of Probe Request frames to transmit per channel visit during a scan.
    /// The definition of a channel visit may differ between device drivers, but it is roughly
    /// the interval of time spent on a specific channel during a scan. Specifying 0 is invalid
    /// since at least one Probe Request frame must be transmitted for an active scan.
    ///
    /// Limiting the number of Probe Request frames sent on a channel reduces the time spent
    /// transmitting frames, and thus increase the time spent receiving frames, while scanning.
    max_probes_per_channel uint8;
};

@transport("Banjo")
@banjo_layout("ddk-protocol")
protocol WlanSoftmac {
    /// Obtain information about the device and supported features
    /// Safe to call at any time.
    Query() -> (struct {
        status zx.status;
        info WlanSoftmacInfo;
    });

    QueryDiscoverySupport() -> (struct {
        resp fuchsia.wlan.common.DiscoverySupport;
    });
    QueryMacSublayerSupport() -> (struct {
        resp fuchsia.wlan.common.MacSublayerSupport;
    });
    QuerySecuritySupport() -> (struct {
        resp fuchsia.wlan.common.SecuritySupport;
    });
    QuerySpectrumManagementSupport() -> (struct {
        resp fuchsia.wlan.common.SpectrumManagementSupport;
    });

    /// Start softmac running with ifc_virt
    /// Callbacks on ifc may be invoked from now until stop() is called
    Start(resource struct {
        ifc client_end:WlanSoftmacIfc;
    }) -> (resource struct {
        status zx.status;
        sme_channel zx.handle:CHANNEL;
    });

    /// Shut down a running softmac
    /// Safe to call if the softmac is already stopped.
    Stop() -> ();

    /// Queue a packet for transmission. May return before a packet has actually been transmitted.
    /// The driver may choose to take ownership of the given WlanTxPacket by setting enqueue_pending
    /// to true, in which case the packet must be returned later via CompleteTx.
    ///
    /// Note: CompleteTx may be used to return the WlanTxPacket before transmission completes, but
    /// MUST NOT be called from within the QueueTx implementation.
    QueueTx(struct {
        packet WlanTxPacket;
    }) -> (struct {
        /// status only indicates that the packet was successfully queued, not successfully
        /// transmitted. enqueue_pending should only be true if status is ZX_OK.
        status zx.status;
        enqueue_pending bool;
    });

    // Set the radio channel
    SetChannel(struct {
        chan fuchsia.wlan.common.WlanChannel;
    }) -> (struct {
        status zx.status;
    });

    // Configures a BSS which the STA is either joining or managing.
    ConfigureBss(struct {
        config fuchsia.wlan.internal.BssConfig;
    }) -> (struct {
        st zx.status;
    });

    // Enables or disables hardware Beaconing.
    // * |bcn_cfg|: Pass `nullptr` to disable hardware Beacons. Used by hardware beacon offload.
    EnableBeaconing(struct {
        bcn_cfg WlanBcnConfig;
    }) -> (struct {
        st zx.status;
    });

    /// Configures a Beacon frame in hardware to announce the BSS' existence.
    /// * |packet|: Pass `nullptr` to disable hardware Beacons. Used by software generated beacon.
    /// TODO(fxbug.dev/29298): Rename to update_beacon.
    ConfigureBeacon(struct {
        packet WlanTxPacket;
    }) -> (struct {
        st zx.status;
    });

    /// Specify a key for frame protection.
    SetKey(struct {
        key_config WlanKeyConfig;
    }) -> (struct {
        st zx.status;
    });

    /// Notifies MAC and PHY parameters negotiated through a successful association
    ConfigureAssoc(struct {
        assoc_ctx fuchsia.hardware.wlan.associnfo.WlanAssocCtx;
    }) -> (struct {
        st zx.status;
    });

    /// Notifies MAC and PHY that the peer has been disassociated.
    ClearAssoc(struct {
        peer_addr ieee80211.MacAddr;
    }) -> (struct {
        st zx.status;
    });

    /// Start a passive scan in the device driver. Scan results will be delivered as Beacon
    /// frames via WlanSoftmacIfc.Recv(). When complete, WlanSoftmacIfc.ScanComplete() will
    /// be called with the corresponding unique `scan_id`.
    StartPassiveScan(struct {
        args WlanSoftmacPassiveScanArgs;
    }) -> (struct {
        status zx.status;
        scan_id uint64;
    });

    /// Start an active scan in the device driver. Scan results will be delivered as Beacon or
    /// Probe Response frames via WlanSoftmacIfc.Recv(). When complete,
    /// WlanSoftmacIfc.ScanComplete() will be called with the corresponding unique `scan_id`.
    ///
    /// The IEs specified must not result in a Probe Request MMPDU that exceed the limits
    /// defined by IEEE Std 802.11-2016, 9.2.4.7. MMPDU limit constants can be found in
    /// fuchsia.wlan.ieee80211. These limits are very large and will likely not be exceeded
    /// by specifying the most common IEs found in Probe Request frames.
    StartActiveScan(struct {
        args WlanSoftmacActiveScanArgs;
    }) -> (struct {
        status zx.status;
        scan_id uint64;
    });

    /// Notifies change of WMM parameters for specified AC
    UpdateWmmParams(struct {
        ac fuchsia.hardware.wlan.associnfo.WlanAc;
        params fuchsia.hardware.wlan.associnfo.WlanWmmParams;
    }) -> (struct {
        st zx.status;
    });
};
