// Copyright 2017 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.mlme;

using fuchsia.wlan.common;
using fuchsia.wlan.stats;
using fuchsia.wlan.minstrel;

// Custom primitives for communicating between the wlan service and the MLME drivers.
// The primitives defined here are not part of the official 802.11 MLME SAP interface specification,
// but follow the same principle for the sake of consistency.

// SIGNAL_REPORT.indication

struct SignalReportIndication {
    int8 rssi_dbm;
};

// EAPOL.indication

struct EapolIndication {
    array<uint8>:6 src_addr;
    array<uint8>:6 dst_addr;
    bytes data;
};

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

// BandInfo groups capabilities defined per band.
// This grouping is the industry's de factor standard.
struct BandCapabilities {
    fuchsia.wlan.common.Band band_id;
    bytes basic_rates;
    uint16 base_frequency;
    bytes channels;

    CapabilityInfo cap;
    HtCapabilities? ht_cap;
    VhtCapabilities? vht_cap;
};

struct DeviceInfo {
    array<uint8>:6 mac_addr;
    MacRole role;
    vector<BandCapabilities> bands;
    vector<fuchsia.wlan.common.DriverFeature>:32 driver_features;
};

// STATS_QUERY.response

struct StatsQueryResponse {
    fuchsia.wlan.stats.IfaceStats stats;
};

struct MinstrelListResponse {
    fuchsia.wlan.minstrel.Peers peers;
};

struct MinstrelStatsRequest {
    array<uint8>:6 mac_addr;
};

struct MinstrelStatsResponse {
    fuchsia.wlan.minstrel.Peer? peer;
};

// SET_CONTROLLED_PORT.request

struct SetControlledPortRequest {
    array<uint8>:6 peer_sta_address;
    ControlledPortState state;
};

enum ControlledPortState {
    CLOSED = 0;
    OPEN = 1;
};

// Method ordinals are defined in wlan_mlme.fidl to prevent error prone overlaps with official
// MLME primitives.
