| // Copyright 2017 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; |
| |
| // TODO(dalesat): Soft transition in progress. |
| // 1) Add the following definitions: |
| // Subscriber.SubscribeToService2 |
| // ServiceSubscriber2 |
| // Publisher.PublishServiceInstance2 |
| // PublicationResponder2 |
| // 2) Transition all clients to the '2' versions. |
| // 3) Change the originals to be identical to the '2' versions. |
| // 4) Transition all clients to the original names. |
| // 5) Remove the '2' versions. |
| |
| // TODO(FIDL-580): Make these alias comments doc comments. |
| |
| /// 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. |
| using 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. |
| using 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. |
| using 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. |
| using 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. |
| using txt_string = string:255; |
| |
| /// Discoverable protocol for resolving host names to IP addresses. |
| [Discoverable] |
| protocol Resolver { |
| /// Gets the addresses for the specified host. `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. |
| /// |
| /// A successful resolution may return one or both addresses. An |
| /// unsuccessful resolution is indicated when both addresses are null. |
| ResolveHostName(host_name host, zx.duration timeout) |
| -> (fuchsia.net.Ipv4Address? v4_address, |
| fuchsia.net.Ipv6Address? v6_address); |
| }; |
| |
| /// Discoverable protocol for finding service instances. |
| [Discoverable] |
| protocol Subscriber { |
| /// Subscribes to a service. The subscription lasts until `subscriber` is |
| /// unbound. |
| [Transitional, Deprecated] |
| SubscribeToService(service_name service, ServiceSubscriber subscriber); |
| |
| /// Subscribes to a service. The subscription lasts until `subscriber` is |
| /// unbound. |
| [Transitional] |
| SubscribeToService2(service_name service, ServiceSubscriber2 subscriber); |
| }; |
| |
| /// Discoverable protocol for publishing service instances. |
| [Discoverable] |
| protocol Publisher { |
| /// Publishes a service instance. `publication_responder` is consulted via its |
| /// `OnPublication` method for initial announcements and to answer queries. |
| /// The service is published until the `publication_responder` channel closes. In |
| /// addition to announcements and queries for the service type, all queries |
| /// for subtypes are answered subject to filtering through the responder. |
| /// `perform_probe` indicates whether a probe for a conflicting instance |
| /// should be performed before publishing the instance. This value should |
| /// be `true` unless the instance name is known to be unique. |
| [Transitional, Deprecated] |
| PublishServiceInstance(service_name service, |
| instance_name instance, |
| bool perform_probe, |
| PublicationResponder publication_responder) -> () error Error; |
| |
| /// Publishes a service instance. `publication_responder` is consulted via its |
| /// `OnPublication` method for initial announcements and to answer queries. |
| /// The service is published until the `publication_responder` channel closes. In |
| /// addition to announcements and queries for the service type, all queries |
| /// for subtypes are answered subject to filtering through the responder. |
| /// `perform_probe` indicates whether a probe for a conflicting instance |
| /// should be performed before publishing the instance. This value should |
| /// be `true` unless the instance name is known to be unique. |
| [Transitional] |
| PublishServiceInstance2(service_name service, |
| instance_name instance, |
| bool perform_probe, |
| PublicationResponder2 publication_responder) -> () error Error; |
| }; |
| |
| /// Error values for instance publishing. |
| enum Error : int32 { |
| /// The specified service name is invalid. |
| INVALID_SERVICE_NAME = 1; |
| |
| /// The specified instance name is invalid. |
| INVALID_INSTANCE_NAME = 2; |
| |
| /// The specified service instance is already being published by this |
| /// mDNS implementation. |
| ALREADY_PUBLISHED_LOCALLY = 3; |
| |
| /// The specified service instance is already being published by another |
| /// host on the subnet. This result occurs when an initial probe discovers |
| /// a conflicting instance. |
| ALREADY_PUBLISHED_ON_SUBNET = 4; |
| }; |
| |
| /// Client-implemented interface for subscribers. Method replies are used to |
| /// throttle traffic. The service won't necessarily wait for a reply before |
| /// calling another method. |
| protocol ServiceSubscriber { |
| /// Notifies the subscriber that a service instance has been discovered. |
| OnInstanceDiscovered(ServiceInstance instance) -> (); |
| |
| /// Notifies the subscriber that addresses or text for a known service |
| /// instance have changed. |
| OnInstanceChanged(ServiceInstance instance) -> (); |
| |
| /// Notifies the subscriber that a known service instance has been lost. |
| OnInstanceLost(service_name service, instance_name instance) -> (); |
| }; |
| |
| /// Client-implemented interface for subscribers. Method replies are used to |
| /// throttle traffic. The service won't necessarily wait for a reply before |
| /// calling another method. |
| protocol ServiceSubscriber2 { |
| /// Notifies the subscriber that a service instance has been discovered. |
| OnInstanceDiscovered(ServiceInstance2 instance) -> (); |
| |
| /// Notifies the subscriber that addresses or text for a known service |
| /// instance have changed. |
| OnInstanceChanged(ServiceInstance2 instance) -> (); |
| |
| /// Notifies the subscriber that a known service instance has been lost. |
| OnInstanceLost(service_name service, instance_name instance) -> (); |
| |
| /// Notifies the subscriber that a PTR query has been sent. |
| OnQuery(ResourceType resource_type) -> (); |
| }; |
| |
| /// DNS resource types. |
| enum ResourceType { |
| /// Domain name pointer. |
| PTR = 12; |
| /// Any (wildcard) type. |
| ANY = 255; |
| }; |
| |
| /// Describes a service instance. |
| struct ServiceInstance { |
| /// The name of the service. |
| service_name service; |
| |
| /// The name of the service instance. |
| instance_name instance; |
| |
| /// Endpoints for the service. If two endpoints are supplied, one will be a |
| /// V4 and the other will be a V6. |
| vector<fuchsia.net.Endpoint>:2 endpoints; |
| |
| /// Text strings describing the instance. |
| vector<txt_string>:MAX_TEXT_STRINGS text; |
| |
| /// The priority of the SRV resource record for this publication. See |
| /// [RFC6763](https://tools.ietf.org/html/rfc6763) for details. |
| uint16 srv_priority; |
| |
| /// The weight of the SRV resource record for this publication. See |
| /// [RFC6763](https://tools.ietf.org/html/rfc6763) for details. |
| uint16 srv_weight; |
| }; |
| |
| /// Describes a service instance. |
| table ServiceInstance2 { |
| /// The name of the service. |
| 1: service_name service; |
| |
| /// The name of the service instance. |
| 2: instance_name instance; |
| |
| /// IPv4 socket address for the service. May be unset. |
| 3: fuchsia.net.Ipv4SocketAddress ipv4_endpoint; |
| |
| /// IPv6 socket address for the service. May be unset. |
| 4: fuchsia.net.Ipv6SocketAddress ipv6_endpoint; |
| |
| /// Text strings describing the instance. |
| 5: vector<txt_string>:MAX_TEXT_STRINGS text; |
| |
| /// The priority of the SRV resource record for this publication. See |
| /// [RFC6763](https://tools.ietf.org/html/rfc6763) for details. |
| 6: uint16 srv_priority; |
| |
| /// The weight of the SRV resource record for this publication. See |
| /// [RFC6763](https://tools.ietf.org/html/rfc6763) for details. |
| 7: uint16 srv_weight; |
| }; |
| |
| /// Client-supplied publication responder interface. |
| protocol PublicationResponder { |
| /// Provides instance information for initial announcements and query |
| /// responses relating to the service instance specified in |
| /// `Publisher.PublishServiceInstance`. `query` indicates whether data is |
| /// requested for an initial announcement (false) or in response to a query |
| /// (true). If the publication relates to a subtype of the service, |
| /// `subtype` contains the subtype, otherwise it is null. If `publication` |
| /// is null, no announcement or response is transmitted. Strings in `text` |
| /// are transmitted in the TXT record. |
| OnPublication(bool query, subtype_name? subtype) -> (Publication? publication); |
| |
| /// Sets the subtypes for the service instance. The specified subtypes will |
| /// be announced subject to filtering through the responder. The initial |
| /// subtype collection is empty. |
| -> SetSubtypes(vector<subtype_name>:MAX_SUBTYPES subtypes); |
| |
| /// Initiates reannouncement of the service instance due to a change in the |
| /// instance's port number or text strings. All announcements are filtered |
| /// through `OnPublication`, which replies with the new port and text |
| /// values. |
| -> Reannounce(); |
| }; |
| |
| /// Client-supplied publication responder interface. |
| protocol PublicationResponder2 { |
| /// Provides instance information for initial announcements and query |
| /// responses relating to the service instance specified in |
| /// `Publisher.PublishServiceInstance`. `query` indicates whether data is |
| /// requested for an initial announcement (false) or in response to a query |
| /// (true). If the publication relates to a subtype of the service, |
| /// `subtype` contains the subtype, otherwise it is null. If `publication` |
| /// is null, no announcement or response is transmitted. Strings in `text` |
| /// are transmitted in the TXT record. |
| OnPublication( |
| bool query, subtype_name? subtype, vector<fuchsia.net.IpAddress>:64 source_addresses) |
| -> (Publication? publication); |
| |
| /// Sets the subtypes for the service instance. The specified subtypes will |
| /// be announced subject to filtering through the responder. The initial |
| /// subtype collection is empty. |
| -> SetSubtypes(vector<subtype_name>:MAX_SUBTYPES subtypes); |
| |
| /// Initiates reannouncement of the service instance due to a change in the |
| /// instance's port number or text strings. All announcements are filtered |
| /// through `OnPublication`, which replies with the new port and text |
| /// values. |
| -> Reannounce(); |
| }; |
| |
| /// Describes an initial instance announcement or query response. In typical |
| /// use, the default SRV priority, SRV weight and TTL values should be used. TTL |
| /// values are rounded down to the nearest second. TTL values less than one |
| /// second are not permitted and will result in the `PublicationResponder` |
| /// channel being closed. |
| struct Publication { |
| /// The port at which the service instance is addressable. |
| uint16 port; |
| |
| /// Text strings describing the instance. |
| vector<txt_string>:MAX_TEXT_STRINGS text; |
| |
| /// The priority of the SRV resource record for this publication. See |
| /// [RFC6763](https://tools.ietf.org/html/rfc6763) for details. |
| uint16 srv_priority = DEFAULT_SRV_PRIORITY; |
| |
| /// The weight of the SRV resource record for this publication. See |
| /// [RFC6763](https://tools.ietf.org/html/rfc6763) for details. |
| uint16 srv_weight = DEFAULT_SRV_WEIGHT; |
| |
| /// Time-to-live for PTR resource records. |
| zx.duration ptr_ttl = DEFAULT_PTR_TTL; |
| |
| /// Time-to-live for SRV resource records. |
| zx.duration srv_ttl = DEFAULT_SRV_TTL; |
| |
| /// Time-to-live for TXT resource records. |
| zx.duration txt_ttl = DEFAULT_TXT_TTL; |
| }; |
| |
| const uint16 DEFAULT_SRV_PRIORITY = 0; |
| const uint16 DEFAULT_SRV_WEIGHT = 0; |
| const zx.duration DEFAULT_PTR_TTL = 4500000000000; // 75 minutes |
| const zx.duration DEFAULT_SRV_TTL = 120000000000; // 2 minutes |
| const zx.duration DEFAULT_TXT_TTL = 4500000000000; // 75 minutes |
| const uint32 MAX_TEXT_STRINGS = 256; |
| const uint32 MAX_SUBTYPES = 256; |