diff options
Diffstat (limited to 'src/ats-tests/ats-testing-preferences.c')
-rw-r--r-- | src/ats-tests/ats-testing-preferences.c | 277 |
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; | |||
33 | extern struct GNUNET_ATS_TEST_Topology *top; | 33 | extern struct GNUNET_ATS_TEST_Topology *top; |
34 | 34 | ||
35 | static double | 35 | static double |
36 | get_preference(struct PreferenceGenerator *pg) | 36 | get_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 | ||
98 | static void | 102 | static void |
99 | set_pref_task(void *cls) | 103 | set_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 | */ |
152 | struct PreferenceGenerator * | 156 | struct PreferenceGenerator * |
153 | GNUNET_ATS_TEST_generate_preferences_start(struct BenchmarkPeer *src, | 157 | GNUNET_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 | ||
226 | void | 231 | void |
227 | GNUNET_ATS_TEST_generate_preferences_stop(struct PreferenceGenerator *pg) | 232 | GNUNET_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 | */ |
245 | void | 250 | void |
246 | GNUNET_ATS_TEST_generate_preferences_stop_all() | 251 | GNUNET_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 */ |