// Copyright 2023 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.

/// Provides facilities for migrating from Netstack2 to Netstack3.
///
/// This library provides the protocols necessary to conduct the network stack
/// migration to the newer version. It will be removed as soon as migration is
/// completed across all users, and it's not intended to be used beyond that.
///
/// At the time of its introduction there aren't platform-wide mechanisms to
/// achieve this, so this one-off library was created to achieve the migration
/// goals.
///
/// It should not be extended to serve other uses and, if there appears a
/// central platform-wide mechanism to achieve this before migration is fully
/// completed it might be deleted before then.
// TODO(https://fxbug.dev/42081574): Remove this library as soon as migration is
// completed.
@available(added=14)
library fuchsia.net.stackmigrationdeprecated;

/// Known Network Stack versions.
type NetstackVersion = strict enum {
    NETSTACK2 = 1;
    NETSTACK3 = 2;
};


/// A wrapper type around [`NetstackVersion`] providing optionality for
/// [`Control`] methods.
type VersionSetting = struct {
    version NetstackVersion;
};

/// Provides access to controlling netstack migration configuration.
@discoverable
closed protocol Control {
    /// Sets the automated target network stack version.
    ///
    /// Takes effect on next boot.
    ///
    /// + request `version` requested network stack version. If unset, the
    ///   automated version preference is cleared.
    strict SetAutomatedNetstackVersion(struct {
        version box<VersionSetting>;
    }) -> ();

    /// Sets user selection target network stack version.
    ///
    /// Takes effect on next boot.
    ///
    /// If set, the user netstack version preference always takes precedence
    /// over the automated version selection.
    ///
    /// + request `version` requested network stack version. If unset, the user
    ///   version preference is cleared.
    strict SetUserNetstackVersion(struct {
        version box<VersionSetting>;
    }) -> ();
};


/// Provides access to reading netstack migration configuration.
@discoverable
closed protocol State {
    /// Gets the target network stack version.
    ///
    /// - response `in_effect_version` the configurations currently in effect.
    strict GetNetstackVersion() -> (struct {
        in_effect_version struct {
            /// The value of the netstack version setting at boot time. This
            /// reflects the currently running netstack.
            current_boot NetstackVersion;
            /// The automated netstack version selected. If set and no `user`
            /// version is set, it'll be applied on next boot. This reflects the
            /// last applied configuration through
            /// [`Control.SetAutomatedNetstackVersion`].
            automated box<VersionSetting>;
            /// The user netstack version selected. If set, it'll be applied on
            /// next boot. The `user` version always takes predence over the
            /// `automated` version. This reflects the last applied
            /// configuration through [`Control.SetUserNetstackVersion`].
            user box<VersionSetting>;
        };
    });
};
