GNUnet  0.10.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) {
45  pref_value = pg->base_value;
46  break;
49  /* Calculate point of time in the current period */
50  time_delta.rel_value_us = time_delta.rel_value_us %
52  delta_value = ((double) time_delta.rel_value_us /
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;
64  10000 * (pg->max_value - pg->base_value)) / 10000;
65  pref_value = pg->base_value + delta_value;
66  break;
69  /* Calculate point of time in the current period */
70  time_delta.rel_value_us = time_delta.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 {
96  struct BenchmarkPartner *p = cls;
97  double pref_value;
98  p->pg->set_task = NULL;
99 
100  pref_value = get_preference (p->pg);
101 
103  "Setting preference for master [%u] and slave [%u] for %s to %f\n",
104  p->me->no, p->dest->no,
105  GNUNET_ATS_print_preference_type (p->pg->kind), pref_value);
106 
108  &p->dest->id,
109  p->pg->kind,
110  pref_value,
112 
113  switch (p->pg->kind) {
115  p->pref_bandwidth = pref_value;
116  break;
118  p->pref_delay = pref_value;
119  break;
120  default:
121  break;
122  }
123 
125  set_pref_task, p);
126 
127 }
128 
129 
144 struct PreferenceGenerator *
146  struct BenchmarkPartner *dest,
147  enum GeneratorType type,
148  unsigned int base_value,
149  unsigned int value_rate,
150  struct GNUNET_TIME_Relative period,
153 {
154  struct PreferenceGenerator *pg;
155 
156  if (NULL != dest->pg)
157  {
158  GNUNET_break (0);
159  return NULL;
160  }
161 
162  pg = GNUNET_new (struct PreferenceGenerator);
163  GNUNET_CONTAINER_DLL_insert (pg_head, pg_tail, pg);
164  pg->type = type;
165  pg->src = src;
166  pg->dest = dest;
167  pg->kind = kind;
168  pg->base_value = base_value;
169  pg->max_value = value_rate;
170  pg->duration_period = period;
171  pg->frequency = frequency;
173 
174  switch (type) {
177  "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),
179  dest->dest->no, GNUNET_i2s (&dest->dest->id),
180  base_value);
181  break;
184  "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),
186  dest->dest->no, GNUNET_i2s (&dest->dest->id),
187  base_value, value_rate);
188  break;
191  "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),
193  dest->dest->no, GNUNET_i2s (&dest->dest->id),
194  base_value, value_rate);
195  break;
198  "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),
200  dest->dest->no, GNUNET_i2s (&dest->dest->id),
201  base_value, value_rate);
202  break;
203  default:
204  break;
205  }
206 
207  dest->pg = pg;
209  return pg;
210 }
211 
212 
213 void
215 {
216  GNUNET_CONTAINER_DLL_remove (pg_head, pg_tail, pg);
217  pg->dest->pg = NULL;
218 
219  if (NULL != pg->set_task)
220  {
222  pg->set_task = NULL;
223  }
224 
225  GNUNET_free (pg);
226 }
227 
228 
232 void
234 {
235  struct PreferenceGenerator *cur;
236  struct PreferenceGenerator *next;
237  next = pg_head;
238  for (cur = next; NULL != cur; cur = next)
239  {
240  next = cur->next;
242  }
243 }
244 
245 /* 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:1246
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:1273
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:373
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:965