// 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.phyinfo;
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.HtCapabilitiesFields;

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

    /// 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 WlanInfoDriverFeature values.
    driver_features fuchsia.hardware.wlan.phyinfo.WlanInfoDriverFeature;

    /// 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;
    });
};
