uncrustify as demanded.
[oweals/gnunet.git] / src / ats / gnunet-ats-solver-eval.h
1 /*
2    This file is part of GNUnet.
3    Copyright (C) 2010-2013 GNUnet e.V.
4
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.
9
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.
14
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/>.
17
18      SPDX-License-Identifier: AGPL3.0-or-later
19  */
20 /**
21  * @file ats-tests/ats-testing-experiment.c
22  * @brief ats benchmark: controlled experiment execution
23  * @author Christian Grothoff
24  * @author Matthias Wachs
25  */
26 #ifndef GNUNET_ATS_SOLVER_EVAL_H
27 #define GNUNET_ATS_SOLVER_EVAL_H
28
29 #include "platform.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"
36
37 enum GeneratorType {
38   GNUNET_ATS_TEST_TG_LINEAR,
39   GNUNET_ATS_TEST_TG_CONSTANT,
40   GNUNET_ATS_TEST_TG_RANDOM,
41   GNUNET_ATS_TEST_TG_SINUS
42 };
43
44
45 enum OperationType {
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,
54 };
55
56 struct SolverHandle {
57   /**
58    * Solver plugin name
59    */
60   char *plugin;
61
62   /**
63    * Solver environment
64    */
65   struct GNUNET_ATS_PluginEnvironment env;
66
67   /**
68    * Solver handle
69    */
70   struct GNUNET_ATS_SolverFunctions *sf;
71
72   /**
73    * Address hashmap
74    */
75   struct GNUNET_CONTAINER_MultiPeerMap *addresses;
76 };
77
78 enum GNUNET_ATS_Solvers {
79   GNUNET_ATS_SOLVER_PROPORTIONAL,
80   GNUNET_ATS_SOLVER_MLP,
81   GNUNET_ATS_SOLVER_RIL,
82 };
83
84 struct LoggingFileHandle {
85   /* DLL list for logging time steps */
86   struct LoggingFileHandle *next;
87   struct LoggingFileHandle *prev;
88
89   /* peer id */
90   long long unsigned int pid;
91
92   /* address id */
93   long long unsigned int aid;
94
95   struct GNUNET_DISK_FileHandle *f_hd;
96 };
97
98 struct LoggingTimeStep {
99   struct LoggingTimeStep *prev;
100   struct LoggingTimeStep *next;
101
102   struct LoggingPeer *head;
103   struct LoggingPeer *tail;
104
105   struct GNUNET_TIME_Absolute timestamp;
106   struct GNUNET_TIME_Relative delta;
107 };
108
109 struct LoggingPeer {
110   struct LoggingPeer *prev;
111   struct LoggingPeer *next;
112
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];
117   int is_requested;
118
119   struct LoggingAddress *addr_head;
120   struct LoggingAddress *addr_tail;
121 };
122
123 struct LoggingAddress {
124   struct LoggingAddress *next;
125   struct LoggingAddress *prev;
126
127   long long unsigned int aid;
128   int active;
129   uint32_t network;
130   uint32_t assigned_bw_in;
131   uint32_t assigned_bw_out;
132
133   double prop_abs[GNUNET_ATS_PropertyCount];
134   double prop_norm[GNUNET_ATS_PropertyCount];
135 };
136
137
138 struct TestPeer {
139   struct TestPeer *prev;
140   struct TestPeer *next;
141
142
143   long long unsigned int id;
144   int is_requested;
145   struct GNUNET_PeerIdentity peer_id;
146
147   double pref_abs[GNUNET_ATS_PreferenceCount];
148   double pref_norm[GNUNET_ATS_PreferenceCount];
149
150   uint32_t assigned_bw_in;
151   uint32_t assigned_bw_out;
152
153   struct TestAddress *addr_head;
154   struct TestAddress *addr_tail;
155 };
156
157
158 struct TestAddress {
159   struct TestAddress *next;
160   struct TestAddress *prev;
161
162   long long unsigned int aid;
163   struct ATS_Address *ats_addr;
164   uint32_t network;
165
166   double prop_abs[GNUNET_ATS_PropertyCount];
167   double prop_norm[GNUNET_ATS_PropertyCount];
168 };
169
170 struct Episode;
171
172 struct Experiment;
173
174 typedef void (*GNUNET_ATS_TESTING_EpisodeDoneCallback) (
175   struct Episode *e);
176
177 typedef void (*GNUNET_ATS_TESTING_ExperimentDoneCallback) (struct Experiment *e,
178                                                            struct GNUNET_TIME_Relative duration, int success);
179
180 /**
181  * An operation in an experiment
182  */
183 struct GNUNET_ATS_TEST_Operation {
184   struct GNUNET_ATS_TEST_Operation *next;
185   struct GNUNET_ATS_TEST_Operation *prev;
186
187   long long unsigned int address_id;
188   long long unsigned int peer_id;
189   long long unsigned int client_id;
190
191   long long unsigned int address_session;
192   unsigned int address_network;
193   char*address;
194   char*plugin;
195
196
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;
202
203   enum OperationType type;
204   enum GeneratorType gen_type;
205   enum GNUNET_ATS_PreferenceKind pref_type;
206   // enum GNUNET_ATS_Property prop_type;
207 };
208
209 struct Episode {
210   int id;
211   struct Episode *next;
212   struct GNUNET_TIME_Relative duration;
213
214   struct GNUNET_ATS_TEST_Operation *head;
215   struct GNUNET_ATS_TEST_Operation *tail;
216 };
217
218 struct LoggingHandle {
219   struct GNUNET_SCHEDULER_Task * logging_task;
220   struct GNUNET_TIME_Relative log_freq;
221
222   /* DLL list for logging time steps */
223   struct LoggingTimeStep *head;
224   struct LoggingTimeStep *tail;
225 };
226
227 struct Experiment {
228   char *name;
229   char *log_prefix;
230   char *cfg_file;
231   char *log_output_dir;
232   int log_append_time_stamp;
233
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;
240
241   struct GNUNET_CONFIGURATION_Handle *cfg;
242
243   struct GNUNET_SCHEDULER_Task * experiment_timeout_task;
244   struct GNUNET_SCHEDULER_Task * episode_timeout_task;
245   struct Episode *cur;
246
247   GNUNET_ATS_TESTING_EpisodeDoneCallback ep_done_cb;
248   GNUNET_ATS_TESTING_ExperimentDoneCallback e_done_cb;
249 };
250
251 struct PreferenceGenerator {
252   struct PreferenceGenerator *prev;
253   struct PreferenceGenerator *next;
254
255   enum GeneratorType type;
256
257   long long unsigned int peer;
258   unsigned int client_id;
259
260   enum GNUNET_ATS_PreferenceKind kind;
261
262   long int base_value;
263   long int max_value;
264   struct GNUNET_TIME_Relative duration_period;
265   struct GNUNET_TIME_Relative frequency;
266   struct GNUNET_TIME_Relative feedback_frequency;
267
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;
272
273
274   /* Feedback */
275   uint32_t feedback_bw_out_acc;
276   uint32_t feedback_bw_in_acc;
277   uint32_t feedback_delay_acc;
278
279   double pref_bw_old;
280   double pref_latency_old;
281
282   struct GNUNET_TIME_Absolute feedback_last;
283
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;
289 };
290
291
292 struct PropertyGenerator {
293   struct PropertyGenerator *prev;
294   struct PropertyGenerator *next;
295
296   enum GeneratorType type;
297
298   long long unsigned int peer;
299   long long unsigned int address_id;
300
301   struct TestPeer *test_peer;
302   struct TestAddress *test_address;
303   uint32_t ats_property;
304
305   long int base_value;
306   long int max_value;
307   struct GNUNET_TIME_Relative duration_period;
308   struct GNUNET_TIME_Relative frequency;
309
310   struct GNUNET_SCHEDULER_Task * set_task;
311   struct GNUNET_TIME_Absolute next_ping_transmission;
312   struct GNUNET_TIME_Absolute time_start;
313 };
314
315 #endif /* #ifndef GNUNET_ATS_SOLVER_EVAL_H */
316 /* end of file ats-testing.h */