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

enable clients to ask TRANSPORT about establishing connections to peers More...

#include "platform.h"
#include "gnunet_transport_application_service.h"
#include "gnunet_transport_core_service.h"
#include "transport.h"
Include dependency graph for transport_api2_application.c:

Go to the source code of this file.

Data Structures

struct  GNUNET_TRANSPORT_ApplicationSuggestHandle
 Handle for TRANSPORT address suggestion requests. More...
 
struct  GNUNET_TRANSPORT_ApplicationHandle
 Handle to the TRANSPORT subsystem for application management. More...
 

Macros

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

Functions

static void reconnect (struct GNUNET_TRANSPORT_ApplicationHandle *ch)
 Re-establish the connection to the TRANSPORT service. More...
 
static void reconnect_task (void *cls)
 Re-establish the connection to the TRANSPORT service. More...
 
static void force_reconnect (struct GNUNET_TRANSPORT_ApplicationHandle *ch)
 Disconnect from TRANSPORT and then reconnect. More...
 
static void error_handler (void *cls, enum GNUNET_MQ_Error error)
 We encountered an error handling the MQ to the TRANSPORT service. More...
 
static int transmit_suggestion (void *cls, const struct GNUNET_PeerIdentity *peer, void *value)
 Transmit request for an address suggestion. More...
 
struct GNUNET_TRANSPORT_ApplicationHandleGNUNET_TRANSPORT_application_init (const struct GNUNET_CONFIGURATION_Handle *cfg)
 Initialize the TRANSPORT application suggestion client handle. More...
 
static int free_sug_handle (void *cls, const struct GNUNET_PeerIdentity *key, void *value)
 Function called to free all struct GNUNET_TRANSPORT_ApplicationSuggestHandles in the map. More...
 
void GNUNET_TRANSPORT_application_done (struct GNUNET_TRANSPORT_ApplicationHandle *ch)
 Client is done with TRANSPORT application management, release resources. More...
 
struct GNUNET_TRANSPORT_ApplicationSuggestHandleGNUNET_TRANSPORT_application_suggest (struct GNUNET_TRANSPORT_ApplicationHandle *ch, const struct GNUNET_PeerIdentity *peer, enum GNUNET_MQ_PriorityPreferences pk, struct GNUNET_BANDWIDTH_Value32NBO bw)
 An application would like TRANSPORT to connect to a peer. More...
 
void GNUNET_TRANSPORT_application_suggest_cancel (struct GNUNET_TRANSPORT_ApplicationSuggestHandle *sh)
 We no longer care about being connected to a peer. More...
 
void GNUNET_TRANSPORT_application_validate (struct GNUNET_TRANSPORT_ApplicationHandle *ch, const struct GNUNET_PeerIdentity *peer, enum GNUNET_NetworkType nt, const char *addr)
 An application (or a communicator) has received a HELLO (or other address data of another peer) and wants TRANSPORT to validate that the address is correct. More...
 

Detailed Description

enable clients to ask TRANSPORT about establishing connections to peers

Author
Christian Grothoff
Matthias Wachs

Definition in file transport_api2_application.c.

Macro Definition Documentation

◆ LOG

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

Function Documentation

◆ reconnect()

static void reconnect ( struct GNUNET_TRANSPORT_ApplicationHandle ch)
static

Re-establish the connection to the TRANSPORT service.

Parameters
chhandle to use to re-connect.

Definition at line 192 of file transport_api2_application.c.

References GNUNET_TRANSPORT_ApplicationHandle::cfg, error_handler(), force_reconnect(), GNUNET_assert, GNUNET_CLIENT_connect(), GNUNET_CONTAINER_multipeermap_iterate(), GNUNET_TRANSPORT_ApplicationHandle::mq, GNUNET_TRANSPORT_ApplicationHandle::sug_requests, and transmit_suggestion().

Referenced by GNUNET_TRANSPORT_application_init(), and reconnect_task().

193 {
194  static const struct GNUNET_MQ_MessageHandler handlers[] = { { NULL, 0, 0 } };
195 
196  GNUNET_assert(NULL == ch->mq);
197  ch->mq =
198  GNUNET_CLIENT_connect(ch->cfg, "transport", handlers, &error_handler, ch);
199  if (NULL == ch->mq)
200  {
201  force_reconnect(ch);
202  return;
203  }
206  ch);
207 }
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
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
struct GNUNET_CONTAINER_MultiPeerMap * sug_requests
Map with the identities of all the peers for which we would like to have address suggestions.
static void force_reconnect(struct GNUNET_TRANSPORT_ApplicationHandle *ch)
Disconnect from TRANSPORT and then reconnect.
static int transmit_suggestion(void *cls, const struct GNUNET_PeerIdentity *peer, void *value)
Transmit request for an address suggestion.
static struct GNUNET_CADET_MessageHandler handlers[]
Handlers, for diverse services.
const struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
struct GNUNET_MQ_Handle * mq
Message queue for sending requests to the TRANSPORT service.
static void error_handler(void *cls, enum GNUNET_MQ_Error error)
We encountered an error handling the MQ to the TRANSPORT service.
Message handler for a specific message type.
int GNUNET_CONTAINER_multipeermap_iterate(struct GNUNET_CONTAINER_MultiPeerMap *map, GNUNET_CONTAINER_PeerMapIterator it, void *it_cls)
Iterate over all entries in the map.
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 TRANSPORT service.

Parameters
clshandle to use to re-connect.

Definition at line 110 of file transport_api2_application.c.

References GNUNET_TRANSPORT_ApplicationSuggestHandle::ch, reconnect(), and GNUNET_TRANSPORT_ApplicationHandle::task.

Referenced by force_reconnect().

111 {
113 
114  ch->task = NULL;
115  reconnect(ch);
116 }
static struct GNUNET_CADET_Channel * ch
Channel handle.
Definition: gnunet-cadet.c:117
struct GNUNET_SCHEDULER_Task * task
Task to trigger reconnect.
static void reconnect(struct GNUNET_TRANSPORT_ApplicationHandle *ch)
Re-establish the connection to the TRANSPORT service.
Handle to the TRANSPORT subsystem for application management.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ force_reconnect()

static void force_reconnect ( struct GNUNET_TRANSPORT_ApplicationHandle ch)
static

Disconnect from TRANSPORT and then reconnect.

Parameters
chour handle

Definition at line 125 of file transport_api2_application.c.

References GNUNET_TRANSPORT_ApplicationHandle::backoff, GNUNET_MQ_destroy(), GNUNET_SCHEDULER_add_delayed(), GNUNET_TIME_STD_BACKOFF, GNUNET_TRANSPORT_ApplicationHandle::mq, reconnect_task(), and GNUNET_TRANSPORT_ApplicationHandle::task.

Referenced by error_handler(), and reconnect().

126 {
127  if (NULL != ch->mq)
128  {
129  GNUNET_MQ_destroy(ch->mq);
130  ch->mq = NULL;
131  }
134 }
struct GNUNET_TIME_Relative backoff
Reconnect backoff delay.
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
static void reconnect_task(void *cls)
Re-establish the connection to the TRANSPORT service.
struct GNUNET_MQ_Handle * mq
Message queue for sending requests to the TRANSPORT service.
#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_SCHEDULER_Task * task
Task to trigger reconnect.
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:

◆ error_handler()

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

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

Reconnect.

Parameters
clsthe struct GNUNET_TRANSPORT_ApplicationHandle
errordetails about the error

Definition at line 145 of file transport_api2_application.c.

References GNUNET_TRANSPORT_ApplicationSuggestHandle::ch, force_reconnect(), GNUNET_ERROR_TYPE_DEBUG, and LOG.

Referenced by reconnect().

146 {
148 
150  "TRANSPORT connection died (code %d), reconnecting\n",
151  (int)error);
152  force_reconnect(ch);
153 }
static struct GNUNET_CADET_Channel * ch
Channel handle.
Definition: gnunet-cadet.c:117
#define LOG(kind,...)
static void force_reconnect(struct GNUNET_TRANSPORT_ApplicationHandle *ch)
Disconnect from TRANSPORT and then reconnect.
Handle to the TRANSPORT subsystem for application management.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ transmit_suggestion()

static int transmit_suggestion ( void *  cls,
const struct GNUNET_PeerIdentity peer,
void *  value 
)
static

Transmit request for an address suggestion.

Parameters
clsthe struct GNUNET_TRANSPORT_ApplicationHandle
peerpeer to ask for an address suggestion for
valuethe struct GNUNET_TRANSPORT_SuggestHandle
Returns
GNUNET_OK (continue to iterate), GNUNET_SYSERR on failure (message queue no longer exists)

Definition at line 166 of file transport_api2_application.c.

References GNUNET_TRANSPORT_ApplicationSuggestHandle::bw, ExpressPreferenceMessage::bw, GNUNET_TRANSPORT_ApplicationSuggestHandle::ch, GNUNET_MESSAGE_TYPE_TRANSPORT_SUGGEST, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_OK, GNUNET_SYSERR, m, GNUNET_TRANSPORT_ApplicationHandle::mq, peer, ExpressPreferenceMessage::peer, GNUNET_TRANSPORT_ApplicationSuggestHandle::pk, ExpressPreferenceMessage::pk, sh, and value.

Referenced by GNUNET_TRANSPORT_application_suggest(), and reconnect().

169 {
172  struct GNUNET_MQ_Envelope *ev;
173  struct ExpressPreferenceMessage *m;
174 
175  if (NULL == ch->mq)
176  return GNUNET_SYSERR;
178  m->pk = htonl((uint32_t)sh->pk);
179  m->bw = sh->bw;
180  m->peer = *peer;
181  GNUNET_MQ_send(ch->mq, ev);
182  return GNUNET_OK;
183 }
static struct GNUNET_CADET_Channel * ch
Channel handle.
Definition: gnunet-cadet.c:117
Handle for TRANSPORT address suggestion requests.
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:67
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
enum GNUNET_MQ_PriorityPreferences pk
What preference is being expressed?
uint32_t pk
What type of performance preference does the client have? A enum GNUNET_MQ_PreferenceKind in NBO...
Definition: ats2.h:121
static struct GNUNET_ARM_MonitorHandle * m
Monitor connection with ARM.
Definition: gnunet-arm.c:99
static char * value
Value of the record to add/remove.
struct GNUNET_MQ_Handle * mq
Message queue for sending requests to the TRANSPORT service.
static struct SolverHandle * sh
struct GNUNET_TESTBED_Peer * peer
The peer associated with this model.
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
#define GNUNET_MESSAGE_TYPE_TRANSPORT_SUGGEST
Type of the 'struct ExpressPreferenceMessage' send by clients to TRANSPORT to establish bandwidth pre...
struct GNUNET_BANDWIDTH_Value32NBO bw
How much bandwidth does the client expect?
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
struct GNUNET_BANDWIDTH_Value32NBO bw
How much bandwidth in bytes/second does the application expect?
Definition: ats2.h:131
Application client to ATS service: we would like to have address suggestions for this peer...
Definition: ats2.h:109
Handle to the TRANSPORT subsystem for application management.
struct GNUNET_PeerIdentity peer
Peer to get address suggestions for.
Definition: ats2.h:126
Here is the call graph for this function:
Here is the caller graph for this function:

◆ free_sug_handle()

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

Function called to free all struct GNUNET_TRANSPORT_ApplicationSuggestHandles in the map.

Parameters
clsNULL
keythe key
valuethe value to free
Returns
GNUNET_OK (continue to iterate)

Definition at line 240 of file transport_api2_application.c.

References GNUNET_free, GNUNET_OK, and value.

Referenced by GNUNET_TRANSPORT_application_done().

241 {
243 
244  GNUNET_free(cur);
245  return GNUNET_OK;
246 }
Handle for TRANSPORT address suggestion requests.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
static char * value
Value of the record to add/remove.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the caller graph for this function: