diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2014-02-03 21:51:43 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2014-02-03 21:51:43 +0000 |
commit | 82668db981251a3b96760c289b459cad1bcece13 (patch) | |
tree | 9c8893c0bf2a10b552ccc723cb61a490a881c0f1 /src/ats-tests/ats-testing-preferences.c | |
parent | 8a3563b5c242b60aa4b7d2b9a3c3607ef8dcbadb (diff) | |
download | gnunet-82668db981251a3b96760c289b459cad1bcece13.tar.gz gnunet-82668db981251a3b96760c289b459cad1bcece13.zip |
adding preference generation
Diffstat (limited to 'src/ats-tests/ats-testing-preferences.c')
-rw-r--r-- | src/ats-tests/ats-testing-preferences.c | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/src/ats-tests/ats-testing-preferences.c b/src/ats-tests/ats-testing-preferences.c new file mode 100644 index 000000000..2e140ae9a --- /dev/null +++ b/src/ats-tests/ats-testing-preferences.c | |||
@@ -0,0 +1,232 @@ | |||
1 | /* | ||
2 | This file is part of GNUnet. | ||
3 | (C) 2010-2013 Christian Grothoff (and other contributing authors) | ||
4 | |||
5 | GNUnet is free software; you can redistribute it and/or modify | ||
6 | it under the terms of the GNU General Public License as published | ||
7 | by the Free Software Foundation; either version 3, or (at your | ||
8 | option) any later version. | ||
9 | |||
10 | GNUnet is distributed in the hope that it will be useful, but | ||
11 | WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
13 | General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with GNUnet; see the file COPYING. If not, write to the | ||
17 | Free Software Foundation, Inc., 59 Temple Place - Suite 330, | ||
18 | Boston, MA 02111-1307, USA. | ||
19 | */ | ||
20 | /** | ||
21 | * @file ats-tests/ats-testing-preferences.c | ||
22 | * @brief ats benchmark: preference generator | ||
23 | * @author Christian Grothoff | ||
24 | * @author Matthias Wachs | ||
25 | */ | ||
26 | #include "platform.h" | ||
27 | #include "gnunet_util_lib.h" | ||
28 | #include "ats-testing.h" | ||
29 | |||
30 | static struct PreferenceGenerator *pg_head; | ||
31 | static struct PreferenceGenerator *pg_tail; | ||
32 | |||
33 | extern struct GNUNET_ATS_TEST_Topology *top; | ||
34 | |||
35 | static double | ||
36 | get_preference (struct PreferenceGenerator *pg) | ||
37 | { | ||
38 | struct GNUNET_TIME_Relative time_delta; | ||
39 | double delta_value; | ||
40 | double pref_value; | ||
41 | |||
42 | /* Calculate the current transmission rate based on the type of traffic */ | ||
43 | switch (pg->type) { | ||
44 | case GNUNET_ATS_TEST_TG_CONSTANT: | ||
45 | pref_value = pg->base_value; | ||
46 | break; | ||
47 | case GNUNET_ATS_TEST_TG_LINEAR: | ||
48 | time_delta = GNUNET_TIME_absolute_get_duration(pg->time_start); | ||
49 | /* Calculate point of time in the current period */ | ||
50 | time_delta.rel_value_us = time_delta.rel_value_us % | ||
51 | pg->duration_period.rel_value_us; | ||
52 | delta_value = ((double) time_delta.rel_value_us / | ||
53 | pg->duration_period.rel_value_us) * (pg->max_value - pg->base_value); | ||
54 | if ((pg->max_value < pg->base_value) && | ||
55 | ((pg->max_value - pg->base_value) > pg->base_value)) | ||
56 | { | ||
57 | /* This will cause an underflow */ | ||
58 | GNUNET_break (0); | ||
59 | } | ||
60 | pref_value = pg->base_value + delta_value; | ||
61 | break; | ||
62 | case GNUNET_ATS_TEST_TG_RANDOM: | ||
63 | delta_value = (double) GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, | ||
64 | 10000 * (pg->max_value - pg->base_value)) / 10000; | ||
65 | pref_value = pg->base_value + delta_value; | ||
66 | break; | ||
67 | case GNUNET_ATS_TEST_TG_SINUS: | ||
68 | time_delta = GNUNET_TIME_absolute_get_duration(pg->time_start); | ||
69 | /* Calculate point of time in the current period */ | ||
70 | time_delta.rel_value_us = time_delta.rel_value_us % | ||
71 | pg->duration_period.rel_value_us; | ||
72 | if ((pg->max_value - pg->base_value) > pg->base_value) | ||
73 | { | ||
74 | /* This will cause an underflow for second half of sinus period, | ||
75 | * will be detected in general when experiments are loaded */ | ||
76 | GNUNET_break (0); | ||
77 | } | ||
78 | delta_value = (pg->max_value - pg->base_value) * | ||
79 | sin ( (2 * M_PI) / ((double) pg->duration_period.rel_value_us) * | ||
80 | time_delta.rel_value_us); | ||
81 | pref_value = pg->base_value + delta_value; | ||
82 | break; | ||
83 | default: | ||
84 | pref_value = 0.0; | ||
85 | break; | ||
86 | } | ||
87 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Current preference value is %f\n", | ||
88 | pref_value); | ||
89 | return pref_value; | ||
90 | } | ||
91 | |||
92 | |||
93 | static void | ||
94 | set_pref_task (void *cls, | ||
95 | const struct GNUNET_SCHEDULER_TaskContext *tc) | ||
96 | { | ||
97 | struct BenchmarkPartner *p = cls; | ||
98 | double pref_value; | ||
99 | p->pg->set_task = GNUNET_SCHEDULER_NO_TASK; | ||
100 | |||
101 | pref_value = get_preference (p->pg); | ||
102 | |||
103 | GNUNET_log(GNUNET_ERROR_TYPE_INFO, | ||
104 | "Setting preference for master [%u] and slave [%u] for %s to %f\n", | ||
105 | p->me->no, p->dest->no, | ||
106 | GNUNET_ATS_print_preference_type (p->pg->kind), pref_value); | ||
107 | |||
108 | GNUNET_ATS_performance_change_preference(p->me->ats_perf_handle, | ||
109 | &p->dest->id, p->pg->kind, pref_value, GNUNET_ATS_PREFERENCE_END); | ||
110 | |||
111 | p->pg->set_task = GNUNET_SCHEDULER_add_delayed (p->pg->frequency, | ||
112 | set_pref_task, p); | ||
113 | |||
114 | } | ||
115 | |||
116 | |||
117 | /** | ||
118 | * Generate between the source master and the partner and set preferences with a | ||
119 | * value depending on the generator. | ||
120 | * | ||
121 | * @param src source | ||
122 | * @param dest partner | ||
123 | * @param type type of preferences to generate | ||
124 | * @param base_rate traffic base rate to send data with | ||
125 | * @param max_rate traffic maximum rate to send data with | ||
126 | * @param period duration of a period of traffic generation (~ 1/frequency) | ||
127 | * @param duration how long to generate traffic | ||
128 | * @return the traffic generator | ||
129 | */ | ||
130 | struct PreferenceGenerator * | ||
131 | GNUNET_ATS_TEST_generate_preferences_start (struct BenchmarkPeer *src, | ||
132 | struct BenchmarkPartner *dest, | ||
133 | enum GeneratorType type, | ||
134 | long int base_value, | ||
135 | long int value_rate, | ||
136 | struct GNUNET_TIME_Relative period, | ||
137 | struct GNUNET_TIME_Relative frequency, | ||
138 | enum GNUNET_ATS_PreferenceKind kind) | ||
139 | { | ||
140 | struct PreferenceGenerator *pg; | ||
141 | |||
142 | if (NULL != dest->pg) | ||
143 | { | ||
144 | GNUNET_break (0); | ||
145 | return NULL; | ||
146 | } | ||
147 | |||
148 | pg = GNUNET_new (struct PreferenceGenerator); | ||
149 | GNUNET_CONTAINER_DLL_insert (pg_head, pg_tail, pg); | ||
150 | pg->type = type; | ||
151 | pg->src = src; | ||
152 | pg->dest = dest; | ||
153 | pg->kind = kind; | ||
154 | pg->base_value = base_value; | ||
155 | pg->max_value = value_rate; | ||
156 | pg->duration_period = period; | ||
157 | pg->frequency = frequency; | ||
158 | pg->time_start = GNUNET_TIME_absolute_get(); | ||
159 | |||
160 | switch (type) { | ||
161 | case GNUNET_ATS_TEST_TG_CONSTANT: | ||
162 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | ||
163 | "Setting up constant preference generator master[%u] `%s' and slave [%u] `%s' max %u Bips\n", | ||
164 | dest->me->no, GNUNET_i2s (&dest->me->id), | ||
165 | dest->dest->no, GNUNET_i2s (&dest->dest->id), | ||
166 | base_value); | ||
167 | break; | ||
168 | case GNUNET_ATS_TEST_TG_LINEAR: | ||
169 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | ||
170 | "Setting up linear preference generator master[%u] `%s' and slave [%u] `%s' min %u Bips max %u Bips\n", | ||
171 | dest->me->no, GNUNET_i2s (&dest->me->id), | ||
172 | dest->dest->no, GNUNET_i2s (&dest->dest->id), | ||
173 | base_value, value_rate); | ||
174 | break; | ||
175 | case GNUNET_ATS_TEST_TG_SINUS: | ||
176 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | ||
177 | "Setting up sinus preference generator master[%u] `%s' and slave [%u] `%s' baserate %u Bips, amplitude %u Bps\n", | ||
178 | dest->me->no, GNUNET_i2s (&dest->me->id), | ||
179 | dest->dest->no, GNUNET_i2s (&dest->dest->id), | ||
180 | base_value, value_rate); | ||
181 | break; | ||
182 | case GNUNET_ATS_TEST_TG_RANDOM: | ||
183 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | ||
184 | "Setting up random preference generator master[%u] `%s' and slave [%u] `%s' min %u Bips max %u Bps\n", | ||
185 | dest->me->no, GNUNET_i2s (&dest->me->id), | ||
186 | dest->dest->no, GNUNET_i2s (&dest->dest->id), | ||
187 | base_value, value_rate); | ||
188 | break; | ||
189 | default: | ||
190 | break; | ||
191 | } | ||
192 | |||
193 | dest->pg = pg; | ||
194 | pg->set_task = GNUNET_SCHEDULER_add_now (&set_pref_task, dest); | ||
195 | return pg; | ||
196 | } | ||
197 | |||
198 | |||
199 | void | ||
200 | GNUNET_ATS_TEST_generate_preferences_stop (struct PreferenceGenerator *pg) | ||
201 | { | ||
202 | GNUNET_CONTAINER_DLL_remove (pg_head, pg_tail, pg); | ||
203 | pg->dest->pg = NULL; | ||
204 | |||
205 | if (GNUNET_SCHEDULER_NO_TASK != pg->set_task) | ||
206 | { | ||
207 | GNUNET_SCHEDULER_cancel (pg->set_task); | ||
208 | pg->set_task = GNUNET_SCHEDULER_NO_TASK; | ||
209 | } | ||
210 | |||
211 | GNUNET_free (pg); | ||
212 | } | ||
213 | |||
214 | |||
215 | /** | ||
216 | * Stop all preferences generators | ||
217 | */ | ||
218 | void | ||
219 | GNUNET_ATS_TEST_generate_preferences_stop_all () | ||
220 | { | ||
221 | struct PreferenceGenerator *cur; | ||
222 | struct PreferenceGenerator *next; | ||
223 | next = pg_head; | ||
224 | for (cur = next; NULL != cur; cur = next) | ||
225 | { | ||
226 | next = cur->next; | ||
227 | GNUNET_ATS_TEST_generate_preferences_stop(cur); | ||
228 | } | ||
229 | } | ||
230 | |||
231 | /* end of file ats-testing-preferences.c */ | ||
232 | |||