GNUnet  0.11.x
Data Structures | Macros | Functions | Variables
gnunet-service-ats_normalization.c File Reference

ats service address: management of ATS properties and preferences normalization More...

#include "platform.h"
#include <float.h>
#include "gnunet_ats_service.h"
#include "gnunet-service-ats_addresses.h"
#include "gnunet-service-ats_normalization.h"
#include "gnunet-service-ats_plugins.h"
Include dependency graph for gnunet-service-ats_normalization.c:

Go to the source code of this file.

Data Structures

struct  PropertyRange
 Range information for normalization of quality properties. More...
 

Macros

#define LOG(kind, ...)   GNUNET_log_from (kind, "ats-normalization", __VA_ARGS__)
 

Functions

static void update_avg (uint64_t current_val, struct GAS_NormalizationInfo *ni)
 Add the value from atsi to the running average of the given ni quality property. More...
 
static int find_min_max_it (void *cls, const struct GNUNET_PeerIdentity *h, void *k)
 Function called for all addresses and peers to find the minimum and maximum (averaged) values for a given quality property. More...
 
static void update_norm (uint64_t min, uint64_t max, struct GAS_NormalizationInfo *ni)
 Compute the normalized value from the given ni range data and the average value. More...
 
static int normalize_address (void *cls, const struct GNUNET_PeerIdentity *key, void *value)
 Normalize the property value for a given address based on the range we know that property values have globally. More...
 
static int notify_change (void *cls, const struct GNUNET_PeerIdentity *key, void *value)
 Notify about change in normalized property. More...
 
static void init_range (struct PropertyRange *pr)
 Initialize property range to the values corresponding to an empty set. More...
 
void GAS_normalization_update_property (struct ATS_Address *address)
 Update and normalize atsi performance information. More...
 
void GAS_normalization_start ()
 Start the normalization component. More...
 
void GAS_normalization_stop ()
 Stop the normalization component and free all items. More...
 

Variables

static struct PropertyRange property_range
 Range information for all quality properties we see. More...
 

Detailed Description

ats service address: management of ATS properties and preferences normalization

Author
Matthias Wachs
Christian Grothoff

Definition in file gnunet-service-ats_normalization.c.

Macro Definition Documentation

◆ LOG

#define LOG (   kind,
  ... 
)    GNUNET_log_from (kind, "ats-normalization", __VA_ARGS__)

Definition at line 34 of file gnunet-service-ats_normalization.c.

Function Documentation

◆ update_avg()

static void update_avg ( uint64_t  current_val,
struct GAS_NormalizationInfo ni 
)
static

Add the value from atsi to the running average of the given ni quality property.

Parameters
current_valthe updated value
ninormalization information to update

Definition at line 68 of file gnunet-service-ats_normalization.c.

70 {
71  double sum;
72  uint32_t count;
73  unsigned int c1;
74 
75  ni->atsi_abs[ni->avg_queue_index++] = current_val;
77  ni->avg_queue_index = 0;
78  count = 0;
79  sum = 0.0;
80  for (c1 = 0; c1 < GAS_normalization_queue_length; c1++)
81  {
82  if (UINT64_MAX != ni->atsi_abs[c1])
83  {
84  count++;
85  sum += (double) ni->atsi_abs[c1];
86  }
87  }
88  if (0 == count)
89  ni->avg = current_val; /* must be UINT64_MAX */
90  else
91  ni->avg = sum / count;
92 }
#define GAS_normalization_queue_length
uint64_t atsi_abs[3]
Averaging queue.
unsigned int avg_queue_index
Next index to use in averaging queue.
uint64_t avg
Averaged ATSI values from queue.

References GAS_NormalizationInfo::atsi_abs, GAS_NormalizationInfo::avg, GAS_NormalizationInfo::avg_queue_index, GAS_normalization_queue_length, and consensus-simulation::sum.

Referenced by GAS_normalization_update_property().

Here is the caller graph for this function:

◆ find_min_max_it()

static int find_min_max_it ( void *  cls,
const struct GNUNET_PeerIdentity h,
void *  k 
)
static

Function called for all addresses and peers to find the minimum and maximum (averaged) values for a given quality property.

Given those, we can then calculate the normalized score.

Parameters
clsthe struct PropertyRange
hwhich peer are we looking at (ignored)
kthe address for that peer
Returns
GNUNET_OK (continue to iterate)

Definition at line 106 of file gnunet-service-ats_normalization.c.

109 {
110  struct PropertyRange *pr = cls;
111  const struct ATS_Address *a = k;
112 
117  pr->max.distance = GNUNET_MAX (pr->max.distance,
118  a->properties.distance);
120  a->properties.delay);
125  pr->min.distance = GNUNET_MIN (pr->min.distance,
126  a->properties.distance);
128  a->properties.delay);
129  return GNUNET_OK;
130 }
#define GNUNET_MAX(a, b)
@ GNUNET_OK
Definition: gnunet_common.h:95
#define GNUNET_MIN(a, b)
struct GNUNET_TIME_Relative GNUNET_TIME_relative_min(struct GNUNET_TIME_Relative t1, struct GNUNET_TIME_Relative t2)
Return the minimum of two relative time values.
Definition: time.c:200
struct GNUNET_TIME_Relative GNUNET_TIME_relative_max(struct GNUNET_TIME_Relative t1, struct GNUNET_TIME_Relative t2)
Return the maximum of two relative time values.
Definition: time.c:208
Address with additional information.
struct GNUNET_ATS_Properties properties
ATS performance information for this address.
uint32_t utilization_in
Actual traffic on this connection from the other peer to this peer.
unsigned int distance
Distance on network layer (required for distance-vector routing) in hops.
struct GNUNET_TIME_Relative delay
Delay.
uint32_t utilization_out
Actual traffic on this connection from this peer to the other peer.
Range information for normalization of quality properties.
struct GNUNET_ATS_Properties min
Minimum value we see for this property across all addresses.
struct GNUNET_ATS_Properties max
Maximum value we see for this property across all addresses.

References GNUNET_ATS_Properties::delay, GNUNET_ATS_Properties::distance, GNUNET_MAX, GNUNET_MIN, GNUNET_OK, GNUNET_TIME_relative_max(), GNUNET_TIME_relative_min(), PropertyRange::max, PropertyRange::min, ATS_Address::properties, GNUNET_ATS_Properties::utilization_in, and GNUNET_ATS_Properties::utilization_out.

Referenced by GAS_normalization_update_property().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ update_norm()

static void update_norm ( uint64_t  min,
uint64_t  max,
struct GAS_NormalizationInfo ni 
)
static

Compute the normalized value from the given ni range data and the average value.

Parameters
minminimum value
maxmaximum value
ninormalization information to update

Definition at line 142 of file gnunet-service-ats_normalization.c.

145 {
146  /* max - 2 * min + avg_value / (max - min) */
147  if (min < max)
148  ni->norm = DEFAULT_REL_QUALITY + (ni->avg - min) / (double) (max - min);
149  else
151 }
#define DEFAULT_REL_QUALITY
Value we return for a normalized quality score if we have no data.
#define min(x, y)
#define max(x, y)
double norm
Normalized values from queue to a range of values [1.0...2.0].

References GAS_NormalizationInfo::avg, DEFAULT_REL_QUALITY, max, min, and GAS_NormalizationInfo::norm.

Referenced by normalize_address().

Here is the caller graph for this function:

◆ normalize_address()

static int normalize_address ( void *  cls,
const struct GNUNET_PeerIdentity key,
void *  value 
)
static

Normalize the property value for a given address based on the range we know that property values have globally.

Parameters
clsNULL
keywhich peer are we looking at (ignored)
valuethe address for that peer, from where we get the original value and where we write the normalized value
Returns
GNUNET_OK (continue to iterate)

Definition at line 166 of file gnunet-service-ats_normalization.c.

169 {
170  struct ATS_Address *address = value;
171 
174  &address->norm_delay);
177  &address->norm_distance);
180  &address->norm_utilization_in);
183  &address->norm_utilization_out);
184  return GNUNET_OK;
185 }
static char * address
GNS address for this phone.
static char * value
Value of the record to add/remove.
static struct PropertyRange property_range
Range information for all quality properties we see.
static void update_norm(uint64_t min, uint64_t max, struct GAS_NormalizationInfo *ni)
Compute the normalized value from the given ni range data and the average value.
uint64_t rel_value_us
The actual value.

References address, GNUNET_ATS_Properties::delay, GNUNET_ATS_Properties::distance, GNUNET_OK, PropertyRange::max, PropertyRange::min, property_range, GNUNET_TIME_Relative::rel_value_us, update_norm(), GNUNET_ATS_Properties::utilization_in, GNUNET_ATS_Properties::utilization_out, and value.

Referenced by GAS_normalization_update_property().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ notify_change()

static int notify_change ( void *  cls,
const struct GNUNET_PeerIdentity key,
void *  value 
)
static

Notify about change in normalized property.

Parameters
clsNULL
keywhich peer are we looking at (ignored)
valuethe address for that peer
Returns
GNUNET_OK (continue to iterate)

Definition at line 197 of file gnunet-service-ats_normalization.c.

200 {
201  struct ATS_Address *address = value;
202 
204  return GNUNET_OK;
205 }
void GAS_plugin_notify_property_changed(struct ATS_Address *address)
The relative value for a property changed.

References address, GAS_plugin_notify_property_changed(), GNUNET_OK, and value.

Referenced by GAS_normalization_update_property().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ init_range()

static void init_range ( struct PropertyRange pr)
static

Initialize property range to the values corresponding to an empty set.

Parameters
prrange to initialize

Definition at line 215 of file gnunet-service-ats_normalization.c.

216 {
217  memset (pr, 0, sizeof(struct PropertyRange));
218  pr->min.utilization_out = UINT32_MAX;
219  pr->min.utilization_in = UINT32_MAX;
220  pr->min.distance = UINT32_MAX;
222 }
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".

References GNUNET_ATS_Properties::delay, GNUNET_ATS_Properties::distance, GNUNET_TIME_UNIT_FOREVER_REL, PropertyRange::min, GNUNET_ATS_Properties::utilization_in, and GNUNET_ATS_Properties::utilization_out.

Referenced by GAS_normalization_start(), and GAS_normalization_update_property().

Here is the caller graph for this function:

◆ GAS_normalization_update_property()

void GAS_normalization_update_property ( struct ATS_Address address)

Update and normalize atsi performance information.

Update and normalize a prop performance information.

Parameters
addressthe address to update

Definition at line 231 of file gnunet-service-ats_normalization.c.

232 {
233  const struct GNUNET_ATS_Properties *prop = &address->properties;
234  struct PropertyRange range;
235 
237  "Updating properties for peer `%s'\n",
238  GNUNET_i2s (&address->peer));
241  &address->norm_delay);
242  update_avg (prop->distance,
243  &address->norm_distance);
244  update_avg (prop->utilization_in,
245  &address->norm_utilization_in);
246  update_avg (prop->utilization_in,
247  &address->norm_utilization_out);
248 
249  init_range (&range);
252  &range);
253  if (0 != GNUNET_memcmp (&range,
254  &property_range))
255  {
256  /* limits changed, (re)normalize all addresses */
257  property_range = range;
260  NULL);
262  &notify_change,
263  NULL);
264  }
265  else
266  {
267  /* renormalize just this one address */
268  normalize_address (NULL,
269  &address->peer,
270  address);
271  notify_change (NULL,
272  &address->peer,
273  address);
274  }
276 }
struct GNUNET_CONTAINER_MultiPeerMap * GSA_addresses
A multihashmap to store all addresses.
static int find_min_max_it(void *cls, const struct GNUNET_PeerIdentity *h, void *k)
Function called for all addresses and peers to find the minimum and maximum (averaged) values for a g...
static int normalize_address(void *cls, const struct GNUNET_PeerIdentity *key, void *value)
Normalize the property value for a given address based on the range we know that property values have...
static void init_range(struct PropertyRange *pr)
Initialize property range to the values corresponding to an empty set.
static void update_avg(uint64_t current_val, struct GAS_NormalizationInfo *ni)
Add the value from atsi to the running average of the given ni quality property.
#define LOG(kind,...)
static int notify_change(void *cls, const struct GNUNET_PeerIdentity *key, void *value)
Notify about change in normalized property.
void GAS_plugin_solver_unlock()
Resume instant solving, we are done with the bulk state updates.
void GAS_plugin_solver_lock()
Stop instant solving, there are many state updates happening in bulk right now.
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
int GNUNET_CONTAINER_multipeermap_iterate(struct GNUNET_CONTAINER_MultiPeerMap *map, GNUNET_CONTAINER_PeerMapIterator it, void *it_cls)
Iterate over all entries in the map.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
@ GNUNET_ERROR_TYPE_DEBUG
ATS performance characteristics for an address.

References address, GNUNET_ATS_Properties::delay, GNUNET_ATS_Properties::distance, find_min_max_it(), GAS_plugin_solver_lock(), GAS_plugin_solver_unlock(), GNUNET_CONTAINER_multipeermap_iterate(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_memcmp, GSA_addresses, init_range(), LOG, normalize_address(), notify_change(), property_range, GNUNET_TIME_Relative::rel_value_us, update_avg(), and GNUNET_ATS_Properties::utilization_in.

Referenced by GAS_addresses_add(), GAS_addresses_update(), and set_prop_task().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GAS_normalization_start()

void GAS_normalization_start ( void  )

Start the normalization component.

Definition at line 283 of file gnunet-service-ats_normalization.c.

284 {
286 }

References init_range(), and property_range.

Referenced by GNUNET_ATS_solvers_solver_start(), and run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GAS_normalization_stop()

void GAS_normalization_stop ( void  )

Stop the normalization component and free all items.

Definition at line 293 of file gnunet-service-ats_normalization.c.

294 {
295  /* nothing to do */
296 }

Referenced by cleanup_task(), GNUNET_ATS_solvers_solver_stop(), and run().

Here is the caller graph for this function:

Variable Documentation

◆ property_range

struct PropertyRange property_range
static

Range information for all quality properties we see.

Definition at line 1 of file gnunet-service-ats_normalization.c.

Referenced by GAS_normalization_start(), GAS_normalization_update_property(), and normalize_address().