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

using fuchsia.wlan.common;
using fuchsia.wlan.mlme;
using zx;

enum SupportedPhy {
    DSSS = 1;
    CCK = 2;
    OFDM = 3;
    HT = 4;
    VHT = 5;
};

enum MacRole {
    CLIENT = 1;
    AP = 2;
    MESH = 3;
};

/// IEEE Std 802.11-206 Section 9.4.1.4 Capability Information Field
enum Capability : uint32 {
    SHORT_PREAMBLE = 0x0020;
    SPECTRUM_MGMT = 0x0100;
    QOS = 0x0200;
    SHORT_SLOT_TIME = 0x0400;
    RADIO_MSMT = 0x01000;

    // TODO(fxbug.dev/54923): Move SIMULTANEOUS_CLIENT_AP to a different Fuchsia specific capability enum.
    // This enum should only be used for IEEE 802.11 fields. This type should also be reduced
    // to uint16_t once this is done.
    SIMULTANEOUS_CLIENT_AP = 0x10000;
};

struct ChannelList {
    uint16 base_freq;
    vector<uint8>:200 channels;
};

// IEEE Std 802.11-2016 defines 12 values in dot11SupportedDataRatesRxTable
const uint8 MAX_NUM_RATES = 12;

// BandInfo groups capabilities defined per band.
// This grouping is the industry's de factor standard.
struct BandInfo {
    fuchsia.wlan.common.Band band_id;
    fuchsia.wlan.mlme.HtCapabilities? ht_caps;
    fuchsia.wlan.mlme.VhtCapabilities? vht_caps;
    vector<uint8>:MAX_NUM_RATES rates;
    ChannelList supported_channels;
};

struct PhyInfo {
    // The following fields are not set by the phy itself, but by the service that monitors them.
    // The phy id. This is not a stable identifier, but will not change while this phy's device node
    // remains.
    uint16 id;
    // The topological path of the phy in the device tree.
    string? dev_path;

    // The hardware MAC address for the phy. May not be the same as the MAC address used to
    // communicate with external systems.
    array<uint8>:6 hw_mac_address;

    vector<SupportedPhy>:8 supported_phys;
    vector<fuchsia.wlan.common.DriverFeature>:8 driver_features;
    vector<MacRole>:8 mac_roles;
    vector<Capability>:8 caps;
    vector<BandInfo>:8 bands;
};

struct QueryResponse {
    int32 status;
    PhyInfo info;
};

resource struct CreateIfaceRequest {
    MacRole role;
    // TODO(fxbug.dev/29547): Make `sme_channel` mandatory once all drivers support the channel.
    zx.handle:CHANNEL? sme_channel;
    bytes:6? init_mac_addr;
};

struct CreateIfaceResponse {
    int32 status;
    uint16 iface_id;
};

struct DestroyIfaceRequest {
    uint16 id;
};

struct DestroyIfaceResponse {
    int32 status;
};

/// The country code for a target WLAN PHY device.
/// alpha2 is ISO 3166-1 code to indicate a country. eg. AF for Afghanistan.
struct CountryCode {
    array<byte>:2 alpha2;
};

protocol Phy {
    Query() -> (QueryResponse resp);
    CreateIface(CreateIfaceRequest req) -> (CreateIfaceResponse resp);
    DestroyIface(DestroyIfaceRequest req) -> (DestroyIfaceResponse resp);
    SetCountry(CountryCode req) -> (int32 status);
    GetCountry() -> (CountryCode resp) error int32;
    ClearCountry() -> (int32 status);
};

// Temporary interface for bridging between the devhost-owned channel model and
// the driver-owned channel model of connection management.
/// This protocol is used to connect to the real Phy protocol underlying this device.
[ForDeprecatedCBindings]
protocol Connector {
    Connect(request<Phy> request);
};
