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

automatic transport selection and outbound bandwidth determination More...

#include "platform.h"
#include "gnunet_ats_service.h"
#include "ats.h"
Include dependency graph for ats_api_performance.c:

Go to the source code of this file.

Data Structures

struct  GNUNET_ATS_ReservationContext
 Linked list of pending reservations. More...
 
struct  GNUNET_ATS_AddressListHandle
 Linked list of pending reservations. More...
 
struct  GNUNET_ATS_PerformanceHandle
 ATS Handle to obtain and/or modify performance information. More...
 

Macros

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

Functions

static void reconnect (struct GNUNET_ATS_PerformanceHandle *ph)
 Re-establish the connection to the ATS service. More...
 
static void reconnect_task (void *cls)
 Re-establish the connection to the ATS service. More...
 
static void do_reconnect (struct GNUNET_ATS_PerformanceHandle *ph)
 Reconnect to the ATS service, something went wrong. More...
 
static int check_peer_information (void *cls, const struct PeerInformationMessage *pi)
 We received a peer information message. More...
 
static void handle_peer_information (void *cls, const struct PeerInformationMessage *pi)
 We received a peer information message. More...
 
static void handle_reservation_result (void *cls, const struct ReservationResultMessage *rr)
 We received a reservation result message. More...
 
static int check_address_list (void *cls, const struct PeerInformationMessage *pi)
 We received a PeerInformationMessage. More...
 
static void handle_address_list (void *cls, const struct PeerInformationMessage *pi)
 We received a GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_RESPONSE. More...
 
static void mq_error_handler (void *cls, enum GNUNET_MQ_Error error)
 Generic error handler, called with the appropriate error code and the same closure specified at the creation of the message queue. More...
 
struct GNUNET_ATS_PerformanceHandleGNUNET_ATS_performance_init (const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_ATS_AddressInformationCallback addr_info_cb, void *addr_info_cb_cls)
 Get handle to access performance API of the ATS subsystem. More...
 
void GNUNET_ATS_performance_done (struct GNUNET_ATS_PerformanceHandle *ph)
 Client is done using the ATS performance subsystem, release resources. More...
 
struct GNUNET_ATS_ReservationContextGNUNET_ATS_reserve_bandwidth (struct GNUNET_ATS_PerformanceHandle *ph, const struct GNUNET_PeerIdentity *peer, int32_t amount, GNUNET_ATS_ReservationCallback rcb, void *rcb_cls)
 Reserve inbound bandwidth from the given peer. More...
 
void GNUNET_ATS_reserve_bandwidth_cancel (struct GNUNET_ATS_ReservationContext *rc)
 Cancel request for reserving bandwidth. More...
 
struct GNUNET_ATS_AddressListHandleGNUNET_ATS_performance_list_addresses (struct GNUNET_ATS_PerformanceHandle *ph, const struct GNUNET_PeerIdentity *peer, int all, GNUNET_ATS_AddressInformationCallback infocb, void *infocb_cls)
 Get information about addresses known to the ATS subsystem. More...
 
void GNUNET_ATS_performance_list_addresses_cancel (struct GNUNET_ATS_AddressListHandle *alh)
 Cancel a pending address listing operation. More...
 
const char * GNUNET_ATS_print_preference_type (enum GNUNET_ATS_PreferenceKind type)
 Convert a enum GNUNET_ATS_PreferenceType to a string. More...
 
void GNUNET_ATS_performance_change_preference (struct GNUNET_ATS_PerformanceHandle *ph, const struct GNUNET_PeerIdentity *peer,...)
 Change preferences for the given peer. More...
 
void GNUNET_ATS_performance_give_feedback (struct GNUNET_ATS_PerformanceHandle *ph, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_TIME_Relative scope,...)
 Send feedback to ATS on how good a the requirements for a peer and a preference is satisfied by ATS. More...
 

Detailed Description

automatic transport selection and outbound bandwidth determination

Author
Christian Grothoff
Matthias Wachs

Definition in file ats_api_performance.c.

Macro Definition Documentation

◆ LOG

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

Definition at line 31 of file ats_api_performance.c.

Referenced by handle_address_list().

Function Documentation

◆ reconnect()

static void reconnect ( struct GNUNET_ATS_PerformanceHandle ph)
static

Re-establish the connection to the ATS service.

Parameters
phhandle to use to re-connect.

Definition at line 566 of file ats_api_performance.c.

References GNUNET_ATS_PerformanceHandle::addr_info_cb, GNUNET_ATS_PerformanceHandle::cfg, env, GNUNET_assert, GNUNET_CLIENT_connect(), GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_RESPONSE, GNUNET_MESSAGE_TYPE_ATS_PEER_INFORMATION, GNUNET_MESSAGE_TYPE_ATS_RESERVATION_RESULT, GNUNET_MESSAGE_TYPE_ATS_START, GNUNET_MQ_handler_end, GNUNET_MQ_hd_fixed_size, GNUNET_MQ_hd_var_size, GNUNET_MQ_msg, GNUNET_MQ_send(), init, GNUNET_ATS_PerformanceHandle::mq, mq_error_handler(), ClientStartMessage::start_flag, START_FLAG_PERFORMANCE_NO_PIC, and START_FLAG_PERFORMANCE_WITH_PIC.

Referenced by GNUNET_ATS_performance_init(), handle_reservation_result(), and reconnect_task().

567 {
569  GNUNET_MQ_hd_var_size (peer_information,
571  struct PeerInformationMessage,
572  ph),
573  GNUNET_MQ_hd_fixed_size (reservation_result,
576  ph),
577  GNUNET_MQ_hd_var_size (address_list,
579  struct PeerInformationMessage,
580  ph),
582  };
583  struct GNUNET_MQ_Envelope *env;
584  struct ClientStartMessage *init;
585 
586  GNUNET_assert (NULL == ph->mq);
587  ph->mq = GNUNET_CLIENT_connect (ph->cfg,
588  "ats",
589  handlers,
591  ph);
592  if (NULL == ph->mq)
593  return;
594  env = GNUNET_MQ_msg (init,
596  init->start_flag = htonl ( (NULL == ph->addr_info_cb)
599  GNUNET_MQ_send (ph->mq,
600  env);
601 }
#define GNUNET_MESSAGE_TYPE_ATS_START
Type of the 'struct ClientStartMessage' sent by clients to ATS to identify the type of the client...
struct GNUNET_MQ_Handle * GNUNET_CLIENT_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *service_name, const struct GNUNET_MQ_MessageHandler *handlers, GNUNET_MQ_ErrorHandler error_handler, void *error_handler_cls)
Create a message queue to connect to a GNUnet service.
Definition: client.c:901
uint32_t start_flag
NBO value of an enum StartFlag.
Definition: ats.h:80
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
struct GNUNET_MQ_Handle * mq
Connection to ATS service.
#define GNUNET_MQ_hd_fixed_size(name, code, str, ctx)
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:67
Performance monitoring client that does NOT want to learn about changes in performance characteristic...
Definition: ats.h:55
#define GNUNET_MESSAGE_TYPE_ATS_PEER_INFORMATION
Type of the 'struct PeerInformationMessage' sent by ATS to clients to inform about QoS for a particul...
static struct GNUNET_CADET_MessageHandler handlers[]
Handlers, for diverse services.
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
GNUNET_ATS_AddressInformationCallback addr_info_cb
Callback to invoke when an address has performance changes.
Message handler for a specific message type.
const struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
static char * init
Set to the name of a service to start.
Definition: gnunet-arm.c:69
#define GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_RESPONSE
Type of the 'struct AddressListResponseMessage' sent by ATS to client with information about addresse...
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition: mq.c:353
static void mq_error_handler(void *cls, enum GNUNET_MQ_Error error)
Generic error handler, called with the appropriate error code and the same closure specified at the c...
#define GNUNET_MESSAGE_TYPE_ATS_RESERVATION_RESULT
Type of the 'struct ReservationResultMessage' sent by ATS to clients in response to a reservation req...
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
First message any client sends to ATS, used to self-identify (what type of client this is)...
Definition: ats.h:70
Performance monitoring client that wants to learn about changes in performance characteristics.
Definition: ats.h:49
Here is the call graph for this function:
Here is the caller graph for this function:

◆ reconnect_task()

static void reconnect_task ( void *  cls)
static

Re-establish the connection to the ATS service.

Parameters
clshandle to use to re-connect.

Definition at line 227 of file ats_api_performance.c.

References ph, reconnect(), and GNUNET_ATS_PerformanceHandle::task.

Referenced by do_reconnect().

228 {
229  struct GNUNET_ATS_PerformanceHandle *ph = cls;
230 
231  ph->task = NULL;
232  reconnect (ph);
233 }
static struct GNUNET_ATS_PerformanceHandle * ph
ATS performance handle used.
Definition: gnunet-ats.c:116
struct GNUNET_SCHEDULER_Task * task
Task to trigger reconnect.
ATS Handle to obtain and/or modify performance information.
static void reconnect(struct GNUNET_ATS_PerformanceHandle *ph)
Re-establish the connection to the ATS service.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ do_reconnect()

static void do_reconnect ( struct GNUNET_ATS_PerformanceHandle ph)
static

Reconnect to the ATS service, something went wrong.

Parameters
phhandle to reconnect

Definition at line 242 of file ats_api_performance.c.

References GNUNET_ATS_PerformanceHandle::addr_info_cb, GNUNET_ATS_PerformanceHandle::addr_info_cb_cls, GNUNET_ATS_PerformanceHandle::addresslist_head, GNUNET_ATS_PerformanceHandle::addresslist_tail, alh, GNUNET_ATS_PerformanceHandle::backoff, GNUNET_ATS_AddressListHandle::cb, GNUNET_ATS_AddressListHandle::cb_cls, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_MQ_destroy(), GNUNET_NO, GNUNET_SCHEDULER_add_delayed(), GNUNET_TIME_STD_BACKOFF, GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_ATS_PerformanceHandle::mq, GNUNET_ATS_ReservationContext::rcb, GNUNET_ATS_ReservationContext::rcb_cls, reconnect_task(), GNUNET_ATS_PerformanceHandle::reservation_head, GNUNET_ATS_PerformanceHandle::reservation_tail, GNUNET_ATS_PerformanceHandle::task, and GNUNET_BANDWIDTH_Value32NBO::value__.

Referenced by mq_error_handler().

243 {
246  struct GNUNET_BANDWIDTH_Value32NBO bandwidth_zero;
247 
248  if (NULL != ph->mq)
249  {
250  GNUNET_MQ_destroy (ph->mq);
251  ph->mq = NULL;
252  }
253  while (NULL != (rc = ph->reservation_head))
254  {
256  ph->reservation_tail,
257  rc);
258  if (NULL != rc->rcb)
259  rc->rcb (rc->rcb_cls,
260  NULL,
261  0,
263  GNUNET_free (rc);
264  }
265  bandwidth_zero.value__ = htonl (0);
266  while (NULL != (alh = ph->addresslist_head))
267  {
269  ph->addresslist_tail,
270  alh);
271  if (NULL != alh->cb)
272  alh->cb (alh->cb_cls,
273  NULL,
274  GNUNET_NO,
275  bandwidth_zero,
276  bandwidth_zero,
277  NULL);
278  GNUNET_free (alh);
279  }
280  if (NULL != ph->addr_info_cb)
281  {
282  /* Indicate reconnect */
284  NULL,
285  GNUNET_NO,
286  bandwidth_zero,
287  bandwidth_zero,
288  NULL);
289  }
293  ph);
294 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
struct GNUNET_ATS_AddressListHandle * addresslist_tail
Tail of linked list of pending address list requests.
struct GNUNET_ATS_ReservationContext * reservation_tail
Tail of linked list of pending reservation requests.
struct GNUNET_ATS_AddressListHandle * addresslist_head
Head of linked list of pending address list requests.
GNUNET_ATS_ReservationCallback rcb
Function to call on result.
struct GNUNET_ATS_ReservationContext * reservation_head
Head of linked list of pending reservation requests.
struct GNUNET_MQ_Handle * mq
Connection to ATS service.
void * rcb_cls
Closure for rcb.
#define GNUNET_NO
Definition: gnunet_common.h:81
Linked list of pending reservations.
GNUNET_ATS_AddressInformationCallback cb
Callback.
static struct GNUNET_ATS_AddressListHandle * alh
ATS address list handle used.
Definition: gnunet-ats.c:131
struct GNUNET_SCHEDULER_Task * task
Task to trigger reconnect.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
Definition: scheduler.c:1246
GNUNET_ATS_AddressInformationCallback addr_info_cb
Callback to invoke when an address has performance changes.
void * cb_cls
Callback closure for cb.
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
#define GNUNET_TIME_STD_BACKOFF(r)
Perform our standard exponential back-off calculation, starting at 1 ms and then going by a factor of...
32-bit bandwidth used for network exchange by GNUnet, in bytes per second.
static void reconnect_task(void *cls)
Re-establish the connection to the ATS service.
struct GNUNET_TIME_Relative backoff
Reconnect backoff delay.
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:824
void * addr_info_cb_cls
Closure for addr_info_cb.
#define GNUNET_free(ptr)
Wrapper around free.
Linked list of pending reservations.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_peer_information()

static int check_peer_information ( void *  cls,
const struct PeerInformationMessage pi 
)
static

We received a peer information message.

Validate and process it.

Parameters
clsour context with the callback
pithe message
Returns
GNUNET_OK if the message was well-formed

Definition at line 305 of file ats_api_performance.c.

References PeerInformationMessage::address_length, GNUNET_break, GNUNET_OK, GNUNET_SYSERR, PeerInformationMessage::header, plugin_name, PeerInformationMessage::plugin_name_length, and GNUNET_MessageHeader::size.

307 {
308  const char *plugin_address;
309  const char *plugin_name;
310  uint16_t plugin_address_length;
311  uint16_t plugin_name_length;
312 
313  plugin_address_length = ntohs (pi->address_length);
314  plugin_name_length = ntohs (pi->plugin_name_length);
315  plugin_address = (const char *) &pi[1];
316  plugin_name = &plugin_address[plugin_address_length];
317  if ( (plugin_address_length + plugin_name_length
318  + sizeof(struct PeerInformationMessage) != ntohs (pi->header.size)) ||
319  (plugin_name[plugin_name_length - 1] != '\0'))
320  {
321  GNUNET_break(0);
322  return GNUNET_SYSERR;
323  }
324  return GNUNET_OK;
325 }
uint16_t address_length
Definition: ats.h:294
uint16_t plugin_name_length
Definition: ats.h:299
struct GNUNET_MessageHeader header
Type is GNUNET_MESSAGE_TYPE_ATS_PEER_INFORMATION.
Definition: ats.h:289
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
static char * plugin_name
Solver plugin name as string.
#define GNUNET_SYSERR
Definition: gnunet_common.h:79

◆ handle_peer_information()

static void handle_peer_information ( void *  cls,
const struct PeerInformationMessage pi 
)
static

We received a peer information message.

Validate and process it.

Parameters
clsour context with the callback
pithe message
Returns
GNUNET_OK if the message was well-formed

Definition at line 336 of file ats_api_performance.c.

References GNUNET_ATS_PerformanceHandle::addr_info_cb, GNUNET_ATS_PerformanceHandle::addr_info_cb_cls, GNUNET_HELLO_Address::address, PeerInformationMessage::address_active, GNUNET_HELLO_Address::address_length, PeerInformationMessage::address_length, PeerInformationMessage::address_local_info, PeerInformationMessage::bandwidth_in, PeerInformationMessage::bandwidth_out, GNUNET_ATS_properties_ntoh(), GNUNET_HELLO_Address::local_info, PeerInformationMessage::peer, GNUNET_HELLO_Address::peer, ph, plugin_name, PeerInformationMessage::properties, and GNUNET_HELLO_Address::transport_name.

338 {
339  struct GNUNET_ATS_PerformanceHandle *ph = cls;
340  const char *plugin_address;
341  const char *plugin_name;
343  uint16_t plugin_address_length;
344  int addr_active;
345  struct GNUNET_ATS_Properties prop;
346 
347  if (NULL == ph->addr_info_cb)
348  return;
349  plugin_address_length = ntohs (pi->address_length);
350  addr_active = (int) ntohl (pi->address_active);
351  plugin_address = (const char *) &pi[1];
352  plugin_name = &plugin_address[plugin_address_length];
353 
355  &pi->properties);
356  address.peer = pi->peer;
357  address.local_info = (enum GNUNET_HELLO_AddressInfo) ntohl (pi->address_local_info);
358  address.address = plugin_address;
359  address.address_length = plugin_address_length;
360  address.transport_name = plugin_name;
362  &address,
363  addr_active,
364  pi->bandwidth_out,
365  pi->bandwidth_in,
366  &prop);
367 }
uint16_t address_length
Definition: ats.h:294
static struct GNUNET_ATS_PerformanceHandle * ph
ATS performance handle used.
Definition: gnunet-ats.c:116
struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in
Definition: ats.h:324
uint32_t address_local_info
Local-only information of the address, see enum GNUNET_HELLO_AddressInfo.
Definition: ats.h:335
ATS performance characteristics for an address.
struct GNUNET_ATS_PropertiesNBO properties
Performance properties of the address.
Definition: ats.h:329
struct GNUNET_PeerIdentity peer
Definition: ats.h:304
struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out
Definition: ats.h:319
GNUNET_ATS_AddressInformationCallback addr_info_cb
Callback to invoke when an address has performance changes.
static char * plugin_name
Solver plugin name as string.
ATS Handle to obtain and/or modify performance information.
void GNUNET_ATS_properties_ntoh(struct GNUNET_ATS_Properties *hbo, const struct GNUNET_ATS_PropertiesNBO *nbo)
Convert ATS properties from network to host byte order.
An address for communicating with a peer.
uint32_t address_active
Definition: ats.h:309
GNUNET_HELLO_AddressInfo
Additional local information about an address.
static char * address
GNS address for this phone.
void * addr_info_cb_cls
Closure for addr_info_cb.
Here is the call graph for this function:

◆ handle_reservation_result()

static void handle_reservation_result ( void *  cls,
const struct ReservationResultMessage rr 
)
static

We received a reservation result message.

Validate and process it.

Parameters
clsour context with the callback
rrthe message

Definition at line 377 of file ats_api_performance.c.

References ReservationResultMessage::amount, GNUNET_ATS_reserve_bandwidth(), GNUNET_break, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_memcmp, GNUNET_TIME_relative_ntoh(), GNUNET_YES, GNUNET_ATS_ReservationContext::peer, ReservationResultMessage::peer, ph, GNUNET_ATS_ReservationContext::rcb, GNUNET_ATS_ReservationContext::rcb_cls, reconnect(), ReservationResultMessage::res_delay, GNUNET_ATS_PerformanceHandle::reservation_head, GNUNET_ATS_PerformanceHandle::reservation_tail, and GNUNET_ATS_ReservationContext::undo.

379 {
380  struct GNUNET_ATS_PerformanceHandle *ph = cls;
382  int32_t amount;
383 
384  amount = ntohl (rr->amount);
385  rc = ph->reservation_head;
386  if (0 != GNUNET_memcmp (&rr->peer,
387  &rc->peer))
388  {
389  GNUNET_break(0);
390  reconnect (ph);
391  return;
392  }
394  ph->reservation_tail,
395  rc);
396  if ( (0 == amount) ||
397  (NULL != rc->rcb) )
398  {
399  /* tell client if not cancelled */
400  if (NULL != rc->rcb)
401  rc->rcb (rc->rcb_cls,
402  &rr->peer,
403  amount,
405  GNUNET_free (rc);
406  return;
407  }
408  /* amount non-zero, but client cancelled, consider undo! */
409  if (GNUNET_YES != rc->undo)
410  {
411  GNUNET_free (rc);
412  return; /* do not try to undo failed undos or negative amounts */
413  }
414  GNUNET_free (rc);
415  (void) GNUNET_ATS_reserve_bandwidth (ph,
416  &rr->peer,
417  -amount,
418  NULL, NULL);
419 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
struct GNUNET_ATS_ReservationContext * reservation_tail
Tail of linked list of pending reservation requests.
static struct GNUNET_ATS_PerformanceHandle * ph
ATS performance handle used.
Definition: gnunet-ats.c:116
GNUNET_ATS_ReservationCallback rcb
Function to call on result.
struct GNUNET_ATS_ReservationContext * reservation_head
Head of linked list of pending reservation requests.
void * rcb_cls
Closure for rcb.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
struct GNUNET_PeerIdentity peer
Definition: ats.h:414
int undo
Do we need to undo this reservation if it succeeded? Set to GNUNET_YES if a reservation is cancelled...
struct GNUNET_ATS_ReservationContext * GNUNET_ATS_reserve_bandwidth(struct GNUNET_ATS_PerformanceHandle *ph, const struct GNUNET_PeerIdentity *peer, int32_t amount, GNUNET_ATS_ReservationCallback rcb, void *rcb_cls)
Reserve inbound bandwidth from the given peer.
struct GNUNET_TIME_Relative GNUNET_TIME_relative_ntoh(struct GNUNET_TIME_RelativeNBO a)
Convert relative time from network byte order.
Definition: time.c:638
struct GNUNET_PeerIdentity peer
Target peer.
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
ATS Handle to obtain and/or modify performance information.
static void reconnect(struct GNUNET_ATS_PerformanceHandle *ph)
Re-establish the connection to the ATS service.
#define GNUNET_YES
Definition: gnunet_common.h:80
struct GNUNET_TIME_RelativeNBO res_delay
Definition: ats.h:419
#define GNUNET_free(ptr)
Wrapper around free.
Linked list of pending reservations.
Here is the call graph for this function:

◆ check_address_list()

static int check_address_list ( void *  cls,
const struct PeerInformationMessage pi 
)
static

We received a PeerInformationMessage.

Validate it.

Parameters
clsour context with the callback
pithe message
Returns
GNUNET_OK if the message was well-formed

Definition at line 430 of file ats_api_performance.c.

References PeerInformationMessage::address_length, GNUNET_break, GNUNET_OK, GNUNET_SYSERR, PeerInformationMessage::header, plugin_name, PeerInformationMessage::plugin_name_length, and GNUNET_MessageHeader::size.

432 {
433  const char *plugin_address;
434  const char *plugin_name;
435  uint16_t plugin_address_length;
436  uint16_t plugin_name_length;
437 
438  plugin_address_length = ntohs (pi->address_length);
439  plugin_name_length = ntohs (pi->plugin_name_length);
440  plugin_address = (const char *) &pi[1];
441  plugin_name = &plugin_address[plugin_address_length];
442  if ( (plugin_address_length + plugin_name_length
443  + sizeof (struct PeerInformationMessage) != ntohs (pi->header.size)) ||
444  (plugin_name[plugin_name_length - 1] != '\0') )
445  {
446  GNUNET_break(0);
447  return GNUNET_SYSERR;
448  }
449  return GNUNET_OK;
450 }
uint16_t address_length
Definition: ats.h:294
uint16_t plugin_name_length
Definition: ats.h:299
struct GNUNET_MessageHeader header
Type is GNUNET_MESSAGE_TYPE_ATS_PEER_INFORMATION.
Definition: ats.h:289
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
static char * plugin_name
Solver plugin name as string.
#define GNUNET_SYSERR
Definition: gnunet_common.h:79

◆ handle_address_list()

static void handle_address_list ( void *  cls,
const struct PeerInformationMessage pi 
)
static

We received a GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_RESPONSE.

Process it.

Parameters
clsour context with the callback
pithe message

Definition at line 461 of file ats_api_performance.c.

References GNUNET_HELLO_Address::address, PeerInformationMessage::address_active, GNUNET_HELLO_Address::address_length, PeerInformationMessage::address_length, GNUNET_ATS_PerformanceHandle::addresslist_head, GNUNET_ATS_PerformanceHandle::addresslist_tail, alh, GNUNET_ATS_AddressListHandle::all_addresses, PeerInformationMessage::bandwidth_in, PeerInformationMessage::bandwidth_out, GNUNET_ATS_AddressListHandle::cb, GNUNET_ATS_AddressListHandle::cb_cls, GNUNET_ATS_properties_ntoh(), GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_i2s(), GNUNET_is_zero, GNUNET_NO, GNUNET_YES, GNUNET_ATS_AddressListHandle::id, id, PeerInformationMessage::id, LOG, GNUNET_ATS_ReservationContext::next, GNUNET_ATS_AddressListHandle::next, PeerInformationMessage::peer, GNUNET_HELLO_Address::peer, ph, plugin_name, PeerInformationMessage::plugin_name_length, PeerInformationMessage::properties, GNUNET_HELLO_Address::transport_name, and GNUNET_BANDWIDTH_Value32NBO::value__.

463 {
464  struct GNUNET_ATS_PerformanceHandle *ph = cls;
467  const char *plugin_address;
468  const char *plugin_name;
470  struct GNUNET_PeerIdentity allzeros;
471  struct GNUNET_BANDWIDTH_Value32NBO bandwidth_zero;
472  struct GNUNET_ATS_Properties prop;
473  uint16_t plugin_address_length;
474  uint16_t plugin_name_length;
475  uint32_t active;
476  uint32_t id;
477 
478  id = ntohl (pi->id);
479  active = ntohl (pi->address_active);
480  plugin_address_length = ntohs (pi->address_length);
481  plugin_name_length = ntohs (pi->plugin_name_length);
482  plugin_address = (const char *) &pi[1];
483  plugin_name = &plugin_address[plugin_address_length];
485  "Received ATS_ADDRESSLIST_RESPONSE message for peer %s and plugin %s\n",
486  GNUNET_i2s (&pi->peer),
487  plugin_name);
488 
489  next = ph->addresslist_head;
490  while (NULL != (alh = next))
491  {
492  next = alh->next;
493  if (alh->id == id)
494  break;
495  }
496  if (NULL == alh)
497  return; /* was canceled */
498 
499  memset (&allzeros, '\0', sizeof (allzeros));
500  if ( (0 == GNUNET_is_zero (&pi->peer)) &&
501  (0 == plugin_name_length) &&
502  (0 == plugin_address_length) )
503  {
504  /* Done */
506  "Received last message for ATS_ADDRESSLIST_RESPONSE\n");
507  bandwidth_zero.value__ = htonl (0);
509  ph->addresslist_tail,
510  alh);
511  if (NULL != alh->cb)
512  alh->cb (alh->cb_cls,
513  NULL,
514  GNUNET_NO,
515  bandwidth_zero,
516  bandwidth_zero,
517  NULL);
518  GNUNET_free (alh);
519  return;
520  }
521 
522  address.peer = pi->peer;
523  address.address = plugin_address;
524  address.address_length = plugin_address_length;
525  address.transport_name = plugin_name;
526  if ( ( (GNUNET_YES == alh->all_addresses) ||
527  (GNUNET_YES == active) ) &&
528  (NULL != alh->cb) )
529  {
531  &pi->properties);
532  alh->cb (alh->cb_cls,
533  &address,
534  active,
535  pi->bandwidth_out,
536  pi->bandwidth_in,
537  &prop);
538  }
539 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
struct GNUNET_ATS_AddressListHandle * addresslist_tail
Tail of linked list of pending address list requests.
uint16_t address_length
Definition: ats.h:294
int all_addresses
Return all or used address only.
struct GNUNET_ATS_AddressListHandle * addresslist_head
Head of linked list of pending address list requests.
static struct GNUNET_ATS_PerformanceHandle * ph
ATS performance handle used.
Definition: gnunet-ats.c:116
struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in
Definition: ats.h:324
uint16_t plugin_name_length
Definition: ats.h:299
#define GNUNET_NO
Definition: gnunet_common.h:81
static struct GNUNET_IDENTITY_Handle * id
Handle to identity service.
struct GNUNET_ATS_AddressListHandle * next
Kept in a DLL.
ATS performance characteristics for an address.
struct GNUNET_ATS_PropertiesNBO properties
Performance properties of the address.
Definition: ats.h:329
struct GNUNET_PeerIdentity peer
Definition: ats.h:304
Linked list of pending reservations.
GNUNET_ATS_AddressInformationCallback cb
Callback.
static struct GNUNET_ATS_AddressListHandle * alh
ATS address list handle used.
Definition: gnunet-ats.c:131
struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out
Definition: ats.h:319
void * cb_cls
Callback closure for cb.
#define LOG(kind,...)
static char * plugin_name
Solver plugin name as string.
32-bit bandwidth used for network exchange by GNUnet, in bytes per second.
#define GNUNET_is_zero(a)
Check that memory in a is all zeros.
ATS Handle to obtain and/or modify performance information.
uint32_t id
Request multiplexing.
The identity of the host (wraps the signing key of the peer).
void GNUNET_ATS_properties_ntoh(struct GNUNET_ATS_Properties *hbo, const struct GNUNET_ATS_PropertiesNBO *nbo)
Convert ATS properties from network to host byte order.
An address for communicating with a peer.
#define GNUNET_YES
Definition: gnunet_common.h:80
uint32_t address_active
Definition: ats.h:309
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).
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:

◆ mq_error_handler()

static void mq_error_handler ( void *  cls,
enum GNUNET_MQ_Error  error 
)
static

Generic error handler, called with the appropriate error code and the same closure specified at the creation of the message queue.

Not every message queue implementation supports an error handler.

Parameters
clsclosure with the struct GNUNET_ATS_PerformanceHandle *
errorerror code

Definition at line 551 of file ats_api_performance.c.

References do_reconnect(), and ph.

Referenced by reconnect().

553 {
554  struct GNUNET_ATS_PerformanceHandle *ph = cls;
555 
556  do_reconnect (ph);
557 }
static struct GNUNET_ATS_PerformanceHandle * ph
ATS performance handle used.
Definition: gnunet-ats.c:116
static void do_reconnect(struct GNUNET_ATS_PerformanceHandle *ph)
Reconnect to the ATS service, something went wrong.
ATS Handle to obtain and/or modify performance information.
Here is the call graph for this function:
Here is the caller graph for this function: