1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111 | // Copyright (C) 2013-2019 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef RATE_CONTROL_H
#define RATE_CONTROL_H
#include <boost/date_time/posix_time/posix_time.hpp><--- Include file: not found. Please note: Cppcheck does not need standard library headers to get proper results.
namespace isc {
namespace perfdhcp {
/// \brief A message sending rate control class for perfdhcp.
///
/// This class provides the means to control the rate at which messages
/// of the specific type are sent by perfdhcp. Each message type,
/// for which the desired rate can be specified, has a corresponding
/// \c RateControl object. So, the perfdhcp is using up to three objects
/// of this type at the same time, to control the rate of the following
/// messages being sent:
/// - Discover(DHCPv4) or Solicit (DHCPv6)
/// - Renew (DHCPv6) or Request (DHCPv4) to renew leases.
/// - Release
///
/// The purpose of the RateControl class is to track the due time for
/// sending next message (or bunch of messages) to keep outbound rate
/// of particular messages at the desired level. The due time is calculated
/// using the desired rate value and the timestamp when the last message of
/// the particular type has been sent. That puts the responsibility on the
/// \c TestControl class to invoke the \c RateControl::updateSendDue, every
/// time the message is sent.
///
/// The \c RateControl object returns the number of messages to be sent at
/// the time. The number returned is 0, if perfdhcp shouldn't send any messages
/// yet, or 1 (sometimes more) if the send due time has been reached.
class RateControl {
public:
/// \brief Default constructor.
RateControl();
/// \brief Constructor which sets desired rate.
///
/// \param rate A desired rate.
RateControl(const unsigned int rate);<--- Class 'RateControl' has a constructor with 1 argument that is not explicit. [+]Class 'RateControl' has a constructor with 1 argument that is not explicit. Such, so called "Converting constructors", should in general be explicit for type safety reasons as that prevents unintended implicit conversions.
/// \brief Returns number of messages to be sent "now".
///
/// This function calculates how many messages of the given type should
/// be sent immediately when the call to the function returns, to catch
/// up with the desired message rate.
///
/// The value returned depends on the due time calculated with the
/// \c RateControl::updateSendDue function and the current time. If
/// the due time has been hit, the non-zero number of messages is returned.
/// If the due time hasn't been hit, the number returned is 0.
///
/// If the rate is non-zero, the number of messages to be sent is calculated
/// as follows:
/// \code
/// num = duration * rate
/// \endcode
/// where <b>duration</b> is a time period between the due time to send
/// next set of messages and current time. The duration is expressed in
/// seconds with the fractional part having 6 or 9 digits (depending on
/// the timer resolution). If the calculated value is equal to 0, it is
/// rounded to 1, so as at least one message is sent.
///
/// \return A number of messages to be sent immediately.
uint64_t getOutboundMessageCount(bool const waiting_to_exit = false);
/// \brief Returns the rate.
unsigned int getRate() const {
return (rate_);
}
/// \brief Sets the new rate.
///
/// \param rate A new value of rate. This value must not be negative.
/// \throw isc::BadValue if new rate is negative.
void setRate(const int rate);
protected:
/// \brief Convenience function returning current time.
///
/// \return current time.
boost::posix_time::ptime currentTime();
/// \brief Holds a desired rate value.
unsigned int rate_;
/// \brief Holds number of packets send from the beginning.
/// It is used to calculate current request rate. Then this is used
/// to estimate number of packets to send in current cycle.
uint64_t total_pkts_sent_count_;
/// \brief Holds time of start of testing.
/// It is used to calculate current request rate. Then this is used
/// to estimate number of packets to send in current cycle.
boost::posix_time::ptime start_time_;
};
}
}
#endif
|