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

using fuchsia.net;
using zx;

/// Discoverable protocol for resolving host names to IP addresses.
@available(added=HEAD)
@discoverable
protocol HostNameResolver {
    /// Gets the addresses for the specified host.
    ///
    /// + request `host` the simple name of the host.
    /// + request `timeout` specifies how long the service should wait before giving up when
    ///   waiting for a response to a resolution query. In typical use, a timeout of two or three
    ///   seconds is recommended.
    /// + request `options` options to be applied to the resolution.
    /// - response `addresses` the addresses of the specified host, if it was found, an empty vector
    ///   if not.
    ResolveHostName(struct {
        host host_name;
        timeout zx.duration;
        options HostNameResolutionOptions;
    }) -> (struct {
        addresses vector<HostAddress>:MAX_ADDRESSES;
    });
};

/// Options for `HostNameResolver.ResolveHostName`.
@available(added=HEAD)
type HostNameResolutionOptions = table {
    /// The media (wired, wireless, both) of the interfaces on which the host name should be
    /// resolved. The default is both wired and wireless media.
    1: media Media;

    /// The IP versions (V4, V6, both) with which the host name should resolved. The default
    /// value is both IPv4 and IPv6.
    2: ip_versions IpVersions;
};

/// An IPv4 or IPv6 host address with the id of the interface through which the address was
/// received.
@available(added=HEAD)
type HostAddress = struct {
    /// IPv4 or IPv6 host address.
    address fuchsia.net.IpAddress;

    /// Interface through which the address was received.
    interface fuchsia.net.interface_id;

    /// Time-to-live of the relevant A or AAAA resource.
    ttl zx.duration;
};
