gnunet-ats-solver-eval.h 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. /*
  2. This file is part of GNUnet.
  3. Copyright (C) 2010-2013 Christian Grothoff (and other contributing authors)
  4. GNUnet is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published
  6. by the Free Software Foundation; either version 3, or (at your
  7. option) any later version.
  8. GNUnet is distributed in the hope that it will be useful, but
  9. WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with GNUnet; see the file COPYING. If not, write to the
  14. Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  15. Boston, MA 02111-1307, USA.
  16. */
  17. /**
  18. * @file ats-tests/ats-testing-experiment.c
  19. * @brief ats benchmark: controlled experiment execution
  20. * @author Christian Grothoff
  21. * @author Matthias Wachs
  22. */
  23. #ifndef GNUNET_ATS_SOLVER_EVAL_H
  24. #define GNUNET_ATS_SOLVER_EVAL_H
  25. #include "platform.h"
  26. #include "gnunet_util_lib.h"
  27. #include "gnunet_ats_plugin.h"
  28. #include "gnunet_ats_service.h"
  29. #include "gnunet-service-ats_addresses.h"
  30. #include "gnunet-service-ats_normalization.h"
  31. #include "test_ats_api_common.h"
  32. enum GeneratorType
  33. {
  34. GNUNET_ATS_TEST_TG_LINEAR,
  35. GNUNET_ATS_TEST_TG_CONSTANT,
  36. GNUNET_ATS_TEST_TG_RANDOM,
  37. GNUNET_ATS_TEST_TG_SINUS
  38. };
  39. enum OperationType
  40. {
  41. SOLVER_OP_ADD_ADDRESS,
  42. SOLVER_OP_DEL_ADDRESS,
  43. SOLVER_OP_START_SET_PROPERTY,
  44. SOLVER_OP_STOP_SET_PROPERTY,
  45. SOLVER_OP_START_SET_PREFERENCE,
  46. SOLVER_OP_STOP_SET_PREFERENCE,
  47. SOLVER_OP_START_REQUEST,
  48. SOLVER_OP_STOP_REQUEST,
  49. };
  50. struct SolverHandle
  51. {
  52. /**
  53. * Solver plugin name
  54. */
  55. char *plugin;
  56. /**
  57. * Solver environment
  58. */
  59. struct GNUNET_ATS_PluginEnvironment env;
  60. /**
  61. * Solver handle
  62. */
  63. struct GNUNET_ATS_SolverFunctions *sf;
  64. /**
  65. * Address hashmap
  66. */
  67. struct GNUNET_CONTAINER_MultiPeerMap *addresses;
  68. };
  69. enum GNUNET_ATS_Solvers
  70. {
  71. GNUNET_ATS_SOLVER_PROPORTIONAL,
  72. GNUNET_ATS_SOLVER_MLP,
  73. GNUNET_ATS_SOLVER_RIL,
  74. };
  75. struct LoggingFileHandle
  76. {
  77. /* DLL list for logging time steps */
  78. struct LoggingFileHandle *next;
  79. struct LoggingFileHandle *prev;
  80. /* peer id */
  81. long long unsigned int pid;
  82. /* address id */
  83. long long unsigned int aid;
  84. struct GNUNET_DISK_FileHandle *f_hd;
  85. };
  86. struct LoggingTimeStep
  87. {
  88. struct LoggingTimeStep *prev;
  89. struct LoggingTimeStep *next;
  90. struct LoggingPeer *head;
  91. struct LoggingPeer *tail;
  92. struct GNUNET_TIME_Absolute timestamp;
  93. struct GNUNET_TIME_Relative delta;
  94. };
  95. struct LoggingPeer
  96. {
  97. struct LoggingPeer *prev;
  98. struct LoggingPeer *next;
  99. long long unsigned int id;
  100. struct GNUNET_PeerIdentity peer_id;
  101. double pref_abs[GNUNET_ATS_PreferenceCount];
  102. double pref_norm[GNUNET_ATS_PreferenceCount];
  103. int is_requested;
  104. struct LoggingAddress *addr_head;
  105. struct LoggingAddress *addr_tail;
  106. };
  107. struct LoggingAddress
  108. {
  109. struct LoggingAddress *next;
  110. struct LoggingAddress *prev;
  111. long long unsigned int aid;
  112. int active;
  113. uint32_t network;
  114. uint32_t assigned_bw_in;
  115. uint32_t assigned_bw_out;
  116. double prop_abs[GNUNET_ATS_PropertyCount];
  117. double prop_norm[GNUNET_ATS_PropertyCount];
  118. };
  119. struct TestPeer
  120. {
  121. struct TestPeer *prev;
  122. struct TestPeer *next;
  123. long long unsigned int id;
  124. int is_requested;
  125. struct GNUNET_PeerIdentity peer_id;
  126. double pref_abs[GNUNET_ATS_PreferenceCount];
  127. double pref_norm[GNUNET_ATS_PreferenceCount];
  128. uint32_t assigned_bw_in;
  129. uint32_t assigned_bw_out;
  130. struct TestAddress *addr_head;
  131. struct TestAddress *addr_tail;
  132. };
  133. struct TestAddress
  134. {
  135. struct TestAddress *next;
  136. struct TestAddress *prev;
  137. long long unsigned int aid;
  138. struct ATS_Address *ats_addr;
  139. uint32_t network;
  140. double prop_abs[GNUNET_ATS_PropertyCount];
  141. double prop_norm[GNUNET_ATS_PropertyCount];
  142. };
  143. struct Episode;
  144. struct Experiment;
  145. typedef void (*GNUNET_ATS_TESTING_EpisodeDoneCallback) (
  146. struct Episode *e);
  147. typedef void (*GNUNET_ATS_TESTING_ExperimentDoneCallback) (struct Experiment *e,
  148. struct GNUNET_TIME_Relative duration,int success);
  149. /**
  150. * An operation in an experiment
  151. */
  152. struct GNUNET_ATS_TEST_Operation
  153. {
  154. struct GNUNET_ATS_TEST_Operation *next;
  155. struct GNUNET_ATS_TEST_Operation *prev;
  156. long long unsigned int address_id;
  157. long long unsigned int peer_id;
  158. long long unsigned int client_id;
  159. long long unsigned int address_session;
  160. unsigned int address_network;
  161. char*address;
  162. char*plugin;
  163. long long unsigned int base_rate;
  164. long long unsigned int max_rate;
  165. struct GNUNET_TIME_Relative period;
  166. struct GNUNET_TIME_Relative frequency;
  167. struct GNUNET_TIME_Relative feedback_delay;
  168. enum OperationType type;
  169. enum GeneratorType gen_type;
  170. enum GNUNET_ATS_PreferenceKind pref_type;
  171. enum GNUNET_ATS_Property prop_type;
  172. };
  173. struct Episode
  174. {
  175. int id;
  176. struct Episode *next;
  177. struct GNUNET_TIME_Relative duration;
  178. struct GNUNET_ATS_TEST_Operation *head;
  179. struct GNUNET_ATS_TEST_Operation *tail;
  180. };
  181. struct LoggingHandle
  182. {
  183. struct GNUNET_SCHEDULER_Task * logging_task;
  184. struct GNUNET_TIME_Relative log_freq;
  185. /* DLL list for logging time steps */
  186. struct LoggingTimeStep *head;
  187. struct LoggingTimeStep *tail;
  188. };
  189. struct Experiment
  190. {
  191. char *name;
  192. char *log_prefix;
  193. char *cfg_file;
  194. char *log_output_dir;
  195. int log_append_time_stamp;
  196. struct GNUNET_TIME_Relative log_freq;
  197. struct GNUNET_TIME_Relative max_duration;
  198. struct GNUNET_TIME_Relative total_duration;
  199. struct GNUNET_TIME_Absolute start_time;
  200. unsigned int num_episodes;
  201. struct Episode *start;
  202. struct GNUNET_CONFIGURATION_Handle *cfg;
  203. struct GNUNET_SCHEDULER_Task * experiment_timeout_task;
  204. struct GNUNET_SCHEDULER_Task * episode_timeout_task;
  205. struct Episode *cur;
  206. GNUNET_ATS_TESTING_EpisodeDoneCallback ep_done_cb;
  207. GNUNET_ATS_TESTING_ExperimentDoneCallback e_done_cb;
  208. };
  209. struct PreferenceGenerator
  210. {
  211. struct PreferenceGenerator *prev;
  212. struct PreferenceGenerator *next;
  213. enum GeneratorType type;
  214. long long unsigned int peer;
  215. unsigned int client_id;
  216. enum GNUNET_ATS_PreferenceKind kind;
  217. long int base_value;
  218. long int max_value;
  219. struct GNUNET_TIME_Relative duration_period;
  220. struct GNUNET_TIME_Relative frequency;
  221. struct GNUNET_TIME_Relative feedback_frequency;
  222. struct GNUNET_SCHEDULER_Task * set_task;
  223. struct GNUNET_SCHEDULER_Task * feedback_task;
  224. struct GNUNET_TIME_Absolute next_ping_transmission;
  225. struct GNUNET_TIME_Absolute time_start;
  226. /* Feedback */
  227. uint32_t feedback_bw_out_acc;
  228. uint32_t feedback_bw_in_acc;
  229. uint32_t feedback_delay_acc;
  230. double pref_bw_old;
  231. double pref_latency_old;
  232. struct GNUNET_TIME_Absolute feedback_last;
  233. struct GNUNET_TIME_Absolute feedback_last_bw_update;
  234. struct GNUNET_TIME_Absolute feedback_last_delay_update;
  235. uint32_t last_assigned_bw_in;
  236. uint32_t last_assigned_bw_out;
  237. double last_delay_value;
  238. };
  239. struct PropertyGenerator
  240. {
  241. struct PropertyGenerator *prev;
  242. struct PropertyGenerator *next;
  243. enum GeneratorType type;
  244. long long unsigned int peer;
  245. long long unsigned int address_id;
  246. struct TestPeer *test_peer;
  247. struct TestAddress *test_address;
  248. uint32_t ats_property;
  249. long int base_value;
  250. long int max_value;
  251. struct GNUNET_TIME_Relative duration_period;
  252. struct GNUNET_TIME_Relative frequency;
  253. struct GNUNET_SCHEDULER_Task * set_task;
  254. struct GNUNET_TIME_Absolute next_ping_transmission;
  255. struct GNUNET_TIME_Absolute time_start;
  256. };
  257. #endif /* #ifndef GNUNET_ATS_SOLVER_EVAL_H */
  258. /* end of file ats-testing.h */