// 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.common;
using fuchsia.wlan.ieee80211 as ieee80211;
using fuchsia.wlan.mlme;
using fuchsia.wlan.sme;
using fuchsia.wlan.stats;
using zx;

type QueryIfaceResponse = struct {
    /// The role the iface is currently operating in, e.g., client role.
    role fuchsia.wlan.common.WlanMacRole;
    /// The iface's global ID.
    id uint16;
    /// Iface's PHY ID.
    phy_id uint16;
    /// Local ID assigned by this iface's PHY.
    phy_assigned_id uint16;
    /// The iface's MAC.
    sta_addr ieee80211.MacAddr;
};

type CreateIfaceRequest = struct {
    phy_id uint16;
    role fuchsia.wlan.common.WlanMacRole;
    sta_addr ieee80211.MacAddr;
};

type CreateIfaceResponse = struct {
    iface_id uint16;
};

type DestroyIfaceRequest = struct {
    iface_id uint16;
};

type GetCountryResponse = struct {
    alpha2 array<byte, 2>;
};

type SetCountryRequest = struct {
    phy_id uint16;
    alpha2 array<byte, 2>;
};

type ClearCountryRequest = struct {
    phy_id uint16;
};

type SetPowerSaveModeRequest = struct {
    /// Interface's PHY ID
    phy_id uint16;
    /// Power Save Mode bit mask
    ps_mode fuchsia.wlan.common.PowerSaveType;
};

type GetPowerSaveModeResponse = struct {
    /// Power Save Mode bit mask
    ps_mode fuchsia.wlan.common.PowerSaveType;
};

type AddIfaceRequest = resource struct {
    phy_id uint16;
    assigned_iface_id uint16;
    iface client_end:fuchsia.wlan.mlme.MLME;
    generic_sme server_end:fuchsia.wlan.sme.GenericSme;
};

type AddIfaceResponse = struct {
    iface_id uint16;
};

// TODO(https://fxbug.dev/42164319): Move this to wlan_internal.fidl after https://fxbug.dev/42166364 is fixed
type GetIfaceCounterStatsResponse = strict union {
    1: stats fuchsia.wlan.stats.IfaceCounterStats;
    2: error_status zx.Status;
};

// TODO(https://fxbug.dev/42164319): Move this to wlan_internal.fidl after https://fxbug.dev/42166364 is fixed
type GetIfaceHistogramStatsResponse = strict union {
    1: stats fuchsia.wlan.stats.IfaceHistogramStats;
    2: error_status zx.Status;
};

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

@discoverable
closed protocol DeviceService {
    // Iface methods
    strict AddIface(resource struct {
        req AddIfaceRequest;
    }) -> (struct {
        status int32;
        iface_id box<AddIfaceResponse>;
    });
};

@discoverable
closed protocol DeviceMonitor {
    // Phy methods
    strict ListPhys() -> (struct {
        phy_list vector<uint16>:MAX;
    });
    strict ListIfaces() -> (struct {
        iface_list vector<uint16>:MAX;
    });
    strict GetDevPath(struct {
        phy_id uint16;
    }) -> (struct {
        dev_path string:optional;
    });
    strict GetSupportedMacRoles(struct {
        phy_id uint16;
    }) -> (struct {
        supported_mac_roles
                vector<fuchsia.wlan.common.WlanMacRole>:fuchsia.wlan.common.MAX_SUPPORTED_MAC_ROLES;
    }) error zx.Status;
    strict WatchDevices(resource struct {
        watcher server_end:DeviceWatcher;
    });
    strict GetCountry(struct {
        phy_id uint16;
    }) -> (struct {
        resp GetCountryResponse;
    }) error int32;
    strict SetCountry(struct {
        req SetCountryRequest;
    }) -> (struct {
        status int32;
    });
    strict ClearCountry(struct {
        req ClearCountryRequest;
    }) -> (struct {
        status int32;
    });
    strict SetPowerSaveMode(struct {
        req SetPowerSaveModeRequest;
    }) -> (struct {
        status int32;
    });
    strict GetPowerSaveMode(struct {
        phy_id uint16;
    }) -> (struct {
        resp GetPowerSaveModeResponse;
    }) error int32;

    // Iface methods
    strict CreateIface(struct {
        req CreateIfaceRequest;
    }) -> (struct {
        status int32;
        resp box<CreateIfaceResponse>;
    });
    strict QueryIface(struct {
        iface_id uint16;
    }) -> (struct {
        resp QueryIfaceResponse;
    }) error zx.Status;
    strict DestroyIface(struct {
        req DestroyIfaceRequest;
    }) -> (struct {
        status int32;
    });

    // SME methods

    /// Attempt to establish a new connection to a Client SME.
    /// Connections may be established for the whole lifetime of the SME,
    /// but concurrent connections might lead to unexpected behavior.
    /// Likely errors include:
    ///     * NOT_FOUND: The given iface_id does not exist.
    ///     * NOT_SUPPORTED: The underlying SME is not a Client SME.
    ///     * PEER_CLOSED: The underlying SME is shutting down.
    strict GetClientSme(resource struct {
        iface_id uint16;
        sme_server server_end:fuchsia.wlan.sme.ClientSme;
    }) -> () error zx.Status;
    /// Attempt to establish a new connection to an AP SME.
    /// Connections may be established for the whole lifetime of the SME,
    /// but concurrent connections might lead to unexpected behavior.
    /// Likely errors include:
    ///     * NOT_FOUND: The given iface_id does not exist.
    ///     * NOT_SUPPORTED: The underlying SME is not a Client SME.
    ///     * PEER_CLOSED: The underlying SME is shutting down.
    strict GetApSme(resource struct {
        iface_id uint16;
        sme_server server_end:fuchsia.wlan.sme.ApSme;
    }) -> () error zx.Status;
    /// Attempt to establish a new connection to telemetry for an SME.
    /// Connections may be established for the whole lifetime of the SME, and
    /// concurrent connections are safe since this is a read-only API.
    /// Likely errors include:
    ///     * NOT_FOUND: The given iface_id does not exist.
    ///     * NOT_SUPPORTED: The underlying SME is not a Client SME.
    ///     * PEER_CLOSED: The underlying SME is shutting down.
    strict GetSmeTelemetry(resource struct {
        iface_id uint16;
        telemetry_server server_end:fuchsia.wlan.sme.Telemetry;
    }) -> () error zx.Status;
    /// Attempt to establish a new connection to feature queries for an SME.
    /// Connections may be established for the whole lifetime of the SME, and
    /// concurrent connections are safe since this is a read-only API.
    /// Likely errors include:
    ///     * NOT_FOUND: The given iface_id does not exist.
    ///     * PEER_CLOSED: The underlying SME is shutting down.
    strict GetFeatureSupport(resource struct {
        iface_id uint16;
        feature_support_server server_end:fuchsia.wlan.sme.FeatureSupport;
    }) -> () error zx.Status;
};
