// Copyright 2020 The Chromium 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 DISCOVERY_COMMON_CONFIG_H_ #define DISCOVERY_COMMON_CONFIG_H_ #include #include "platform/base/interface_info.h" namespace openscreen { namespace discovery { // This struct provides parameters needed to initialize the discovery pipeline. struct Config { struct NetworkInfo { enum AddressFamilies : uint8_t { kNoAddressFamily = 0, kUseIpV4 = 0x01 << 0, kUseIpV6 = 0x01 << 1 }; // Network Interface on which discovery should be run. InterfaceInfo interface; // IP Address Families supported by this network interface and on which the // mDNS Service should listen for and/or publish records. AddressFamilies supported_address_families; }; /***************************************** * Common Settings *****************************************/ // Interfaces on which services should be published, and on which discovery // should listen for announced service instances. std::vector network_info; // Maximum allowed size in bytes for the rdata in an incoming record. All // received records with rdata size exceeding this size will be dropped. // The default value is taken from RFC 6763 section 6.2. int maximum_valid_rdata_size = 1300; /***************************************** * Publisher Settings *****************************************/ // Determines whether publishing of services is enabled. bool enable_publication = true; // Number of times new mDNS records should be announced, using an exponential // back off. See RFC 6762 section 8.3 for further details. Per RFC, this value // is expected to be in the range of 2 to 8. int new_record_announcement_count = 8; // Maximum number of truncated messages that the receiver may receive for a // single query from any given host. // The supported record type with the largest expected data size is a TXT // record. RFC 6763 section 6.1 states that the "maximum sensible size" for // one such record is "a few hundred bytes". Given that an mDNS Message's size // is bounded by 9000 bytes, each message can be expected to hold at least 30 // records, meaning that the default value of 8 allows for 240 records, or // more in the case of non-TXT records. int maximum_truncated_messages_per_query = 8; // Maximum number of concurrent truncated queries that may be tracked by a // single network interface. // By the same logic stated in the above config value, truncated queries // should be relatively rare. Each truncated query lives for at most one // second after the last truncated packet is received, so receiving 64 such // queries in a short timespan is unlinkely. int maximum_concurrent_truncated_queries_per_interface = 64; // Maximum number of known answers allowed for a given truncated query. // A default value of 256 is used because this is the maximum number of // devices on a LAN. int maximum_known_answer_records_per_query = 256; /***************************************** * Querier Settings *****************************************/ // Determines whether querying is enabled. bool enable_querying = true; // Number of times new mDNS records should be announced, using an exponential // back off. -1 signifies that there should be no maximum. int new_query_announcement_count = -1; // Limit on the size to which the mDNS Querier Cache may grow. This is used to // prevent a malicious or misbehaving mDNS client from causing the memory // used by mDNS to grow in an unbounded fashion. int querier_max_records_cached = 1024; // Sets the querier to ignore all NSEC negative response records received as // responses to outgoing queries. bool ignore_nsec_responses = false; }; inline Config::NetworkInfo::AddressFamilies operator&( Config::NetworkInfo::AddressFamilies lhs, Config::NetworkInfo::AddressFamilies rhs) { return static_cast( static_cast(lhs) & static_cast(rhs)); } inline Config::NetworkInfo::AddressFamilies operator|( Config::NetworkInfo::AddressFamilies lhs, Config::NetworkInfo::AddressFamilies rhs) { return static_cast( static_cast(lhs) | static_cast(rhs)); } inline Config::NetworkInfo::AddressFamilies operator|=( Config::NetworkInfo::AddressFamilies& lhs, Config::NetworkInfo::AddressFamilies rhs) { return lhs = lhs | rhs; } inline Config::NetworkInfo::AddressFamilies operator&=( Config::NetworkInfo::AddressFamilies& lhs, Config::NetworkInfo::AddressFamilies rhs) { return lhs = lhs & rhs; } } // namespace discovery } // namespace openscreen #endif // DISCOVERY_COMMON_CONFIG_H_