// 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;
using fuchsia.net;

type Identity = table {
    /// The raw bytes for the network name.
    /// This is typically a [StringPrep'd][1] UTF8 encoding.
    ///
    /// Note that extra care must be taken when displaying
    /// this value to users, since there are many ways
    /// to make visually similar UTF8 strings that
    /// have differing bytecode representations.
    ///
    /// [1]: https://tools.ietf.org/html/rfc3454
    1: raw_name vector<uint8>:63;

    @available(removed=11, renamed="deprecated_vector_xpanid")
    2: xpanid vector<uint8>:8;

    /// String identifying the type of network.
    ///
    /// Well-known protocol ids are associated with
    /// specific string values (like "org.threadgroup.std.thread"
    /// or "org.zigbee.std.zigbee-ip"). For unknown protocol ids,
    /// the string will map to something like
    /// `fuchsia.lowpan.net_type.802.15.4.pid.XX`, where `XX` is
    /// the value of the protocol id from a 802.14.5 beacon.
    /// This field is optional when joining, forming, or provisioning.
    3: net_type NetworkType;

    /// Channel Index.
    4: channel fuchsia.lowpan.ChannelIndex;

    /// PANID for 802.14.5-based networks (or the equivalent).
    5: panid uint16;

    /// IPv6 Mesh-local prefix.
    ///
    /// This parameter allows you to determine the mesh-local
    /// IPv6 prefix for the current network, or to specify one
    /// when provisioning the interface for a network or forming
    /// a new network.
    ///
    /// The prefix length is always 64 bits, so only the upper
    /// 64 bits of the value are used: the least significant bits
    /// must be ignored when read and zero when set.
    ///
    /// This field is ignored when supplied to `JoinNetwork()`.
    6: mesh_local_prefix fuchsia.net.Ipv6AddressWithPrefix;

    /// Extended PANID.
    @available(added=11)
    7: xpanid array<uint8, 8>;
};

/// LoWPAN Role Type.
///
/// This type describes the role a device can assume on a network.
type Role = flexible enum : int32 {
    /// Detached role. The interface is not
    /// currently participating on the network,
    /// either because it cannot find a parent
    //// or the interface is not currently provisioned.
    DETACHED = 1;

    /// End-device role. End devices do not route
    /// traffic on behalf of other nodes.
    END_DEVICE = 2;

    /// Router role. Routers help route traffic
    /// around the mesh network.
    ///
    /// Note that this role is independent of the
    /// device being a "border router".
    ///
    /// Not all network types support this role.
    ROUTER = 3;

    /// Sleepy End-Device role.
    ///
    /// End devices with this role are nominally asleep,
    /// waking up periodically to check in with their
    /// parent to see if there are packets destined for
    /// them. Such devices are capable of extraordinarily
    /// low power consumption, but packet latency can be
    /// on the order of dozens of seconds(depending on how
    /// the node is configured). Not all network types
    /// support this role.
    ///
    /// Not all network types support this role.
    SLEEPY_END_DEVICE = 4;

    /// Sleepy-router role.
    ///
    /// Routers with this role are nominally asleep,
    /// waking up periodically to check in with
    /// other routers and their children.
    ///
    /// Not all network types support this role.
    SLEEPY_ROUTER = 5;

    /// Leader role.
    ///
    /// On Thread networks, for each partition/fragment
    /// one router is designated as the "leader", which
    /// means that it is considered authoritative for
    /// all network data. In most cases this role can be
    /// considered as a synonym to Role::ROUTER.
    ///
    /// Not all network types support this role.
    LEADER = 6;

    /// Coordinator role.
    ///
    /// Not all network types support this role.
    COORDINATOR = 7;
};

/// LoWPAN Connectivity State
///
/// This enum describes the level of connectivity being provided
/// by a device.
type ConnectivityState = flexible enum : int32 {
    /// Inactive state.
    ///
    /// In this state the device is unprovisioned and administratively
    /// disabled (inactive).
    ///
    /// This state can always be explicitly entered by calling `Leave`
    /// followed by `SetActive(false)`.
    INACTIVE = 1;

    /// Ready state.
    ///
    /// In this state the device is provisioned for a network, but is
    /// administratively disabled (inactive).
    ///
    /// This state can be directly entered with the following actions
    /// based on the current connectivity state:
    ///
    /// * `INACTIVE`: by calling `ProvisionNetwork(...)`.
    /// * `ATTACHING`, `ATTACHED`, `ISOLATED`, `COMMISSIONING`: by calling `SetActive(false)`.
    READY = 2;

    /// Offline state.
    ///
    /// In this state the device is administratively enabled (active)
    /// but is not provisioned and thus has no network to attach to.
    ///
    /// This state can be directly entered with the following actions
    /// based on the current connectivity state:
    ///
    /// * `INACTIVE`: by calling `SetActive(true)`.
    /// * `ATTACHING`, `ATTACHED`, `ISOLATED`, `COMMISSIONING`: by calling `Leave()`.
    OFFLINE = 3;

    /// Attaching state.
    ///
    /// In this state the device is administratively enabled
    /// (active) and either provisioned for a network or shortly
    /// about to become provisioned for a network.
    ///
    /// The interface enters this state when it starts the process
    /// of trying to find other nodes so that it can attach to any
    /// pre-existing network fragment, or when it is in the process
    /// of calculating the optimal values for unspecified parameters
    /// when forming a new network.
    ///
    /// This state can be directly entered with the following actions
    /// based on the current connectivity state:
    ///
    /// * `READY`: by calling `SetActive(true)`
    /// * `OFFLINE`, `ATTACHING`, `ATTACHED`, `ISOLATED`, `COMMISSIONING`:
    ///    by calling `ProvisionNetwork(...)`, `FormNetwork(...)`, or `JoinNetwork(...)`
    ATTACHING = 4;

    /// Attached state.
    ///
    /// In this state the device is both administratively enabled
    /// (active) and provisioned for a network. The device is an
    /// active participant on the network and can communicate with
    /// peers.
    ///
    /// This state usually implies that peers are available, but that
    /// may not actually be the case due to current network conditions
    /// or privacy-protecting measures.
    ///
    /// This state cannot generally be entered directly, rather
    /// the device will enter this state automatically from the
    /// `ATTACHING` or `ISOLATED` states once connectivity has been
    /// (re)established.
    ATTACHED = 5;

    /// Isolated state.
    ///
    /// In this state the device is both administratively enabled
    /// (active) and provisioned for a network. However, the device
    /// has no connectivity because there are no peers in range on
    /// the provisioned network.
    ///
    /// Once peer devices on the same network come into range
    /// the connectivity state will eventually switch back to
    /// `ATTACHED`, indicating restored connectivity with at least
    /// one peer.
    ///
    /// This state cannot generally be entered directly, rather
    /// the device may enter this state automatically from the
    /// `ATTACHING` or `ATTACHED` states.
    ISOLATED = 6;

    /// Commissioning state.
    ///
    /// Currently unused, but will later be used to
    /// support in-band commissioning. It is usually appropriate
    /// to consider this as a synonym for the `ATTACHING` state
    /// except that the device remains unprovisioned.
    COMMISSIONING = 7;
};

/// Describes a LoWPAN credential.
///
/// Currently only supports a symmetric network key,
/// but may be extended in the future to support other
/// types of credentials, such as passwords, PAKE
/// secrets, or a reference to a certificate/private-key
/// pair.
type Credential = flexible union {
    /// Describes a symmetric key credential.
    ///
    /// The size of the symmetric key is defined by the
    /// underlying network technology. For Thread this
    /// is a 16-byte value.
    ///
    /// Note that this value is not a password.
    1: network_key vector<uint8>:32;
};

/// 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.
type DeviceState = table {
    /// LoWPAN Connectivity State
    ///
    /// This field describes the current level of connectivity being
    /// provided by this device.
    1: connectivity_state ConnectivityState;

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

/// Protocol for connecting to [`Device`] on a LoWPAN
/// interface.
@discoverable
closed protocol DeviceConnector {
    /// Connects to the [`Device`] protocol on the
    /// named LoWPAN interface.
    ///
    /// The name of the interface can be learned by calling
    /// [`fuchsia.lowpan/Lookup.GetDevices()`].
    ///
    /// If there is an error in processing this request
    /// the given channel is closed and an epitaph code used
    /// to describe the reason for the failure:
    ///
    /// * `ZX_ERR_INVALID_ARGUMENT`: The given interface name
    ///   was not formatted correctly or otherwise invalid.
    /// * `ZX_ERR_NOT_FOUND`: No interface was found with the
    ///   given name.
    /// * `ZX_ERR_NOT_SUPPORTED`: The interface exists but
    ///   does not support this protocol.
    strict Connect(resource struct {
        name fuchsia.lowpan.InterfaceName;
        server_end server_end:Device;
    });
};

/// 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.
closed 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.
    strict ProvisionNetwork(struct {
        params ProvisioningParams;
    }) -> ();

    /// 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.
    strict 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.
    strict SetActive(struct {
        active bool;
    }) -> ();

    /// 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.
    strict GetSupportedNetworkTypes() -> (struct {
        network_types vector<NetworkType>:MAX_NETWORK_TYPES;
    });

    /// 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.
    strict WatchDeviceState() -> (struct {
        device_combined_state DeviceState;
    });
};

/// Protocol for connecting to [`DeviceExtra`] on a LoWPAN
/// interface.
@discoverable
closed protocol DeviceExtraConnector {
    /// Connects to the [`DeviceExtra`] protocol on the
    /// named LoWPAN interface.
    ///
    /// The name of the interface can be learned by calling
    /// [`fuchsia.lowpan/Lookup.GetDevices`].
    ///
    /// If there is an error in processing this request
    /// the given channel is closed and an epitaph code used
    /// to describe the reason for the failure:
    ///
    /// * `ZX_ERR_INVALID_ARGUMENT`: The given interface name
    ///   was not formatted correctly or otherwise invalid.
    /// * `ZX_ERR_NOT_FOUND`: No interface was found with the
    ///   given name.
    /// * `ZX_ERR_NOT_SUPPORTED`: The interface exists but
    ///   does not support this protocol.
    strict Connect(resource struct {
        name fuchsia.lowpan.InterfaceName;
        server_end server_end:DeviceExtra;
    });
};

/// 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.
closed protocol DeviceExtra {
    // *****************************************************
    // ALL METHODS IN THIS CLASS DEAL WITH PII.
    // *****************************************************

    /// 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.
    strict GetCredential() -> (struct {
        credential Credential:optional;
    });

    /// 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()`
    strict WatchIdentity() -> (struct {
        identity Identity;
    });

    /// Returns the current MAC address being used for this device,
    /// which may differ from the static factory-assigned MAC address.
    ///
    /// This address is generally static, but may change when the
    /// device is re-associated to a different network or a factory
    /// reset is performed.
    @available(added=9)
    strict GetCurrentMacAddress() -> (struct {
        address fuchsia.lowpan.MacAddress;
    });
};
