// Copyright 2015 The Weave Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef LIBWEAVE_INCLUDE_WEAVE_PROVIDER_DNS_SERVICE_DISCOVERY_H_
#define LIBWEAVE_INCLUDE_WEAVE_PROVIDER_DNS_SERVICE_DISCOVERY_H_
#include <string>
#include <vector>
#include <base/callback.h>
namespace weave {
namespace provider {
// This interface should be implemented by the user of libweave and
// provided during device creation in Device::Create(...)
// libweave will use this interface to start/stop mDNS service discovery.
//
// Implementation of the PublishService(...) method should publish mDNS
// service. Publishing service should be done according to RFC 6762 (mDNS)
// and RFC 6763 (DNS Service discovery).
//
// service_type will contain name of the service before .local.
// For example, "_privet._tcp".
// port will have a port number where Weave HTTP server is running.
// For example, 80.
// txt will contain a list of strings for mDNS TXT records.
// For example, "txtver=3", "name=MyDevice"
//
// The following mDNS records should be published in the above examples:
// _privet._tcp.local PTR <service_name>._privet._tcp.local
// <service_name>._privet._tcp.local SRV <local_domain> 80
// <service_name>._privet._tcp.local TXT "txtver=3" "name=MyDevice"
// <local_domain> A <IPv4 address>
// <local_domain> AAAA <IPv6 address>
//
// In the list above, it is implementer's responsibility to choose
// <service_name> and <local_domain>.
// If device only supports IPv4 or IPv6, then only the corresponding mDNS
// records should be published. <IPv4 address> and <IPv6 address> should
// be the addresses of the network interface this record is advertised on.
//
// Implementation of PublishService(...) may use existing libraries or
// services to implement mDNS service discovery. For example, Avahi or
// Bonjour. Such implementation may require IPC or similar async
// communication mechanisms. PublishService(...) implementation may
// just start the process and return quickly (non-blocking) while the
// full mDNS implementation is started in the background. In such case
// PublishService(...) implementation should remember all input parameters
// so it can restart service publishing in case of failures.
// From libweave perspective, discovery is started after
// PublishService(...) returns and libweave may not call this method again.
//
// Implementation of the StopPublishing(...) method should stop advertising
// specified service type on the mDNS. This should be done according to mDNS
// (RFC 6762) and DNS-SD (RFC 6763) specifications, which require announcing
// DNS records that will be going away with TTL=1.
//
// Since this interface allows multiple service types to be published, proper
// implementation should maintain list of service types and stop advertising
// only the type specified in this request. Other service types, as well as
// records necessary for other services, like A, AAAA may still be available
// over mDNS.
//
// In case a device has multiple networking interfaces, the device developer
// needs to make a decision where mDNS advertising is necessary and where it is
// not. For example, there should be no mDNS advertising on cellular (LTE) or
// WAN (for routers) network interfaces. In some cases, there might be more
// then one network interface where advertising makes sense. For example,
// a device may have both WiFi and Ethernet connections. In such case,
// PublishService(...) should make service available on both interface.
//
// From libweave perspective, it always looks like there is only one network
// interface (for both service discovery and web server). It is
// the job of this interface implementation to hide network complexity from
// the libweave and to bring webserver up on the same port on both interfaces,
// as well as publish an mDNS service (uses webserver port).
//
// See libweave/examples/provider/avahi_client.cc for complete example
// using Avahi for DNS service discovery.
class DnsServiceDiscovery {
public:
// Publishes new service using DNS-SD or updates existing one.
virtual void PublishService(const std::string& service_type,
uint16_t port,
const std::vector<std::string>& txt) = 0;
// Stops publishing service.
virtual void StopPublishing(const std::string& service_type) = 0;
protected:
virtual ~DnsServiceDiscovery() {}
};
} // namespace provider
} // namespace weave
#endif // LIBWEAVE_INCLUDE_WEAVE_PROVIDER_DNS_SERVICE_DISCOVERY_H_