GNUnet  0.11.x
ats-testing-preferences.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet.
3  Copyright (C) 2010-2013 GNUnet e.V.
4 
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
7  by the Free Software Foundation, either version 3 of the License,
8  or (at your 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  Affero General Public License for more details.
14 
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/>.
17 
18  SPDX-License-Identifier: AGPL3.0-or-later
19  */
26 #include "platform.h"
27 #include "gnunet_util_lib.h"
28 #include "ats-testing.h"
29 
32 
33 extern struct GNUNET_ATS_TEST_Topology *top;
34 
35 static double
37 {
38  struct GNUNET_TIME_Relative time_delta;
39  double delta_value;
40  double pref_value;
41 
42  /* Calculate the current preference value */
43  switch (pg->type)
44  {
46  pref_value = pg->base_value;
47  break;
48 
51  /* Calculate point of time in the current period */
52  time_delta.rel_value_us = time_delta.rel_value_us
54  delta_value = ((double) time_delta.rel_value_us
56  - pg->base_value);
57  if ((pg->max_value < pg->base_value) &&
58  ((pg->max_value - pg->base_value) > pg->base_value))
59  {
60  /* This will cause an underflow */
61  GNUNET_break (0);
62  }
63  pref_value = pg->base_value + delta_value;
64  break;
65 
68  10000 * (pg->max_value
69  - pg->base_value))
70  / 10000;
71  pref_value = pg->base_value + delta_value;
72  break;
73 
76  /* Calculate point of time in the current period */
77  time_delta.rel_value_us = time_delta.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);
98  return pref_value;
99 }
100 
101 
102 static void
103 set_pref_task (void *cls)
104 {
105  struct BenchmarkPartner *p = cls;
106  double pref_value;
107 
108  p->pg->set_task = NULL;
109 
110  pref_value = get_preference (p->pg);
111 
113  "Setting preference for master [%u] and slave [%u] for %s to %f\n",
114  p->me->no, p->dest->no,
115  GNUNET_ATS_print_preference_type (p->pg->kind), pref_value);
116 
118  &p->dest->id,
119  p->pg->kind,
120  pref_value,
122 
123  switch (p->pg->kind)
124  {
126  p->pref_bandwidth = pref_value;
127  break;
128 
130  p->pref_delay = pref_value;
131  break;
132 
133  default:
134  break;
135  }
136 
138  set_pref_task, p);
139 }
140 
141 
156 struct PreferenceGenerator *
158  struct BenchmarkPartner *dest,
159  enum GeneratorType type,
160  unsigned int base_value,
161  unsigned int value_rate,
162  struct GNUNET_TIME_Relative period,
163  struct GNUNET_TIME_Relative
164  frequency,
166 {
167  struct PreferenceGenerator *pg;
168 
169  if (NULL != dest->pg)
170  {
171  GNUNET_break (0);
172  return NULL;
173  }
174 
175  pg = GNUNET_new (struct PreferenceGenerator);
176  GNUNET_CONTAINER_DLL_insert (pg_head, pg_tail, pg);
177  pg->type = type;
178  pg->src = src;
179  pg->dest = dest;
180  pg->kind = kind;
181  pg->base_value = base_value;
182  pg->max_value = value_rate;
183  pg->duration_period = period;
184  pg->frequency = frequency;
186 
187  switch (type)
188  {
191  "Setting up constant preference generator master[%u] `%s' and slave [%u] `%s' max %u Bips\n",
192  dest->me->no, GNUNET_i2s (&dest->me->id),
193  dest->dest->no, GNUNET_i2s (&dest->dest->id),
194  base_value);
195  break;
196 
199  "Setting up linear preference generator master[%u] `%s' and slave [%u] `%s' min %u Bips max %u Bips\n",
200  dest->me->no, GNUNET_i2s (&dest->me->id),
201  dest->dest->no, GNUNET_i2s (&dest->dest->id),
202  base_value, value_rate);
203  break;
204 
207  "Setting up sinus preference generator master[%u] `%s' and slave [%u] `%s' baserate %u Bips, amplitude %u Bps\n",
208  dest->me->no, GNUNET_i2s (&dest->me->id),
209  dest->dest->no, GNUNET_i2s (&dest->dest->id),
210  base_value, value_rate);
211  break;
212 
215  "Setting up random preference generator master[%u] `%s' and slave [%u] `%s' min %u Bips max %u Bps\n",
216  dest->me->no, GNUNET_i2s (&dest->me->id),
217  dest->dest->no, GNUNET_i2s (&dest->dest->id),
218  base_value, value_rate);
219  break;
220 
221  default:
222  break;
223  }
224 
225  dest->pg = pg;
227  return pg;
228 }
229 
230 
231 void
233 {
234  GNUNET_CONTAINER_DLL_remove (pg_head, pg_tail, pg);
235  pg->dest->pg = NULL;
236 
237  if (NULL != pg->set_task)
238  {
240  pg->set_task = NULL;
241  }
242 
243  GNUNET_free (pg);
244 }
245 
246 
250 void
252 {
253  struct PreferenceGenerator *cur;
254  struct PreferenceGenerator *next;
255 
256  next = pg_head;
257  for (cur = next; NULL != cur; cur = next)
258  {
259  next = cur->next;
261  }
262 }
263 
264 
265 /* end of file ats-testing-preferences.c */
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
struct PreferenceGenerator * next
struct GNUNET_TIME_Absolute time_start
uint64_t rel_value_us
The actual value.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
struct GNUNET_TIME_Relative duration_period
uint32_t GNUNET_CRYPTO_random_u32(enum GNUNET_CRYPTO_Quality mode, uint32_t i)
Produce a random value.
double pref_bandwidth
Current preference values for bandwidth.
Definition: ats-testing.h:350
struct PreferenceGenerator * pg
Handle for preference generator.
Definition: ats-testing.h:300
struct GNUNET_ATS_TEST_Topology * top
Definition: ats-testing.c:53
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
End of preference list.
enum GNUNET_ATS_PreferenceKind kind
struct BenchmarkPartner * dest
Definition: ats-testing.h:258
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
Definition: scheduler.c:1253
int no
Unique identifier.
Definition: ats-testing.h:121
static struct GNUNET_OS_Process * p
Helper process we started.
Definition: gnunet-qr.c:59
Information we track for a peer in the testbed.
Definition: ats-testing.h:111
double pref_delay
Current preference values for delay.
Definition: ats-testing.h:355
static void set_pref_task(void *cls)
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1280
Information about a benchmarking partner.
Definition: ats-testing.h:275
struct PreferenceGenerator * GNUNET_ATS_TEST_generate_preferences_start(struct BenchmarkPeer *src, struct BenchmarkPartner *dest, enum GeneratorType type, unsigned int base_value, unsigned int value_rate, struct GNUNET_TIME_Relative period, struct GNUNET_TIME_Relative frequency, enum GNUNET_ATS_PreferenceKind kind)
Generate between the source master and the partner and set preferences with a value depending on the ...
struct GNUNET_ATS_PerformanceHandle * ats_perf_handle
ATS performance handle.
Definition: ats-testing.h:151
static struct PreferenceGenerator * pg_head
ats testing library: setup topology and provide logging to test ats
const char * GNUNET_ATS_print_preference_type(enum GNUNET_ATS_PreferenceKind type)
Convert a enum GNUNET_ATS_PreferenceType to a string.
struct GNUNET_SCHEDULER_Task * set_task
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition: time.c:118
void GNUNET_ATS_TEST_generate_preferences_stop(struct PreferenceGenerator *pg)
struct BenchmarkPeer * src
Definition: ats-testing.h:257
Change the peer&#39;s latency value to the given amount.
static double get_preference(struct PreferenceGenerator *pg)
void GNUNET_ATS_TEST_generate_preferences_stop_all()
Stop all preferences generators.
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_duration(struct GNUNET_TIME_Absolute whence)
Get the duration of an operation as the difference of the current time and the given start time "henc...
Definition: time.c:375
void GNUNET_ATS_performance_change_preference(struct GNUNET_ATS_PerformanceHandle *ph, const struct GNUNET_PeerIdentity *peer,...)
Change preferences for the given peer.
struct GNUNET_TIME_Relative frequency
#define GNUNET_log(kind,...)
Change the peer&#39;s bandwidth value (value per byte of bandwidth in the goal function) to the given amo...
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
static struct PreferenceGenerator * pg_tail
GNUNET_ATS_PreferenceKind
Enum defining all known preference categories.
struct BenchmarkPeer * me
The peer itself this partner belongs to.
Definition: ats-testing.h:280
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
struct BenchmarkPeer * dest
The partner peer.
Definition: ats-testing.h:285
struct GNUNET_PeerIdentity id
Peer ID.
Definition: ats-testing.h:131
No good quality of the operation is needed (i.e., random numbers can be pseudo-random).
#define GNUNET_free(ptr)
Wrapper around free.
Time for relative time used by GNUnet, in microseconds.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:966