1*3f982cf4SFabien Sanglard // Copyright 2020 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard // found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglard #ifndef DISCOVERY_COMMON_CONFIG_H_ 6*3f982cf4SFabien Sanglard #define DISCOVERY_COMMON_CONFIG_H_ 7*3f982cf4SFabien Sanglard 8*3f982cf4SFabien Sanglard #include <vector> 9*3f982cf4SFabien Sanglard 10*3f982cf4SFabien Sanglard #include "platform/base/interface_info.h" 11*3f982cf4SFabien Sanglard 12*3f982cf4SFabien Sanglard namespace openscreen { 13*3f982cf4SFabien Sanglard namespace discovery { 14*3f982cf4SFabien Sanglard 15*3f982cf4SFabien Sanglard // This struct provides parameters needed to initialize the discovery pipeline. 16*3f982cf4SFabien Sanglard struct Config { 17*3f982cf4SFabien Sanglard /***************************************** 18*3f982cf4SFabien Sanglard * Common Settings 19*3f982cf4SFabien Sanglard *****************************************/ 20*3f982cf4SFabien Sanglard 21*3f982cf4SFabien Sanglard // Interfaces on which services should be published, and on which discovery 22*3f982cf4SFabien Sanglard // should listen for announced service instances. 23*3f982cf4SFabien Sanglard std::vector<InterfaceInfo> network_info; 24*3f982cf4SFabien Sanglard 25*3f982cf4SFabien Sanglard // Maximum allowed size in bytes for the rdata in an incoming record. All 26*3f982cf4SFabien Sanglard // received records with rdata size exceeding this size will be dropped. 27*3f982cf4SFabien Sanglard // The default value is taken from RFC 6763 section 6.2. 28*3f982cf4SFabien Sanglard int maximum_valid_rdata_size = 1300; 29*3f982cf4SFabien Sanglard 30*3f982cf4SFabien Sanglard /***************************************** 31*3f982cf4SFabien Sanglard * Publisher Settings 32*3f982cf4SFabien Sanglard *****************************************/ 33*3f982cf4SFabien Sanglard 34*3f982cf4SFabien Sanglard // Determines whether publishing of services is enabled. 35*3f982cf4SFabien Sanglard bool enable_publication = true; 36*3f982cf4SFabien Sanglard 37*3f982cf4SFabien Sanglard // Number of times new mDNS records should be announced, using an exponential 38*3f982cf4SFabien Sanglard // back off. See RFC 6762 section 8.3 for further details. Per RFC, this value 39*3f982cf4SFabien Sanglard // is expected to be in the range of 2 to 8. 40*3f982cf4SFabien Sanglard int new_record_announcement_count = 8; 41*3f982cf4SFabien Sanglard 42*3f982cf4SFabien Sanglard // Maximum number of truncated messages that the receiver may receive for a 43*3f982cf4SFabien Sanglard // single query from any given host. 44*3f982cf4SFabien Sanglard // The supported record type with the largest expected data size is a TXT 45*3f982cf4SFabien Sanglard // record. RFC 6763 section 6.1 states that the "maximum sensible size" for 46*3f982cf4SFabien Sanglard // one such record is "a few hundred bytes". Given that an mDNS Message's size 47*3f982cf4SFabien Sanglard // is bounded by 9000 bytes, each message can be expected to hold at least 30 48*3f982cf4SFabien Sanglard // records, meaning that the default value of 8 allows for 240 records, or 49*3f982cf4SFabien Sanglard // more in the case of non-TXT records. 50*3f982cf4SFabien Sanglard int maximum_truncated_messages_per_query = 8; 51*3f982cf4SFabien Sanglard 52*3f982cf4SFabien Sanglard // Maximum number of concurrent truncated queries that may be tracked by a 53*3f982cf4SFabien Sanglard // single network interface. 54*3f982cf4SFabien Sanglard // By the same logic stated in the above config value, truncated queries 55*3f982cf4SFabien Sanglard // should be relatively rare. Each truncated query lives for at most one 56*3f982cf4SFabien Sanglard // second after the last truncated packet is received, so receiving 64 such 57*3f982cf4SFabien Sanglard // queries in a short timespan is unlinkely. 58*3f982cf4SFabien Sanglard int maximum_concurrent_truncated_queries_per_interface = 64; 59*3f982cf4SFabien Sanglard 60*3f982cf4SFabien Sanglard // Maximum number of known answers allowed for a given truncated query. 61*3f982cf4SFabien Sanglard // A default value of 256 is used because this is the maximum number of 62*3f982cf4SFabien Sanglard // devices on a LAN. 63*3f982cf4SFabien Sanglard int maximum_known_answer_records_per_query = 256; 64*3f982cf4SFabien Sanglard 65*3f982cf4SFabien Sanglard /***************************************** 66*3f982cf4SFabien Sanglard * Querier Settings 67*3f982cf4SFabien Sanglard *****************************************/ 68*3f982cf4SFabien Sanglard 69*3f982cf4SFabien Sanglard // Determines whether querying is enabled. 70*3f982cf4SFabien Sanglard bool enable_querying = true; 71*3f982cf4SFabien Sanglard 72*3f982cf4SFabien Sanglard // Number of times new mDNS records should be announced, using an exponential 73*3f982cf4SFabien Sanglard // back off. -1 signifies that there should be no maximum. 74*3f982cf4SFabien Sanglard int new_query_announcement_count = -1; 75*3f982cf4SFabien Sanglard 76*3f982cf4SFabien Sanglard // Limit on the size to which the mDNS Querier Cache may grow. This is used to 77*3f982cf4SFabien Sanglard // prevent a malicious or misbehaving mDNS client from causing the memory 78*3f982cf4SFabien Sanglard // used by mDNS to grow in an unbounded fashion. 79*3f982cf4SFabien Sanglard int querier_max_records_cached = 1024; 80*3f982cf4SFabien Sanglard 81*3f982cf4SFabien Sanglard // Sets the querier to ignore all NSEC negative response records received as 82*3f982cf4SFabien Sanglard // responses to outgoing queries. 83*3f982cf4SFabien Sanglard bool ignore_nsec_responses = false; 84*3f982cf4SFabien Sanglard }; 85*3f982cf4SFabien Sanglard 86*3f982cf4SFabien Sanglard } // namespace discovery 87*3f982cf4SFabien Sanglard } // namespace openscreen 88*3f982cf4SFabien Sanglard 89*3f982cf4SFabien Sanglard #endif // DISCOVERY_COMMON_CONFIG_H_ 90