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

library fuchsia.net.root;

using fuchsia.net.filter;

/// Provides administrative access to all filtering state.
///
/// This protocol provides the ability to bypass regular ownership controls
/// which allow only the owner of each controller to modify or remove resources
/// they added.
///
/// Circumventing the strong-ownership semantics through use of this protocol
/// is highly discouraged and applications considering use of this protocol
/// are encouraged to exhaust other options first by working with the Netstack
/// team to find an alternative solution.
@discoverable
closed protocol Filter {
    /// Open a new *or* existing `NamespaceController`. The server end is
    /// "auto-detached": in other words, it behaves as if the client has called
    /// `Detach` on creation, and the lifetime of the filtering state is not
    /// tied to the client end of the protocol. If the client does call
    /// `Detach` on the `NamespaceController`, the server will close the
    /// channel.
    ///
    /// Clients have unilateral access to add or remove resources owned by the
    /// controller, irrespective of other clients' ownership. This includes the
    /// ability to remove resources installed by other clients.
    strict OpenController(resource struct {
        id fuchsia.net.filter.ControllerId;
        request server_end:fuchsia.net.filter.NamespaceController;
    });
};
