| // 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); |
| }; |