// 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;
    bytes:6? mac_addr;
};

struct CreateIfaceResponse {
    uint16 iface_id;
};

struct DestroyIfaceRequest {
    uint16 iface_id;
};

struct GetCountryResponse {
    array<byte>:2 alpha2;
};

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

struct ClearCountryRequest {
    uint16 phy_id;
};

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);
    GetCountry(uint16 phy_id) -> (GetCountryResponse resp) error int32;
    SetCountry(SetCountryRequest req) -> (int32 status);
    ClearCountry(ClearCountryRequest req) -> (int32 status);
};
