# 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.