// Copyright 2022 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.experimental;

using fuchsia.lowpan;
using zx;

/// Protocol for connecting to [`LegacyJoining`] on a LoWPAN
/// interface.
@discoverable
protocol LegacyJoiningConnector {
    /// Connects to the [`LegacyJoining`] 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.
    Connect(resource struct {
        name fuchsia.lowpan.InterfaceName;
        server_end server_end:LegacyJoining;
    });
};

/// Protocol for supporting non-standard in-band commissioning protocols.
/// Only one instance of this protocol may be valid at a time: after the
/// first request all subsequent requests for this protocol will fail until
/// the first instance is closed.
protocol LegacyJoining {
    /// Makes the interface joinable for Thread devices that need to use a
    /// non-standard in-band commissioning protocol. It is not used for
    /// standard Thread commissioning.
    ///
    /// When this call returns, the interface has been made joinable if
    /// requested.
    ///
    /// Subsequent calls to this method will override previous calls.
    /// To force the interface to no longer be joinable immediately, call
    /// this method with a duration of zero seconds and a port of zero (port
    /// is ignored in this case).
    ///
    /// This method must only be called when the interface is online
    /// (Specifically, either attaching, attached, or isolated). If the
    /// interface is in any other state, the channel will be closed with
    /// `ZX_ERR_BAD_STATE`.
    ///
    /// `duration` specifies a minimum time the interface should be made
    /// joinable, relative to the time the call is received. It may be rounded
    /// up to the nearest second.
    ///
    /// `port` specifies the local port that TCP or UDP commissioning traffic
    /// will be directed to.
    MakeJoinable(struct {
        duration zx.duration;
        port uint16;
    }) -> ();
};
