1*3f982cf4SFabien Sanglard // Copyright 2019 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_MDNS_MDNS_RANDOM_H_ 6*3f982cf4SFabien Sanglard #define DISCOVERY_MDNS_MDNS_RANDOM_H_ 7*3f982cf4SFabien Sanglard 8*3f982cf4SFabien Sanglard #include <random> 9*3f982cf4SFabien Sanglard 10*3f982cf4SFabien Sanglard #include "platform/api/time.h" 11*3f982cf4SFabien Sanglard 12*3f982cf4SFabien Sanglard namespace openscreen { 13*3f982cf4SFabien Sanglard namespace discovery { 14*3f982cf4SFabien Sanglard 15*3f982cf4SFabien Sanglard class MdnsRandom { 16*3f982cf4SFabien Sanglard public: 17*3f982cf4SFabien Sanglard // RFC 6762 Section 5.2 18*3f982cf4SFabien Sanglard // https://tools.ietf.org/html/rfc6762#section-5.2 19*3f982cf4SFabien Sanglard GetInitialQueryDelay()20*3f982cf4SFabien Sanglard Clock::duration GetInitialQueryDelay() { 21*3f982cf4SFabien Sanglard return std::chrono::milliseconds{initial_query_delay_(random_engine_)}; 22*3f982cf4SFabien Sanglard } 23*3f982cf4SFabien Sanglard GetRecordTtlVariation()24*3f982cf4SFabien Sanglard double GetRecordTtlVariation() { 25*3f982cf4SFabien Sanglard return record_ttl_variation_(random_engine_); 26*3f982cf4SFabien Sanglard } 27*3f982cf4SFabien Sanglard 28*3f982cf4SFabien Sanglard // RFC 6762 Section 6 29*3f982cf4SFabien Sanglard // https://tools.ietf.org/html/rfc6762#section-6 30*3f982cf4SFabien Sanglard GetSharedRecordResponseDelay()31*3f982cf4SFabien Sanglard Clock::duration GetSharedRecordResponseDelay() { 32*3f982cf4SFabien Sanglard return std::chrono::milliseconds{ 33*3f982cf4SFabien Sanglard shared_record_response_delay_(random_engine_)}; 34*3f982cf4SFabien Sanglard } 35*3f982cf4SFabien Sanglard GetTruncatedQueryResponseDelay()36*3f982cf4SFabien Sanglard Clock::duration GetTruncatedQueryResponseDelay() { 37*3f982cf4SFabien Sanglard return std::chrono::milliseconds{ 38*3f982cf4SFabien Sanglard truncated_query_response_delay_(random_engine_)}; 39*3f982cf4SFabien Sanglard } 40*3f982cf4SFabien Sanglard GetInitialProbeDelay()41*3f982cf4SFabien Sanglard Clock::duration GetInitialProbeDelay() { 42*3f982cf4SFabien Sanglard return std::chrono::milliseconds{ 43*3f982cf4SFabien Sanglard probe_initialization_delay_(random_engine_)}; 44*3f982cf4SFabien Sanglard } 45*3f982cf4SFabien Sanglard 46*3f982cf4SFabien Sanglard private: 47*3f982cf4SFabien Sanglard static constexpr int64_t kMinimumInitialQueryDelayMs = 20; 48*3f982cf4SFabien Sanglard static constexpr int64_t kMaximumInitialQueryDelayMs = 120; 49*3f982cf4SFabien Sanglard 50*3f982cf4SFabien Sanglard static constexpr double kMinimumTtlVariation = 0.0; 51*3f982cf4SFabien Sanglard static constexpr double kMaximumTtlVariation = 0.02; 52*3f982cf4SFabien Sanglard 53*3f982cf4SFabien Sanglard static constexpr int64_t kMinimumSharedRecordResponseDelayMs = 20; 54*3f982cf4SFabien Sanglard static constexpr int64_t kMaximumSharedRecordResponseDelayMs = 120; 55*3f982cf4SFabien Sanglard 56*3f982cf4SFabien Sanglard static constexpr int64_t kMinimumTruncatedQueryResponseDelayMs = 400; 57*3f982cf4SFabien Sanglard static constexpr int64_t kMaximumTruncatedQueryResponseDelayMs = 500; 58*3f982cf4SFabien Sanglard 59*3f982cf4SFabien Sanglard static constexpr int64_t kMinimumProbeInitializationDelayMs = 0; 60*3f982cf4SFabien Sanglard static constexpr int64_t kMaximumProbeInitializationDelayMs = 250; 61*3f982cf4SFabien Sanglard 62*3f982cf4SFabien Sanglard std::default_random_engine random_engine_{std::random_device{}()}; 63*3f982cf4SFabien Sanglard std::uniform_int_distribution<int64_t> initial_query_delay_{ 64*3f982cf4SFabien Sanglard kMinimumInitialQueryDelayMs, kMaximumInitialQueryDelayMs}; 65*3f982cf4SFabien Sanglard std::uniform_real_distribution<double> record_ttl_variation_{ 66*3f982cf4SFabien Sanglard kMinimumTtlVariation, kMaximumTtlVariation}; 67*3f982cf4SFabien Sanglard std::uniform_int_distribution<int64_t> shared_record_response_delay_{ 68*3f982cf4SFabien Sanglard kMinimumSharedRecordResponseDelayMs, kMaximumSharedRecordResponseDelayMs}; 69*3f982cf4SFabien Sanglard std::uniform_int_distribution<int64_t> truncated_query_response_delay_{ 70*3f982cf4SFabien Sanglard kMinimumTruncatedQueryResponseDelayMs, 71*3f982cf4SFabien Sanglard kMaximumTruncatedQueryResponseDelayMs}; 72*3f982cf4SFabien Sanglard std::uniform_int_distribution<int64_t> probe_initialization_delay_{ 73*3f982cf4SFabien Sanglard kMinimumProbeInitializationDelayMs, kMaximumProbeInitializationDelayMs}; 74*3f982cf4SFabien Sanglard }; 75*3f982cf4SFabien Sanglard 76*3f982cf4SFabien Sanglard } // namespace discovery 77*3f982cf4SFabien Sanglard } // namespace openscreen 78*3f982cf4SFabien Sanglard 79*3f982cf4SFabien Sanglard #endif // DISCOVERY_MDNS_MDNS_RANDOM_H_ 80