# Discovery This discovery module is an implementation of the mDNS and DNS-SD protocols as defined in [RFC 6762](https://tools.ietf.org/html/rfc6762) and [RFC 6763](https://tools.ietf.org/html/rfc6763). The protocols have been fully implemented, with the exceptions called out below. Other modules in Open Screen use this module to advertise and discover presentation displays. If you wish to provide your own implementation of DNS-SD, implement the [DNS-SD public interfaces](https://chromium.googlesource.com/openscreen/+/refs/heads/master/discovery/dnssd/public) and updating the linker rules. In this case, the [public discovery layer](https://chromium.googlesource.com/openscreen/+/refs/heads/master/discovery/public) will continue to function as described below. Note that this DNS-SD implementation is fully generic and can be used for advertisement and discovery of any RFC 6763 compliant services. ## How To Use This Module In order to use the discovery module, embedders should only need to reference the [public](https://chromium.googlesource.com/openscreen/+/refs/heads/master/discovery/public) and [common](https://chromium.googlesource.com/openscreen/+/refs/heads/master/discovery/common) directories. The [DNS-SD](https://chromium.googlesource.com/openscreen/+/refs/heads/master/discovery/dnssd) and [mDNS](https://chromium.googlesource.com/openscreen/+/refs/heads/master/discovery/mdns) layers should not be accessed. In order to encourage this behavior, DEPS rules have been defined. The config directory provides parameters needed to configure the discovery module. Specifically: * The [openscreen::discovery::Config struct](https://chromium.googlesource.com/openscreen/+/refs/heads/master/discovery/common/config.h) provides the required data to publish or discover service instances, such as a list of valid network interfaces or constants used to configure the underlying stack. * The [openscreen::discovery::ReportingClient](https://chromium.googlesource.com/openscreen/+/refs/heads/master/discovery/common/reporting_client.h) provides a way for embedders to receive callbacks for errors which occur inside the discovery implementation. The public directory provides wrappers around the DNS-SD protocol to simplify interacting with the internals of this module: * The [openscreen::discovery::DnsSdServicePublisher](https://chromium.googlesource.com/openscreen/+/refs/heads/master/discovery/public/dns_sd_service_publisher.h) provides a simple interface for registering, updating, and de-registering DNS-SD service instances. * The [openscreen::discovery::DnsSdServiceWatcher](https://chromium.googlesource.com/openscreen/+/refs/heads/master/discovery/public/dns_sd_service_watcher.h) provides an interface to begin and end querying for service types, providing callbacks for the embedder to be notified whenever an instance is discovered, changed, or deleted. For an example use case of this module, see the [standalone sender](https://chromium.googlesource.com/openscreen/+/refs/heads/master/cast/standalone_sender/main.cc) and [standalone receiver](https://chromium.googlesource.com/openscreen/+/refs/heads/master/cast/standalone_receiver/main.cc) code. ## Limitations This implementation has been created to fulfill the role of discovery for the CastV2 protocol. For this reason, some details or optimizations called out in the RFC documents had cost or additional required complexity that outweighed the added benefit they provided. As such, the following have not been fully implemented: * [Selective Instance Enumeration](https://tools.ietf.org/html/rfc6763#section-7.1) is not supported. * [Multiple SRV records](https://tools.ietf.org/html/rfc6763#section-5) for a single service instance are not supported. * [Multiple TXT records](https://tools.ietf.org/html/rfc6763#section-6.8) for a single service instance are not supported. * Hosts which publish [no TXT record](https://tools.ietf.org/html/rfc6763#section-6.1) are treated as invalid. However, hosts which publish [an empty TXT record](https://tools.ietf.org/html/rfc6763#section-6.1) are valid. * [Duplicate Question Suppression](https://tools.ietf.org/html/rfc6762#section-7.3) has not been implemented. Additionally, the following limitations should be noted: * If network interface information is changed, the discovery stack must be re-initialized. * If a [fatal error](https://chromium.googlesource.com/openscreen/+/refs/heads/master/discovery/common/reporting_client.h#25) occurs, the discovery stack must be re-initialized.