aboutsummaryrefslogtreecommitdiff
path: root/src/ats-tests/ats-testing-preferences.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ats-tests/ats-testing-preferences.c')
-rw-r--r--src/ats-tests/ats-testing-preferences.c277
1 files changed, 141 insertions, 136 deletions
diff --git a/src/ats-tests/ats-testing-preferences.c b/src/ats-tests/ats-testing-preferences.c
index a14e66736..8138b18bb 100644
--- a/src/ats-tests/ats-testing-preferences.c
+++ b/src/ats-tests/ats-testing-preferences.c
@@ -33,7 +33,7 @@ static struct PreferenceGenerator *pg_tail;
33extern struct GNUNET_ATS_TEST_Topology *top; 33extern struct GNUNET_ATS_TEST_Topology *top;
34 34
35static double 35static double
36get_preference(struct PreferenceGenerator *pg) 36get_preference (struct PreferenceGenerator *pg)
37{ 37{
38 struct GNUNET_TIME_Relative time_delta; 38 struct GNUNET_TIME_Relative time_delta;
39 double delta_value; 39 double delta_value;
@@ -41,97 +41,101 @@ get_preference(struct PreferenceGenerator *pg)
41 41
42 /* Calculate the current preference value */ 42 /* Calculate the current preference value */
43 switch (pg->type) 43 switch (pg->type)
44 {
45 case GNUNET_ATS_TEST_TG_CONSTANT:
46 pref_value = pg->base_value;
47 break;
48
49 case GNUNET_ATS_TEST_TG_LINEAR:
50 time_delta = GNUNET_TIME_absolute_get_duration (pg->time_start);
51 /* Calculate point of time in the current period */
52 time_delta.rel_value_us = time_delta.rel_value_us
53 % pg->duration_period.rel_value_us;
54 delta_value = ((double) time_delta.rel_value_us
55 / pg->duration_period.rel_value_us) * (pg->max_value
56 - pg->base_value);
57 if ((pg->max_value < pg->base_value) &&
58 ((pg->max_value - pg->base_value) > pg->base_value))
44 { 59 {
45 case GNUNET_ATS_TEST_TG_CONSTANT: 60 /* This will cause an underflow */
46 pref_value = pg->base_value; 61 GNUNET_break (0);
47 break;
48
49 case GNUNET_ATS_TEST_TG_LINEAR:
50 time_delta = GNUNET_TIME_absolute_get_duration(pg->time_start);
51 /* Calculate point of time in the current period */
52 time_delta.rel_value_us = time_delta.rel_value_us %
53 pg->duration_period.rel_value_us;
54 delta_value = ((double)time_delta.rel_value_us /
55 pg->duration_period.rel_value_us) * (pg->max_value - pg->base_value);
56 if ((pg->max_value < pg->base_value) &&
57 ((pg->max_value - pg->base_value) > pg->base_value))
58 {
59 /* This will cause an underflow */
60 GNUNET_break(0);
61 }
62 pref_value = pg->base_value + delta_value;
63 break;
64
65 case GNUNET_ATS_TEST_TG_RANDOM:
66 delta_value = (double)GNUNET_CRYPTO_random_u32(GNUNET_CRYPTO_QUALITY_WEAK,
67 10000 * (pg->max_value - pg->base_value)) / 10000;
68 pref_value = pg->base_value + delta_value;
69 break;
70
71 case GNUNET_ATS_TEST_TG_SINUS:
72 time_delta = GNUNET_TIME_absolute_get_duration(pg->time_start);
73 /* Calculate point of time in the current period */
74 time_delta.rel_value_us = time_delta.rel_value_us %
75 pg->duration_period.rel_value_us;
76 if ((pg->max_value - pg->base_value) > pg->base_value)
77 {
78 /* This will cause an underflow for second half of sinus period,
79 * will be detected in general when experiments are loaded */
80 GNUNET_break(0);
81 }
82 delta_value = (pg->max_value - pg->base_value) *
83 sin((2 * M_PI) / ((double)pg->duration_period.rel_value_us) *
84 time_delta.rel_value_us);
85 pref_value = pg->base_value + delta_value;
86 break;
87
88 default:
89 pref_value = 0.0;
90 break;
91 } 62 }
92 GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Current preference value is %f\n", 63 pref_value = pg->base_value + delta_value;
93 pref_value); 64 break;
65
66 case GNUNET_ATS_TEST_TG_RANDOM:
67 delta_value = (double) GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
68 10000 * (pg->max_value
69 - pg->base_value))
70 / 10000;
71 pref_value = pg->base_value + delta_value;
72 break;
73
74 case GNUNET_ATS_TEST_TG_SINUS:
75 time_delta = GNUNET_TIME_absolute_get_duration (pg->time_start);
76 /* Calculate point of time in the current period */
77 time_delta.rel_value_us = time_delta.rel_value_us
78 % pg->duration_period.rel_value_us;
79 if ((pg->max_value - pg->base_value) > pg->base_value)
80 {
81 /* This will cause an underflow for second half of sinus period,
82 * will be detected in general when experiments are loaded */
83 GNUNET_break (0);
84 }
85 delta_value = (pg->max_value - pg->base_value)
86 * sin ((2 * M_PI)
87 / ((double) pg->duration_period.rel_value_us)
88 * time_delta.rel_value_us);
89 pref_value = pg->base_value + delta_value;
90 break;
91
92 default:
93 pref_value = 0.0;
94 break;
95 }
96 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Current preference value is %f\n",
97 pref_value);
94 return pref_value; 98 return pref_value;
95} 99}
96 100
97 101
98static void 102static void
99set_pref_task(void *cls) 103set_pref_task (void *cls)
100{ 104{
101 struct BenchmarkPartner *p = cls; 105 struct BenchmarkPartner *p = cls;
102 double pref_value; 106 double pref_value;
103 107
104 p->pg->set_task = NULL; 108 p->pg->set_task = NULL;
105 109
106 pref_value = get_preference(p->pg); 110 pref_value = get_preference (p->pg);
107 111
108 GNUNET_log(GNUNET_ERROR_TYPE_INFO, 112 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
109 "Setting preference for master [%u] and slave [%u] for %s to %f\n", 113 "Setting preference for master [%u] and slave [%u] for %s to %f\n",
110 p->me->no, p->dest->no, 114 p->me->no, p->dest->no,
111 GNUNET_ATS_print_preference_type(p->pg->kind), pref_value); 115 GNUNET_ATS_print_preference_type (p->pg->kind), pref_value);
112 116
113 GNUNET_ATS_performance_change_preference(p->me->ats_perf_handle, 117 GNUNET_ATS_performance_change_preference (p->me->ats_perf_handle,
114 &p->dest->id, 118 &p->dest->id,
115 p->pg->kind, 119 p->pg->kind,
116 pref_value, 120 pref_value,
117 GNUNET_ATS_PREFERENCE_END); 121 GNUNET_ATS_PREFERENCE_END);
118 122
119 switch (p->pg->kind) 123 switch (p->pg->kind)
120 { 124 {
121 case GNUNET_ATS_PREFERENCE_BANDWIDTH: 125 case GNUNET_ATS_PREFERENCE_BANDWIDTH:
122 p->pref_bandwidth = pref_value; 126 p->pref_bandwidth = pref_value;
123 break; 127 break;
124 128
125 case GNUNET_ATS_PREFERENCE_LATENCY: 129 case GNUNET_ATS_PREFERENCE_LATENCY:
126 p->pref_delay = pref_value; 130 p->pref_delay = pref_value;
127 break; 131 break;
128 132
129 default: 133 default:
130 break; 134 break;
131 } 135 }
132 136
133 p->pg->set_task = GNUNET_SCHEDULER_add_delayed(p->pg->frequency, 137 p->pg->set_task = GNUNET_SCHEDULER_add_delayed (p->pg->frequency,
134 set_pref_task, p); 138 set_pref_task, p);
135} 139}
136 140
137 141
@@ -150,25 +154,26 @@ set_pref_task(void *cls)
150 * @return the preference generator 154 * @return the preference generator
151 */ 155 */
152struct PreferenceGenerator * 156struct PreferenceGenerator *
153GNUNET_ATS_TEST_generate_preferences_start(struct BenchmarkPeer *src, 157GNUNET_ATS_TEST_generate_preferences_start (struct BenchmarkPeer *src,
154 struct BenchmarkPartner *dest, 158 struct BenchmarkPartner *dest,
155 enum GeneratorType type, 159 enum GeneratorType type,
156 unsigned int base_value, 160 unsigned int base_value,
157 unsigned int value_rate, 161 unsigned int value_rate,
158 struct GNUNET_TIME_Relative period, 162 struct GNUNET_TIME_Relative period,
159 struct GNUNET_TIME_Relative frequency, 163 struct GNUNET_TIME_Relative
160 enum GNUNET_ATS_PreferenceKind kind) 164 frequency,
165 enum GNUNET_ATS_PreferenceKind kind)
161{ 166{
162 struct PreferenceGenerator *pg; 167 struct PreferenceGenerator *pg;
163 168
164 if (NULL != dest->pg) 169 if (NULL != dest->pg)
165 { 170 {
166 GNUNET_break(0); 171 GNUNET_break (0);
167 return NULL; 172 return NULL;
168 } 173 }
169 174
170 pg = GNUNET_new(struct PreferenceGenerator); 175 pg = GNUNET_new (struct PreferenceGenerator);
171 GNUNET_CONTAINER_DLL_insert(pg_head, pg_tail, pg); 176 GNUNET_CONTAINER_DLL_insert (pg_head, pg_tail, pg);
172 pg->type = type; 177 pg->type = type;
173 pg->src = src; 178 pg->src = src;
174 pg->dest = dest; 179 pg->dest = dest;
@@ -177,65 +182,65 @@ GNUNET_ATS_TEST_generate_preferences_start(struct BenchmarkPeer *src,
177 pg->max_value = value_rate; 182 pg->max_value = value_rate;
178 pg->duration_period = period; 183 pg->duration_period = period;
179 pg->frequency = frequency; 184 pg->frequency = frequency;
180 pg->time_start = GNUNET_TIME_absolute_get(); 185 pg->time_start = GNUNET_TIME_absolute_get ();
181 186
182 switch (type) 187 switch (type)
183 { 188 {
184 case GNUNET_ATS_TEST_TG_CONSTANT: 189 case GNUNET_ATS_TEST_TG_CONSTANT:
185 GNUNET_log(GNUNET_ERROR_TYPE_INFO, 190 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
186 "Setting up constant preference generator master[%u] `%s' and slave [%u] `%s' max %u Bips\n", 191 "Setting up constant preference generator master[%u] `%s' and slave [%u] `%s' max %u Bips\n",
187 dest->me->no, GNUNET_i2s(&dest->me->id), 192 dest->me->no, GNUNET_i2s (&dest->me->id),
188 dest->dest->no, GNUNET_i2s(&dest->dest->id), 193 dest->dest->no, GNUNET_i2s (&dest->dest->id),
189 base_value); 194 base_value);
190 break; 195 break;
191 196
192 case GNUNET_ATS_TEST_TG_LINEAR: 197 case GNUNET_ATS_TEST_TG_LINEAR:
193 GNUNET_log(GNUNET_ERROR_TYPE_INFO, 198 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
194 "Setting up linear preference generator master[%u] `%s' and slave [%u] `%s' min %u Bips max %u Bips\n", 199 "Setting up linear preference generator master[%u] `%s' and slave [%u] `%s' min %u Bips max %u Bips\n",
195 dest->me->no, GNUNET_i2s(&dest->me->id), 200 dest->me->no, GNUNET_i2s (&dest->me->id),
196 dest->dest->no, GNUNET_i2s(&dest->dest->id), 201 dest->dest->no, GNUNET_i2s (&dest->dest->id),
197 base_value, value_rate); 202 base_value, value_rate);
198 break; 203 break;
199 204
200 case GNUNET_ATS_TEST_TG_SINUS: 205 case GNUNET_ATS_TEST_TG_SINUS:
201 GNUNET_log(GNUNET_ERROR_TYPE_INFO, 206 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
202 "Setting up sinus preference generator master[%u] `%s' and slave [%u] `%s' baserate %u Bips, amplitude %u Bps\n", 207 "Setting up sinus preference generator master[%u] `%s' and slave [%u] `%s' baserate %u Bips, amplitude %u Bps\n",
203 dest->me->no, GNUNET_i2s(&dest->me->id), 208 dest->me->no, GNUNET_i2s (&dest->me->id),
204 dest->dest->no, GNUNET_i2s(&dest->dest->id), 209 dest->dest->no, GNUNET_i2s (&dest->dest->id),
205 base_value, value_rate); 210 base_value, value_rate);
206 break; 211 break;
207 212
208 case GNUNET_ATS_TEST_TG_RANDOM: 213 case GNUNET_ATS_TEST_TG_RANDOM:
209 GNUNET_log(GNUNET_ERROR_TYPE_INFO, 214 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
210 "Setting up random preference generator master[%u] `%s' and slave [%u] `%s' min %u Bips max %u Bps\n", 215 "Setting up random preference generator master[%u] `%s' and slave [%u] `%s' min %u Bips max %u Bps\n",
211 dest->me->no, GNUNET_i2s(&dest->me->id), 216 dest->me->no, GNUNET_i2s (&dest->me->id),
212 dest->dest->no, GNUNET_i2s(&dest->dest->id), 217 dest->dest->no, GNUNET_i2s (&dest->dest->id),
213 base_value, value_rate); 218 base_value, value_rate);
214 break; 219 break;
215 220
216 default: 221 default:
217 break; 222 break;
218 } 223 }
219 224
220 dest->pg = pg; 225 dest->pg = pg;
221 pg->set_task = GNUNET_SCHEDULER_add_now(&set_pref_task, dest); 226 pg->set_task = GNUNET_SCHEDULER_add_now (&set_pref_task, dest);
222 return pg; 227 return pg;
223} 228}
224 229
225 230
226void 231void
227GNUNET_ATS_TEST_generate_preferences_stop(struct PreferenceGenerator *pg) 232GNUNET_ATS_TEST_generate_preferences_stop (struct PreferenceGenerator *pg)
228{ 233{
229 GNUNET_CONTAINER_DLL_remove(pg_head, pg_tail, pg); 234 GNUNET_CONTAINER_DLL_remove (pg_head, pg_tail, pg);
230 pg->dest->pg = NULL; 235 pg->dest->pg = NULL;
231 236
232 if (NULL != pg->set_task) 237 if (NULL != pg->set_task)
233 { 238 {
234 GNUNET_SCHEDULER_cancel(pg->set_task); 239 GNUNET_SCHEDULER_cancel (pg->set_task);
235 pg->set_task = NULL; 240 pg->set_task = NULL;
236 } 241 }
237 242
238 GNUNET_free(pg); 243 GNUNET_free (pg);
239} 244}
240 245
241 246
@@ -243,17 +248,17 @@ GNUNET_ATS_TEST_generate_preferences_stop(struct PreferenceGenerator *pg)
243 * Stop all preferences generators 248 * Stop all preferences generators
244 */ 249 */
245void 250void
246GNUNET_ATS_TEST_generate_preferences_stop_all() 251GNUNET_ATS_TEST_generate_preferences_stop_all ()
247{ 252{
248 struct PreferenceGenerator *cur; 253 struct PreferenceGenerator *cur;
249 struct PreferenceGenerator *next; 254 struct PreferenceGenerator *next;
250 255
251 next = pg_head; 256 next = pg_head;
252 for (cur = next; NULL != cur; cur = next) 257 for (cur = next; NULL != cur; cur = next)
253 { 258 {
254 next = cur->next; 259 next = cur->next;
255 GNUNET_ATS_TEST_generate_preferences_stop(cur); 260 GNUNET_ATS_TEST_generate_preferences_stop (cur);
256 } 261 }
257} 262}
258 263
259/* end of file ats-testing-preferences.c */ 264/* end of file ats-testing-preferences.c */