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

/// Identifies a host. Host names consist of one or more labels separated by
/// '.'s. A host name must not end with a '.'. Labels must each be 63 characters
/// or less (not including the separator) and are UTF-8-encoded. A complete host
/// name, including separators, must be 255 characters or less.
alias host_name = string:255;

/// Identifies a (type of) service being published. Service names consist of
/// two labels, both terminated with a '.'. The first label must start with an
/// underscore and be 16 characters or less, including the underscore. The
/// second label must be either '_tcp' or '_udp'. Labels do not contain '.'s.
/// With underscores and terminators, that makes for a maximum of 22 characters.
/// Service names are UTF-8-encoded.
alias service_name = string:22;

/// Identifies a specific instance of a service being published. Instance names
/// consist of a single label, which is at most 63 characters long and which
/// contains no '.'s. Instance names are UTF-8-encoded.
alias instance_name = string:63;

/// Identifies a subtype of a service. Subtype names consist of a single label,
/// which is at most 63 characters long and which contains no '.'s. Subtype
/// names are UTF-8-encoded.
alias subtype_name = string:63;

/// Provides description relating to a service instance. In typical use, TXT
/// strings consist of a key and value separated by '='. TXT strings must be
/// at most 255 characters long and are UTF-8-encoded.
@available(added=HEAD)
alias txt_character_string = bytes:255;

/// Specifies network media on which a service instance should be published.
type Media = strict bits : uint32 {
    /// Specifies wired interfaces.
    WIRED = 1;

    /// Specifies wireless interfaces.
    WIRELESS = 2;
};

/// Specifies IP versions on which a service instance should be published.
type IpVersions = strict bits : uint32 {
    /// Specifies IPv4.
    V4 = 1;

    /// Specifies IPv6.
    V6 = 2;
};

/// Describes a service instance.
type ServiceInstance = table {
    /// The name of the service.
    1: service service_name;

    /// The name of the service instance.
    2: instance instance_name;

    /// IPv4 socket address for the service. May be empty. Deprecated: use `addresses`.
    @available(deprecated=HEAD)
    @deprecated
    3: ipv4_endpoint fuchsia.net.Ipv4SocketAddress;

    /// IPv6 socket address for the service. May be empty. Deprecated: use `addresses`.
    @available(deprecated=HEAD)
    @deprecated
    4: ipv6_endpoint fuchsia.net.Ipv6SocketAddress;

    /// Text strings describing the instance. Deprecated: use `text_strings`.
    @available(deprecated=HEAD)
    @deprecated
    5: text vector<txt_string>:MAX_TEXT_STRINGS;

    /// The priority of the SRV resource record for this publication. See
    /// [RFC6763](https://tools.ietf.org/html/rfc6763) for details.
    6: srv_priority uint16;

    /// The weight of the SRV resource record for this publication. See
    /// [RFC6763](https://tools.ietf.org/html/rfc6763) for details.
    7: srv_weight uint16;

    /// The domain name of the target host.
    8: target host_name;

    /// The socket addresses for the service instance.
    @available(added=HEAD)
    9: addresses vector<fuchsia.net.SocketAddress>:MAX_ADDRESSES;

    /// Text strings describing the instance.
    @available(added=HEAD)
   10: text_strings vector<txt_character_string>:MAX_TEXT_STRINGS;
};

const MAX_TEXT_STRINGS uint32 = 256;
const MAX_ADDRESSES uint32 = 64;
const MAX_SUBTYPES uint32 = 256;
