GNUnet  0.10.x
Data Structures | Macros | Functions | Variables
gnunet-service-transport_ats.c File Reference

interfacing between transport and ATS service More...

#include "platform.h"
#include "gnunet-service-transport.h"
#include "gnunet-service-transport_ats.h"
#include "gnunet-service-transport_manipulation.h"
#include "gnunet-service-transport_plugins.h"
#include "gnunet_ats_service.h"
Include dependency graph for gnunet-service-transport_ats.c:

Go to the source code of this file.

Data Structures

struct  AddressInfo
 Information we track for each address known to ATS. More...
 
struct  FindClosure
 Closure for find_ai_cb() and find_ai_no_session_cb(). More...
 

Macros

#define LOG(kind, ...)   GNUNET_log_from(kind, "transport-ats", __VA_ARGS__)
 Log convenience function. More...
 

Functions

static void publish_p2a_stat_update ()
 Provide an update on the p2a map size to statistics. More...
 
static int find_ai_cb (void *cls, const struct GNUNET_PeerIdentity *key, void *value)
 Find matching address info. More...
 
static struct AddressInfofind_ai (const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session)
 Find the address information struct for the given address and session. More...
 
static int find_ai_no_session_cb (void *cls, const struct GNUNET_PeerIdentity *key, void *value)
 Find matching address info, ignoring sessions and expired addresses. More...
 
static struct AddressInfofind_ai_no_session (const struct GNUNET_HELLO_Address *address)
 Find the address information struct for the given address (ignoring sessions) More...
 
int GST_ats_is_known (const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session)
 Test if ATS knows about this address and session. More...
 
int GST_ats_is_known_no_session (const struct GNUNET_HELLO_Address *address)
 Test if ATS knows about this address. More...
 
static void unblock_address (void *cls)
 The blocking time for an address has expired, allow ATS to suggest it again. More...
 
void GST_ats_block_address (const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session)
 Temporarily block a valid address for use by ATS for address suggestions. More...
 
void GST_ats_block_reset (const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session)
 Reset address blocking time. More...
 
void GST_ats_add_inbound_address (const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session, const struct GNUNET_ATS_Properties *prop)
 Notify ATS about a new inbound address. More...
 
void GST_ats_add_address (const struct GNUNET_HELLO_Address *address, const struct GNUNET_ATS_Properties *prop)
 Notify ATS about the new address including the network this address is located in. More...
 
void GST_ats_new_session (const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session)
 Notify ATS about a new session now existing for the given address. More...
 
static void destroy_ai (struct AddressInfo *ai)
 Release memory used by the given address data. More...
 
void GST_ats_del_session (const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session)
 Notify ATS that the session (but not the address) of a given address is no longer relevant. More...
 
void GST_ats_update_distance (const struct GNUNET_HELLO_Address *address, uint32_t distance)
 Notify ATS about DV distance change to an address. More...
 
void GST_ats_update_delay (const struct GNUNET_HELLO_Address *address, struct GNUNET_TIME_Relative delay)
 Notify ATS about delay changes to properties of an address. More...
 
void GST_ats_update_utilization (const struct GNUNET_HELLO_Address *address, uint32_t bps_in, uint32_t bps_out)
 Notify ATS about utilization changes to an address. More...
 
void GST_ats_expire_address (const struct GNUNET_HELLO_Address *address)
 Notify ATS that the address has expired and thus cannot be used any longer. More...
 
void GST_ats_init ()
 Initialize ATS subsystem. More...
 
static int destroy_ai_cb (void *cls, const struct GNUNET_PeerIdentity *key, void *value)
 Release memory used by the given address data. More...
 
void GST_ats_done ()
 Shutdown ATS subsystem. More...
 

Variables

static struct GNUNET_CONTAINER_MultiPeerMapp2a
 Map from peer identities to one or more struct AddressInfo values for the peer. More...
 
static unsigned int num_blocked
 Number of blocked addresses. More...
 

Detailed Description

interfacing between transport and ATS service

Author
Christian Grothoff

Definition in file gnunet-service-transport_ats.c.

Macro Definition Documentation

◆ LOG

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

Function Documentation

◆ publish_p2a_stat_update()

static void publish_p2a_stat_update ( )
static

Provide an update on the p2a map size to statistics.

This function should be called whenever the p2a map is changed.

Definition at line 132 of file gnunet-service-transport_ats.c.

References gettext_noop, GNUNET_CONTAINER_multipeermap_size(), GNUNET_NO, GNUNET_STATISTICS_set(), GST_stats, and num_blocked.

Referenced by destroy_ai(), GST_ats_add_address(), GST_ats_add_inbound_address(), GST_ats_block_address(), GST_ats_done(), and unblock_address().

133 {
135  gettext_noop("# Addresses given to ATS"),
137  GNUNET_NO);
139  "# blocked addresses",
140  num_blocked,
141  GNUNET_NO);
142 }
static unsigned int num_blocked
Number of blocked addresses.
#define GNUNET_NO
Definition: gnunet_common.h:78
static struct GNUNET_CONTAINER_MultiPeerMap * p2a
Map from peer identities to one or more struct AddressInfo values for the peer.
static struct GNUNET_STATISTICS_Handle * GST_stats
Statistics handle.
void GNUNET_STATISTICS_set(struct GNUNET_STATISTICS_Handle *handle, const char *name, uint64_t value, int make_persistent)
Set statistic value for the peer.
unsigned int GNUNET_CONTAINER_multipeermap_size(const struct GNUNET_CONTAINER_MultiPeerMap *map)
Get the number of key-value pairs in the map.
#define gettext_noop(String)
Definition: gettext.h:69
Here is the call graph for this function:
Here is the caller graph for this function:

◆ find_ai_cb()

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

Find matching address info.

Both the address and the session must match; note that expired addresses are still found (as the session kind-of keeps those alive).

Parameters
clsthe struct FindClosure
keywhich peer is this about
valuethe struct AddressInfo
Returns
GNUNET_YES to continue to iterate, GNUNET_NO if we found the value

Definition at line 156 of file gnunet-service-transport_ats.c.

References AddressInfo::address, FindClosure::address, ai, GNUNET_HELLO_address_cmp(), GNUNET_NO, GNUNET_YES, FindClosure::ret, AddressInfo::session, FindClosure::session, and value.

Referenced by find_ai().

159 {
160  struct FindClosure *fc = cls;
161  struct AddressInfo *ai = value;
162 
163  if ((0 ==
165  ai->address)) &&
166  (fc->session == ai->session))
167  {
168  fc->ret = ai;
169  return GNUNET_NO;
170  }
171  return GNUNET_YES;
172 }
struct GNUNET_ATS_Session * session
Session to look for (only used if the address is inbound).
Closure for find_ai_cb() and find_ai_no_session_cb().
struct AddressInfo * ret
Where to store the result.
#define GNUNET_NO
Definition: gnunet_common.h:78
int GNUNET_HELLO_address_cmp(const struct GNUNET_HELLO_Address *a1, const struct GNUNET_HELLO_Address *a2)
Compare two addresses.
Definition: address.c:130
static char * value
Value of the record to add/remove.
Information we track for each address known to ATS.
static struct GNUNET_TRANSPORT_AddressIdentifier * ai
Handle to the operation that publishes our address.
const struct GNUNET_HELLO_Address * address
Address to look for.
struct GNUNET_HELLO_Address * address
The address (with peer identity).
#define GNUNET_YES
Definition: gnunet_common.h:77
struct GNUNET_ATS_Session * session
Session (can be NULL)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ find_ai()

static struct AddressInfo* find_ai ( const struct GNUNET_HELLO_Address address,
struct GNUNET_ATS_Session session 
)
static

Find the address information struct for the given address and session.

Parameters
addressaddress to look for
sessionsession to match for inbound connections
Returns
NULL if this combination is unknown

Definition at line 184 of file gnunet-service-transport_ats.c.

References AddressInfo::address, FindClosure::address, find_ai_cb(), GNUNET_CONTAINER_multipeermap_get_multiple(), GNUNET_HELLO_Address::peer, FindClosure::ret, AddressInfo::session, and FindClosure::session.

Referenced by GST_ats_add_inbound_address(), GST_ats_block_address(), GST_ats_block_reset(), GST_ats_del_session(), GST_ats_is_known(), and GST_ats_new_session().

186 {
187  struct FindClosure fc;
188 
189  fc.address = address;
190  fc.session = session;
191  fc.ret = NULL;
193  &address->peer,
194  &find_ai_cb,
195  &fc);
196  return fc.ret;
197 }
struct GNUNET_ATS_Session * session
Session to look for (only used if the address is inbound).
Closure for find_ai_cb() and find_ai_no_session_cb().
static struct GNUNET_CONTAINER_MultiPeerMap * p2a
Map from peer identities to one or more struct AddressInfo values for the peer.
struct GNUNET_PeerIdentity peer
For which peer is this an address?
const struct GNUNET_HELLO_Address * address
Address to look for.
static int find_ai_cb(void *cls, const struct GNUNET_PeerIdentity *key, void *value)
Find matching address info.
static char * address
GNS address for this phone.
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:

◆ find_ai_no_session_cb()

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

Find matching address info, ignoring sessions and expired addresses.

Parameters
clsthe struct FindClosure
keywhich peer is this about
valuethe struct AddressInfo
Returns
GNUNET_YES to continue to iterate, GNUNET_NO if we found the value

Definition at line 210 of file gnunet-service-transport_ats.c.

References AddressInfo::address, FindClosure::address, ai, AddressInfo::expired, GNUNET_HELLO_address_cmp(), GNUNET_NO, GNUNET_YES, FindClosure::ret, and value.

Referenced by find_ai_no_session().

213 {
214  struct FindClosure *fc = cls;
215  struct AddressInfo *ai = value;
216 
217  if (ai->expired)
218  return GNUNET_YES; /* expired do not count here */
219  if (0 ==
221  ai->address))
222  {
223  fc->ret = ai;
224  return GNUNET_NO;
225  }
226  return GNUNET_YES;
227 }
Closure for find_ai_cb() and find_ai_no_session_cb().
struct AddressInfo * ret
Where to store the result.
#define GNUNET_NO
Definition: gnunet_common.h:78
int GNUNET_HELLO_address_cmp(const struct GNUNET_HELLO_Address *a1, const struct GNUNET_HELLO_Address *a2)
Compare two addresses.
Definition: address.c:130
static char * value
Value of the record to add/remove.
Information we track for each address known to ATS.
static struct GNUNET_TRANSPORT_AddressIdentifier * ai
Handle to the operation that publishes our address.
const struct GNUNET_HELLO_Address * address
Address to look for.
struct GNUNET_HELLO_Address * address
The address (with peer identity).
#define GNUNET_YES
Definition: gnunet_common.h:77
int expired
Set to GNUNET_YES if the address has expired but we could not yet remove it because we still have a v...
Here is the call graph for this function:
Here is the caller graph for this function:

◆ find_ai_no_session()

static struct AddressInfo* find_ai_no_session ( const struct GNUNET_HELLO_Address address)
static

Find the address information struct for the given address (ignoring sessions)

Parameters
addressaddress to look for
Returns
NULL if this combination is unknown

Definition at line 238 of file gnunet-service-transport_ats.c.

References AddressInfo::address, FindClosure::address, find_ai_no_session_cb(), GNUNET_CONTAINER_multipeermap_get_multiple(), GNUNET_HELLO_Address::peer, FindClosure::ret, and FindClosure::session.

Referenced by GST_ats_add_address(), GST_ats_expire_address(), GST_ats_is_known_no_session(), GST_ats_update_delay(), GST_ats_update_distance(), and GST_ats_update_utilization().

239 {
240  struct FindClosure fc;
241 
242  fc.address = address;
243  fc.session = NULL;
244  fc.ret = NULL;
246  &address->peer,
248  &fc);
249  return fc.ret;
250 }
Closure for find_ai_cb() and find_ai_no_session_cb().
static struct GNUNET_CONTAINER_MultiPeerMap * p2a
Map from peer identities to one or more struct AddressInfo values for the peer.
struct GNUNET_PeerIdentity peer
For which peer is this an address?
const struct GNUNET_HELLO_Address * address
Address to look for.
static int find_ai_no_session_cb(void *cls, const struct GNUNET_PeerIdentity *key, void *value)
Find matching address info, ignoring sessions and expired addresses.
static char * address
GNS address for this phone.
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:

◆ GST_ats_is_known()

int GST_ats_is_known ( const struct GNUNET_HELLO_Address address,
struct GNUNET_ATS_Session session 
)

Test if ATS knows about this address and session.

Note that even if the address is expired, we return GNUNET_YES if the respective session matches.

Parameters
addressthe address
sessionthe session
Returns
GNUNET_YES if address is known, GNUNET_NO if not.

Definition at line 263 of file gnunet-service-transport_ats.c.

References find_ai(), GNUNET_NO, and GNUNET_YES.

Referenced by GST_neighbours_session_terminated(), set_alternative_address(), set_primary_address(), and try_run_fast_ats_update().

265 {
266  return (NULL != find_ai(address, session)) ? GNUNET_YES : GNUNET_NO;
267 }
#define GNUNET_NO
Definition: gnunet_common.h:78
static struct AddressInfo * find_ai(const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session)
Find the address information struct for the given address and session.
#define GNUNET_YES
Definition: gnunet_common.h:77
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_ats_is_known_no_session()

int GST_ats_is_known_no_session ( const struct GNUNET_HELLO_Address address)

Test if ATS knows about this address.

Note that expired addresses do not count.

Parameters
addressthe address
Returns
GNUNET_YES if address is known, GNUNET_NO if not.

Definition at line 278 of file gnunet-service-transport_ats.c.

References find_ai_no_session(), GNUNET_NO, and GNUNET_YES.

Referenced by add_valid_address(), cleanup_validation_entry(), find_validation_entry(), and GST_validation_handle_pong().

279 {
280  return (NULL != find_ai_no_session(address))
281  ? GNUNET_YES
282  : GNUNET_NO;
283 }
#define GNUNET_NO
Definition: gnunet_common.h:78
static struct AddressInfo * find_ai_no_session(const struct GNUNET_HELLO_Address *address)
Find the address information struct for the given address (ignoring sessions)
#define GNUNET_YES
Definition: gnunet_common.h:77
Here is the call graph for this function:
Here is the caller graph for this function:

◆ unblock_address()

static void unblock_address ( void *  cls)
static

The blocking time for an address has expired, allow ATS to suggest it again.

Parameters
clsthe struct AddressInfo of the address to unblock

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

References AddressInfo::address, ai, AddressInfo::ar, GNUNET_ATS_address_add(), GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GST_ats, GST_plugins_a2s(), LOG, num_blocked, GNUNET_HELLO_Address::peer, AddressInfo::properties, publish_p2a_stat_update(), AddressInfo::session, and AddressInfo::unblock_task.

Referenced by GST_ats_block_address().

294 {
295  struct AddressInfo *ai = cls;
296 
297  ai->unblock_task = NULL;
299  "Unblocking address %s of peer %s\n",
301  GNUNET_i2s(&ai->address->peer));
303  ai->address,
304  ai->session,
305  &ai->properties);
306  GNUNET_break(NULL != ai->ar);
307  num_blocked--;
309 }
struct GNUNET_SCHEDULER_Task * unblock_task
Task scheduled to unblock an ATS-blocked address at blocked time, or NULL if the address is not block...
struct GNUNET_ATS_Properties properties
Performance properties of this address.
static unsigned int num_blocked
Number of blocked addresses.
struct GNUNET_ATS_SchedulingHandle * GST_ats
ATS scheduling handle.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
struct GNUNET_ATS_AddressRecord * ar
Record with ATS API for the address.
#define LOG(kind,...)
Log convenience function.
const char * GST_plugins_a2s(const struct GNUNET_HELLO_Address *address)
Convert a given address to a human-readable format.
struct GNUNET_ATS_AddressRecord * GNUNET_ATS_address_add(struct GNUNET_ATS_SchedulingHandle *sh, const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session, const struct GNUNET_ATS_Properties *prop)
We have a new address ATS should know.
Information we track for each address known to ATS.
static struct GNUNET_TRANSPORT_AddressIdentifier * ai
Handle to the operation that publishes our address.
struct GNUNET_PeerIdentity peer
For which peer is this an address?
struct GNUNET_HELLO_Address * address
The address (with peer identity).
struct GNUNET_ATS_Session * session
Session (can be NULL)
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
static void publish_p2a_stat_update()
Provide an update on the p2a map size to statistics.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_ats_block_address()

void GST_ats_block_address ( const struct GNUNET_HELLO_Address address,
struct GNUNET_ATS_Session session 
)

Temporarily block a valid address for use by ATS for address suggestions.

This function should be called if an address was suggested by ATS but failed to perform (i.e. failure to establish a session or to exchange the PING/PONG).

Parameters
addressthe address to block
sessionthe session (can be NULL)

Definition at line 322 of file gnunet-service-transport_ats.c.

References ai, AddressInfo::ar, AddressInfo::back_off, AddressInfo::blocked, find_ai(), GNUNET_ATS_address_del_session(), GNUNET_ATS_address_destroy(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_INFO, GNUNET_HELLO_address_check_option(), GNUNET_HELLO_ADDRESS_INFO_INBOUND, GNUNET_i2s(), GNUNET_NO, GNUNET_SCHEDULER_add_delayed(), GNUNET_STRINGS_relative_time_to_string(), GNUNET_TIME_relative_to_absolute(), GNUNET_TIME_STD_BACKOFF, GNUNET_YES, GST_my_identity, GST_plugins_a2s(), LOG, num_blocked, GNUNET_HELLO_Address::peer, publish_p2a_stat_update(), unblock_address(), and AddressInfo::unblock_task.

Referenced by free_address(), GST_neighbours_switch_to_address(), set_primary_address(), and switch_address_bl_check_cont().

324 {
325  struct AddressInfo *ai;
326 
327  if (0 ==
328  memcmp(&GST_my_identity,
329  &address->peer,
330  sizeof(struct GNUNET_PeerIdentity)))
331  return; /* our own, ignore! */
332  ai = find_ai(address,
333  session);
334  if (NULL == ai || NULL == ai->ar)
335  {
336  /* The address is already gone/blocked, this can happen during a blacklist
337  * callback. */
338  return;
339  }
341  if (GNUNET_YES ==
345  "Removing address %s of peer %s from use (inbound died)\n",
346  GST_plugins_a2s(address),
347  GNUNET_i2s(&address->peer));
348  else
350  "Blocking address %s of peer %s from use for %s\n",
351  GST_plugins_a2s(address),
352  GNUNET_i2s(&address->peer),
354  GNUNET_YES));
355  /* destroy session and address */
356  if ((NULL == session) ||
357  (GNUNET_NO ==
359  session)))
360  {
362  }
363  /* "ar" has been freed, regardless how the branch
364  above played out: it was either freed in
365  #GNUNET_ATS_address_del_session() because it was
366  incoming, or explicitly in
367  #GNUNET_ATS_address_del_session(). */
368  ai->ar = NULL;
369 
370  /* determine when the address should come back to life */
374  ai);
375  num_blocked++;
377 }
static struct GNUNET_PeerIdentity GST_my_identity
Our public key.
struct GNUNET_TIME_Relative back_off
If an address is blocked as part of an exponential back-off, we track the current size of the backoff...
struct GNUNET_TIME_Absolute GNUNET_TIME_relative_to_absolute(struct GNUNET_TIME_Relative rel)
Convert relative time to an absolute time in the future.
Definition: time.c:246
struct GNUNET_SCHEDULER_Task * unblock_task
Task scheduled to unblock an ATS-blocked address at blocked time, or NULL if the address is not block...
static unsigned int num_blocked
Number of blocked addresses.
#define GNUNET_NO
Definition: gnunet_common.h:78
int GNUNET_HELLO_address_check_option(const struct GNUNET_HELLO_Address *address, enum GNUNET_HELLO_AddressInfo option)
Check if an address has a local option set.
Definition: address.c:39
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:1237
struct GNUNET_ATS_AddressRecord * ar
Record with ATS API for the address.
This is an inbound address and cannot be used to initiate an outbound connection to another peer...
struct GNUNET_TIME_Absolute blocked
Time until when this address is blocked and should thus not be made available to ATS (ar should be NU...
const char * GNUNET_STRINGS_relative_time_to_string(struct GNUNET_TIME_Relative delta, int do_round)
Give relative time in human-readable fancy format.
Definition: strings.c:686
#define LOG(kind,...)
Log convenience function.
const char * GST_plugins_a2s(const struct GNUNET_HELLO_Address *address)
Convert a given address to a human-readable format.
Information we track for each address known to ATS.
int GNUNET_ATS_address_del_session(struct GNUNET_ATS_AddressRecord *ar, struct GNUNET_ATS_Session *session)
A session was destroyed, disassociate it from the given address record.
static struct GNUNET_TRANSPORT_AddressIdentifier * ai
Handle to the operation that publishes our address.
static void unblock_address(void *cls)
The blocking time for an address has expired, allow ATS to suggest it again.
#define GNUNET_TIME_STD_BACKOFF(r)
Perform our standard exponential back-off calculation, starting at 1 ms and then going by a factor of...
struct GNUNET_PeerIdentity peer
For which peer is this an address?
The identity of the host (wraps the signing key of the peer).
static struct AddressInfo * find_ai(const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session)
Find the address information struct for the given address and session.
void GNUNET_ATS_address_destroy(struct GNUNET_ATS_AddressRecord *ar)
An address got destroyed, stop using it as a valid address.
#define GNUNET_YES
Definition: gnunet_common.h:77
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
static void publish_p2a_stat_update()
Provide an update on the p2a map size to statistics.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_ats_block_reset()

void GST_ats_block_reset ( const struct GNUNET_HELLO_Address address,
struct GNUNET_ATS_Session session 
)

Reset address blocking time.

Resets the exponential back-off timer for this address to zero. Called when an address was used to create a successful connection.

Parameters
addressthe address to reset the blocking timer
sessionthe session (can be NULL)

Definition at line 389 of file gnunet-service-transport_ats.c.

References ai, AddressInfo::back_off, find_ai(), GNUNET_break, GNUNET_TIME_UNIT_ZERO, GST_my_identity, GNUNET_HELLO_Address::peer, and AddressInfo::unblock_task.

Referenced by GST_neighbours_handle_session_ack().

391 {
392  struct AddressInfo *ai;
393 
394  if (0 ==
395  memcmp(&GST_my_identity,
396  &address->peer,
397  sizeof(struct GNUNET_PeerIdentity)))
398  return; /* our own, ignore! */
399  ai = find_ai(address, session);
400  if (NULL == ai)
401  {
402  GNUNET_break(0);
403  return;
404  }
405  /* address is in successful use, so it should not be blocked right now */
406  GNUNET_break(NULL == ai->unblock_task);
408 }
static struct GNUNET_PeerIdentity GST_my_identity
Our public key.
struct GNUNET_TIME_Relative back_off
If an address is blocked as part of an exponential back-off, we track the current size of the backoff...
struct GNUNET_SCHEDULER_Task * unblock_task
Task scheduled to unblock an ATS-blocked address at blocked time, or NULL if the address is not block...
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
Information we track for each address known to ATS.
static struct GNUNET_TRANSPORT_AddressIdentifier * ai
Handle to the operation that publishes our address.
struct GNUNET_PeerIdentity peer
For which peer is this an address?
#define GNUNET_TIME_UNIT_ZERO
Relative time zero.
The identity of the host (wraps the signing key of the peer).
static struct AddressInfo * find_ai(const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session)
Find the address information struct for the given address and session.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_ats_add_inbound_address()

void GST_ats_add_inbound_address ( const struct GNUNET_HELLO_Address address,
struct GNUNET_ATS_Session session,
const struct GNUNET_ATS_Properties prop 
)

Notify ATS about a new inbound address.

The address in combination with the session must be new, but this function will perform a santiy check. If the address is indeed new, make it available to ATS.

Parameters
addressthe address
sessionthe session
propperformance information

Definition at line 422 of file gnunet-service-transport_ats.c.

References AddressInfo::address, ai, AddressInfo::ar, find_ai(), GNUNET_assert, GNUNET_ATS_address_add(), GNUNET_break, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE, GNUNET_CONTAINER_multipeermap_put(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_HELLO_address_check_option(), GNUNET_HELLO_address_copy(), GNUNET_HELLO_ADDRESS_INFO_INBOUND, GNUNET_i2s(), GNUNET_new, GNUNET_NT_to_string(), GNUNET_NT_UNSPECIFIED, GNUNET_YES, GST_ats, GST_my_identity, GST_plugins_a2s(), LOG, GNUNET_HELLO_Address::peer, AddressInfo::properties, publish_p2a_stat_update(), GNUNET_ATS_Properties::scope, AddressInfo::session, and GNUNET_HELLO_Address::transport_name.

Referenced by plugin_env_session_start().

425 {
426  struct GNUNET_ATS_AddressRecord *ar;
427  struct AddressInfo *ai;
428 
429  if (0 ==
430  memcmp(&GST_my_identity,
431  &address->peer,
432  sizeof(struct GNUNET_PeerIdentity)))
433  return; /* our own, ignore! */
434 
435  /* Sanity checks for a valid inbound address */
436  if (NULL == address->transport_name)
437  {
438  GNUNET_break(0);
439  return;
440  }
445  GNUNET_assert(NULL != session);
446  ai = find_ai(address, session);
447  if (NULL != ai)
448  {
449  /* This should only be called for new sessions, and thus
450  we should not already have the address */
451  GNUNET_break(0);
452  return;
453  }
454  /* Is indeed new, let's tell ATS */
456  "Notifying ATS about peer `%s''s new inbound address `%s' session %p in network %s\n",
457  GNUNET_i2s(&address->peer),
458  GST_plugins_a2s(address),
459  session,
460  GNUNET_NT_to_string(prop->scope));
462  address,
463  session,
464  prop);
465  GNUNET_assert(NULL != ar);
466  ai = GNUNET_new(struct AddressInfo);
467  ai->address = GNUNET_HELLO_address_copy(address);
468  ai->session = session;
469  ai->properties = *prop;
470  ai->ar = ar;
472  &ai->address->peer,
473  ai,
476 }
static struct GNUNET_PeerIdentity GST_my_identity
Our public key.
const char * GNUNET_NT_to_string(enum GNUNET_NetworkType net)
Convert a enum GNUNET_NetworkType to a string.
Definition: nt.c:43
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
struct GNUNET_ATS_Properties properties
Performance properties of this address.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
struct GNUNET_ATS_SchedulingHandle * GST_ats
ATS scheduling handle.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
static struct GNUNET_CONTAINER_MultiPeerMap * p2a
Map from peer identities to one or more struct AddressInfo values for the peer.
int GNUNET_HELLO_address_check_option(const struct GNUNET_HELLO_Address *address, enum GNUNET_HELLO_AddressInfo option)
Check if an address has a local option set.
Definition: address.c:39
struct GNUNET_ATS_AddressRecord * ar
Record with ATS API for the address.
This is an inbound address and cannot be used to initiate an outbound connection to another peer...
const char * transport_name
Name of the transport plugin enabling the communication using this address.
#define LOG(kind,...)
Log convenience function.
const char * GST_plugins_a2s(const struct GNUNET_HELLO_Address *address)
Convert a given address to a human-readable format.
Information we track per address, incoming or outgoing.
struct GNUNET_ATS_AddressRecord * GNUNET_ATS_address_add(struct GNUNET_ATS_SchedulingHandle *sh, const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session, const struct GNUNET_ATS_Properties *prop)
We have a new address ATS should know.
Information we track for each address known to ATS.
static struct GNUNET_TRANSPORT_AddressIdentifier * ai
Handle to the operation that publishes our address.
struct GNUNET_PeerIdentity peer
For which peer is this an address?
enum GNUNET_NetworkType scope
Which network scope does the respective address belong to? This property does not change...
Allow multiple values with the same key.
int GNUNET_CONTAINER_multipeermap_put(struct GNUNET_CONTAINER_MultiPeerMap *map, const struct GNUNET_PeerIdentity *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
The identity of the host (wraps the signing key of the peer).
static struct AddressInfo * find_ai(const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session)
Find the address information struct for the given address and session.
struct GNUNET_HELLO_Address * GNUNET_HELLO_address_copy(const struct GNUNET_HELLO_Address *address)
Copy an address struct.
Definition: address.c:109
struct GNUNET_HELLO_Address * address
The address (with peer identity).
#define GNUNET_YES
Definition: gnunet_common.h:77
struct GNUNET_ATS_Session * session
Session (can be NULL)
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
static void publish_p2a_stat_update()
Provide an update on the p2a map size to statistics.
Category of last resort.
Definition: gnunet_nt_lib.h:39
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_ats_add_address()

void GST_ats_add_address ( const struct GNUNET_HELLO_Address address,
const struct GNUNET_ATS_Properties prop 
)

Notify ATS about the new address including the network this address is located in.

Notify ATS about a new address including the network this address is located in.

The address must NOT be inbound and must be new to ATS.

Parameters
addressthe address
propperformance information

Definition at line 487 of file gnunet-service-transport_ats.c.

References AddressInfo::address, ai, AddressInfo::ar, find_ai_no_session(), GNUNET_assert, GNUNET_ATS_address_add(), GNUNET_break, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE, GNUNET_CONTAINER_multipeermap_put(), GNUNET_ERROR_TYPE_INFO, GNUNET_HELLO_address_check_option(), GNUNET_HELLO_address_copy(), GNUNET_HELLO_ADDRESS_INFO_INBOUND, GNUNET_i2s(), GNUNET_new, GNUNET_NT_UNSPECIFIED, GNUNET_YES, GST_ats, GST_my_identity, GST_plugins_a2s(), LOG, GNUNET_HELLO_Address::peer, AddressInfo::properties, publish_p2a_stat_update(), GNUNET_ATS_Properties::scope, and GNUNET_HELLO_Address::transport_name.

Referenced by add_valid_address(), and GST_validation_handle_pong().

489 {
490  struct GNUNET_ATS_AddressRecord *ar;
491  struct AddressInfo *ai;
492 
493  if (0 ==
494  memcmp(&GST_my_identity,
495  &address->peer,
496  sizeof(struct GNUNET_PeerIdentity)))
497  return; /* our own, ignore! */
498  /* validadte address */
499  if (NULL == address->transport_name)
500  {
501  GNUNET_break(0);
502  return;
503  }
507  ai = find_ai_no_session(address);
508  GNUNET_assert(NULL == ai);
510 
511  /* address seems sane, let's tell ATS */
513  "Notifying ATS about peer %s's new address `%s'\n",
514  GNUNET_i2s(&address->peer),
515  GST_plugins_a2s(address));
517  address,
518  NULL,
519  prop);
520  GNUNET_assert(NULL != ar);
521  ai = GNUNET_new(struct AddressInfo);
522  ai->address = GNUNET_HELLO_address_copy(address);
523  ai->ar = ar;
524  ai->properties = *prop;
526  &ai->address->peer,
527  ai,
530 }
static struct GNUNET_PeerIdentity GST_my_identity
Our public key.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
struct GNUNET_ATS_Properties properties
Performance properties of this address.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
struct GNUNET_ATS_SchedulingHandle * GST_ats
ATS scheduling handle.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
static struct GNUNET_CONTAINER_MultiPeerMap * p2a
Map from peer identities to one or more struct AddressInfo values for the peer.
int GNUNET_HELLO_address_check_option(const struct GNUNET_HELLO_Address *address, enum GNUNET_HELLO_AddressInfo option)
Check if an address has a local option set.
Definition: address.c:39
struct GNUNET_ATS_AddressRecord * ar
Record with ATS API for the address.
This is an inbound address and cannot be used to initiate an outbound connection to another peer...
const char * transport_name
Name of the transport plugin enabling the communication using this address.
#define LOG(kind,...)
Log convenience function.
const char * GST_plugins_a2s(const struct GNUNET_HELLO_Address *address)
Convert a given address to a human-readable format.
Information we track per address, incoming or outgoing.
struct GNUNET_ATS_AddressRecord * GNUNET_ATS_address_add(struct GNUNET_ATS_SchedulingHandle *sh, const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session, const struct GNUNET_ATS_Properties *prop)
We have a new address ATS should know.
Information we track for each address known to ATS.
static struct AddressInfo * find_ai_no_session(const struct GNUNET_HELLO_Address *address)
Find the address information struct for the given address (ignoring sessions)
static struct GNUNET_TRANSPORT_AddressIdentifier * ai
Handle to the operation that publishes our address.
struct GNUNET_PeerIdentity peer
For which peer is this an address?
enum GNUNET_NetworkType scope
Which network scope does the respective address belong to? This property does not change...
Allow multiple values with the same key.
int GNUNET_CONTAINER_multipeermap_put(struct GNUNET_CONTAINER_MultiPeerMap *map, const struct GNUNET_PeerIdentity *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
The identity of the host (wraps the signing key of the peer).
struct GNUNET_HELLO_Address * GNUNET_HELLO_address_copy(const struct GNUNET_HELLO_Address *address)
Copy an address struct.
Definition: address.c:109
struct GNUNET_HELLO_Address * address
The address (with peer identity).
#define GNUNET_YES
Definition: gnunet_common.h:77
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
static void publish_p2a_stat_update()
Provide an update on the p2a map size to statistics.
Category of last resort.
Definition: gnunet_nt_lib.h:39
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_ats_new_session()

void GST_ats_new_session ( const struct GNUNET_HELLO_Address address,
struct GNUNET_ATS_Session session 
)

Notify ATS about a new session now existing for the given address.

Essentially, an outbound address was used to establish a session. It is safe to call this function repeatedly for the same address and session pair.

Parameters
addressthe address
sessionthe session

Definition at line 543 of file gnunet-service-transport_ats.c.

References ai, AddressInfo::ar, find_ai(), GNUNET_assert, GNUNET_ATS_address_add_session(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GST_my_identity, LOG, GNUNET_HELLO_Address::peer, AddressInfo::session, and AddressInfo::unblock_task.

Referenced by multicast_pong(), send_syn_ack_message(), set_alternative_address(), and switch_address_bl_check_cont().

545 {
546  struct AddressInfo *ai;
547 
548  if (0 ==
549  memcmp(&GST_my_identity,
550  &address->peer,
551  sizeof(struct GNUNET_PeerIdentity)))
552  return; /* our own, ignore! */
553  ai = find_ai(address, NULL);
554  if (NULL == ai)
555  {
556  /* We may simply already be aware of the session, even if some
557  other part of the code could not tell if it just created a new
558  session or just got one recycled from the plugin; hence, we may
559  be called with "new" session even for an "old" session; in that
560  case, check that this is the case, but just ignore it. */
561  GNUNET_assert(NULL != (find_ai(address, session)));
562  return;
563  }
564  GNUNET_assert(NULL == ai->session);
565  ai->session = session;
567  "Telling ATS about new session for peer %s\n",
568  GNUNET_i2s(&address->peer));
569  /* Note that the address might currently be blocked; we only
570  tell ATS about the session if the address is currently not
571  blocked; otherwise, ATS will be told about the session on
572  unblock. */
573  if (NULL != ai->ar)
575  session);
576  else
577  GNUNET_assert(NULL != ai->unblock_task);
578 }
static struct GNUNET_PeerIdentity GST_my_identity
Our public key.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
struct GNUNET_SCHEDULER_Task * unblock_task
Task scheduled to unblock an ATS-blocked address at blocked time, or NULL if the address is not block...
struct GNUNET_ATS_AddressRecord * ar
Record with ATS API for the address.
#define LOG(kind,...)
Log convenience function.
Information we track for each address known to ATS.
static struct GNUNET_TRANSPORT_AddressIdentifier * ai
Handle to the operation that publishes our address.
struct GNUNET_PeerIdentity peer
For which peer is this an address?
The identity of the host (wraps the signing key of the peer).
static struct AddressInfo * find_ai(const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session)
Find the address information struct for the given address and session.
void GNUNET_ATS_address_add_session(struct GNUNET_ATS_AddressRecord *ar, struct GNUNET_ATS_Session *session)
An address was used to initiate a session.
struct GNUNET_ATS_Session * session
Session (can be NULL)
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
Here is the call graph for this function:
Here is the caller graph for this function:

◆ destroy_ai()

static void destroy_ai ( struct AddressInfo ai)
static

Release memory used by the given address data.

Parameters
aithe struct AddressInfo

Definition at line 587 of file gnunet-service-transport_ats.c.

References AddressInfo::address, AddressInfo::ar, GNUNET_assert, GNUNET_ATS_address_destroy(), GNUNET_CONTAINER_multipeermap_remove(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_HELLO_address_free, GNUNET_i2s(), GNUNET_SCHEDULER_cancel(), GNUNET_YES, LOG, num_blocked, GNUNET_HELLO_Address::peer, publish_p2a_stat_update(), AddressInfo::session, and AddressInfo::unblock_task.

Referenced by destroy_ai_cb(), GST_ats_del_session(), and GST_ats_expire_address().

588 {
589  GNUNET_assert(NULL == ai->session);
590  if (NULL != ai->unblock_task)
591  {
593  ai->unblock_task = NULL;
594  num_blocked--;
595  }
598  &ai->address->peer,
599  ai));
601  "Telling ATS to destroy address from peer %s\n",
602  GNUNET_i2s(&ai->address->peer));
603  if (NULL != ai->ar)
604  {
606  ai->ar = NULL;
607  }
610  GNUNET_free(ai);
611 }
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
struct GNUNET_SCHEDULER_Task * unblock_task
Task scheduled to unblock an ATS-blocked address at blocked time, or NULL if the address is not block...
static unsigned int num_blocked
Number of blocked addresses.
int GNUNET_CONTAINER_multipeermap_remove(struct GNUNET_CONTAINER_MultiPeerMap *map, const struct GNUNET_PeerIdentity *key, const void *value)
Remove the given key-value pair from the map.
static struct GNUNET_CONTAINER_MultiPeerMap * p2a
Map from peer identities to one or more struct AddressInfo values for the peer.
struct GNUNET_ATS_AddressRecord * ar
Record with ATS API for the address.
#define LOG(kind,...)
Log convenience function.
struct GNUNET_PeerIdentity peer
For which peer is this an address?
void GNUNET_ATS_address_destroy(struct GNUNET_ATS_AddressRecord *ar)
An address got destroyed, stop using it as a valid address.
struct GNUNET_HELLO_Address * address
The address (with peer identity).
#define GNUNET_YES
Definition: gnunet_common.h:77
struct GNUNET_ATS_Session * session
Session (can be NULL)
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
#define GNUNET_HELLO_address_free(addr)
Free an address.
static void publish_p2a_stat_update()
Provide an update on the p2a map size to statistics.
#define GNUNET_free(ptr)
Wrapper around free.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:956
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_ats_del_session()

void GST_ats_del_session ( const struct GNUNET_HELLO_Address address,
struct GNUNET_ATS_Session session 
)

Notify ATS that the session (but not the address) of a given address is no longer relevant.

(The session went down.) This function may be called even if for the respective outbound address GST_ats_new_session() was never called and thus the pair is unknown to ATS. In this case, the call is simply ignored.

Parameters
addressthe address
sessionthe session

Definition at line 626 of file gnunet-service-transport_ats.c.

References ai, AddressInfo::ar, destroy_ai(), AddressInfo::expired, find_ai(), GNUNET_assert, GNUNET_ATS_address_del_session(), GNUNET_ATS_address_destroy(), GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_HELLO_address_check_option(), GNUNET_HELLO_ADDRESS_INFO_INBOUND, GNUNET_i2s(), GNUNET_NO, GNUNET_YES, GST_my_identity, LOG, GNUNET_HELLO_Address::peer, and AddressInfo::session.

Referenced by plugin_env_session_end().

628 {
629  struct AddressInfo *ai;
630 
631  if (0 ==
632  memcmp(&GST_my_identity,
633  &address->peer,
634  sizeof(struct GNUNET_PeerIdentity)))
635  return; /* our own, ignore! */
636  if (NULL == session)
637  {
638  GNUNET_break(0);
639  return;
640  }
641  ai = find_ai(address,
642  session);
643  if (NULL == ai)
644  {
645  /* We sometimes create sessions just for sending a PING,
646  and if those are destroyed they were never known to
647  ATS which means we end up here (however, in this
648  case, the address must be an outbound address). */
652  return;
653  }
654  GNUNET_assert(session == ai->session);
655  ai->session = NULL;
657  "Telling ATS to destroy session %p from peer %s\n",
658  session,
659  GNUNET_i2s(&address->peer));
660  if (GNUNET_YES == ai->expired)
661  {
662  /* last reason to keep this 'ai' around is now gone, the
663  session is dead as well, clean up */
664  if (NULL != ai->ar)
665  {
666  /* Address expired but not blocked, and thus 'ar' was still
667  live because of the session; deleting just the session
668  will do for an inbound session, but for an outbound we
669  then also need to destroy the address with ATS. */
670  if (GNUNET_NO ==
672  session))
673  {
675  }
676  /* "ar" has been freed, regardless how the branch
677  above played out: it was either freed in
678  #GNUNET_ATS_address_del_session() because it was
679  incoming, or explicitly in
680  #GNUNET_ATS_address_del_session(). */
681  ai->ar = NULL;
682  }
683  destroy_ai(ai);
684  return;
685  }
686 
687  if (NULL == ai->ar)
688  {
689  /* If ATS doesn't know about the address/session, this means
690  this address was blocked. */
691  if (GNUNET_YES ==
694  {
695  /* This was a blocked inbound session, which now lost the
696  session. But inbound addresses are by themselves useless,
697  so we must forget about the address as well. */
698  destroy_ai(ai);
699  return;
700  }
701  /* Otherwise, we are done as we have set `ai->session` to NULL
702  already and ATS will simply not be told about the session when
703  the connection is unblocked and the outbound address becomes
704  available again. . */
705  return;
706  }
707 
708  /* This is the "simple" case where ATS knows about the session and
709  the address is neither blocked nor expired. Delete the session,
710  and if it was inbound, free the address as well. */
711  if (GNUNET_YES ==
713  session))
714  {
715  /* This was an inbound address, the session is now gone, so we
716  need to also forget about the address itself. */
717  ai->ar = NULL;
718  destroy_ai(ai);
719  }
720 }
static struct GNUNET_PeerIdentity GST_my_identity
Our public key.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
static void destroy_ai(struct AddressInfo *ai)
Release memory used by the given address data.
int GNUNET_HELLO_address_check_option(const struct GNUNET_HELLO_Address *address, enum GNUNET_HELLO_AddressInfo option)
Check if an address has a local option set.
Definition: address.c:39
struct GNUNET_ATS_AddressRecord * ar
Record with ATS API for the address.
This is an inbound address and cannot be used to initiate an outbound connection to another peer...
#define LOG(kind,...)
Log convenience function.
Information we track for each address known to ATS.
int GNUNET_ATS_address_del_session(struct GNUNET_ATS_AddressRecord *ar, struct GNUNET_ATS_Session *session)
A session was destroyed, disassociate it from the given address record.
static struct GNUNET_TRANSPORT_AddressIdentifier * ai
Handle to the operation that publishes our address.
struct GNUNET_PeerIdentity peer
For which peer is this an address?
The identity of the host (wraps the signing key of the peer).
static struct AddressInfo * find_ai(const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session)
Find the address information struct for the given address and session.
void GNUNET_ATS_address_destroy(struct GNUNET_ATS_AddressRecord *ar)
An address got destroyed, stop using it as a valid address.
#define GNUNET_YES
Definition: gnunet_common.h:77
struct GNUNET_ATS_Session * session
Session (can be NULL)
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
int expired
Set to GNUNET_YES if the address has expired but we could not yet remove it because we still have a v...
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_ats_update_distance()

void GST_ats_update_distance ( const struct GNUNET_HELLO_Address address,
uint32_t  distance 
)

Notify ATS about DV distance change to an address.

Does nothing if the address is not known to us.

Parameters
addressthe address
distancenew distance value

Definition at line 731 of file gnunet-service-transport_ats.c.

References ai, AddressInfo::ar, GNUNET_ATS_Properties::distance, find_ai_no_session(), GNUNET_ATS_address_update(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GST_manipulation_manipulate_metrics(), LOG, GNUNET_HELLO_Address::peer, AddressInfo::properties, and AddressInfo::session.

Referenced by plugin_env_update_distance().

733 {
734  struct AddressInfo *ai;
735 
736  ai = find_ai_no_session(address);
737  if (NULL == ai)
738  {
739  /* We do not know about this address, do nothing. */
740  return;
741  }
743  "Updated distance for peer `%s' to %u\n",
744  GNUNET_i2s(&address->peer),
745  distance);
746  ai->properties.distance = distance;
747  /* Give manipulation its chance to change metrics */
749  ai->session,
750  &ai->properties);
751  /* Address may be blocked, only give ATS if address is
752  currently active. */
753  if (NULL != ai->ar)
755  &ai->properties);
756 }
void GST_manipulation_manipulate_metrics(const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session, struct GNUNET_ATS_Properties *prop)
Function that will be called to manipulate ATS information according to current manipulation settings...
struct GNUNET_ATS_Properties properties
Performance properties of this address.
struct GNUNET_ATS_AddressRecord * ar
Record with ATS API for the address.
void GNUNET_ATS_address_update(struct GNUNET_ATS_AddressRecord *ar, const struct GNUNET_ATS_Properties *prop)
We have updated performance statistics for a given address.
#define LOG(kind,...)
Log convenience function.
Information we track for each address known to ATS.
static struct AddressInfo * find_ai_no_session(const struct GNUNET_HELLO_Address *address)
Find the address information struct for the given address (ignoring sessions)
static struct GNUNET_TRANSPORT_AddressIdentifier * ai
Handle to the operation that publishes our address.
struct GNUNET_PeerIdentity peer
For which peer is this an address?
struct GNUNET_ATS_Session * session
Session (can be NULL)
unsigned int distance
Distance on network layer (required for distance-vector routing) in hops.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_ats_update_delay()

void GST_ats_update_delay ( const struct GNUNET_HELLO_Address address,
struct GNUNET_TIME_Relative  delay 
)

Notify ATS about delay changes to properties of an address.

Does nothing if the address is not known to us.

Parameters
addressthe address
delaynew delay value

Definition at line 767 of file gnunet-service-transport_ats.c.

References ai, AddressInfo::ar, delay, GNUNET_ATS_Properties::delay, find_ai_no_session(), GNUNET_ATS_address_update(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_STRINGS_relative_time_to_string(), GNUNET_YES, GST_manipulation_manipulate_metrics(), LOG, GNUNET_HELLO_Address::peer, AddressInfo::properties, and AddressInfo::session.

Referenced by GST_neighbours_keepalive_response(), and GST_validation_handle_pong().

769 {
770  struct AddressInfo *ai;
771 
772  ai = find_ai_no_session(address);
773  if (NULL == ai)
774  {
775  /* We do not know about this address, do nothing. */
776  return;
777  }
779  "Updated latency for peer `%s' to %s\n",
780  GNUNET_i2s(&address->peer),
782  GNUNET_YES));
783  ai->properties.delay = delay;
784  /* Give manipulation its chance to change metrics */
786  ai->session,
787  &ai->properties);
788  /* Address may be blocked, only give ATS if address is
789  currently active. */
790  if (NULL != ai->ar)
792  &ai->properties);
793 }
void GST_manipulation_manipulate_metrics(const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session, struct GNUNET_ATS_Properties *prop)
Function that will be called to manipulate ATS information according to current manipulation settings...
struct GNUNET_ATS_Properties properties
Performance properties of this address.
struct GNUNET_ATS_AddressRecord * ar
Record with ATS API for the address.
void GNUNET_ATS_address_update(struct GNUNET_ATS_AddressRecord *ar, const struct GNUNET_ATS_Properties *prop)
We have updated performance statistics for a given address.
const char * GNUNET_STRINGS_relative_time_to_string(struct GNUNET_TIME_Relative delta, int do_round)
Give relative time in human-readable fancy format.
Definition: strings.c:686
struct GNUNET_TIME_Relative delay
Delay.
#define LOG(kind,...)
Log convenience function.
Information we track for each address known to ATS.
static struct AddressInfo * find_ai_no_session(const struct GNUNET_HELLO_Address *address)
Find the address information struct for the given address (ignoring sessions)
static struct GNUNET_TRANSPORT_AddressIdentifier * ai
Handle to the operation that publishes our address.
static struct GNUNET_TIME_Relative delay
When should dkg communication start?
struct GNUNET_PeerIdentity peer
For which peer is this an address?
#define GNUNET_YES
Definition: gnunet_common.h:77
struct GNUNET_ATS_Session * session
Session (can be NULL)
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_ats_update_utilization()

void GST_ats_update_utilization ( const struct GNUNET_HELLO_Address address,
uint32_t  bps_in,
uint32_t  bps_out 
)

Notify ATS about utilization changes to an address.

Does nothing if the address is not known to us.

Parameters
addressour information about the address
bps_innew utilization inbound
bps_outnew utilization outbound

Definition at line 805 of file gnunet-service-transport_ats.c.

References ai, AddressInfo::ar, find_ai_no_session(), GNUNET_ATS_address_update(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GST_manipulation_manipulate_metrics(), GST_plugins_a2s(), LOG, GNUNET_HELLO_Address::peer, AddressInfo::properties, AddressInfo::session, GNUNET_ATS_Properties::utilization_in, and GNUNET_ATS_Properties::utilization_out.

Referenced by send_utilization_data().

808 {
809  struct AddressInfo *ai;
810 
811  ai = find_ai_no_session(address);
812  if (NULL == ai)
813  {
814  /* We do not know about this address, do nothing. */
815  return;
816  }
818  "Updating utilization for peer `%s' address %s: %u/%u\n",
819  GNUNET_i2s(&address->peer),
820  GST_plugins_a2s(address),
821  (unsigned int)bps_in,
822  (unsigned int)bps_out);
823  ai->properties.utilization_in = bps_in;
824  ai->properties.utilization_out = bps_out;
825  /* Give manipulation its chance to change metrics */
827  ai->session,
828  &ai->properties);
829  /* Address may be blocked, only give ATS if address is
830  currently active. */
831  if (NULL != ai->ar)
833  &ai->properties);
834 }
void GST_manipulation_manipulate_metrics(const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session, struct GNUNET_ATS_Properties *prop)
Function that will be called to manipulate ATS information according to current manipulation settings...
uint32_t utilization_in
Actual traffic on this connection from the other peer to this peer.
struct GNUNET_ATS_Properties properties
Performance properties of this address.
struct GNUNET_ATS_AddressRecord * ar
Record with ATS API for the address.
void GNUNET_ATS_address_update(struct GNUNET_ATS_AddressRecord *ar, const struct GNUNET_ATS_Properties *prop)
We have updated performance statistics for a given address.
#define LOG(kind,...)
Log convenience function.
const char * GST_plugins_a2s(const struct GNUNET_HELLO_Address *address)
Convert a given address to a human-readable format.
Information we track for each address known to ATS.
static struct AddressInfo * find_ai_no_session(const struct GNUNET_HELLO_Address *address)
Find the address information struct for the given address (ignoring sessions)
static struct GNUNET_TRANSPORT_AddressIdentifier * ai
Handle to the operation that publishes our address.
struct GNUNET_PeerIdentity peer
For which peer is this an address?
struct GNUNET_ATS_Session * session
Session (can be NULL)
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
uint32_t utilization_out
Actual traffic on this connection from this peer to the other peer.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_ats_expire_address()

void GST_ats_expire_address ( const struct GNUNET_HELLO_Address address)

Notify ATS that the address has expired and thus cannot be used any longer.

This function must only be called if the corresponding session is already gone.

Parameters
addressthe address

Definition at line 845 of file gnunet-service-transport_ats.c.

References ai, destroy_ai(), AddressInfo::expired, find_ai_no_session(), GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_YES, GST_my_identity, GST_plugins_a2s(), LOG, GNUNET_HELLO_Address::peer, and AddressInfo::session.

Referenced by cleanup_validation_entry().

846 {
847  struct AddressInfo *ai;
848 
849  if (0 ==
850  memcmp(&GST_my_identity,
851  &address->peer,
852  sizeof(struct GNUNET_PeerIdentity)))
853  return; /* our own, ignore! */
855  "Address %s of peer %s expired\n",
856  GST_plugins_a2s(address),
857  GNUNET_i2s(&address->peer));
858  ai = find_ai_no_session(address);
859  if (NULL == ai)
860  {
861  GNUNET_assert(0);
862  return;
863  }
864  if (NULL != ai->session)
865  {
866  /* Got an active session, just remember the expiration
867  and act upon it when the session goes down. */
868  ai->expired = GNUNET_YES;
869  return;
870  }
871  /* Address expired, no session, free resources */
872  destroy_ai(ai);
873 }
static struct GNUNET_PeerIdentity GST_my_identity
Our public key.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
static void destroy_ai(struct AddressInfo *ai)
Release memory used by the given address data.
#define LOG(kind,...)
Log convenience function.
const char * GST_plugins_a2s(const struct GNUNET_HELLO_Address *address)
Convert a given address to a human-readable format.
Information we track for each address known to ATS.
static struct AddressInfo * find_ai_no_session(const struct GNUNET_HELLO_Address *address)
Find the address information struct for the given address (ignoring sessions)
static struct GNUNET_TRANSPORT_AddressIdentifier * ai
Handle to the operation that publishes our address.
struct GNUNET_PeerIdentity peer
For which peer is this an address?
The identity of the host (wraps the signing key of the peer).
#define GNUNET_YES
Definition: gnunet_common.h:77
struct GNUNET_ATS_Session * session
Session (can be NULL)
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
int expired
Set to GNUNET_YES if the address has expired but we could not yet remove it because we still have a v...
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_ats_init()

void GST_ats_init ( void  )

Initialize ATS subsystem.

Definition at line 880 of file gnunet-service-transport_ats.c.

References GNUNET_CONTAINER_multipeermap_create(), and GNUNET_YES.

Referenced by run().

881 {
883 }
struct GNUNET_CONTAINER_MultiPeerMap * GNUNET_CONTAINER_multipeermap_create(unsigned int len, int do_not_copy_keys)
Create a multi peer map (hash map for public keys of peers).
static struct GNUNET_CONTAINER_MultiPeerMap * p2a
Map from peer identities to one or more struct AddressInfo values for the peer.
#define GNUNET_YES
Definition: gnunet_common.h:77
Here is the call graph for this function:
Here is the caller graph for this function:

◆ destroy_ai_cb()

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

Release memory used by the given address data.

Parameters
clsNULL
keywhich peer is this about
valuethe struct AddressInfo
Returns
GNUNET_OK (continue to iterate)

Definition at line 895 of file gnunet-service-transport_ats.c.

References ai, destroy_ai(), GNUNET_OK, and value.

Referenced by GST_ats_done().

898 {
899  struct AddressInfo *ai = value;
900 
901  destroy_ai(ai);
902  return GNUNET_OK;
903 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
static void destroy_ai(struct AddressInfo *ai)
Release memory used by the given address data.
static char * value
Value of the record to add/remove.
Information we track for each address known to ATS.
static struct GNUNET_TRANSPORT_AddressIdentifier * ai
Handle to the operation that publishes our address.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_ats_done()

void GST_ats_done ( void  )

Shutdown ATS subsystem.

Definition at line 910 of file gnunet-service-transport_ats.c.

References destroy_ai_cb(), GNUNET_CONTAINER_multipeermap_destroy(), GNUNET_CONTAINER_multipeermap_iterate(), and publish_p2a_stat_update().

Referenced by shutdown_task().

911 {
913  &destroy_ai_cb,
914  NULL);
917  p2a = NULL;
918 }
void GNUNET_CONTAINER_multipeermap_destroy(struct GNUNET_CONTAINER_MultiPeerMap *map)
Destroy a hash map.
static struct GNUNET_CONTAINER_MultiPeerMap * p2a
Map from peer identities to one or more struct AddressInfo values for the peer.
static int destroy_ai_cb(void *cls, const struct GNUNET_PeerIdentity *key, void *value)
Release memory used by the given address data.
int GNUNET_CONTAINER_multipeermap_iterate(struct GNUNET_CONTAINER_MultiPeerMap *map, GNUNET_CONTAINER_PeerMapIterator it, void *it_cls)
Iterate over all entries in the map.
static void publish_p2a_stat_update()
Provide an update on the p2a map size to statistics.
Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ p2a

struct GNUNET_CONTAINER_MultiPeerMap* p2a
static

Map from peer identities to one or more struct AddressInfo values for the peer.

Definition at line 97 of file gnunet-service-transport_ats.c.

◆ num_blocked

unsigned int num_blocked
static

Number of blocked addresses.

Definition at line 102 of file gnunet-service-transport_ats.c.

Referenced by destroy_ai(), GST_ats_block_address(), publish_p2a_stat_update(), and unblock_address().