GNUnet  0.10.x
Data Structures | Macros | Functions
ats_api_scheduling.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_scheduling.c:

Go to the source code of this file.

Data Structures

struct  GNUNET_ATS_AddressRecord
 Information we track per address, incoming or outgoing. More...
 
struct  GNUNET_ATS_SchedulingHandle
 Handle to the ATS subsystem for bandwidth/transport scheduling information. More...
 

Macros

#define INTERFACE_PROCESSING_INTERVAL   GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MINUTES, 2)
 How frequently do we scan the interfaces for changes to the addresses? More...
 
#define LOG(kind, ...)   GNUNET_log_from(kind, "ats-scheduling-api", __VA_ARGS__)
 
#define NOT_FOUND   0
 Session ID we use if there is no session / slot. More...
 

Functions

static void reconnect (struct GNUNET_ATS_SchedulingHandle *sh)
 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 force_reconnect (struct GNUNET_ATS_SchedulingHandle *sh)
 Disconnect from ATS and then reconnect. More...
 
static struct GNUNET_ATS_AddressRecordfind_session (struct GNUNET_ATS_SchedulingHandle *sh, uint32_t session_id, const struct GNUNET_PeerIdentity *peer)
 Find the session object corresponding to the given session ID. More...
 
static uint32_t find_empty_session_slot (struct GNUNET_ATS_SchedulingHandle *sh)
 Get an available session ID. More...
 
static uint32_t find_session_id (struct GNUNET_ATS_SchedulingHandle *sh, struct GNUNET_ATS_Session *session, const struct GNUNET_HELLO_Address *address)
 Get the ID for the given session object. More...
 
static void release_session (struct GNUNET_ATS_SchedulingHandle *sh, uint32_t session_id)
 Release the session slot from the session table (ATS service is also done using it). More...
 
static void handle_ats_session_release (void *cls, const struct GNUNET_ATS_SessionReleaseMessage *srm)
 Type of a function to call when we receive a session release message from the service. More...
 
static void handle_ats_address_suggestion (void *cls, const struct AddressSuggestionMessage *m)
 Type of a function to call when we receive a address suggestion message from the service. More...
 
static void error_handler (void *cls, enum GNUNET_MQ_Error error)
 We encountered an error handling the MQ to the ATS service. More...
 
static void send_add_address_message (struct GNUNET_ATS_SchedulingHandle *sh, const struct GNUNET_ATS_AddressRecord *ar)
 Generate and transmit the struct AddressAddMessage for the given address record. More...
 
struct GNUNET_ATS_SchedulingHandleGNUNET_ATS_scheduling_init (const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_ATS_AddressSuggestionCallback suggest_cb, void *suggest_cb_cls)
 Initialize the ATS subsystem. More...
 
void GNUNET_ATS_scheduling_done (struct GNUNET_ATS_SchedulingHandle *sh)
 Client is done with ATS scheduling, release resources. More...
 
struct GNUNET_ATS_AddressRecordGNUNET_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. More...
 
void GNUNET_ATS_address_add_session (struct GNUNET_ATS_AddressRecord *ar, struct GNUNET_ATS_Session *session)
 An address was used to initiate a session. More...
 
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. More...
 
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. More...
 
void GNUNET_ATS_address_destroy (struct GNUNET_ATS_AddressRecord *ar)
 An address got destroyed, stop using it as a valid address. More...
 

Detailed Description

automatic transport selection and outbound bandwidth determination

Author
Christian Grothoff
Matthias Wachs

TODO:

Definition in file ats_api_scheduling.c.

Macro Definition Documentation

◆ INTERFACE_PROCESSING_INTERVAL

#define INTERFACE_PROCESSING_INTERVAL   GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MINUTES, 2)

How frequently do we scan the interfaces for changes to the addresses?

Definition at line 41 of file ats_api_scheduling.c.

◆ LOG

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

◆ NOT_FOUND

#define NOT_FOUND   0

Session ID we use if there is no session / slot.

Definition at line 48 of file ats_api_scheduling.c.

Referenced by find_empty_session_slot(), find_session_id(), GNUNET_ATS_address_add(), and release_session().

Function Documentation

◆ reconnect()

static void reconnect ( struct GNUNET_ATS_SchedulingHandle sh)
static

Re-establish the connection to the ATS service.

Parameters
shhandle to use to re-connect.

Definition at line 509 of file ats_api_scheduling.c.

References GNUNET_ATS_SchedulingHandle::cfg, error_handler(), force_reconnect(), GNUNET_assert, GNUNET_break, GNUNET_CLIENT_connect(), GNUNET_MESSAGE_TYPE_ATS_ADDRESS_SUGGESTION, GNUNET_MESSAGE_TYPE_ATS_SESSION_RELEASE, GNUNET_MESSAGE_TYPE_ATS_START, GNUNET_MQ_handler_end, GNUNET_MQ_hd_fixed_size, GNUNET_MQ_msg, GNUNET_MQ_send(), init, GNUNET_ATS_SchedulingHandle::mq, send_add_address_message(), GNUNET_ATS_SchedulingHandle::session_array, GNUNET_ATS_SchedulingHandle::session_array_size, ClientStartMessage::start_flag, and START_FLAG_SCHEDULING.

Referenced by GNUNET_ATS_scheduling_init(), and reconnect_task().

510 {
512  GNUNET_MQ_hd_fixed_size(ats_session_release,
515  sh),
516  GNUNET_MQ_hd_fixed_size(ats_address_suggestion,
519  sh),
521  };
522  struct GNUNET_MQ_Envelope *ev;
523  struct ClientStartMessage *init;
524  unsigned int i;
525  struct GNUNET_ATS_AddressRecord *ar;
526 
527  GNUNET_assert(NULL == sh->mq);
528  sh->mq = GNUNET_CLIENT_connect(sh->cfg,
529  "ats",
530  handlers,
531  &error_handler,
532  sh);
533  if (NULL == sh->mq)
534  {
535  GNUNET_break(0);
536  force_reconnect(sh);
537  return;
538  }
539  ev = GNUNET_MQ_msg(init,
541  init->start_flag = htonl(START_FLAG_SCHEDULING);
542  GNUNET_MQ_send(sh->mq, ev);
543  if (NULL == sh->mq)
544  return;
545  for (i = 0; i < sh->session_array_size; i++)
546  {
547  ar = sh->session_array[i];
548  if (NULL == ar)
549  continue;
550  send_add_address_message(sh, ar);
551  if (NULL == sh->mq)
552  return;
553  }
554 }
#define GNUNET_MESSAGE_TYPE_ATS_START
Type of the &#39;struct ClientStartMessage&#39; sent by clients to ATS to identify the type of the client...
static void send_add_address_message(struct GNUNET_ATS_SchedulingHandle *sh, const struct GNUNET_ATS_AddressRecord *ar)
Generate and transmit the struct AddressAddMessage for the given address record.
struct GNUNET_ATS_AddressRecord ** session_array
Array of session objects (we need to translate them to numbers and back for the protocol; the offset ...
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:900
const struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
uint32_t start_flag
NBO value of an enum StartFlag.
Definition: ats.h:77
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_MESSAGE_TYPE_ATS_ADDRESS_SUGGESTION
Type of the &#39;struct AddressSuggestionMessage&#39; sent by ATS to clients to suggest switching to a differ...
#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
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
#define GNUNET_MESSAGE_TYPE_ATS_SESSION_RELEASE
Type of the &#39;struct SessionReleaseMessage&#39; sent by ATS to client to confirm that a session ID was des...
static struct GNUNET_CADET_MessageHandler handlers[]
Handlers, for diverse services.
This is a scheduling client (aka transport service)
Definition: ats.h:41
unsigned int session_array_size
Size of the session_array.
Information we track per address, incoming or outgoing.
static void error_handler(void *cls, enum GNUNET_MQ_Error error)
We encountered an error handling the MQ to the ATS service.
Message handler for a specific message type.
static char * init
Set to the name of a service to start.
Definition: gnunet-arm.c:69
ATS Service suggests to the transport service to use the address identified by the given session_id f...
Definition: ats.h:237
struct GNUNET_MQ_Handle * mq
Message queue for sending requests to the ATS service.
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:351
Message sent by ATS service to client to confirm that it is done using the given session ID...
Definition: ats.h:211
#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:68
static void force_reconnect(struct GNUNET_ATS_SchedulingHandle *sh)
Disconnect from ATS and then reconnect.
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 161 of file ats_api_scheduling.c.

References reconnect(), GNUNET_ATS_AddressRecord::sh, and GNUNET_ATS_SchedulingHandle::task.

Referenced by force_reconnect().

162 {
163  struct GNUNET_ATS_SchedulingHandle *sh = cls;
164 
165  sh->task = NULL;
166  reconnect(sh);
167 }
struct GNUNET_SCHEDULER_Task * task
Task to trigger reconnect.
Handle to the ATS subsystem for bandwidth/transport scheduling information.
static struct SolverHandle * sh
static void reconnect(struct GNUNET_ATS_SchedulingHandle *sh)
Re-establish the connection to the ATS service.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ force_reconnect()

static void force_reconnect ( struct GNUNET_ATS_SchedulingHandle sh)
static

Disconnect from ATS and then reconnect.

Parameters
shour handle

Definition at line 176 of file ats_api_scheduling.c.

References GNUNET_ATS_SchedulingHandle::backoff, GNUNET_BANDWIDTH_ZERO, GNUNET_MQ_destroy(), GNUNET_SCHEDULER_add_delayed(), GNUNET_TIME_STD_BACKOFF, GNUNET_ATS_SchedulingHandle::mq, reconnect_task(), GNUNET_ATS_SchedulingHandle::suggest_cb, GNUNET_ATS_SchedulingHandle::suggest_cb_cls, and GNUNET_ATS_SchedulingHandle::task.

Referenced by error_handler(), handle_ats_address_suggestion(), reconnect(), and release_session().

177 {
178  if (NULL != sh->mq)
179  {
180  GNUNET_MQ_destroy(sh->mq);
181  sh->mq = NULL;
182  }
183  sh->suggest_cb(sh->suggest_cb_cls,
184  NULL, NULL, NULL,
190  sh);
191 }
struct GNUNET_SCHEDULER_Task * task
Task to trigger reconnect.
GNUNET_ATS_AddressSuggestionCallback suggest_cb
Callback to invoke on suggestions.
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
void * suggest_cb_cls
Closure for suggest_cb.
#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_TIME_Relative backoff
Reconnect backoff delay.
#define GNUNET_BANDWIDTH_ZERO
Convenience definition to use for 0-bandwidth.
struct GNUNET_MQ_Handle * mq
Message queue for sending requests to the ATS service.
static void reconnect_task(void *cls)
Re-establish the connection to the ATS service.
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:821
Here is the call graph for this function:
Here is the caller graph for this function:

◆ find_session()

static struct GNUNET_ATS_AddressRecord* find_session ( struct GNUNET_ATS_SchedulingHandle sh,
uint32_t  session_id,
const struct GNUNET_PeerIdentity peer 
)
static

Find the session object corresponding to the given session ID.

Parameters
shour handle
session_idcurrent session ID
peerpeer the session belongs to
Returns
the session object (or NULL)

Definition at line 203 of file ats_api_scheduling.c.

References GNUNET_ATS_AddressRecord::address, GNUNET_break, GNUNET_memcmp, GNUNET_HELLO_Address::peer, GNUNET_ATS_SchedulingHandle::session_array, GNUNET_ATS_SchedulingHandle::session_array_size, and session_id.

Referenced by handle_ats_address_suggestion().

206 {
207  struct GNUNET_ATS_AddressRecord *ar;
208 
209  if (session_id >= sh->session_array_size)
210  {
211  GNUNET_break(0);
212  return NULL;
213  }
214  if (0 == session_id)
215  return NULL;
216  ar = sh->session_array[session_id];
217  if (NULL == ar)
218  {
219  GNUNET_break(0);
220  return NULL;
221  }
222  if (NULL == ar->address)
223  {
224  /* address was destroyed in the meantime, this can happen
225  as we communicate asynchronously with the ATS service. */
226  return NULL;
227  }
228  if (0 != GNUNET_memcmp(peer,
229  &ar->address->peer))
230  {
231  GNUNET_break(0);
232  return NULL;
233  }
234  return ar;
235 }
struct GNUNET_ATS_AddressRecord ** session_array
Array of session objects (we need to translate them to numbers and back for the protocol; the offset ...
static struct GNUNET_HashCode session_id
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
unsigned int session_array_size
Size of the session_array.
Information we track per address, incoming or outgoing.
struct GNUNET_PeerIdentity peer
For which peer is this an address?
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
struct GNUNET_HELLO_Address * address
Address data.
Here is the caller graph for this function:

◆ find_empty_session_slot()

static uint32_t find_empty_session_slot ( struct GNUNET_ATS_SchedulingHandle sh)
static

Get an available session ID.

Parameters
shour handle
Returns
an unused slot, but never NOT_FOUND (0)

Definition at line 245 of file ats_api_scheduling.c.

References GNUNET_array_grow, GNUNET_assert, NOT_FOUND, GNUNET_ATS_SchedulingHandle::session_array, and GNUNET_ATS_SchedulingHandle::session_array_size.

Referenced by GNUNET_ATS_address_add().

246 {
247  static uint32_t off;
248  uint32_t i;
249 
251  i = 0;
252  while (((NOT_FOUND == off) ||
253  (NULL != sh->session_array[off % sh->session_array_size])) &&
254  (i < sh->session_array_size))
255  {
256  off++;
257  i++;
258  }
259  if ((NOT_FOUND != off % sh->session_array_size) &&
260  (NULL == sh->session_array[off % sh->session_array_size]))
261  return off;
262  i = sh->session_array_size;
264  sh->session_array_size,
265  sh->session_array_size * 2);
266  return i;
267 }
struct GNUNET_ATS_AddressRecord ** session_array
Array of session objects (we need to translate them to numbers and back for the protocol; the offset ...
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define NOT_FOUND
Session ID we use if there is no session / slot.
#define GNUNET_array_grow(arr, size, tsize)
Grow a well-typed (!) array.
unsigned int session_array_size
Size of the session_array.
Here is the caller graph for this function:

◆ find_session_id()

static uint32_t find_session_id ( struct GNUNET_ATS_SchedulingHandle sh,
struct GNUNET_ATS_Session session,
const struct GNUNET_HELLO_Address address 
)
static

Get the ID for the given session object.

Parameters
shour handle
sessionsession object
addressthe address we are looking for
Returns
the session id or NOT_FOUND for error

Definition at line 279 of file ats_api_scheduling.c.

References GNUNET_ATS_AddressRecord::address, GNUNET_break, GNUNET_HELLO_address_cmp(), GNUNET_memcmp, GNUNET_NO, GNUNET_ATS_AddressRecord::in_destroy, NOT_FOUND, GNUNET_HELLO_Address::peer, GNUNET_ATS_AddressRecord::session, GNUNET_ATS_SchedulingHandle::session_array, and GNUNET_ATS_SchedulingHandle::session_array_size.

Referenced by GNUNET_ATS_address_add().

282 {
283  uint32_t i;
284 
285  if (NULL == address)
286  {
287  GNUNET_break(0);
288  return NOT_FOUND;
289  }
290  for (i = 1; i < sh->session_array_size; i++)
291  if ((NULL != sh->session_array[i]) &&
292  (GNUNET_NO == sh->session_array[i]->in_destroy) &&
293  ((session == sh->session_array[i]->session) ||
294  (NULL == sh->session_array[i]->session)) &&
295  (0 == GNUNET_memcmp(&address->peer,
296  &sh->session_array[i]->address->peer)) &&
297  (0 == GNUNET_HELLO_address_cmp(address,
298  sh->session_array[i]->address)))
299  return i;
300  return NOT_FOUND;
301 }
struct GNUNET_ATS_AddressRecord ** session_array
Array of session objects (we need to translate them to numbers and back for the protocol; the offset ...
#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...
struct GNUNET_ATS_Session * session
Session handle.
int GNUNET_HELLO_address_cmp(const struct GNUNET_HELLO_Address *a1, const struct GNUNET_HELLO_Address *a2)
Compare two addresses.
Definition: address.c:130
#define NOT_FOUND
Session ID we use if there is no session / slot.
unsigned int session_array_size
Size of the session_array.
struct GNUNET_PeerIdentity peer
For which peer is this an address?
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
struct GNUNET_HELLO_Address * address
Address data.
int in_destroy
We&#39;re about to destroy this address record, just ATS does not know this yet.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ release_session()

static void release_session ( struct GNUNET_ATS_SchedulingHandle sh,
uint32_t  session_id 
)
static

Release the session slot from the session table (ATS service is also done using it).

Parameters
shour handle
session_ididentifies session that is no longer valid

Definition at line 312 of file ats_api_scheduling.c.

References GNUNET_ATS_AddressRecord::address, force_reconnect(), GNUNET_break, GNUNET_free, GNUNET_HELLO_address_free, NOT_FOUND, GNUNET_ATS_AddressRecord::session, GNUNET_ATS_SchedulingHandle::session_array, GNUNET_ATS_SchedulingHandle::session_array_size, and session_id.

Referenced by handle_ats_session_release().

314 {
315  struct GNUNET_ATS_AddressRecord *ar;
316 
317  if (NOT_FOUND == session_id)
318  return;
319  if (session_id >= sh->session_array_size)
320  {
321  GNUNET_break(0);
322  force_reconnect(sh);
323  return;
324  }
325  /* this slot should have been removed from remove_session before */
326  ar = sh->session_array[session_id];
327  if (NULL != ar->session)
328  {
329  GNUNET_break(0);
330  force_reconnect(sh);
331  return;
332  }
334  GNUNET_free(ar);
335  sh->session_array[session_id] = NULL;
336 }
struct GNUNET_ATS_AddressRecord ** session_array
Array of session objects (we need to translate them to numbers and back for the protocol; the offset ...
static struct GNUNET_HashCode session_id
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
struct GNUNET_ATS_Session * session
Session handle.
#define NOT_FOUND
Session ID we use if there is no session / slot.
unsigned int session_array_size
Size of the session_array.
Information we track per address, incoming or outgoing.
struct GNUNET_HELLO_Address * address
Address data.
#define GNUNET_HELLO_address_free(addr)
Free an address.
#define GNUNET_free(ptr)
Wrapper around free.
static void force_reconnect(struct GNUNET_ATS_SchedulingHandle *sh)
Disconnect from ATS and then reconnect.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ handle_ats_session_release()

static void handle_ats_session_release ( void *  cls,
const struct GNUNET_ATS_SessionReleaseMessage srm 
)
static

Type of a function to call when we receive a session release message from the service.

Parameters
clsthe struct GNUNET_ATS_SchedulingHandle
srmmessage received

Definition at line 347 of file ats_api_scheduling.c.

References release_session(), GNUNET_ATS_SessionReleaseMessage::session_id, and GNUNET_ATS_AddressRecord::sh.

349 {
350  struct GNUNET_ATS_SchedulingHandle *sh = cls;
351 
352  /* Note: peer field in srm not necessary right now,
353  but might be good to have in the future */
354  release_session(sh,
355  ntohl(srm->session_id));
356 }
Handle to the ATS subsystem for bandwidth/transport scheduling information.
uint32_t session_id
Number the client used to identify the session.
Definition: ats.h:220
static struct SolverHandle * sh
static void release_session(struct GNUNET_ATS_SchedulingHandle *sh, uint32_t session_id)
Release the session slot from the session table (ATS service is also done using it).
Here is the call graph for this function:

◆ handle_ats_address_suggestion()

static void handle_ats_address_suggestion ( void *  cls,
const struct AddressSuggestionMessage m 
)
static

Type of a function to call when we receive a address suggestion message from the service.

Parameters
clsthe struct GNUNET_ATS_SchedulingHandle
mmessage received

Definition at line 367 of file ats_api_scheduling.c.

References GNUNET_ATS_AddressRecord::address, GNUNET_ATS_SchedulingHandle::backoff, AddressSuggestionMessage::bandwidth_in, AddressSuggestionMessage::bandwidth_out, find_session(), force_reconnect(), GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_HELLO_address_check_option(), GNUNET_HELLO_ADDRESS_INFO_INBOUND, GNUNET_i2s(), GNUNET_TIME_UNIT_ZERO, GNUNET_YES, GNUNET_ATS_AddressRecord::in_destroy, LOG, AddressSuggestionMessage::peer, GNUNET_HELLO_Address::peer, GNUNET_ATS_AddressRecord::session, session_id, AddressSuggestionMessage::session_id, GNUNET_ATS_AddressRecord::sh, GNUNET_ATS_AddressRecord::slot, GNUNET_ATS_SchedulingHandle::suggest_cb, GNUNET_ATS_SchedulingHandle::suggest_cb_cls, GNUNET_HELLO_Address::transport_name, and GNUNET_BANDWIDTH_Value32NBO::value__.

369 {
370  struct GNUNET_ATS_SchedulingHandle *sh = cls;
371  struct GNUNET_ATS_AddressRecord *ar;
372  uint32_t session_id;
373 
374  session_id = ntohl(m->session_id);
375  if (0 == session_id)
376  {
377  GNUNET_break(0);
378  force_reconnect(sh);
379  return;
380  }
381  ar = find_session(sh,
382  session_id,
383  &m->peer);
384  if (NULL == ar)
385  {
386  GNUNET_break(0);
387  force_reconnect(sh);
388  return;
389  }
390  if (NULL == sh->suggest_cb)
391  return;
392  if (GNUNET_YES == ar->in_destroy)
393  {
394  /* ignore suggestion, as this address is dying, unless BW is 0,
395  in that case signal 'disconnect' via BW 0 */
396  if ((0 == ntohl(m->bandwidth_out.value__)) &&
397  (0 == ntohl(m->bandwidth_in.value__)))
398  {
400  "ATS suggests disconnect from peer `%s' with BW %u/%u\n",
401  GNUNET_i2s(&ar->address->peer),
402  (unsigned int)ntohl(m->bandwidth_out.value__),
403  (unsigned int)ntohl(m->bandwidth_in.value__));
404  sh->suggest_cb(sh->suggest_cb_cls,
405  &m->peer,
406  NULL,
407  NULL,
408  m->bandwidth_out,
409  m->bandwidth_in);
410  }
411  return;
412  }
413  if ((NULL == ar->session) &&
416  {
417  GNUNET_break(0);
418  return;
419  }
422  "ATS suggests address slot %u for peer `%s' using plugin %s\n",
423  ar->slot,
424  GNUNET_i2s(&ar->address->peer),
425  ar->address->transport_name);
426  sh->suggest_cb(sh->suggest_cb_cls,
427  &m->peer,
428  ar->address,
429  ar->session,
430  m->bandwidth_out,
431  m->bandwidth_in);
432 }
static struct GNUNET_ATS_AddressRecord * find_session(struct GNUNET_ATS_SchedulingHandle *sh, uint32_t session_id, const struct GNUNET_PeerIdentity *peer)
Find the session object corresponding to the given session ID.
Handle to the ATS subsystem for bandwidth/transport scheduling information.
GNUNET_ATS_AddressSuggestionCallback suggest_cb
Callback to invoke on suggestions.
static struct GNUNET_HashCode session_id
struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in
How much bandwidth we are allowed for receiving.
Definition: ats.h:264
struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out
How much bandwidth we are allowed for sending.
Definition: ats.h:259
#define LOG(kind,...)
uint32_t session_id
Internal number this client uses to refer to the address this suggestion is about.
Definition: ats.h:247
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
uint32_t value__
The actual value (bytes per second).
struct GNUNET_ATS_Session * session
Session handle.
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
void * suggest_cb_cls
Closure for suggest_cb.
This is an inbound address and cannot be used to initiate an outbound connection to another peer...
static struct SolverHandle * sh
const char * transport_name
Name of the transport plugin enabling the communication using this address.
Information we track per address, incoming or outgoing.
struct GNUNET_PeerIdentity peer
For which peer is this an address?
#define GNUNET_TIME_UNIT_ZERO
Relative time zero.
struct GNUNET_TIME_Relative backoff
Reconnect backoff delay.
struct GNUNET_HELLO_Address * address
Address data.
#define GNUNET_YES
Definition: gnunet_common.h:77
struct GNUNET_PeerIdentity peer
Which peer is this about? (Technically redundant, as the session_id should be sufficient, but may enable client to find the session faster and/or check consistency).
Definition: ats.h:254
int in_destroy
We&#39;re about to destroy this address record, just ATS does not know this yet.
uint32_t slot
Which slot (index) in the session array does this record correspond to? FIXME: a linear search on thi...
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
static void force_reconnect(struct GNUNET_ATS_SchedulingHandle *sh)
Disconnect from ATS and then reconnect.
Here is the call graph for this function:

◆ error_handler()

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

We encountered an error handling the MQ to the ATS service.

Reconnect.

Parameters
clsthe struct GNUNET_ATS_SchedulingHandle
errordetails about the error

Definition at line 443 of file ats_api_scheduling.c.

References force_reconnect(), GNUNET_ERROR_TYPE_DEBUG, LOG, and GNUNET_ATS_AddressRecord::sh.

Referenced by reconnect().

445 {
446  struct GNUNET_ATS_SchedulingHandle *sh = cls;
447 
449  "ATS connection died (code %d), reconnecting\n",
450  (int)error);
451  force_reconnect(sh);
452 }
Handle to the ATS subsystem for bandwidth/transport scheduling information.
#define LOG(kind,...)
static struct SolverHandle * sh
static void force_reconnect(struct GNUNET_ATS_SchedulingHandle *sh)
Disconnect from ATS and then reconnect.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ send_add_address_message()

static void send_add_address_message ( struct GNUNET_ATS_SchedulingHandle sh,
const struct GNUNET_ATS_AddressRecord ar 
)
static

Generate and transmit the struct AddressAddMessage for the given address record.

Parameters
shthe scheduling handle to use for transmission
arthe address to inform the ATS service about

Definition at line 463 of file ats_api_scheduling.c.

References GNUNET_ATS_AddressRecord::address, GNUNET_HELLO_Address::address, GNUNET_HELLO_Address::address_length, AddressAddMessage::address_length, AddressAddMessage::address_local_info, GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_memcpy, GNUNET_MESSAGE_TYPE_ATS_ADDRESS_ADD, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_NT_UNSPECIFIED, GNUNET_HELLO_Address::local_info, LOG, m, GNUNET_ATS_SchedulingHandle::mq, AddressAddMessage::peer, GNUNET_HELLO_Address::peer, AddressAddMessage::plugin_name_length, pm, GNUNET_ATS_AddressRecord::properties, AddressAddMessage::properties, GNUNET_ATS_PropertiesNBO::scope, GNUNET_ATS_AddressRecord::session, AddressAddMessage::session_id, GNUNET_ATS_AddressRecord::slot, and GNUNET_HELLO_Address::transport_name.

Referenced by GNUNET_ATS_address_add(), and reconnect().

465 {
466  struct GNUNET_MQ_Envelope *ev;
467  struct AddressAddMessage *m;
468  char *pm;
469  size_t namelen;
470  size_t msize;
471 
472  if (NULL == sh->mq)
473  return; /* disconnected, skip for now */
475  namelen = strlen(ar->address->transport_name) + 1;
476  msize = ar->address->address_length + namelen;
478  m->peer = ar->address->peer;
479  m->address_length = htons(ar->address->address_length);
480  m->address_local_info = htonl((uint32_t)ar->address->local_info);
481  m->plugin_name_length = htons(namelen);
482  m->session_id = htonl(ar->slot);
483  m->properties = ar->properties;
484 
486  "Adding address for peer `%s', plugin `%s', session %p slot %u\n",
487  GNUNET_i2s(&ar->address->peer),
488  ar->address->transport_name,
489  ar->session,
490  ar->slot);
491  pm = (char *)&m[1];
492  GNUNET_memcpy(pm,
493  ar->address->address,
494  ar->address->address_length);
495  if (NULL != ar->address->transport_name)
497  ar->address->transport_name,
498  namelen);
499  GNUNET_MQ_send(sh->mq, ev);
500 }
size_t address_length
Number of bytes in address.
uint16_t address_length
Number of bytes in the address that follows this struct.
Definition: ats.h:117
enum GNUNET_HELLO_AddressInfo local_info
Extended information about address.
const void * address
Binary representation of the address (plugin-specific).
struct GNUNET_PeerIdentity peer
Identity of the peer that this address is for.
Definition: ats.h:127
struct GNUNET_ATS_PropertiesNBO properties
Performance properties of the address.
Definition: ats.h:144
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
uint32_t scope
Which network scope does the respective address belong to? This property does not change...
#define LOG(kind,...)
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
struct GNUNET_ATS_Session * session
Session handle.
static struct GNUNET_ARM_MonitorHandle * m
Monitor connection with ARM.
Definition: gnunet-arm.c:99
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct...
Definition: gnunet_mq_lib.h:52
const char * transport_name
Name of the transport plugin enabling the communication using this address.
uint16_t plugin_name_length
Number of bytes in the plugin name that follows this struct.
Definition: ats.h:122
struct GNUNET_ATS_PropertiesNBO properties
Performance data about the address.
struct GNUNET_PeerIdentity peer
For which peer is this an address?
uint32_t address_local_info
Local-only information of the address, see enum GNUNET_HELLO_AddressInfo.
Definition: ats.h:139
struct GNUNET_MQ_Handle * mq
Message queue for sending requests to the ATS service.
struct GNUNET_HELLO_Address * address
Address data.
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:351
#define GNUNET_MESSAGE_TYPE_ATS_ADDRESS_ADD
Type of the &#39;struct AddressUpdateMessage&#39; sent by client to ATS to add a new address.
uint32_t session_id
Internal number this client will henceforth use to refer to this address.
Definition: ats.h:133
uint32_t slot
Which slot (index) in the session array does this record correspond to? FIXME: a linear search on thi...
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
static struct GNUNET_TRANSPORT_PluginMonitor * pm
Handle if we are monitoring plugin session activity.
Category of last resort.
Definition: gnunet_nt_lib.h:39
Scheduling client to ATS service: here is another address you can use.
Definition: ats.h:108
Here is the call graph for this function:
Here is the caller graph for this function: