// Copyright 2021 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.thread;

using zx;

/// 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(zx.duration duration, uint16 port) -> ();
};
