// 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.net.name;

using fuchsia.net;
using zx;

/// Provides administration controls over name resolution settings.
[Discoverable]
protocol LookupAdmin {
    /// Sets the DNS servers to `servers`
    ///
    /// + request `servers` The list of servers to use for domain name resolution, in priority
    /// order. An empty list means no servers will be used and name resolution may fail. Each
    /// `SocketAddress` in `servers` must be a valid unicast socket address. The list of servers
    /// will be deduplicated.
    /// * error Returns `ZX_ERR_INVALID_ARGS` if any of the provided addresses does not meet the
    /// conditions above.
    SetDnsServers(vector<fuchsia.net.SocketAddress>:MAX servers) -> () error zx.status;

    /// Gets the DNS servers currently in use to resolve name lookups.
    /// - response `servers` The list of servers in use by `LookupAdmin`, in priority order.
    GetDnsServers() -> (vector<fuchsia.net.SocketAddress>:MAX servers);
};
