GNUnet  0.10.x
Data Structures | Macros | Functions
plugin_ats_proportional.c File Reference

ATS proportional solver. More...

#include "platform.h"
#include "gnunet_statistics_service.h"
#include "gnunet_ats_service.h"
#include "gnunet_ats_plugin.h"
#include "gnunet-service-ats_addresses.h"
Include dependency graph for plugin_ats_proportional.c:

Go to the source code of this file.

Data Structures

struct  AddressWrapper
 Address information stored for the proportional solver in the solver_information member of struct GNUNET_ATS_Address. More...
 
struct  Network
 Representation of a network (to be expanded...) More...
 
struct  GAS_PROPORTIONAL_Handle
 A handle for the proportional solver. More...
 
struct  FindBestAddressCtx
 Context for finding the best address* Linked list of addresses in this network: head. More...
 

Macros

#define LOG(kind, ...)   GNUNET_log_from (kind, "ats-proportional",__VA_ARGS__)
 
#define PROP_STABILITY_FACTOR   1.25
 How much do we value stability over adaptation by default. More...
 
#define PROPORTIONALITY_FACTOR   2.0
 Default value to assume for the proportionality factor, if none is given in the configuration. More...
 

Functions

static int is_bandwidth_available_in_network (struct Network *net, int extra)
 Test if bandwidth is available in this network to add an additional address. More...
 
static int all_require_connectivity (struct GAS_PROPORTIONAL_Handle *s, struct Network *net, unsigned int con)
 Test if all peers in this network require connectivity at level at least con. More...
 
static void distribute_bandwidth (struct GAS_PROPORTIONAL_Handle *s, struct Network *net)
 Update bandwidth assigned to peers in this network. More...
 
static void propagate_bandwidth (struct GAS_PROPORTIONAL_Handle *s, struct Network *net)
 Notify ATS service of bandwidth changes to addresses. More...
 
static void distribute_bandwidth_in_network (struct GAS_PROPORTIONAL_Handle *s, struct Network *n)
 Distribute bandwidth. More...
 
static int find_best_address_it (void *cls, const struct GNUNET_PeerIdentity *key, void *value)
 Find a "good" address to use for a peer by iterating over the addresses for this peer. More...
 
struct ATS_Addressget_best_address (struct GAS_PROPORTIONAL_Handle *s, struct GNUNET_CONTAINER_MultiPeerMap *addresses, const struct GNUNET_PeerIdentity *id)
 Find the currently best address for a peer from the set of addresses available or return NULL of no address is available. More...
 
static void address_decrement_active (struct GAS_PROPORTIONAL_Handle *s, struct Network *net)
 Decrease number of active addresses in network. More...
 
static int get_active_address_it (void *cls, const struct GNUNET_PeerIdentity *key, void *value)
 Address map iterator to find current active address for peer. More...
 
static struct ATS_Addressget_active_address (struct GAS_PROPORTIONAL_Handle *s, const struct GNUNET_PeerIdentity *peer)
 Find current active address for peer. More...
 
static void update_active_address (struct GAS_PROPORTIONAL_Handle *s, struct ATS_Address *current_address, const struct GNUNET_PeerIdentity *peer)
 Update active address for a peer. More...
 
static void GAS_proportional_change_preference (void *solver, const struct GNUNET_PeerIdentity *peer, enum GNUNET_ATS_PreferenceKind kind, double pref_rel)
 The preferences for a peer in the problem changed. More...
 
static void GAS_proportional_feedback (void *solver, struct GNUNET_SERVICE_Client *application, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_TIME_Relative scope, enum GNUNET_ATS_PreferenceKind kind, double score)
 Get application feedback for a peer. More...
 
static void GAS_proportional_start_get_address (void *solver, const struct GNUNET_PeerIdentity *peer)
 Get the preferred address for a specific peer. More...
 
static void GAS_proportional_stop_get_address (void *solver, const struct GNUNET_PeerIdentity *peer)
 Stop notifying about address and bandwidth changes for this peer. More...
 
static void GAS_proportional_bulk_start (void *solver)
 Start a bulk operation. More...
 
static void GAS_proportional_bulk_stop (void *solver)
 Bulk operation done. More...
 
static void GAS_proportional_address_property_changed (void *solver, struct ATS_Address *address)
 Transport properties for this address have changed. More...
 
static void GAS_proportional_address_add (void *solver, struct ATS_Address *address, uint32_t network)
 Add a new single address to a network. More...
 
static void GAS_proportional_address_delete (void *solver, struct ATS_Address *address)
 Remove an address from the solver. More...
 
void * libgnunet_plugin_ats_proportional_init (void *cls)
 Function invoked when the plugin is loaded. More...
 
void * libgnunet_plugin_ats_proportional_done (void *cls)
 Function used to unload the plugin. More...
 

Detailed Description

ATS proportional solver.

Author
Matthias Wachs
Christian Grothoff

Definition in file plugin_ats_proportional.c.

Macro Definition Documentation

◆ LOG

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

◆ PROP_STABILITY_FACTOR

#define PROP_STABILITY_FACTOR   1.25

How much do we value stability over adaptation by default.

A low value (close to 1.0) means we adapt as soon as possible, a larger value means that we have to have the respective factor of an advantage (or delay) before we adapt and sacrifice stability.

Definition at line 40 of file plugin_ats_proportional.c.

Referenced by libgnunet_plugin_ats_proportional_init().

◆ PROPORTIONALITY_FACTOR

#define PROPORTIONALITY_FACTOR   2.0

Default value to assume for the proportionality factor, if none is given in the configuration.

This factor determines how strong the bandwidth allocation will orient itself on the application preferences. A lower factor means a more balanced bandwidth distribution while a larger number means a distribution more in line with application (bandwidth) preferences.

Definition at line 51 of file plugin_ats_proportional.c.

Referenced by libgnunet_plugin_ats_proportional_init().

Function Documentation

◆ is_bandwidth_available_in_network()

static int is_bandwidth_available_in_network ( struct Network net,
int  extra 
)
static

Test if bandwidth is available in this network to add an additional address.

Parameters
netthe network type to check
extrafor how many extra addresses do we check?
Returns
GNUNET_YES or GNUNET_NO

Definition at line 212 of file plugin_ats_proportional.c.

References Network::active_addresses, GNUNET_assert, GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT, GNUNET_NO, GNUNET_YES, Network::total_quota_in, and Network::total_quota_out.

Referenced by find_best_address_it(), and update_active_address().

214 {
215  unsigned int na;
216  uint32_t min_bw = ntohl (GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT.value__);
217 
218  GNUNET_assert (((int)net->active_addresses) + extra >= 0);
219  na = net->active_addresses + extra;
220  if (0 == na)
221  return GNUNET_YES;
222  if ( ((net->total_quota_in / na) > min_bw) &&
223  ((net->total_quota_out / na) > min_bw) )
224  return GNUNET_YES;
225  return GNUNET_NO;
226 }
unsigned long long total_quota_out
Total outbound quota.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT
Bandwidth (in/out) to assume initially (before either peer has communicated any particular preference...
#define GNUNET_NO
Definition: gnunet_common.h:81
unsigned long long total_quota_in
Total inbound quota.
#define GNUNET_YES
Definition: gnunet_common.h:80
unsigned int active_addresses
Number of active addresses for this network.
Here is the caller graph for this function:

◆ all_require_connectivity()

static int all_require_connectivity ( struct GAS_PROPORTIONAL_Handle s,
struct Network net,
unsigned int  con 
)
static

Test if all peers in this network require connectivity at level at least con.

Parameters
sthe solver handle
netthe network type to check
conconnection return value threshold to check
Returns
GNUNET_YES or GNUNET_NO

Definition at line 239 of file plugin_ats_proportional.c.

References AddressWrapper::addr, GNUNET_ATS_PluginEnvironment::cls, GAS_PROPORTIONAL_Handle::env, GNUNET_ATS_PluginEnvironment::get_connectivity, GNUNET_NO, GNUNET_YES, Network::head, AddressWrapper::next, and ATS_Address::peer.

Referenced by find_best_address_it().

242 {
243  struct AddressWrapper *aw;
244 
245  for (aw = net->head; NULL != aw; aw = aw->next)
246  if (con >
247  s->env->get_connectivity (s->env->cls,
248  &aw->addr->peer))
249  return GNUNET_NO;
250  return GNUNET_YES;
251 }
struct AddressWrapper * next
Next in DLL.
struct GNUNET_PeerIdentity peer
Peer ID this address is for.
Address information stored for the proportional solver in the solver_information member of struct GNU...
#define GNUNET_NO
Definition: gnunet_common.h:81
struct GNUNET_ATS_PluginEnvironment * env
Our execution environment.
struct AddressWrapper * head
Linked list of addresses in this network: head.
void * cls
Closure to pass to all callbacks in this struct.
struct ATS_Address * addr
The address.
#define GNUNET_YES
Definition: gnunet_common.h:80
GAS_get_connectivity get_connectivity
ATS addresses function to obtain preference values.
Here is the caller graph for this function:

◆ distribute_bandwidth()

static void distribute_bandwidth ( struct GAS_PROPORTIONAL_Handle s,
struct Network net 
)
static

Update bandwidth assigned to peers in this network.

The basic idea is to assign every peer in the network the minimum bandwidth, and then distribute the remaining bandwidth proportional to application preferences.

Parameters
sthe solver handle
netthe network type to update

Definition at line 264 of file plugin_ats_proportional.c.

References ATS_Address::active, Network::active_addresses, AddressWrapper::addr, AddressWrapper::calculated_quota_in, AddressWrapper::calculated_quota_out, GNUNET_ATS_PluginEnvironment::cls, count_addresses(), Network::desc, GAS_PROPORTIONAL_Handle::env, GNUNET_ATS_PluginEnvironment::get_preferences, GNUNET_ATS_PREFERENCE_BANDWIDTH, GNUNET_break, GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_INFO, GNUNET_ERROR_TYPE_WARNING, GNUNET_i2s(), GNUNET_YES, Network::head, LOG, AddressWrapper::next, ATS_Address::peer, GAS_PROPORTIONAL_Handle::prop_factor, Network::total_quota_in, and Network::total_quota_out.

Referenced by distribute_bandwidth_in_network().

266 {
267  const uint32_t min_bw = ntohl (GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT.value__);
268  struct AddressWrapper *aw;
269  unsigned long long remaining_quota_in;
270  unsigned long long quota_out_used;
271  unsigned long long remaining_quota_out;
272  unsigned long long quota_in_used;
273  unsigned int count_addresses;
274  double sum_relative_peer_prefences;
275  double peer_weight;
276  double total_weight;
277  const double *peer_relative_prefs;
278 
280  "Recalculate quota for network type `%s' for %u addresses (in/out): %llu/%llu \n",
281  net->desc,
282  net->active_addresses,
283  net->total_quota_in,
284  net->total_quota_in);
285 
286  if (0 == net->active_addresses)
287  return; /* no addresses to update */
288 
289  /* sanity checks */
290  if ((net->active_addresses * min_bw) > net->total_quota_in)
291  {
292  GNUNET_break(0);
293  return;
294  }
295  if ((net->active_addresses * min_bw) > net->total_quota_out)
296  {
297  GNUNET_break(0);
298  return;
299  }
300 
301  /* Calculate sum of relative preference for active addresses in this
302  network */
303  sum_relative_peer_prefences = 0.0;
304  count_addresses = 0;
305  for (aw = net->head; NULL != aw; aw = aw->next)
306  {
307  if (GNUNET_YES != aw->addr->active)
308  continue;
309  peer_relative_prefs = s->env->get_preferences (s->env->cls,
310  &aw->addr->peer);
311  sum_relative_peer_prefences
312  += peer_relative_prefs[GNUNET_ATS_PREFERENCE_BANDWIDTH];
313  count_addresses++;
314  }
315  if (count_addresses != net->active_addresses)
316  {
317  GNUNET_break (0);
319  "%s: Counted %u active addresses, expected %u active addresses\n",
320  net->desc,
321  count_addresses,
322  net->active_addresses);
323  /* try to fix... */
325  }
327  "Total relative preference %.3f for %u addresses in network %s\n",
328  sum_relative_peer_prefences,
329  net->active_addresses,
330  net->desc);
331 
332  /* check how much we have to distribute */
333  remaining_quota_in = net->total_quota_in - (net->active_addresses * min_bw);
334  remaining_quota_out = net->total_quota_out - (net->active_addresses * min_bw);
336  "Proportionally distributable bandwidth (in/out): %llu/%llu\n",
337  remaining_quota_in,
338  remaining_quota_out);
339 
340  /* distribute remaining quota; we do not do it exactly proportional,
341  but balance "even" distribution ("net->active_addresses") with
342  the preference sum using the "prop_factor". */
343  total_weight = net->active_addresses +
344  s->prop_factor * sum_relative_peer_prefences;
345  quota_out_used = 0;
346  quota_in_used = 0;
347  for (aw = net->head; NULL != aw; aw = aw->next)
348  {
349  if (GNUNET_YES != aw->addr->active)
350  {
351  /* set to 0, just to be sure */
352  aw->calculated_quota_in = 0;
353  aw->calculated_quota_out = 0;
354  continue;
355  }
356  peer_relative_prefs = s->env->get_preferences (s->env->cls,
357  &aw->addr->peer);
358  peer_weight = 1.0
359  + s->prop_factor * peer_relative_prefs[GNUNET_ATS_PREFERENCE_BANDWIDTH];
360 
361  aw->calculated_quota_in = min_bw
362  + (peer_weight / total_weight) * remaining_quota_in;
363  aw->calculated_quota_out = min_bw
364  + (peer_weight / total_weight) * remaining_quota_out;
365 
367  "New quotas for peer `%s' with weight (cur/total) %.3f/%.3f (in/out) are: %u/%u\n",
368  GNUNET_i2s (&aw->addr->peer),
369  peer_weight,
370  total_weight,
371  (unsigned int) aw->calculated_quota_in,
372  (unsigned int) aw->calculated_quota_out);
373  quota_in_used += aw->calculated_quota_in;
374  quota_out_used += aw->calculated_quota_out;
375  }
377  "Total bandwidth assigned is (in/out): %llu /%llu\n",
378  quota_in_used,
379  quota_out_used);
380  /* +1 due to possible rounding errors */
381  GNUNET_break (quota_out_used <= net->total_quota_out + 1);
382  GNUNET_break (quota_in_used <= net->total_quota_in + 1);
383 }
static int count_addresses(void *cls, const struct GNUNET_HELLO_Address *address, struct GNUNET_TIME_Absolute expiration)
Address iterator that counts the remaining addresses.
struct AddressWrapper * next
Next in DLL.
unsigned long long total_quota_out
Total outbound quota.
uint32_t calculated_quota_out
Outbound quota.
int active
Is this the active address for this peer?
GAS_get_preferences get_preferences
ATS addresses function to obtain preference values.
struct GNUNET_PeerIdentity peer
Peer ID this address is for.
Address information stored for the proportional solver in the solver_information member of struct GNU...
const char * desc
Network description.
#define GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT
Bandwidth (in/out) to assume initially (before either peer has communicated any particular preference...
double prop_factor
Proportionality factor.
#define LOG(kind,...)
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
struct GNUNET_ATS_PluginEnvironment * env
Our execution environment.
struct AddressWrapper * head
Linked list of addresses in this network: head.
uint32_t calculated_quota_in
Inbound quota.
unsigned long long total_quota_in
Total inbound quota.
Change the peer&#39;s bandwidth value (value per byte of bandwidth in the goal function) to the given amo...
void * cls
Closure to pass to all callbacks in this struct.
struct ATS_Address * addr
The address.
#define GNUNET_YES
Definition: gnunet_common.h:80
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
unsigned int active_addresses
Number of active addresses for this network.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ propagate_bandwidth()

static void propagate_bandwidth ( struct GAS_PROPORTIONAL_Handle s,
struct Network net 
)
static

Notify ATS service of bandwidth changes to addresses.

Parameters
ssolver handle
netthe network to propagate changes in

Definition at line 393 of file plugin_ats_proportional.c.

References ATS_Address::active, AddressWrapper::addr, ATS_Address::assigned_bw_in, ATS_Address::assigned_bw_out, GNUNET_ATS_PluginEnvironment::bandwidth_changed_cb, AddressWrapper::calculated_quota_in, AddressWrapper::calculated_quota_out, GNUNET_ATS_PluginEnvironment::cls, GAS_PROPORTIONAL_Handle::env, GNUNET_YES, Network::head, and AddressWrapper::next.

Referenced by distribute_bandwidth_in_network().

395 {
396  struct AddressWrapper *cur;
397 
398  for (cur = net->head; NULL != cur; cur = cur->next)
399  {
400  if ( (cur->addr->assigned_bw_in == cur->calculated_quota_in) &&
401  (cur->addr->assigned_bw_out == cur->calculated_quota_out) )
402  continue;
405  if (GNUNET_YES == cur->addr->active)
406  s->env->bandwidth_changed_cb (s->env->cls,
407  cur->addr);
408  }
409 }
struct AddressWrapper * next
Next in DLL.
uint32_t calculated_quota_out
Outbound quota.
int active
Is this the active address for this peer?
Address information stored for the proportional solver in the solver_information member of struct GNU...
uint32_t assigned_bw_in
Inbound bandwidth assigned by solver.
struct GNUNET_ATS_PluginEnvironment * env
Our execution environment.
struct AddressWrapper * head
Linked list of addresses in this network: head.
uint32_t calculated_quota_in
Inbound quota.
uint32_t assigned_bw_out
Outbound bandwidth assigned by solver.
void * cls
Closure to pass to all callbacks in this struct.
struct ATS_Address * addr
The address.
#define GNUNET_YES
Definition: gnunet_common.h:80
GAS_bandwidth_changed_cb bandwidth_changed_cb
ATS addresses callback to be notified about bandwidth assignment changes.
Here is the caller graph for this function:

◆ distribute_bandwidth_in_network()

static void distribute_bandwidth_in_network ( struct GAS_PROPORTIONAL_Handle s,
struct Network n 
)
static

Distribute bandwidth.

The addresses have already been selected, this is merely distributed the bandwidth among the addresses.

Parameters
sthe solver handle
nthe network, can be NULL for all networks

Definition at line 420 of file plugin_ats_proportional.c.

References Network::active_addresses, GAS_PROPORTIONAL_Handle::bulk_lock, GAS_PROPORTIONAL_Handle::bulk_requests, GNUNET_ATS_PluginEnvironment::cls, distribute_bandwidth(), GAS_PROPORTIONAL_Handle::env, GAS_INFO_PROP_ALL, GAS_INFO_PROP_SINGLE, GAS_OP_SOLVE_START, GAS_OP_SOLVE_STOP, GAS_OP_SOLVE_UPDATE_NOTIFICATION_START, GAS_OP_SOLVE_UPDATE_NOTIFICATION_STOP, GAS_STAT_SUCCESS, GNUNET_ERROR_TYPE_DEBUG, GNUNET_NT_to_string(), GNUNET_ATS_PluginEnvironment::info_cb, LOG, GNUNET_ATS_PluginEnvironment::network_count, GAS_PROPORTIONAL_Handle::network_entries, propagate_bandwidth(), Network::total_addresses, and Network::type.

Referenced by GAS_proportional_address_delete(), GAS_proportional_address_property_changed(), GAS_proportional_bulk_stop(), GAS_proportional_change_preference(), GAS_proportional_stop_get_address(), and update_active_address().

422 {
423  unsigned int i;
424 
425  if (0 != s->bulk_lock)
426  {
427  s->bulk_requests++;
428  return;
429  }
430  if (NULL != n)
431  {
433  "Redistributing bandwidth in network %s with %u active and %u total addresses\n",
435  n->active_addresses,
436  n->total_addresses);
437  s->env->info_cb (s->env->cls,
442  n);
443  s->env->info_cb (s->env->cls,
447  s->env->info_cb (s->env->cls,
452  n);
453 
454  s->env->info_cb (s->env->cls,
458  }
459  else
460  {
462  "Redistributing bandwidth in all %u networks\n",
463  s->env->network_count);
464  s->env->info_cb (s->env->cls,
468  for (i = 0; i < s->env->network_count; i++)
470  &s->network_entries[i]);
471  s->env->info_cb (s->env->cls,
475  s->env->info_cb (s->env->cls,
479  for (i = 0; i < s->env->network_count; i++)
481  &s->network_entries[i]);
482  s->env->info_cb (s->env->cls,
486  }
487 }
unsigned int total_addresses
Number of total addresses for this network.
After the problem was finished, start notifications about changes to addresses.
The proportional solver had to recalculate for a single network.
const char * GNUNET_NT_to_string(enum GNUNET_NetworkType net)
Convert a enum GNUNET_NetworkType to a string.
Definition: nt.c:43
The proportional solver had to recalculate for all networks.
#define LOG(kind,...)
A solution iteration has been started.
static void propagate_bandwidth(struct GAS_PROPORTIONAL_Handle *s, struct Network *net)
Notify ATS service of bandwidth changes to addresses.
struct GNUNET_ATS_PluginEnvironment * env
Our execution environment.
unsigned int bulk_requests
Number of changes made while solver was locked.
enum GNUNET_NetworkType type
ATS network type.
static void distribute_bandwidth(struct GAS_PROPORTIONAL_Handle *s, struct Network *net)
Update bandwidth assigned to peers in this network.
struct Network * network_entries
Networks array.
A solution iteration has been finished.
GAS_solver_information_callback info_cb
Callback for solver to call with status information, can be NULL.
void * cls
Closure to pass to all callbacks in this struct.
unsigned int bulk_lock
Bulk lock counter.
After the problem was finished, notifications about changes to addresses are done.
unsigned int active_addresses
Number of active addresses for this network.
unsigned int network_count
Number of networks available, size of the out_quota and in_quota arrays.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ find_best_address_it()

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

Find a "good" address to use for a peer by iterating over the addresses for this peer.

If we already have an existing address, we stick to it. Otherwise, we pick by lowest distance and then by lowest latency.

Parameters
clsthe `struct FindBestAddressCtx *' where we store the result
keythe peer we are trying to find the best address for
valueanother struct ATS_Address* to consider using
Returns
GNUNET_OK (continue to iterate)

Definition at line 519 of file plugin_ats_proportional.c.

References AddressWrapper::activated, ATS_Address::active, all_require_connectivity(), FindBestAddressCtx::best, GNUNET_ATS_PluginEnvironment::cls, ctx, GAS_PROPORTIONAL_Handle::env, GNUNET_ATS_PluginEnvironment::get_connectivity, GNUNET_NO, GNUNET_OK, GNUNET_TIME_absolute_get_duration(), GNUNET_TIME_UNIT_SECONDS, GNUNET_YES, is_bandwidth_available_in_network(), AddressWrapper::network, GAS_NormalizationInfo::norm, ATS_Address::norm_delay, ATS_Address::norm_distance, GNUNET_TIME_Relative::rel_value_us, FindBestAddressCtx::s, ATS_Address::solver_information, GAS_PROPORTIONAL_Handle::stability_factor, and value.

Referenced by get_best_address().

522 {
523  struct FindBestAddressCtx *ctx = cls;
524  struct ATS_Address *current = value;
525  struct AddressWrapper *asi = current->solver_information;
526  struct GNUNET_TIME_Relative active_time;
527  double best_delay;
528  double best_distance;
529  double cur_delay;
530  double cur_distance;
531  unsigned int con;
532  int bw_available;
533  int need;
534 
535  /* we need +1 slot if 'current' is not yet active */
536  need = (GNUNET_YES == current->active) ? 0 : 1;
537  /* we save -1 slot if 'best' is active and belongs
538  to the same network (as we would replace it) */
539  if ( (NULL != ctx->best) &&
540  (GNUNET_YES == ctx->best->active) &&
541  (((struct AddressWrapper *) ctx->best->solver_information)->network ==
542  asi->network) )
543  need--;
544  /* we can gain -1 slot if this peers connectivity
545  requirement is higher than that of another peer
546  in that network scope */
547  con = ctx->s->env->get_connectivity (ctx->s->env->cls,
548  key);
549  if (GNUNET_YES !=
551  asi->network,
552  con))
553  need--;
554  /* test if minimum bandwidth for 'current' would be available */
555  bw_available
557  need);
558  if (! bw_available)
559  {
560  /* Bandwidth for this address is unavailable, so we cannot use
561  it. */
562  return GNUNET_OK;
563  }
564  if (GNUNET_YES == current->active)
565  {
566  active_time = GNUNET_TIME_absolute_get_duration (asi->activated);
567  if (active_time.rel_value_us <=
568  ((double) GNUNET_TIME_UNIT_SECONDS.rel_value_us) * ctx->s->stability_factor)
569  {
570  /* Keep active address for stability reasons */
571  ctx->best = current;
572  return GNUNET_NO;
573  }
574  }
575  if (NULL == ctx->best)
576  {
577  /* We so far have nothing else, so go with it! */
578  ctx->best = current;
579  return GNUNET_OK;
580  }
581 
582  /* Now compare ATS information */
583  cur_distance = current->norm_distance.norm;
584  best_distance = ctx->best->norm_distance.norm;
585  cur_delay = current->norm_delay.norm;
586  best_delay = ctx->best->norm_delay.norm;
587 
588  /* user shorter distance */
589  if (cur_distance < best_distance)
590  {
591  if (GNUNET_NO == ctx->best->active)
592  {
593  /* Activity doesn't influence the equation, use current */
594  ctx->best = current;
595  }
596  else if ((best_distance / cur_distance) > ctx->s->stability_factor)
597  {
598  /* Distance change is significant, switch active address! */
599  ctx->best = current;
600  }
601  }
602 
603  /* User connection with less delay */
604  if (cur_delay < best_delay)
605  {
606  if (GNUNET_NO == ctx->best->active)
607  {
608  /* Activity doesn't influence the equation, use current */
609  ctx->best = current;
610  }
611  else if ((best_delay / cur_delay) > ctx->s->stability_factor)
612  {
613  /* Latency change is significant, switch active address! */
614  ctx->best = current;
615  }
616  }
617  return GNUNET_OK;
618 }
struct ATS_Address * best
The currently best address.
struct GNUNET_TIME_Absolute activated
When was this address activated.
int active
Is this the active address for this peer?
Address information stored for the proportional solver in the solver_information member of struct GNU...
#define GNUNET_TIME_UNIT_SECONDS
One second.
#define GNUNET_NO
Definition: gnunet_common.h:81
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
struct GAS_PROPORTIONAL_Handle * s
The solver handle.
struct Network * network
Network scope this address is in.
static struct GNUNET_DNSSTUB_Context * ctx
Context for DNS resolution.
static char * value
Value of the record to add/remove.
struct GNUNET_ATS_PluginEnvironment * env
Our execution environment.
static int all_require_connectivity(struct GAS_PROPORTIONAL_Handle *s, struct Network *net, unsigned int con)
Test if all peers in this network require connectivity at level at least con.
Address with additional information.
void * solver_information
Solver-specific information for this address.
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
static int is_bandwidth_available_in_network(struct Network *net, int extra)
Test if bandwidth is available in this network to add an additional address.
Context for finding the best address* Linked list of addresses in this network: head.
struct GAS_NormalizationInfo norm_delay
Normalized delay information for this address.
void * cls
Closure to pass to all callbacks in this struct.
#define GNUNET_YES
Definition: gnunet_common.h:80
double norm
Normalized values from queue to a range of values [1.0...2.0].
double stability_factor
Stability factor.
struct GAS_NormalizationInfo norm_distance
Normalized distance information for this address.
GAS_get_connectivity get_connectivity
ATS addresses function to obtain preference values.
Time for relative time used by GNUnet, in microseconds.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_best_address()

struct ATS_Address* get_best_address ( struct GAS_PROPORTIONAL_Handle s,
struct GNUNET_CONTAINER_MultiPeerMap addresses,
const struct GNUNET_PeerIdentity id 
)

Find the currently best address for a peer from the set of addresses available or return NULL of no address is available.

Parameters
sthe proportional handle
addressesthe address hashmap
idthe peer id
Returns
the address or NULL

Definition at line 631 of file plugin_ats_proportional.c.

References FindBestAddressCtx::best, find_best_address_it(), GNUNET_CONTAINER_multipeermap_get_multiple(), and FindBestAddressCtx::s.

Referenced by update_active_address().

634 {
635  struct FindBestAddressCtx fba_ctx;
636 
637  fba_ctx.best = NULL;
638  fba_ctx.s = s;
640  id,
642  &fba_ctx);
643  return fba_ctx.best;
644 }
struct ATS_Address * best
The currently best address.
struct GAS_PROPORTIONAL_Handle * s
The solver handle.
static int find_best_address_it(void *cls, const struct GNUNET_PeerIdentity *key, void *value)
Find a "good" address to use for a peer by iterating over the addresses for this peer.
Context for finding the best address* Linked list of addresses in this network: head.
int GNUNET_CONTAINER_multipeermap_get_multiple(struct GNUNET_CONTAINER_MultiPeerMap *map, const struct GNUNET_PeerIdentity *key, GNUNET_CONTAINER_PeerMapIterator it, void *it_cls)
Iterate over all entries in the map that match a particular key.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ address_decrement_active()

static void address_decrement_active ( struct GAS_PROPORTIONAL_Handle s,
struct Network net 
)
static

Decrease number of active addresses in network.

Parameters
sthe solver handle
netthe network type

Definition at line 654 of file plugin_ats_proportional.c.

References Network::active_addresses, GAS_PROPORTIONAL_Handle::active_addresses, GAS_PROPORTIONAL_Handle::env, GNUNET_assert, GNUNET_NO, GNUNET_STATISTICS_update(), Network::stat_active, and GNUNET_ATS_PluginEnvironment::stats.

Referenced by update_active_address().

656 {
657  GNUNET_assert (net->active_addresses > 0);
658  net->active_addresses--;
660  net->stat_active,
661  -1,
662  GNUNET_NO);
664  s->active_addresses--;
666  "# ATS addresses total",
667  -1,
668  GNUNET_NO);
669 }
struct GNUNET_STATISTICS_Handle * stats
Statistics handle to be used by the solver.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_NO
Definition: gnunet_common.h:81
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
char * stat_active
String for statistics active addresses.
struct GNUNET_ATS_PluginEnvironment * env
Our execution environment.
unsigned int active_addresses
Number of active addresses for solver.
unsigned int active_addresses
Number of active addresses for this network.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_active_address_it()

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

Address map iterator to find current active address for peer.

Asserts that only one address is active per peer.

Parameters
clslast active address
keypeer's key
valueaddress to check
Returns
GNUNET_NO on double active address else GNUNET_YES;

Definition at line 682 of file plugin_ats_proportional.c.

References ATS_Address::active, GNUNET_assert, GNUNET_OK, GNUNET_YES, and value.

Referenced by get_active_address().

685 {
686  struct ATS_Address **dest = cls;
687  struct ATS_Address *aa = value;
688 
689  if (GNUNET_YES != aa->active)
690  return GNUNET_OK;
691  GNUNET_assert (NULL == (*dest));
692  (*dest) = aa;
693  return GNUNET_OK;
694 }
int active
Is this the active address for this peer?
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
static char * value
Value of the record to add/remove.
Address with additional information.
#define GNUNET_YES
Definition: gnunet_common.h:80
Here is the caller graph for this function:

◆ get_active_address()

static struct ATS_Address* get_active_address ( struct GAS_PROPORTIONAL_Handle s,
const struct GNUNET_PeerIdentity peer 
)
static

Find current active address for peer.

Parameters
sthe solver handle
peerthe peer
Returns
active address or NULL

Definition at line 705 of file plugin_ats_proportional.c.

References GNUNET_ATS_PluginEnvironment::addresses, GAS_PROPORTIONAL_Handle::env, get_active_address_it(), and GNUNET_CONTAINER_multipeermap_get_multiple().

Referenced by GAS_proportional_address_add(), GAS_proportional_start_get_address(), and GAS_proportional_stop_get_address().

707 {
708  struct ATS_Address *dest;
709 
710  dest = NULL;
712  peer,
714  &dest);
715  return dest;
716 }
struct GNUNET_ATS_PluginEnvironment * env
Our execution environment.
static int get_active_address_it(void *cls, const struct GNUNET_PeerIdentity *key, void *value)
Address map iterator to find current active address for peer.
Address with additional information.
struct GNUNET_CONTAINER_MultiPeerMap * addresses
Hashmap containing all addresses available.
int GNUNET_CONTAINER_multipeermap_get_multiple(struct GNUNET_CONTAINER_MultiPeerMap *map, const struct GNUNET_PeerIdentity *key, GNUNET_CONTAINER_PeerMapIterator it, void *it_cls)
Iterate over all entries in the map that match a particular key.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ update_active_address()

static void update_active_address ( struct GAS_PROPORTIONAL_Handle s,
struct ATS_Address current_address,
const struct GNUNET_PeerIdentity peer 
)
static

Update active address for a peer.

Check if active address exists and what the best address is, if addresses are different switch. Then reallocate bandwidth within the affected network scopes.

Parameters
ssolver handle
current_addressthe address currently active for the peer, NULL for none
peerthe peer to check

Definition at line 730 of file plugin_ats_proportional.c.

References AddressWrapper::activated, ATS_Address::active, Network::active_addresses, GAS_PROPORTIONAL_Handle::active_addresses, AddressWrapper::addr, address_decrement_active(), GNUNET_ATS_PluginEnvironment::addresses, ATS_Address::assigned_bw_in, ATS_Address::assigned_bw_out, GNUNET_ATS_PluginEnvironment::bandwidth_changed_cb, GNUNET_ATS_PluginEnvironment::cls, distribute_bandwidth_in_network(), GAS_PROPORTIONAL_Handle::env, get_best_address(), GNUNET_ATS_PluginEnvironment::get_connectivity, GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_INFO, GNUNET_i2s(), GNUNET_NO, GNUNET_STATISTICS_update(), GNUNET_TIME_absolute_get(), GNUNET_TIME_UNIT_ZERO_ABS, GNUNET_YES, Network::head, is_bandwidth_available_in_network(), LOG, AddressWrapper::network, AddressWrapper::next, ATS_Address::peer, ATS_Address::solver_information, Network::stat_active, and GNUNET_ATS_PluginEnvironment::stats.

Referenced by GAS_proportional_address_add(), GAS_proportional_address_delete(), and GAS_proportional_start_get_address().

733 {
734  struct ATS_Address *best_address;
735  struct AddressWrapper *asi_cur;
736  struct AddressWrapper *asi_best;
737  struct AddressWrapper *aw;
738  struct AddressWrapper *aw_min;
739  unsigned int a_con;
740  unsigned int con_min;
741 
742  best_address = get_best_address (s,
743  s->env->addresses,
744  peer);
745  if (NULL != best_address)
746  asi_best = best_address->solver_information;
747  else
748  asi_best = NULL;
749  if (current_address == best_address)
750  return; /* no changes */
751  if (NULL != current_address)
752  {
753  /* We switch to a new address (or to none);
754  mark old address as inactive. */
755  asi_cur = current_address->solver_information;
756  GNUNET_assert (GNUNET_YES == current_address->active);
758  "Disabling previous active address for peer `%s'\n",
759  GNUNET_i2s (peer));
761  current_address->active = GNUNET_NO;
762  current_address->assigned_bw_in = 0;
763  current_address->assigned_bw_out = 0;
765  asi_cur->network);
766  if ( (NULL == best_address) ||
767  (asi_best->network != asi_cur->network) )
769  asi_cur->network);
770  if (NULL == best_address)
771  {
772  /* We previously had an active address, but now we cannot
773  * suggest one. Therefore we have to disconnect the peer.
774  * The above call to "distribute_bandwidth_in_network()
775  * does not see 'current_address' so we need to trigger
776  * the update here. */
778  "Disconnecting peer `%s'.\n",
779  GNUNET_i2s (peer));
780  s->env->bandwidth_changed_cb (s->env->cls,
781  current_address);
782  return;
783  }
784  }
785  if (NULL == best_address)
786  {
787  /* We do not have a new address, so we are done. */
789  "Cannot suggest address for peer `%s'\n",
790  GNUNET_i2s (peer));
791  return;
792  }
793  /* We do have a new address, activate it */
795  "Selecting new address %p for peer `%s'\n",
796  best_address,
797  GNUNET_i2s (peer));
798  /* Mark address as active */
799  best_address->active = GNUNET_YES;
800  asi_best->activated = GNUNET_TIME_absolute_get ();
801  asi_best->network->active_addresses++;
802  s->active_addresses++;
804  "# ATS active addresses total",
805  1,
806  GNUNET_NO);
808  asi_best->network->stat_active,
809  1,
810  GNUNET_NO);
812  "Address %p for peer `%s' is now active\n",
813  best_address,
814  GNUNET_i2s (peer));
815 
816  if (GNUNET_NO ==
818  0))
819  {
820  /* we went over the maximum number of addresses for
821  this scope; remove the address with the smallest
822  connectivity requirement */
823  con_min = UINT32_MAX;
824  aw_min = NULL;
825  for (aw = asi_best->network->head; NULL != aw; aw = aw->next)
826  {
827  if ( (con_min >
828  (a_con = s->env->get_connectivity (s->env->cls,
829  &aw->addr->peer))) &&
830  (GNUNET_YES == aw->addr->active) )
831  {
832  aw_min = aw;
833  con_min = a_con;
834  if (0 == con_min)
835  break;
836  }
837  }
839  aw_min->addr,
840  &aw_min->addr->peer);
841  }
843  asi_best->network);
844 }
struct GNUNET_TIME_Absolute activated
When was this address activated.
#define GNUNET_TIME_UNIT_ZERO_ABS
Absolute time zero.
struct AddressWrapper * next
Next in DLL.
struct GNUNET_STATISTICS_Handle * stats
Statistics handle to be used by the solver.
int active
Is this the active address for this peer?
struct GNUNET_PeerIdentity peer
Peer ID this address is for.
Address information stored for the proportional solver in the solver_information member of struct GNU...
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
static void address_decrement_active(struct GAS_PROPORTIONAL_Handle *s, struct Network *net)
Decrease number of active addresses in network.
#define GNUNET_NO
Definition: gnunet_common.h:81
#define LOG(kind,...)
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
struct Network * network
Network scope this address is in.
char * stat_active
String for statistics active addresses.
static void update_active_address(struct GAS_PROPORTIONAL_Handle *s, struct ATS_Address *current_address, const struct GNUNET_PeerIdentity *peer)
Update active address for a peer.
uint32_t assigned_bw_in
Inbound bandwidth assigned by solver.
struct GNUNET_ATS_PluginEnvironment * env
Our execution environment.
static void distribute_bandwidth_in_network(struct GAS_PROPORTIONAL_Handle *s, struct Network *n)
Distribute bandwidth.
struct AddressWrapper * head
Linked list of addresses in this network: head.
struct ATS_Address * get_best_address(struct GAS_PROPORTIONAL_Handle *s, struct GNUNET_CONTAINER_MultiPeerMap *addresses, const struct GNUNET_PeerIdentity *id)
Find the currently best address for a peer from the set of addresses available or return NULL of no a...
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition: time.c:118
Address with additional information.
void * solver_information
Solver-specific information for this address.
unsigned int active_addresses
Number of active addresses for solver.
uint32_t assigned_bw_out
Outbound bandwidth assigned by solver.
static int is_bandwidth_available_in_network(struct Network *net, int extra)
Test if bandwidth is available in this network to add an additional address.
void * cls
Closure to pass to all callbacks in this struct.
struct ATS_Address * addr
The address.
#define GNUNET_YES
Definition: gnunet_common.h:80
struct GNUNET_CONTAINER_MultiPeerMap * addresses
Hashmap containing all addresses available.
GAS_bandwidth_changed_cb bandwidth_changed_cb
ATS addresses callback to be notified about bandwidth assignment changes.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
unsigned int active_addresses
Number of active addresses for this network.
GAS_get_connectivity get_connectivity
ATS addresses function to obtain preference values.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GAS_proportional_change_preference()

static void GAS_proportional_change_preference ( void *  solver,
const struct GNUNET_PeerIdentity peer,
enum GNUNET_ATS_PreferenceKind  kind,
double  pref_rel 
)
static

The preferences for a peer in the problem changed.

Parameters
solverthe solver handle
peerthe peer to change the preference for
kindthe kind to change the preference
pref_relthe normalized preference value for this kind over all clients

Definition at line 856 of file plugin_ats_proportional.c.

References distribute_bandwidth_in_network(), and GNUNET_ATS_PREFERENCE_BANDWIDTH.

Referenced by libgnunet_plugin_ats_proportional_init().

860 {
861  struct GAS_PROPORTIONAL_Handle *s = solver;
862 
864  return; /* we do not care */
866  NULL);
867 }
A handle for the proportional solver.
static void distribute_bandwidth_in_network(struct GAS_PROPORTIONAL_Handle *s, struct Network *n)
Distribute bandwidth.
Change the peer&#39;s bandwidth value (value per byte of bandwidth in the goal function) to the given amo...
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GAS_proportional_feedback()

static void GAS_proportional_feedback ( void *  solver,
struct GNUNET_SERVICE_Client application,
const struct GNUNET_PeerIdentity peer,
const struct GNUNET_TIME_Relative  scope,
enum GNUNET_ATS_PreferenceKind  kind,
double  score 
)
static

Get application feedback for a peer.

Parameters
solverthe solver handle
applicationthe application
peerthe peer to change the preference for
scopethe time interval for this feedback: [now - scope .. now]
kindthe kind to change the preference
scorethe score

Definition at line 881 of file plugin_ats_proportional.c.

Referenced by libgnunet_plugin_ats_proportional_init().

887 {
888  /* Proportional does not care about feedback */
889 }
Here is the caller graph for this function:

◆ GAS_proportional_start_get_address()

static void GAS_proportional_start_get_address ( void *  solver,
const struct GNUNET_PeerIdentity peer 
)
static

Get the preferred address for a specific peer.

Parameters
solverthe solver handle
peerthe identity of the peer

Definition at line 899 of file plugin_ats_proportional.c.

References get_active_address(), and update_active_address().

Referenced by libgnunet_plugin_ats_proportional_init().

901 {
902  struct GAS_PROPORTIONAL_Handle *s = solver;
903 
906  peer),
907  peer);
908 }
A handle for the proportional solver.
static void update_active_address(struct GAS_PROPORTIONAL_Handle *s, struct ATS_Address *current_address, const struct GNUNET_PeerIdentity *peer)
Update active address for a peer.
static struct ATS_Address * get_active_address(struct GAS_PROPORTIONAL_Handle *s, const struct GNUNET_PeerIdentity *peer)
Find current active address for peer.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GAS_proportional_stop_get_address()

static void GAS_proportional_stop_get_address ( void *  solver,
const struct GNUNET_PeerIdentity peer 
)
static

Stop notifying about address and bandwidth changes for this peer.

Parameters
solverthe solver handle
peerthe peer

Definition at line 918 of file plugin_ats_proportional.c.

References distribute_bandwidth_in_network(), get_active_address(), AddressWrapper::network, and ATS_Address::solver_information.

Referenced by libgnunet_plugin_ats_proportional_init().

920 {
921  struct GAS_PROPORTIONAL_Handle *s = solver;
922  struct ATS_Address *cur;
923  struct AddressWrapper *asi;
924 
925  cur = get_active_address (s,
926  peer);
927  if (NULL == cur)
928  return;
929  asi = cur->solver_information;
931  asi->network);
932 }
A handle for the proportional solver.
Address information stored for the proportional solver in the solver_information member of struct GNU...
struct Network * network
Network scope this address is in.
static void distribute_bandwidth_in_network(struct GAS_PROPORTIONAL_Handle *s, struct Network *n)
Distribute bandwidth.
Address with additional information.
void * solver_information
Solver-specific information for this address.
static struct ATS_Address * get_active_address(struct GAS_PROPORTIONAL_Handle *s, const struct GNUNET_PeerIdentity *peer)
Find current active address for peer.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GAS_proportional_bulk_start()

static void GAS_proportional_bulk_start ( void *  solver)
static

Start a bulk operation.

Parameters
solverthe solver

Definition at line 941 of file plugin_ats_proportional.c.

References GAS_PROPORTIONAL_Handle::bulk_lock, GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, and LOG.

Referenced by libgnunet_plugin_ats_proportional_init().

942 {
943  struct GAS_PROPORTIONAL_Handle *s = solver;
944 
946  "Locking solver for bulk operation ...\n");
947  GNUNET_assert (NULL != solver);
948  s->bulk_lock++;
949 }
A handle for the proportional solver.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define LOG(kind,...)
unsigned int bulk_lock
Bulk lock counter.
Here is the caller graph for this function:

◆ GAS_proportional_bulk_stop()

static void GAS_proportional_bulk_stop ( void *  solver)
static

Bulk operation done.

Parameters
solverour struct GAS_PROPORTIONAL_Handle *

Definition at line 958 of file plugin_ats_proportional.c.

References GAS_PROPORTIONAL_Handle::bulk_lock, GAS_PROPORTIONAL_Handle::bulk_requests, distribute_bandwidth_in_network(), GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_INFO, and LOG.

Referenced by libgnunet_plugin_ats_proportional_init().

959 {
960  struct GAS_PROPORTIONAL_Handle *s = solver;
961 
963  "Unlocking solver from bulk operation ...\n");
964  if (s->bulk_lock < 1)
965  {
966  GNUNET_break(0);
967  return;
968  }
969  s->bulk_lock--;
970  if ( (0 == s->bulk_lock) &&
971  (0 < s->bulk_requests) )
972  {
974  "No lock pending, recalculating\n");
976  NULL);
977  s->bulk_requests = 0;
978  }
979 }
A handle for the proportional solver.
#define LOG(kind,...)
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
static void distribute_bandwidth_in_network(struct GAS_PROPORTIONAL_Handle *s, struct Network *n)
Distribute bandwidth.
unsigned int bulk_requests
Number of changes made while solver was locked.
unsigned int bulk_lock
Bulk lock counter.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GAS_proportional_address_property_changed()

static void GAS_proportional_address_property_changed ( void *  solver,
struct ATS_Address address 
)
static

Transport properties for this address have changed.

Parameters
solversolver handle
addressthe address

Definition at line 989 of file plugin_ats_proportional.c.

References distribute_bandwidth_in_network(), AddressWrapper::network, and ATS_Address::solver_information.

Referenced by libgnunet_plugin_ats_proportional_init().

991 {
992  struct GAS_PROPORTIONAL_Handle *s = solver;
993  struct AddressWrapper *asi = address->solver_information;
994 
996  asi->network);
997 }
A handle for the proportional solver.
Address information stored for the proportional solver in the solver_information member of struct GNU...
struct Network * network
Network scope this address is in.
static void distribute_bandwidth_in_network(struct GAS_PROPORTIONAL_Handle *s, struct Network *n)
Distribute bandwidth.
void * solver_information
Solver-specific information for this address.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GAS_proportional_address_add()

static void GAS_proportional_address_add ( void *  solver,
struct ATS_Address address,
uint32_t  network 
)
static

Add a new single address to a network.

Parameters
solverthe solver Handle
addressthe address to add
networknetwork type of this address

Definition at line 1008 of file plugin_ats_proportional.c.

References Network::active_addresses, AddressWrapper::addr, address, Network::desc, env, GAS_PROPORTIONAL_Handle::env, get_active_address(), GNUNET_assert, GNUNET_CONTAINER_DLL_insert, GNUNET_ERROR_TYPE_INFO, GNUNET_i2s(), GNUNET_new, GNUNET_NO, GNUNET_STATISTICS_update(), Network::head, LOG, AddressWrapper::network, GAS_PROPORTIONAL_Handle::network_entries, ATS_Address::peer, ATS_Address::solver_information, Network::stat_total, GNUNET_ATS_PluginEnvironment::stats, Network::tail, Network::total_addresses, and update_active_address().

Referenced by libgnunet_plugin_ats_proportional_init().

1011 {
1012  struct GAS_PROPORTIONAL_Handle *s = solver;
1013  struct Network *net;
1014  struct AddressWrapper *aw;
1015 
1016  GNUNET_assert (network < s->env->network_count);
1017  net = &s->network_entries[network];
1018  net->total_addresses++;
1019 
1020  aw = GNUNET_new (struct AddressWrapper);
1021  aw->addr = address;
1022  aw->network = net;
1023  address->solver_information = aw;
1025  net->tail,
1026  aw);
1028  "# ATS addresses total",
1029  1,
1030  GNUNET_NO);
1032  net->stat_total,
1033  1,
1034  GNUNET_NO);
1036  get_active_address (s,
1037  &address->peer),
1038  &address->peer);
1040  "Added new address for `%s', now total %u and active %u addresses in network `%s'\n",
1041  GNUNET_i2s (&address->peer),
1042  net->total_addresses,
1043  net->active_addresses,
1044  net->desc);
1045 }
unsigned int total_addresses
Number of total addresses for this network.
A handle for the proportional solver.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
struct GNUNET_STATISTICS_Handle * stats
Statistics handle to be used by the solver.
struct GNUNET_PeerIdentity peer
Peer ID this address is for.
Address information stored for the proportional solver in the solver_information member of struct GNU...
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
const char * desc
Network description.
#define GNUNET_NO
Definition: gnunet_common.h:81
#define LOG(kind,...)
#define GNUNET_new(type)
Allocate a struct or union of the given type.
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
struct Network * network
Network scope this address is in.
static void update_active_address(struct GAS_PROPORTIONAL_Handle *s, struct ATS_Address *current_address, const struct GNUNET_PeerIdentity *peer)
Update active address for a peer.
struct GNUNET_ATS_PluginEnvironment * env
Our execution environment.
Representation of a network (to be expanded...)
struct AddressWrapper * head
Linked list of addresses in this network: head.
char * stat_total
String for statistics total addresses.
void * solver_information
Solver-specific information for this address.
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
struct Network * network_entries
Networks array.
static struct ATS_Address * get_active_address(struct GAS_PROPORTIONAL_Handle *s, const struct GNUNET_PeerIdentity *peer)
Find current active address for peer.
struct ATS_Address * addr
The address.
struct AddressWrapper * tail
Linked list of addresses in this network: tail.
static char * address
GNS address for this phone.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
unsigned int active_addresses
Number of active addresses for this network.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GAS_proportional_address_delete()

static void GAS_proportional_address_delete ( void *  solver,
struct ATS_Address address 
)
static

Remove an address from the solver.

To do so, we:

  • Removed it from specific network
  • Decrease the number of total addresses
  • If active:
    • decrease number of active addreses
    • update quotas
Parameters
solverthe solver handle
addressthe address to remove

Definition at line 1060 of file plugin_ats_proportional.c.

References ATS_Address::active, Network::active_addresses, Network::desc, distribute_bandwidth_in_network(), GAS_PROPORTIONAL_Handle::env, GNUNET_assert, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_i2s(), GNUNET_NO, GNUNET_STATISTICS_update(), GNUNET_YES, Network::head, LOG, AddressWrapper::network, ATS_Address::peer, ATS_Address::solver_information, Network::stat_total, GNUNET_ATS_PluginEnvironment::stats, Network::tail, Network::total_addresses, and update_active_address().

Referenced by libgnunet_plugin_ats_proportional_init().

1062 {
1063  struct GAS_PROPORTIONAL_Handle *s = solver;
1064  struct AddressWrapper *aw = address->solver_information;
1065  struct Network *net = aw->network;
1066 
1068  "Deleting %s address for peer `%s' from network `%s' (total: %u/active: %u)\n",
1069  (GNUNET_NO == address->active) ? "inactive" : "active",
1070  GNUNET_i2s (&address->peer),
1071  net->desc,
1072  net->total_addresses,
1073  net->active_addresses);
1074 
1076  net->tail,
1077  aw);
1078  GNUNET_assert (net->total_addresses > 0);
1079  net->total_addresses--;
1081  net->stat_total,
1082  -1,
1083  GNUNET_NO);
1084  if (GNUNET_YES == address->active)
1085  {
1086  /* Address was active, remove from network and update quotas */
1088  address,
1089  &address->peer);
1091  }
1092  GNUNET_free (aw);
1093  address->solver_information = NULL;
1095  "After deleting address now total %u and active %u addresses in network `%s'\n",
1096  net->total_addresses,
1097  net->active_addresses,
1098  net->desc);
1099 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
unsigned int total_addresses
Number of total addresses for this network.
A handle for the proportional solver.
struct GNUNET_STATISTICS_Handle * stats
Statistics handle to be used by the solver.
int active
Is this the active address for this peer?
struct GNUNET_PeerIdentity peer
Peer ID this address is for.
Address information stored for the proportional solver in the solver_information member of struct GNU...
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
const char * desc
Network description.
#define GNUNET_NO
Definition: gnunet_common.h:81
#define LOG(kind,...)
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
struct Network * network
Network scope this address is in.
static void update_active_address(struct GAS_PROPORTIONAL_Handle *s, struct ATS_Address *current_address, const struct GNUNET_PeerIdentity *peer)
Update active address for a peer.
struct GNUNET_ATS_PluginEnvironment * env
Our execution environment.
static void distribute_bandwidth_in_network(struct GAS_PROPORTIONAL_Handle *s, struct Network *n)
Distribute bandwidth.
Representation of a network (to be expanded...)
struct AddressWrapper * head
Linked list of addresses in this network: head.
char * stat_total
String for statistics total addresses.
void * solver_information
Solver-specific information for this address.
#define GNUNET_YES
Definition: gnunet_common.h:80
struct AddressWrapper * tail
Linked list of addresses in this network: tail.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
unsigned int active_addresses
Number of active addresses for this network.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ libgnunet_plugin_ats_proportional_init()

void* libgnunet_plugin_ats_proportional_init ( void *  cls)

Function invoked when the plugin is loaded.

Parameters
[in,out]clsthe struct GNUNET_ATS_PluginEnvironment * to use; modified to return the API functions (ugh).
Returns
the struct GAS_PROPORTIONAL_Handle to pass as a closure

Definition at line 1110 of file plugin_ats_proportional.c.

References _, GNUNET_ATS_PluginEnvironment::cfg, GNUNET_ATS_SolverFunctions::cls, GNUNET_ATS_PluginEnvironment::cls, Network::desc, env, GAS_PROPORTIONAL_Handle::env, GAS_proportional_address_add(), GAS_proportional_address_delete(), GAS_proportional_address_property_changed(), GAS_proportional_bulk_start(), GAS_proportional_bulk_stop(), GAS_proportional_change_preference(), GAS_proportional_feedback(), GAS_proportional_start_get_address(), GAS_proportional_stop_get_address(), GNUNET_asprintf(), GNUNET_CONFIGURATION_get_value_float(), GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_INFO, GNUNET_malloc, GNUNET_new, GNUNET_NT_to_string(), GNUNET_SYSERR, GNUNET_ATS_PluginEnvironment::in_quota, LOG, GNUNET_ATS_PluginEnvironment::network_count, GAS_PROPORTIONAL_Handle::network_entries, GNUNET_ATS_PluginEnvironment::out_quota, GAS_PROPORTIONAL_Handle::prop_factor, PROP_STABILITY_FACTOR, PROPORTIONALITY_FACTOR, GNUNET_ATS_SolverFunctions::s_add, GNUNET_ATS_SolverFunctions::s_address_update_property, GNUNET_ATS_SolverFunctions::s_bulk_start, GNUNET_ATS_SolverFunctions::s_bulk_stop, GNUNET_ATS_SolverFunctions::s_del, GNUNET_ATS_SolverFunctions::s_feedback, GNUNET_ATS_SolverFunctions::s_get, GNUNET_ATS_SolverFunctions::s_get_stop, GNUNET_ATS_SolverFunctions::s_pref, sf, GAS_PROPORTIONAL_Handle::stability_factor, Network::stat_active, Network::stat_total, Network::total_quota_in, Network::total_quota_out, and Network::type.

1111 {
1112  static struct GNUNET_ATS_SolverFunctions sf;
1114  struct GAS_PROPORTIONAL_Handle *s;
1115  struct Network * cur;
1116  float f_tmp;
1117  unsigned int c;
1118 
1119  s = GNUNET_new (struct GAS_PROPORTIONAL_Handle);
1120  s->env = env;
1121  sf.cls = s;
1132  if (GNUNET_SYSERR !=
1134  "ats",
1135  "PROP_STABILITY_FACTOR",
1136  &f_tmp))
1137  {
1138  if ((f_tmp < 1.0) || (f_tmp > 2.0))
1139  {
1141  _("Invalid %s configuration %f \n"),
1142  "PROP_STABILITY_FACTOR",
1143  f_tmp);
1144  }
1145  else
1146  {
1147  s->stability_factor = f_tmp;
1149  "Using %s of %.3f\n",
1150  "PROP_STABILITY_FACTOR",
1151  f_tmp);
1152  }
1153  }
1155  if (GNUNET_SYSERR !=
1157  "ats",
1158  "PROP_PROPORTIONALITY_FACTOR",
1159  &f_tmp))
1160  {
1161  if (f_tmp < 1.0)
1162  {
1164  _("Invalid %s configuration %f\n"),
1165  "PROP_PROPORTIONALITY_FACTOR",
1166  f_tmp);
1167  }
1168  else
1169  {
1170  s->prop_factor = f_tmp;
1172  "Using %s of %.3f\n",
1173  "PROP_PROPORTIONALITY_FACTOR",
1174  f_tmp);
1175  }
1176  }
1177 
1179  sizeof (struct Network));
1180  for (c = 0; c < env->network_count; c++)
1181  {
1182  cur = &s->network_entries[c];
1183  cur->type = c;
1184  cur->total_quota_in = env->in_quota[c];
1185  cur->total_quota_out = env->out_quota[c];
1186  cur->desc = GNUNET_NT_to_string (c);
1187  GNUNET_asprintf (&cur->stat_total,
1188  "# ATS addresses %s total",
1189  cur->desc);
1191  "# ATS active addresses %s total",
1192  cur->desc);
1194  "Added network %u `%s' (%llu/%llu)\n",
1195  c,
1196  cur->desc,
1197  cur->total_quota_in,
1198  cur->total_quota_out);
1199  }
1200  return &sf;
1201 }
GAS_solver_stop_get_preferred_address s_get_stop
Tell solver stop notifying ATS about changes for this peers.
A handle for the proportional solver.
GAS_solver_address_add s_add
Add a new address for a peer to the solver.
const char * GNUNET_NT_to_string(enum GNUNET_NetworkType net)
Convert a enum GNUNET_NetworkType to a string.
Definition: nt.c:43
unsigned long long total_quota_out
Total outbound quota.
static void GAS_proportional_feedback(void *solver, struct GNUNET_SERVICE_Client *application, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_TIME_Relative scope, enum GNUNET_ATS_PreferenceKind kind, double score)
Get application feedback for a peer.
#define PROPORTIONALITY_FACTOR
Default value to assume for the proportionality factor, if none is given in the configuration.
const char * desc
Network description.
static void GAS_proportional_start_get_address(void *solver, const struct GNUNET_PeerIdentity *peer)
Get the preferred address for a specific peer.
GAS_solver_address_feedback_preference s_feedback
Give feedback about the current assignment.
int GNUNET_CONFIGURATION_get_value_float(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, float *number)
Get a configuration value that should be a floating point number.
static void GAS_proportional_change_preference(void *solver, const struct GNUNET_PeerIdentity *peer, enum GNUNET_ATS_PreferenceKind kind, double pref_rel)
The preferences for a peer in the problem changed.
GAS_solver_address_property_changed s_address_update_property
Update the properties of an address in the solver.
double prop_factor
Proportionality factor.
#define PROP_STABILITY_FACTOR
How much do we value stability over adaptation by default.
#define LOG(kind,...)
#define GNUNET_new(type)
Allocate a struct or union of the given type.
char * stat_active
String for statistics active addresses.
#define _(String)
GNU gettext support macro.
Definition: platform.h:208
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
struct GNUNET_ATS_PluginEnvironment * env
Our execution environment.
GAS_solver_address_delete s_del
Delete an address in the solver.
Representation of a network (to be expanded...)
GAS_solver_address_change_preference s_pref
Change relative preference for quality in solver.
static void GAS_proportional_address_delete(void *solver, struct ATS_Address *address)
Remove an address from the solver.
static void GAS_proportional_address_property_changed(void *solver, struct ATS_Address *address)
Transport properties for this address have changed.
char * stat_total
String for statistics total addresses.
enum GNUNET_NetworkType type
ATS network type.
unsigned long long total_quota_in
Total inbound quota.
#define GNUNET_SYSERR
Definition: gnunet_common.h:79
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
void * cls
Closure to pass to all solver functions in this struct.
struct Network * network_entries
Networks array.
GAS_solver_get_preferred_address s_get
Tell solver to notify ATS if the address to use changes for a specific peer using the bandwidth chang...
unsigned long long in_quota[6]
Array of configured inbound quotas Order according to networks in network array.
GAS_solver_bulk_start s_bulk_start
Start a bulk operation.
static void GAS_proportional_bulk_start(void *solver)
Start a bulk operation.
static void GAS_proportional_bulk_stop(void *solver)
Bulk operation done.
static void GAS_proportional_address_add(void *solver, struct ATS_Address *address, uint32_t network)
Add a new single address to a network.
static void GAS_proportional_stop_get_address(void *solver, const struct GNUNET_PeerIdentity *peer)
Stop notifying about address and bandwidth changes for this peer.
const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration handle to be used by the solver.
unsigned long long out_quota[6]
Array of configured outbound quotas Order according to networks in network array. ...
void * cls
Closure to pass to all callbacks in this struct.
static struct GNUNET_ATS_SolverFunctions * sf
Solver handle.
The ATS plugin will pass a pointer to a struct of this type as to the initialization function of the ...
GAS_solver_bulk_stop s_bulk_stop
Bulk operation done.
unsigned int network_count
Number of networks available, size of the out_quota and in_quota arrays.
double stability_factor
Stability factor.
#define GNUNET_malloc(size)
Wrapper around malloc.
Here is the call graph for this function:

◆ libgnunet_plugin_ats_proportional_done()

void* libgnunet_plugin_ats_proportional_done ( void *  cls)

Function used to unload the plugin.

Parameters
clsreturn value from libgnunet_plugin_ats_proportional_init()

Definition at line 1210 of file plugin_ats_proportional.c.

References Network::active_addresses, GAS_PROPORTIONAL_Handle::active_addresses, AddressWrapper::addr, GNUNET_ATS_SolverFunctions::cls, GAS_PROPORTIONAL_Handle::env, GNUNET_break, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_free_non_null, Network::head, GNUNET_ATS_PluginEnvironment::network_count, GAS_PROPORTIONAL_Handle::network_entries, AddressWrapper::next, sf, ATS_Address::solver_information, Network::stat_active, Network::stat_total, Network::tail, and Network::total_addresses.

1211 {
1212  struct GNUNET_ATS_SolverFunctions *sf = cls;
1213  struct GAS_PROPORTIONAL_Handle *s = sf->cls;
1214  struct AddressWrapper *cur;
1215  struct AddressWrapper *next;
1216  unsigned int c;
1217 
1218  for (c = 0; c < s->env->network_count; c++)
1219  {
1222  next = s->network_entries[c].head;
1223  while (NULL != (cur = next))
1224  {
1225  next = cur->next;
1227  s->network_entries[c].tail,
1228  cur);
1230  GNUNET_free(cur);
1231  }
1234  }
1235  GNUNET_break (0 == s->active_addresses);
1237  GNUNET_free (s);
1238  return NULL;
1239 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
unsigned int total_addresses
Number of total addresses for this network.
A handle for the proportional solver.
struct AddressWrapper * next
Next in DLL.
Address information stored for the proportional solver in the solver_information member of struct GNU...
#define GNUNET_free_non_null(ptr)
Free the memory pointed to by ptr if ptr is not NULL.
char * stat_active
String for statistics active addresses.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
struct GNUNET_ATS_PluginEnvironment * env
Our execution environment.
struct AddressWrapper * head
Linked list of addresses in this network: head.
char * stat_total
String for statistics total addresses.
void * solver_information
Solver-specific information for this address.
void * cls
Closure to pass to all solver functions in this struct.
unsigned int active_addresses
Number of active addresses for solver.
struct Network * network_entries
Networks array.
struct ATS_Address * addr
The address.
struct AddressWrapper * tail
Linked list of addresses in this network: tail.
static struct GNUNET_ATS_SolverFunctions * sf
Solver handle.
unsigned int active_addresses
Number of active addresses for this network.
unsigned int network_count
Number of networks available, size of the out_quota and in_quota arrays.
#define GNUNET_free(ptr)
Wrapper around free.