diff options
Diffstat (limited to 'src/ats-tests/ats-testing-preferences.c')
-rw-r--r-- | src/ats-tests/ats-testing-preferences.c | 196 |
1 files changed, 105 insertions, 91 deletions
diff --git a/src/ats-tests/ats-testing-preferences.c b/src/ats-tests/ats-testing-preferences.c index ba2f133b9..a14e66736 100644 --- a/src/ats-tests/ats-testing-preferences.c +++ b/src/ats-tests/ats-testing-preferences.c | |||
@@ -1,19 +1,19 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of GNUnet. | 2 | This file is part of GNUnet. |
3 | Copyright (C) 2010-2013 GNUnet e.V. | 3 | Copyright (C) 2010-2013 GNUnet e.V. |
4 | 4 | ||
5 | GNUnet is free software: you can redistribute it and/or modify it | 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 | 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, | 7 | by the Free Software Foundation, either version 3 of the License, |
8 | or (at your option) any later version. | 8 | or (at your option) any later version. |
9 | 9 | ||
10 | GNUnet is distributed in the hope that it will be useful, but | 10 | GNUnet is distributed in the hope that it will be useful, but |
11 | WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 | Affero General Public License for more details. | 13 | Affero General Public License for more details. |
14 | 14 | ||
15 | You should have received a copy of the GNU Affero General Public License | 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/>. | 16 | along with this program. If not, see <http://www.gnu.org/licenses/>. |
17 | 17 | ||
18 | SPDX-License-Identifier: AGPL3.0-or-later | 18 | SPDX-License-Identifier: AGPL3.0-or-later |
19 | */ | 19 | */ |
@@ -33,76 +33,82 @@ 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; |
40 | double pref_value; | 40 | double pref_value; |
41 | 41 | ||
42 | /* Calculate the current preference value */ | 42 | /* Calculate the current preference value */ |
43 | switch (pg->type) { | 43 | switch (pg->type) |
44 | { | ||
44 | case GNUNET_ATS_TEST_TG_CONSTANT: | 45 | case GNUNET_ATS_TEST_TG_CONSTANT: |
45 | pref_value = pg->base_value; | 46 | pref_value = pg->base_value; |
46 | break; | 47 | break; |
48 | |||
47 | case GNUNET_ATS_TEST_TG_LINEAR: | 49 | case GNUNET_ATS_TEST_TG_LINEAR: |
48 | time_delta = GNUNET_TIME_absolute_get_duration(pg->time_start); | 50 | time_delta = GNUNET_TIME_absolute_get_duration(pg->time_start); |
49 | /* Calculate point of time in the current period */ | 51 | /* Calculate point of time in the current period */ |
50 | time_delta.rel_value_us = time_delta.rel_value_us % | 52 | time_delta.rel_value_us = time_delta.rel_value_us % |
51 | pg->duration_period.rel_value_us; | 53 | pg->duration_period.rel_value_us; |
52 | delta_value = ((double) time_delta.rel_value_us / | 54 | delta_value = ((double)time_delta.rel_value_us / |
53 | pg->duration_period.rel_value_us) * (pg->max_value - pg->base_value); | 55 | pg->duration_period.rel_value_us) * (pg->max_value - pg->base_value); |
54 | if ((pg->max_value < pg->base_value) && | 56 | if ((pg->max_value < pg->base_value) && |
55 | ((pg->max_value - pg->base_value) > pg->base_value)) | 57 | ((pg->max_value - pg->base_value) > pg->base_value)) |
56 | { | 58 | { |
57 | /* This will cause an underflow */ | 59 | /* This will cause an underflow */ |
58 | GNUNET_break (0); | 60 | GNUNET_break(0); |
59 | } | 61 | } |
60 | pref_value = pg->base_value + delta_value; | 62 | pref_value = pg->base_value + delta_value; |
61 | break; | 63 | break; |
64 | |||
62 | case GNUNET_ATS_TEST_TG_RANDOM: | 65 | case GNUNET_ATS_TEST_TG_RANDOM: |
63 | delta_value = (double) GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, | 66 | delta_value = (double)GNUNET_CRYPTO_random_u32(GNUNET_CRYPTO_QUALITY_WEAK, |
64 | 10000 * (pg->max_value - pg->base_value)) / 10000; | 67 | 10000 * (pg->max_value - pg->base_value)) / 10000; |
65 | pref_value = pg->base_value + delta_value; | 68 | pref_value = pg->base_value + delta_value; |
66 | break; | 69 | break; |
70 | |||
67 | case GNUNET_ATS_TEST_TG_SINUS: | 71 | case GNUNET_ATS_TEST_TG_SINUS: |
68 | time_delta = GNUNET_TIME_absolute_get_duration(pg->time_start); | 72 | time_delta = GNUNET_TIME_absolute_get_duration(pg->time_start); |
69 | /* Calculate point of time in the current period */ | 73 | /* Calculate point of time in the current period */ |
70 | time_delta.rel_value_us = time_delta.rel_value_us % | 74 | time_delta.rel_value_us = time_delta.rel_value_us % |
71 | pg->duration_period.rel_value_us; | 75 | pg->duration_period.rel_value_us; |
72 | if ((pg->max_value - pg->base_value) > pg->base_value) | 76 | if ((pg->max_value - pg->base_value) > pg->base_value) |
73 | { | 77 | { |
74 | /* This will cause an underflow for second half of sinus period, | 78 | /* This will cause an underflow for second half of sinus period, |
75 | * will be detected in general when experiments are loaded */ | 79 | * will be detected in general when experiments are loaded */ |
76 | GNUNET_break (0); | 80 | GNUNET_break(0); |
77 | } | 81 | } |
78 | delta_value = (pg->max_value - pg->base_value) * | 82 | delta_value = (pg->max_value - pg->base_value) * |
79 | sin ( (2 * M_PI) / ((double) pg->duration_period.rel_value_us) * | 83 | sin((2 * M_PI) / ((double)pg->duration_period.rel_value_us) * |
80 | time_delta.rel_value_us); | 84 | time_delta.rel_value_us); |
81 | pref_value = pg->base_value + delta_value; | 85 | pref_value = pg->base_value + delta_value; |
82 | break; | 86 | break; |
87 | |||
83 | default: | 88 | default: |
84 | pref_value = 0.0; | 89 | pref_value = 0.0; |
85 | break; | 90 | break; |
86 | } | 91 | } |
87 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Current preference value is %f\n", | 92 | GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Current preference value is %f\n", |
88 | pref_value); | 93 | pref_value); |
89 | return pref_value; | 94 | return pref_value; |
90 | } | 95 | } |
91 | 96 | ||
92 | 97 | ||
93 | static void | 98 | static void |
94 | set_pref_task (void *cls) | 99 | set_pref_task(void *cls) |
95 | { | 100 | { |
96 | struct BenchmarkPartner *p = cls; | 101 | struct BenchmarkPartner *p = cls; |
97 | double pref_value; | 102 | double pref_value; |
103 | |||
98 | p->pg->set_task = NULL; | 104 | p->pg->set_task = NULL; |
99 | 105 | ||
100 | pref_value = get_preference (p->pg); | 106 | pref_value = get_preference(p->pg); |
101 | 107 | ||
102 | GNUNET_log(GNUNET_ERROR_TYPE_INFO, | 108 | GNUNET_log(GNUNET_ERROR_TYPE_INFO, |
103 | "Setting preference for master [%u] and slave [%u] for %s to %f\n", | 109 | "Setting preference for master [%u] and slave [%u] for %s to %f\n", |
104 | p->me->no, p->dest->no, | 110 | p->me->no, p->dest->no, |
105 | GNUNET_ATS_print_preference_type (p->pg->kind), pref_value); | 111 | GNUNET_ATS_print_preference_type(p->pg->kind), pref_value); |
106 | 112 | ||
107 | GNUNET_ATS_performance_change_preference(p->me->ats_perf_handle, | 113 | GNUNET_ATS_performance_change_preference(p->me->ats_perf_handle, |
108 | &p->dest->id, | 114 | &p->dest->id, |
@@ -110,20 +116,22 @@ set_pref_task (void *cls) | |||
110 | pref_value, | 116 | pref_value, |
111 | GNUNET_ATS_PREFERENCE_END); | 117 | GNUNET_ATS_PREFERENCE_END); |
112 | 118 | ||
113 | switch (p->pg->kind) { | 119 | switch (p->pg->kind) |
120 | { | ||
114 | case GNUNET_ATS_PREFERENCE_BANDWIDTH: | 121 | case GNUNET_ATS_PREFERENCE_BANDWIDTH: |
115 | p->pref_bandwidth = pref_value; | 122 | p->pref_bandwidth = pref_value; |
116 | break; | 123 | break; |
124 | |||
117 | case GNUNET_ATS_PREFERENCE_LATENCY: | 125 | case GNUNET_ATS_PREFERENCE_LATENCY: |
118 | p->pref_delay = pref_value; | 126 | p->pref_delay = pref_value; |
119 | break; | 127 | break; |
128 | |||
120 | default: | 129 | default: |
121 | break; | 130 | break; |
122 | } | 131 | } |
123 | |||
124 | p->pg->set_task = GNUNET_SCHEDULER_add_delayed (p->pg->frequency, | ||
125 | set_pref_task, p); | ||
126 | 132 | ||
133 | p->pg->set_task = GNUNET_SCHEDULER_add_delayed(p->pg->frequency, | ||
134 | set_pref_task, p); | ||
127 | } | 135 | } |
128 | 136 | ||
129 | 137 | ||
@@ -142,25 +150,25 @@ set_pref_task (void *cls) | |||
142 | * @return the preference generator | 150 | * @return the preference generator |
143 | */ | 151 | */ |
144 | struct PreferenceGenerator * | 152 | struct PreferenceGenerator * |
145 | GNUNET_ATS_TEST_generate_preferences_start (struct BenchmarkPeer *src, | 153 | GNUNET_ATS_TEST_generate_preferences_start(struct BenchmarkPeer *src, |
146 | struct BenchmarkPartner *dest, | 154 | struct BenchmarkPartner *dest, |
147 | enum GeneratorType type, | 155 | enum GeneratorType type, |
148 | unsigned int base_value, | 156 | unsigned int base_value, |
149 | unsigned int value_rate, | 157 | unsigned int value_rate, |
150 | struct GNUNET_TIME_Relative period, | 158 | struct GNUNET_TIME_Relative period, |
151 | struct GNUNET_TIME_Relative frequency, | 159 | struct GNUNET_TIME_Relative frequency, |
152 | enum GNUNET_ATS_PreferenceKind kind) | 160 | enum GNUNET_ATS_PreferenceKind kind) |
153 | { | 161 | { |
154 | struct PreferenceGenerator *pg; | 162 | struct PreferenceGenerator *pg; |
155 | 163 | ||
156 | if (NULL != dest->pg) | 164 | if (NULL != dest->pg) |
157 | { | 165 | { |
158 | GNUNET_break (0); | 166 | GNUNET_break(0); |
159 | return NULL; | 167 | return NULL; |
160 | } | 168 | } |
161 | 169 | ||
162 | pg = GNUNET_new (struct PreferenceGenerator); | 170 | pg = GNUNET_new(struct PreferenceGenerator); |
163 | GNUNET_CONTAINER_DLL_insert (pg_head, pg_tail, pg); | 171 | GNUNET_CONTAINER_DLL_insert(pg_head, pg_tail, pg); |
164 | pg->type = type; | 172 | pg->type = type; |
165 | pg->src = src; | 173 | pg->src = src; |
166 | pg->dest = dest; | 174 | pg->dest = dest; |
@@ -171,58 +179,63 @@ GNUNET_ATS_TEST_generate_preferences_start (struct BenchmarkPeer *src, | |||
171 | pg->frequency = frequency; | 179 | pg->frequency = frequency; |
172 | pg->time_start = GNUNET_TIME_absolute_get(); | 180 | pg->time_start = GNUNET_TIME_absolute_get(); |
173 | 181 | ||
174 | switch (type) { | 182 | switch (type) |
183 | { | ||
175 | case GNUNET_ATS_TEST_TG_CONSTANT: | 184 | case GNUNET_ATS_TEST_TG_CONSTANT: |
176 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 185 | GNUNET_log(GNUNET_ERROR_TYPE_INFO, |
177 | "Setting up constant preference generator master[%u] `%s' and slave [%u] `%s' max %u Bips\n", | 186 | "Setting up constant preference generator master[%u] `%s' and slave [%u] `%s' max %u Bips\n", |
178 | dest->me->no, GNUNET_i2s (&dest->me->id), | 187 | dest->me->no, GNUNET_i2s(&dest->me->id), |
179 | dest->dest->no, GNUNET_i2s (&dest->dest->id), | 188 | dest->dest->no, GNUNET_i2s(&dest->dest->id), |
180 | base_value); | 189 | base_value); |
181 | break; | 190 | break; |
191 | |||
182 | case GNUNET_ATS_TEST_TG_LINEAR: | 192 | case GNUNET_ATS_TEST_TG_LINEAR: |
183 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 193 | GNUNET_log(GNUNET_ERROR_TYPE_INFO, |
184 | "Setting up linear preference generator master[%u] `%s' and slave [%u] `%s' min %u Bips max %u Bips\n", | 194 | "Setting up linear preference generator master[%u] `%s' and slave [%u] `%s' min %u Bips max %u Bips\n", |
185 | dest->me->no, GNUNET_i2s (&dest->me->id), | 195 | dest->me->no, GNUNET_i2s(&dest->me->id), |
186 | dest->dest->no, GNUNET_i2s (&dest->dest->id), | 196 | dest->dest->no, GNUNET_i2s(&dest->dest->id), |
187 | base_value, value_rate); | 197 | base_value, value_rate); |
188 | break; | 198 | break; |
199 | |||
189 | case GNUNET_ATS_TEST_TG_SINUS: | 200 | case GNUNET_ATS_TEST_TG_SINUS: |
190 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 201 | GNUNET_log(GNUNET_ERROR_TYPE_INFO, |
191 | "Setting up sinus preference generator master[%u] `%s' and slave [%u] `%s' baserate %u Bips, amplitude %u Bps\n", | 202 | "Setting up sinus preference generator master[%u] `%s' and slave [%u] `%s' baserate %u Bips, amplitude %u Bps\n", |
192 | dest->me->no, GNUNET_i2s (&dest->me->id), | 203 | dest->me->no, GNUNET_i2s(&dest->me->id), |
193 | dest->dest->no, GNUNET_i2s (&dest->dest->id), | 204 | dest->dest->no, GNUNET_i2s(&dest->dest->id), |
194 | base_value, value_rate); | 205 | base_value, value_rate); |
195 | break; | 206 | break; |
207 | |||
196 | case GNUNET_ATS_TEST_TG_RANDOM: | 208 | case GNUNET_ATS_TEST_TG_RANDOM: |
197 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 209 | GNUNET_log(GNUNET_ERROR_TYPE_INFO, |
198 | "Setting up random preference generator master[%u] `%s' and slave [%u] `%s' min %u Bips max %u Bps\n", | 210 | "Setting up random preference generator master[%u] `%s' and slave [%u] `%s' min %u Bips max %u Bps\n", |
199 | dest->me->no, GNUNET_i2s (&dest->me->id), | 211 | dest->me->no, GNUNET_i2s(&dest->me->id), |
200 | dest->dest->no, GNUNET_i2s (&dest->dest->id), | 212 | dest->dest->no, GNUNET_i2s(&dest->dest->id), |
201 | base_value, value_rate); | 213 | base_value, value_rate); |
202 | break; | 214 | break; |
215 | |||
203 | default: | 216 | default: |
204 | break; | 217 | break; |
205 | } | 218 | } |
206 | 219 | ||
207 | dest->pg = pg; | 220 | dest->pg = pg; |
208 | pg->set_task = GNUNET_SCHEDULER_add_now (&set_pref_task, dest); | 221 | pg->set_task = GNUNET_SCHEDULER_add_now(&set_pref_task, dest); |
209 | return pg; | 222 | return pg; |
210 | } | 223 | } |
211 | 224 | ||
212 | 225 | ||
213 | void | 226 | void |
214 | GNUNET_ATS_TEST_generate_preferences_stop (struct PreferenceGenerator *pg) | 227 | GNUNET_ATS_TEST_generate_preferences_stop(struct PreferenceGenerator *pg) |
215 | { | 228 | { |
216 | GNUNET_CONTAINER_DLL_remove (pg_head, pg_tail, pg); | 229 | GNUNET_CONTAINER_DLL_remove(pg_head, pg_tail, pg); |
217 | pg->dest->pg = NULL; | 230 | pg->dest->pg = NULL; |
218 | 231 | ||
219 | if (NULL != pg->set_task) | 232 | if (NULL != pg->set_task) |
220 | { | 233 | { |
221 | GNUNET_SCHEDULER_cancel (pg->set_task); | 234 | GNUNET_SCHEDULER_cancel(pg->set_task); |
222 | pg->set_task = NULL; | 235 | pg->set_task = NULL; |
223 | } | 236 | } |
224 | 237 | ||
225 | GNUNET_free (pg); | 238 | GNUNET_free(pg); |
226 | } | 239 | } |
227 | 240 | ||
228 | 241 | ||
@@ -230,16 +243,17 @@ GNUNET_ATS_TEST_generate_preferences_stop (struct PreferenceGenerator *pg) | |||
230 | * Stop all preferences generators | 243 | * Stop all preferences generators |
231 | */ | 244 | */ |
232 | void | 245 | void |
233 | GNUNET_ATS_TEST_generate_preferences_stop_all () | 246 | GNUNET_ATS_TEST_generate_preferences_stop_all() |
234 | { | 247 | { |
235 | struct PreferenceGenerator *cur; | 248 | struct PreferenceGenerator *cur; |
236 | struct PreferenceGenerator *next; | 249 | struct PreferenceGenerator *next; |
250 | |||
237 | next = pg_head; | 251 | next = pg_head; |
238 | for (cur = next; NULL != cur; cur = next) | 252 | for (cur = next; NULL != cur; cur = next) |
239 | { | 253 | { |
240 | next = cur->next; | 254 | next = cur->next; |
241 | GNUNET_ATS_TEST_generate_preferences_stop(cur); | 255 | GNUNET_ATS_TEST_generate_preferences_stop(cur); |
242 | } | 256 | } |
243 | } | 257 | } |
244 | 258 | ||
245 | /* end of file ats-testing-preferences.c */ | 259 | /* end of file ats-testing-preferences.c */ |