Commit | Line | Data |
---|---|---|
91fcc471 TJ |
1 | /* |
2 | The software in this package is distributed under the GNU General | |
3 | Public License version 2 (with a special exception described below). | |
4 | ||
5 | A copy of GNU General Public License (GPL) is included in this distribution, | |
6 | in the file COPYING.GPL. | |
7 | ||
8 | As a special exception, if other files instantiate templates or use macros | |
9 | or inline functions from this file, or you compile this file and link it | |
10 | with other works to produce a work based on this file, this file | |
11 | does not by itself cause the resulting work to be covered | |
12 | by the GNU General Public License. | |
13 | ||
14 | However the source code for this file must still be made available | |
15 | in accordance with section (3) of the GNU General Public License. | |
16 | ||
17 | This exception does not invalidate any other reasons why a work based | |
18 | on this file might be covered by the GNU General Public License. | |
19 | */ | |
a9c88e1c GMF |
20 | #ifndef PING_SCHEDULER_H |
21 | #define PING_SCHEDULER_H | |
ced28dc7 | 22 | |
238da857 GMF |
23 | #include <stdint.h> |
24 | ||
9c55ecd3 | 25 | #include <string> |
5624490d | 26 | #include <vector> |
9c55ecd3 | 27 | |
e39cc3da GMF |
28 | #include <boost/asio.hpp> |
29 | #include <boost/shared_ptr.hpp> | |
ced28dc7 | 30 | |
72e54d1c | 31 | #include "link/linkstatus.h" |
6c14bbee | 32 | #include "host/hoststatus.h" |
96c4e7a4 | 33 | #include "host/pingstatus.h" |
51cbc790 | 34 | #include "host/pinger.h" |
8f66f529 | 35 | #include "host/pinginterval.h" |
242e5fb3 | 36 | #include "host/pingnumber.h" |
3fd74a53 | 37 | #include "host/pingprotocol.h" |
26b0f687 | 38 | #include "dns/resolverbase.h" |
ced28dc7 | 39 | |
89f153af | 40 | typedef std::vector<PingerItem> pinger_vec; |
91aa83f9 | 41 | |
4c2a5ab5 | 42 | //----------------------------------------------------------------------------- |
4bb97b45 | 43 | // PingScheduler |
4c2a5ab5 GMF |
44 | //----------------------------------------------------------------------------- |
45 | ||
c5e4bfa1 GMF |
46 | /** |
47 | * @brief This class is responsible to control whether to ping a host. It | |
48 | * schedules periodic pings to a host. | |
49 | * Scope: one object per host. | |
50 | */ | |
4bb97b45 | 51 | class PingScheduler |
ced28dc7 GMF |
52 | { |
53 | public: | |
4bb97b45 | 54 | PingScheduler( |
365036be | 55 | const IoServiceItem io_service, |
2bf8720f GMF |
56 | const std::string &network_interface, |
57 | const std::string &destination_address, | |
238da857 | 58 | const uint16_t destination_port, |
fe6a2f80 | 59 | const PingProtocolList &ping_protocol_list, |
c15a722d | 60 | const long ping_interval_in_sec, |
a341119a | 61 | const int ping_fail_percentage_limit, |
a7b15639 CH |
62 | const int ping_congestion_percentage_limit, |
63 | const int ping_congestion_duration_thresh, | |
079d19ab | 64 | const int ping_reply_timeout, |
59733431 | 65 | LinkStatusItem link_analyzer, |
91aa83f9 CH |
66 | const int first_delay, |
67 | const int n_parallel_pings, | |
87758553 CH |
68 | const int parallel_ping_delay, |
69 | const int ping_timeout_factor | |
e39cc3da | 70 | ); |
a86e8ddc | 71 | ~PingScheduler(); |
ced28dc7 | 72 | |
365036be CH |
73 | void start_pinging(); |
74 | void stop_pinging(); | |
88714861 GMF |
75 | |
76 | private: | |
010b8519 GMF |
77 | // |
78 | // Methods | |
79 | // | |
80 | ||
26b0f687 | 81 | void ping(const boost::system::error_code &error); |
9c0dcf33 CH |
82 | void ping_done_handler(const PingStatus &result, |
83 | const long ping_duration_us); | |
d8a91bd6 | 84 | void update_ping_interval(); |
242e5fb3 | 85 | void update_ping_number(); |
ced28dc7 | 86 | |
23f51766 CH |
87 | void init_ping_protocol(); |
88 | void update_ping_protocol(); | |
89 | void get_next_ping_protocol(); | |
90 | bool can_change_ping_protocol() const; | |
91 | ||
91aa83f9 | 92 | void prepare_next_ping(); |
242e5fb3 | 93 | void update_dns_resolver(); |
23f51766 | 94 | |
8d26221d | 95 | void ping_when_ready(); |
89f153af | 96 | void delayed_ping( const boost::system::error_code &error, |
242e5fb3 | 97 | const boost::asio::ip::address ip, |
89f153af | 98 | const int pinger_index ); |
cd71d095 CH |
99 | void dns_resolve_callback(const bool was_success, |
100 | const int recursion_count); | |
26b0f687 CH |
101 | void start_resolving_ping_address(); |
102 | ||
103 | void update_log_prefix(); | |
72be9e7d | 104 | void cancel_resolve(const bool force_cancel); |
91aa83f9 | 105 | void clear_pingers(); |
23f51766 | 106 | |
010b8519 GMF |
107 | // |
108 | // Attributes | |
109 | // | |
110 | ||
23f51766 CH |
111 | /// The IO service object, which has the loop event |
112 | IoServiceItem IoService; | |
113 | /// The network interface name | |
114 | std::string NetworkInterfaceName; | |
23f51766 CH |
115 | /// The address to ping |
116 | std::string DestinationAddress; | |
26b0f687 | 117 | /// The port to ping at destination host (same for all protocols) |
23f51766 | 118 | uint16_t DestinationPort; |
26b0f687 CH |
119 | /// The list of protocols to ping and iterator over them |
120 | PingProtocolList Protocols; | |
121 | PingProtocolList::const_iterator ProtocolIter; | |
122 | /// Interval between each ping to the same host | |
123 | PingInterval PingIntervalInSec; | |
242e5fb3 CH |
124 | /// number of pingers that work in parallel |
125 | PingNumber NPingers; | |
26b0f687 CH |
126 | /// delay for very first ping to avoid lots of simultaneous pings at startup |
127 | int FirstDelay; | |
128 | /// Timer to trigger the next ping | |
129 | boost::asio::deadline_timer NextPingTimer; | |
130 | /// Keeps track of the time when the last ping was send | |
131 | boost::posix_time::ptime TimeSentLastPing; | |
132 | /// time threshold for ping | |
87758553 CH |
133 | int PingReplyTimeout; |
134 | /// time threshold for ping -- original value | |
135 | const int PingReplyTimeoutOrig; | |
26b0f687 CH |
136 | /// Object responsible to evaluate the status of the host |
137 | HostStatus HostAnalyzer; | |
138 | /// The Dns resolver | |
139 | ResolverItem Resolver; | |
91aa83f9 | 140 | /// vector of pingers |
89f153af | 141 | pinger_vec Pingers; |
91aa83f9 CH |
142 | /// number of results from pingers |
143 | int NPingersDone; | |
144 | /// delay (in ms) between pings to same IP | |
145 | int ParallelPingDelay; | |
89f153af CH |
146 | /// timers for delayed pings |
147 | boost::asio::deadline_timer DelayedPingTimer; | |
23f51766 CH |
148 | /// a flag whether we should ping as soon as dns is ready |
149 | bool WantToPing; | |
26b0f687 CH |
150 | /// Prefix to log messages for quicker analysis/debugging |
151 | std::string LogPrefix; | |
152 | /// Flag whether DNS resolution has failed so we have to run on outdated IPs | |
153 | bool ContinueOnOutdatedIps; | |
87758553 | 154 | int PingTimeoutFactor; |
ced28dc7 GMF |
155 | }; |
156 | ||
e39cc3da | 157 | //----------------------------------------------------------------------------- |
4bb97b45 | 158 | // PingSchedulerItem |
e39cc3da GMF |
159 | //----------------------------------------------------------------------------- |
160 | ||
4bb97b45 | 161 | typedef boost::shared_ptr<PingScheduler> PingSchedulerItem; |
e39cc3da | 162 | |
5624490d GMF |
163 | //----------------------------------------------------------------------------- |
164 | // PingSchedulerList | |
165 | //----------------------------------------------------------------------------- | |
166 | ||
167 | typedef std::vector< PingSchedulerItem > PingSchedulerList; | |
168 | ||
a9c88e1c | 169 | #endif // PING_SCHEDULER_H |