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

using fuchsia.lowpan;

/// Combined State for LoWPAN Devices
///
/// Contains the various properties of a LoWPAN device
/// that define its current operational state.
///
/// You will get a snapshot of the current state upon the first
/// invocation of `WatchDeviceState()`, after which future
/// invocations of that method will return deltas.
table DeviceState {
    /// LoWPAN Connectivity State
    ///
    /// This field describes the current level of connectivity being
    /// provided by this device.
    1: fuchsia.lowpan.ConnectivityState connectivity_state;

    /// LoWPAN Role
    ///
    /// This field describes the current role this device is taking
    /// on the current network.
    2: fuchsia.lowpan.Role role;
};

/// LoWPAN Device Protocol.
///
/// This protocol provides clients with a way to control and
/// monitor the device.
///
/// Note that aspects of the device that deal with PII must
/// be monitored and controlled via the `DeviceExtra` protocol.
protocol Device {
    /// Provision the interface for the network described by identity
    /// and credential. This is similar to `JoinNetwork`, except that
    /// (assuming the identity and credential are valid) it will (assuming
    /// all preconditions are met) always succeed, even if there are no
    /// peers nearby.
    ///
    /// The following fields of `ProvisioningParams` MUST
    /// be specified:
    ///
    /// * `identity.raw_name`
    /// * `identity.xpanid`
    /// * `identity.panid`
    /// * `identity.channel_index`
    /// * `credential`
    ///
    /// If any of the required fields are unspecified, the
    /// channel will be closed with the epitaph `ZX_ERR_INVALID_ARGUMENT`.
    ///
    /// Additionally, if the `identity.net_type` field is present
    /// and does not match a network type supported by this device,
    /// the channel will also be closed with the epitaph `ZX_ERR_NOT_SUPPORTED`.
    ///
    /// This method returns once the device has been reconfigured successfully.
    /// The resulting change in state can be monitored via `WatchDeviceState()`.
    /// Any error that prevents the operation from completing successfully
    /// will result in the protocol being closed.
    ProvisionNetwork(fuchsia.lowpan.ProvisioningParams params) -> ();

    /// Bring down the network interface and forget
    /// all non-volatile details about the current network.
    ///
    /// Upon completion, all non-volatile and transient state
    /// about the current network is cleared and the interface
    /// will be offline.
    ///
    /// Specifically, calling this method will cause the following
    /// observable effects:
    ///
    /// * `DeviceState.connectivity_state` will transition
    ///   to `State::OFFLINE`, assuming it wasn't in that state already.
    /// * `DeviceExtra::WatchIdentity` will emit an empty `Identity`,
    ///   assuming it wasn't already empty.
    ///
    /// If the interface was not previously provisioned,
    /// calling this method does nothing.
    LeaveNetwork() -> ();

    /// Activate ("bring-up") or deactivate ("shut-down") the
    /// network interface.
    ///
    /// Note that simply setting this to `true` does not mean that
    /// the network interface will necessarily become online and usable,
    /// see the `connectivity_state` field of the `DeviceState` table for
    /// more information.
    ///
    /// This method returns once the operation has completed successfully.
    /// The resulting change in state can be monitored via `WatchDeviceState()`.
    /// Any error that prevents the operation from completing successfully
    /// will result in the protocol being closed.
    SetActive(bool active) -> ();

    /// Returns the types of networks supported by this interface.
    ///
    /// LoWPAN devices typically only support a single network type,
    /// but some devices may support more than one. Up to `MAX_NETWORK_TYPES`
    /// network types may be returned.
    GetSupportedNetworkTypes()
        -> (vector<fuchsia.lowpan.NetworkType>:MAX_NETWORK_TYPES network_types);

    /// Returns a vector of information about the
    /// channels supported by this interface.
    GetSupportedChannels()
        -> (vector<fuchsia.lowpan.ChannelInfo>:fuchsia.lowpan.MAX_CHANNELS channels_info);

    /// Observes changes to the `DeviceState`.
    ///
    /// First call always returns a snapshot of the current state.
    /// Subsequent calls will block until the state has changed
    /// and returns the delta against the device's internal state.
    ///
    /// Changes are not queued. The returned value always represents
    /// the latest and most accurate state values, even if several changes
    /// had happened in-between calls.
    WatchDeviceState() -> (DeviceState device_combined_state);
};

/// LoWPAN Device "Extra" Protocol.
///
/// This protocol provides clients with a way to control and
/// monitor aspects of the LoWPAN device that can, either
/// directly or indirectly, leak PII or cryptographic keys.
protocol DeviceExtra {
    // *****************************************************
    // ALL METHODS IN THIS CLASS DEAL WITH PII.
    // *****************************************************

    /// Forms a new network with the given provisioning parameters.
    ///
    /// Any unspecified fields that are required by the underlying
    /// device or network type will assigned with default values.
    /// If the credential is unspecified, a random one will be
    /// generated automatically.
    ///
    /// This method will cause the device to leave any previously
    /// provisioned network.
    ///
    /// Calling this method while the device is not active will
    /// implicitly make the device active.
    ///
    /// Upon success, the device will be active and provisioned
    /// for the newly created network.
    ///
    /// The progress of the operation can be monitored via
    /// the `ProvisioningMonitor` protocol instance. The operation
    /// may be cancelled by closing the `ProvisioningMonitor`.
    ///
    /// Calling this method will cause any current form, join, or
    /// commission operation to be canceled.
    FormNetwork(fuchsia.lowpan.ProvisioningParams params, request<ProvisioningMonitor> progress);

    /// Attempts to join a pre-existing nearby network
    /// with the given provisioning parameters.
    ///
    /// Upon success, the device will be active and provisioned
    /// for the newly created network.
    ///
    /// The progress of the operation can be monitored via
    /// the `ProvisioningMonitor` protocol instance. The operation
    /// may be cancelled by closing the `ProvisioningMonitor`.
    ///
    /// Calling this method will cause any current form, join, or
    /// commission operation to be canceled.
    JoinNetwork(fuchsia.lowpan.ProvisioningParams params, request<ProvisioningMonitor> progress);

    /// Attempts to find and join a pre-existing nearby network
    /// that is configured to accept and provision devices with
    /// the given shared secret. This allows new devices to join
    /// existing networks without knowing the credentials for the
    /// specific network.
    ///
    /// Upon success, the device will be active and provisioned
    /// for the newly created network.
    ///
    /// The progress of the operation can be monitored via
    /// the `ProvisioningMonitor` protocol instance. The operation
    /// may be cancelled by closing the `ProvisioningMonitor`.
    ///
    /// Calling this method will cause any current form, join, or
    /// commission operation to be canceled.
    CommissionNetwork(JoinerSecret secret, request<ProvisioningMonitor> progress);

    /// Fetches the current credential.
    ///
    /// The returned credential will have originated from a previous call
    /// to `ProvisionNetwork`, `JoinNetwork`, or `FormNetwork`. If the
    /// device is not provisioned (for example, by calling `LeaveNetwork()`)
    /// then this method returns nothing.
    GetCredential() -> (fuchsia.lowpan.Credential? credential);

    /// Starts an energy scan operation.
    ///
    /// This can be used for surveying the spectrum to identify channels
    /// that should be avoided.
    ///
    /// The scan operation may be cancelled by closing the stream protocol.
    ///
    /// If a scan is started while another scan is in progress,
    /// the previous scan is allowed to complete before
    /// the new scan executes and starts returning results.
    ///
    /// All scans should be expected to completely occupy the
    /// LoWPAN device while it is in progress, preventing other operations
    /// from completing until the scan has completed. Additionally, all
    /// network packets should be expected to be dropped while a scan is
    /// in progress.
    ///
    /// Performing energy scans could be used to profile the spectrum
    /// energy for a location and thus be used to determine or refine coarse
    /// location information.
    StartEnergyScan(EnergyScanParameters params, request<EnergyScanResultStream> stream);

    /// Starts an active network scan operation.
    ///
    /// This scan is used to identify other nearby networks in order
    /// to identify channels that should be avoided.
    ///
    /// The scan operation may be cancelled by closing the stream protocol.
    ///
    /// If a scan is started while another scan is in progress,
    /// the previous scan is allowed to complete before
    /// the new scan executes and starts returning results.
    ///
    /// All scans should be expected to completely occupy the
    /// LoWPAN device while it is in progress, preventing other operations
    /// from completing until the scan has completed. Additionally, all
    /// network packets should be expected to be dropped while a scan is
    /// in progress.
    ///
    /// A `NetworkScanner` instance could be used to expose coarse
    /// location information.
    StartNetworkScan(NetworkScanParameters params, request<BeaconInfoStream> stream);

    /// Observes changes to the current network identity.
    ///
    /// First call always returns a snapshot of the current identity.
    /// Subsequent calls will block until the identity has changed,
    /// upon which the entire updated identity is returned.
    ///
    /// If there is no identity currently associated with the
    /// device, then the returned identity will be empty.
    ///
    /// Changes are not queued. The returned identity always represents
    /// the latest and most accurate value, even if several changes
    /// had happened in-between calls.
    ///
    /// Note that the changes are NOT incremental: whenever there
    /// is a change, the entire current LoWPAN identity is returned.
    ///
    /// The value of the identity can be changed by any of the
    /// following calls:
    ///
    /// * `Device.ProvisionNetwork()`
    /// * `Device.LeaveNetwork()`
    /// * `DeviceExtra.JoinNetwork()`
    /// * `DeviceExtra.FormNetwork()`
    WatchIdentity() -> (fuchsia.lowpan.Identity identity);
};
