xref: /aosp_15_r20/external/openscreen/discovery/mdns/mdns_random.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
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