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.c196
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;
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;
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
93static void 98static void
94set_pref_task (void *cls) 99set_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 */
144struct PreferenceGenerator * 152struct PreferenceGenerator *
145GNUNET_ATS_TEST_generate_preferences_start (struct BenchmarkPeer *src, 153GNUNET_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
213void 226void
214GNUNET_ATS_TEST_generate_preferences_stop (struct PreferenceGenerator *pg) 227GNUNET_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 */
232void 245void
233GNUNET_ATS_TEST_generate_preferences_stop_all () 246GNUNET_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 */