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

using fuchsia.wlan.device;
using fuchsia.wlan.minstrel;
using fuchsia.wlan.sme;
using fuchsia.wlan.stats;

struct PhyListItem {
    uint16 phy_id;
    string path;
};

struct ListPhysResponse {
    vector<PhyListItem> phys;
};

struct QueryPhyRequest {
    uint16 phy_id;
};

struct QueryPhyResponse {
    fuchsia.wlan.device.PhyInfo info;
};

struct IfaceListItem {
    uint16 iface_id;
};

struct QueryIfaceResponse {
    /// The role the iface is currently operating in, e.g., client role.
    fuchsia.wlan.device.MacRole role;
    /// The iface's global ID.
    uint16 id;
    /// Iface's PHY ID.
    uint16 phy_id;
    /// Local ID assigned by this iface's PHY.
    uint16 phy_assigned_id;
    /// The iface's MAC.
    array<uint8>:6 mac_addr;
};

struct ListIfacesResponse {
    vector<IfaceListItem> ifaces;
};

struct CreateIfaceRequest {
    uint16 phy_id;
    fuchsia.wlan.device.MacRole role;
};

struct CreateIfaceResponse {
    uint16 iface_id;
};

struct DestroyIfaceRequest {
    uint16 iface_id;
};

struct SetCountryRequest {
    uint16 phy_id;
    array<byte>:2 alpha2;
};

protocol DeviceWatcher {
    -> OnPhyAdded(uint16 phy_id);
    -> OnPhyRemoved(uint16 phy_id);
    -> OnIfaceAdded(uint16 iface_id);
    -> OnIfaceRemoved(uint16 iface_id);
};

[Discoverable]
protocol DeviceService {
    // Phy methods
    ListPhys() -> (ListPhysResponse resp);
    QueryPhy(QueryPhyRequest req) -> (int32 status, QueryPhyResponse? resp);
    // 3-15: reserved

    // Iface methods
    ListIfaces() -> (ListIfacesResponse resp);
    QueryIface(uint16 iface_id) -> (int32 status, QueryIfaceResponse? resp);
    CreateIface(CreateIfaceRequest req) -> (int32 status, CreateIfaceResponse? resp);
    // 19: reserved for StartIface
    // 20: reserved for StopIface
    DestroyIface(DestroyIfaceRequest req) -> (int32 status);
    GetClientSme(uint16 iface_id, request<fuchsia.wlan.sme.ClientSme> sme) -> (int32 status);
    GetApSme(uint16 iface_id, request<fuchsia.wlan.sme.ApSme> sme) -> (int32 status);
    GetMeshSme(uint16 iface_id, request<fuchsia.wlan.sme.MeshSme> sme) -> (int32 status);
    GetIfaceStats(uint16 iface_id) -> (int32 status, fuchsia.wlan.stats.IfaceStats? stats);
    GetMinstrelList(uint16 iface_id) -> (int32 status, fuchsia.wlan.minstrel.Peers peers);
    GetMinstrelStats(uint16 iface_id, array<uint8>:6 peer_addr)
        -> (int32 status, fuchsia.wlan.minstrel.Peer? peer);

    WatchDevices(request<DeviceWatcher> watcher);
    SetCountry(SetCountryRequest req) -> (int32 status);
};
