2 This file is part of GNUnet.
3 Copyright (C) 2010-2013 GNUnet e.V.
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
18 SPDX-License-Identifier: AGPL3.0-or-later
21 * @file ats-tests/ats-testing-experiment.c
22 * @brief ats benchmark: controlled experiment execution
23 * @author Christian Grothoff
24 * @author Matthias Wachs
26 #ifndef GNUNET_ATS_SOLVER_EVAL_H
27 #define GNUNET_ATS_SOLVER_EVAL_H
30 #include "gnunet_util_lib.h"
31 #include "gnunet_ats_plugin.h"
32 #include "gnunet_ats_service.h"
33 #include "gnunet-service-ats_addresses.h"
34 #include "gnunet-service-ats_normalization.h"
35 #include "test_ats_api_common.h"
38 GNUNET_ATS_TEST_TG_LINEAR,
39 GNUNET_ATS_TEST_TG_CONSTANT,
40 GNUNET_ATS_TEST_TG_RANDOM,
41 GNUNET_ATS_TEST_TG_SINUS
46 SOLVER_OP_ADD_ADDRESS,
47 SOLVER_OP_DEL_ADDRESS,
48 SOLVER_OP_START_SET_PROPERTY,
49 SOLVER_OP_STOP_SET_PROPERTY,
50 SOLVER_OP_START_SET_PREFERENCE,
51 SOLVER_OP_STOP_SET_PREFERENCE,
52 SOLVER_OP_START_REQUEST,
53 SOLVER_OP_STOP_REQUEST,
65 struct GNUNET_ATS_PluginEnvironment env;
70 struct GNUNET_ATS_SolverFunctions *sf;
75 struct GNUNET_CONTAINER_MultiPeerMap *addresses;
78 enum GNUNET_ATS_Solvers {
79 GNUNET_ATS_SOLVER_PROPORTIONAL,
80 GNUNET_ATS_SOLVER_MLP,
81 GNUNET_ATS_SOLVER_RIL,
84 struct LoggingFileHandle {
85 /* DLL list for logging time steps */
86 struct LoggingFileHandle *next;
87 struct LoggingFileHandle *prev;
90 long long unsigned int pid;
93 long long unsigned int aid;
95 struct GNUNET_DISK_FileHandle *f_hd;
98 struct LoggingTimeStep {
99 struct LoggingTimeStep *prev;
100 struct LoggingTimeStep *next;
102 struct LoggingPeer *head;
103 struct LoggingPeer *tail;
105 struct GNUNET_TIME_Absolute timestamp;
106 struct GNUNET_TIME_Relative delta;
110 struct LoggingPeer *prev;
111 struct LoggingPeer *next;
113 long long unsigned int id;
114 struct GNUNET_PeerIdentity peer_id;
115 double pref_abs[GNUNET_ATS_PREFERENCE_END];
116 double pref_norm[GNUNET_ATS_PREFERENCE_END];
119 struct LoggingAddress *addr_head;
120 struct LoggingAddress *addr_tail;
123 struct LoggingAddress {
124 struct LoggingAddress *next;
125 struct LoggingAddress *prev;
127 long long unsigned int aid;
130 uint32_t assigned_bw_in;
131 uint32_t assigned_bw_out;
133 double prop_abs[GNUNET_ATS_PropertyCount];
134 double prop_norm[GNUNET_ATS_PropertyCount];
139 struct TestPeer *prev;
140 struct TestPeer *next;
143 long long unsigned int id;
145 struct GNUNET_PeerIdentity peer_id;
147 double pref_abs[GNUNET_ATS_PreferenceCount];
148 double pref_norm[GNUNET_ATS_PreferenceCount];
150 uint32_t assigned_bw_in;
151 uint32_t assigned_bw_out;
153 struct TestAddress *addr_head;
154 struct TestAddress *addr_tail;
159 struct TestAddress *next;
160 struct TestAddress *prev;
162 long long unsigned int aid;
163 struct ATS_Address *ats_addr;
166 double prop_abs[GNUNET_ATS_PropertyCount];
167 double prop_norm[GNUNET_ATS_PropertyCount];
174 typedef void (*GNUNET_ATS_TESTING_EpisodeDoneCallback) (
177 typedef void (*GNUNET_ATS_TESTING_ExperimentDoneCallback) (struct Experiment *e,
178 struct GNUNET_TIME_Relative duration, int success);
181 * An operation in an experiment
183 struct GNUNET_ATS_TEST_Operation {
184 struct GNUNET_ATS_TEST_Operation *next;
185 struct GNUNET_ATS_TEST_Operation *prev;
187 long long unsigned int address_id;
188 long long unsigned int peer_id;
189 long long unsigned int client_id;
191 long long unsigned int address_session;
192 unsigned int address_network;
197 long long unsigned int base_rate;
198 long long unsigned int max_rate;
199 struct GNUNET_TIME_Relative period;
200 struct GNUNET_TIME_Relative frequency;
201 struct GNUNET_TIME_Relative feedback_delay;
203 enum OperationType type;
204 enum GeneratorType gen_type;
205 enum GNUNET_ATS_PreferenceKind pref_type;
206 // enum GNUNET_ATS_Property prop_type;
211 struct Episode *next;
212 struct GNUNET_TIME_Relative duration;
214 struct GNUNET_ATS_TEST_Operation *head;
215 struct GNUNET_ATS_TEST_Operation *tail;
218 struct LoggingHandle {
219 struct GNUNET_SCHEDULER_Task * logging_task;
220 struct GNUNET_TIME_Relative log_freq;
222 /* DLL list for logging time steps */
223 struct LoggingTimeStep *head;
224 struct LoggingTimeStep *tail;
231 char *log_output_dir;
232 int log_append_time_stamp;
234 struct GNUNET_TIME_Relative log_freq;
235 struct GNUNET_TIME_Relative max_duration;
236 struct GNUNET_TIME_Relative total_duration;
237 struct GNUNET_TIME_Absolute start_time;
238 unsigned int num_episodes;
239 struct Episode *start;
241 struct GNUNET_CONFIGURATION_Handle *cfg;
243 struct GNUNET_SCHEDULER_Task * experiment_timeout_task;
244 struct GNUNET_SCHEDULER_Task * episode_timeout_task;
247 GNUNET_ATS_TESTING_EpisodeDoneCallback ep_done_cb;
248 GNUNET_ATS_TESTING_ExperimentDoneCallback e_done_cb;
251 struct PreferenceGenerator {
252 struct PreferenceGenerator *prev;
253 struct PreferenceGenerator *next;
255 enum GeneratorType type;
257 long long unsigned int peer;
258 unsigned int client_id;
260 enum GNUNET_ATS_PreferenceKind kind;
264 struct GNUNET_TIME_Relative duration_period;
265 struct GNUNET_TIME_Relative frequency;
266 struct GNUNET_TIME_Relative feedback_frequency;
268 struct GNUNET_SCHEDULER_Task * set_task;
269 struct GNUNET_SCHEDULER_Task * feedback_task;
270 struct GNUNET_TIME_Absolute next_ping_transmission;
271 struct GNUNET_TIME_Absolute time_start;
275 uint32_t feedback_bw_out_acc;
276 uint32_t feedback_bw_in_acc;
277 uint32_t feedback_delay_acc;
280 double pref_latency_old;
282 struct GNUNET_TIME_Absolute feedback_last;
284 struct GNUNET_TIME_Absolute feedback_last_bw_update;
285 struct GNUNET_TIME_Absolute feedback_last_delay_update;
286 uint32_t last_assigned_bw_in;
287 uint32_t last_assigned_bw_out;
288 double last_delay_value;
292 struct PropertyGenerator {
293 struct PropertyGenerator *prev;
294 struct PropertyGenerator *next;
296 enum GeneratorType type;
298 long long unsigned int peer;
299 long long unsigned int address_id;
301 struct TestPeer *test_peer;
302 struct TestAddress *test_address;
303 uint32_t ats_property;
307 struct GNUNET_TIME_Relative duration_period;
308 struct GNUNET_TIME_Relative frequency;
310 struct GNUNET_SCHEDULER_Task * set_task;
311 struct GNUNET_TIME_Absolute next_ping_transmission;
312 struct GNUNET_TIME_Absolute time_start;
315 #endif /* #ifndef GNUNET_ATS_SOLVER_EVAL_H */
316 /* end of file ats-testing.h */