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

implementation of the gnunet_transport_communication_service.h API More...

#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_protocols.h"
#include "gnunet_transport_communication_service.h"
#include "gnunet_ats_transport_service.h"
#include "transport.h"
Include dependency graph for transport_api2_communication.c:

Go to the source code of this file.

Data Structures

struct  FlowControl
 Information we track per packet to enable flow control. More...
 
struct  AckPending
 Information we track per message to tell the transport about success or failures. More...
 
struct  GNUNET_TRANSPORT_CommunicatorHandle
 Opaque handle to the transport service for communicators. More...
 
struct  GNUNET_TRANSPORT_QueueHandle
 Handle returned to identify the internal data structure the transport API has created to manage a message queue to a particular peer. More...
 
struct  GNUNET_TRANSPORT_AddressIdentifier
 Internal representation of an address a communicator is currently providing for the transport service. More...
 

Macros

#define DEFAULT_MAX_QUEUE_LENGTH   16
 How many messages do we keep at most in the queue to the transport service before we start to drop (default, can be changed via the configuration file). More...
 

Functions

static void reconnect (struct GNUNET_TRANSPORT_CommunicatorHandle *ch)
 (re)connect our communicator to the transport service More...
 
static void send_add_address (struct GNUNET_TRANSPORT_AddressIdentifier *ai)
 Send message to the transport service about address ai being now available. More...
 
static void send_del_address (struct GNUNET_TRANSPORT_AddressIdentifier *ai)
 Send message to the transport service about address ai being no longer available. More...
 
static void send_add_queue (struct GNUNET_TRANSPORT_QueueHandle *qh)
 Send message to the transport service about queue qh being now available. More...
 
static void send_del_queue (struct GNUNET_TRANSPORT_QueueHandle *qh)
 Send message to the transport service about queue qh being no longer available. More...
 
static void disconnect (struct GNUNET_TRANSPORT_CommunicatorHandle *ch)
 Disconnect from the transport service. More...
 
static void error_handler (void *cls, enum GNUNET_MQ_Error error)
 Function called on MQ errors. More...
 
static void handle_incoming_ack (void *cls, const struct GNUNET_TRANSPORT_IncomingMessageAck *incoming_ack)
 Transport service acknowledged a message we gave it (with flow control enabled). More...
 
static int check_create_queue (void *cls, const struct GNUNET_TRANSPORT_CreateQueue *cq)
 Transport service wants us to create a queue. More...
 
static void handle_create_queue (void *cls, const struct GNUNET_TRANSPORT_CreateQueue *cq)
 Transport service wants us to create a queue. More...
 
static int check_send_msg (void *cls, const struct GNUNET_TRANSPORT_SendMessageTo *smt)
 Transport service wants us to send a message. More...
 
static void send_ack (struct GNUNET_TRANSPORT_CommunicatorHandle *ch, int status, const struct GNUNET_PeerIdentity *receiver, uint64_t mid)
 Notify transport service about status of a message with mid sent to receiver. More...
 
static void send_ack_cb (void *cls)
 Message queue transmission by communicator was successful, notify transport service. More...
 
static void handle_send_msg (void *cls, const struct GNUNET_TRANSPORT_SendMessageTo *smt)
 Transport service wants us to send a message. More...
 
static int check_backchannel_incoming (void *cls, const struct GNUNET_TRANSPORT_CommunicatorBackchannelIncoming *bi)
 Transport service gives us backchannel message. More...
 
static void handle_backchannel_incoming (void *cls, const struct GNUNET_TRANSPORT_CommunicatorBackchannelIncoming *bi)
 Transport service gives us backchannel message. More...
 
struct GNUNET_TRANSPORT_CommunicatorHandleGNUNET_TRANSPORT_communicator_connect (const struct GNUNET_CONFIGURATION_Handle *cfg, const char *config_section, const char *addr_prefix, enum GNUNET_TRANSPORT_CommunicatorCharacteristics cc, GNUNET_TRANSPORT_CommunicatorMqInit mq_init, void *mq_init_cls, GNUNET_TRANSPORT_CommunicatorNotify notify_cb, void *notify_cb_cls)
 Connect to the transport service. More...
 
void GNUNET_TRANSPORT_communicator_disconnect (struct GNUNET_TRANSPORT_CommunicatorHandle *ch)
 Disconnect from the transport service. More...
 
int GNUNET_TRANSPORT_communicator_receive (struct GNUNET_TRANSPORT_CommunicatorHandle *ch, const struct GNUNET_PeerIdentity *sender, const struct GNUNET_MessageHeader *msg, struct GNUNET_TIME_Relative expected_addr_validity, GNUNET_TRANSPORT_MessageCompletedCallback cb, void *cb_cls)
 Notify transport service that the communicator has received a message. More...
 
struct GNUNET_TRANSPORT_QueueHandleGNUNET_TRANSPORT_communicator_mq_add (struct GNUNET_TRANSPORT_CommunicatorHandle *ch, const struct GNUNET_PeerIdentity *peer, const char *address, uint32_t mtu, enum GNUNET_NetworkType nt, enum GNUNET_TRANSPORT_ConnectionStatus cs, struct GNUNET_MQ_Handle *mq)
 Notify transport service that an MQ became available due to an "inbound" connection or because the communicator discovered the presence of another peer. More...
 
void GNUNET_TRANSPORT_communicator_mq_del (struct GNUNET_TRANSPORT_QueueHandle *qh)
 Notify transport service that an MQ became unavailable due to a disconnect or timeout. More...
 
struct GNUNET_TRANSPORT_AddressIdentifierGNUNET_TRANSPORT_communicator_address_add (struct GNUNET_TRANSPORT_CommunicatorHandle *ch, const char *address, enum GNUNET_NetworkType nt, struct GNUNET_TIME_Relative expiration)
 Notify transport service about an address that this communicator provides for this peer. More...
 
void GNUNET_TRANSPORT_communicator_address_remove (struct GNUNET_TRANSPORT_AddressIdentifier *ai)
 Notify transport service about an address that this communicator no longer provides for this peer. More...
 
void GNUNET_TRANSPORT_communicator_notify (struct GNUNET_TRANSPORT_CommunicatorHandle *ch, const struct GNUNET_PeerIdentity *pid, const char *comm, const struct GNUNET_MessageHeader *header)
 The communicator asks the transport service to route a message via a different path to another communicator service at another peer. More...
 

Detailed Description

implementation of the gnunet_transport_communication_service.h API

Author
Christian Grothoff

Definition in file transport_api2_communication.c.

Macro Definition Documentation

◆ DEFAULT_MAX_QUEUE_LENGTH

#define DEFAULT_MAX_QUEUE_LENGTH   16

How many messages do we keep at most in the queue to the transport service before we start to drop (default, can be changed via the configuration file).

Definition at line 39 of file transport_api2_communication.c.

Referenced by GNUNET_TRANSPORT_communicator_connect().

Function Documentation

◆ reconnect()

static void reconnect ( struct GNUNET_TRANSPORT_CommunicatorHandle ch)
static

(re)connect our communicator to the transport service

Parameters
chhandle to reconnect

Definition at line 717 of file transport_api2_communication.c.

References GNUNET_TRANSPORT_CommunicatorHandle::addr_prefix, ai, GNUNET_TRANSPORT_CommunicatorHandle::ai_head, GNUNET_TRANSPORT_CommunicatorHandle::cc, GNUNET_TRANSPORT_CommunicatorHandle::cfg, env, error_handler(), GNUNET_CLIENT_connect(), GNUNET_MESSAGE_TYPE_TRANSPORT_COMMUNICATOR_BACKCHANNEL_INCOMING, GNUNET_MESSAGE_TYPE_TRANSPORT_INCOMING_MSG_ACK, GNUNET_MESSAGE_TYPE_TRANSPORT_NEW_COMMUNICATOR, GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE, GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_MSG, GNUNET_MQ_handler_end, GNUNET_MQ_hd_fixed_size, GNUNET_MQ_hd_var_size, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_TRANSPORT_CommunicatorHandle::mq, GNUNET_TRANSPORT_QueueHandle::next, GNUNET_TRANSPORT_AddressIdentifier::next, GNUNET_TRANSPORT_CommunicatorHandle::queue_head, send_add_address(), send_add_queue(), and send_msg().

Referenced by error_handler(), GNUNET_TRANSPORT_communicator_connect(), and handle_incoming_ack().

718 {
720  {GNUNET_MQ_hd_fixed_size (incoming_ack,
722  struct GNUNET_TRANSPORT_IncomingMessageAck,
723  ch),
724  GNUNET_MQ_hd_var_size (create_queue,
726  struct GNUNET_TRANSPORT_CreateQueue,
727  ch),
730  struct GNUNET_TRANSPORT_SendMessageTo,
731  ch),
733  backchannel_incoming,
735  struct GNUNET_TRANSPORT_CommunicatorBackchannelIncoming,
736  ch),
738  struct GNUNET_TRANSPORT_CommunicatorAvailableMessage *cam;
739  struct GNUNET_MQ_Envelope *env;
740 
741  ch->mq =
742  GNUNET_CLIENT_connect (ch->cfg, "transport", handlers, &error_handler, ch);
743  if (NULL == ch->mq)
744  return;
745  env = GNUNET_MQ_msg_extra (cam,
746  strlen (ch->addr_prefix) + 1,
748  cam->cc = htonl ((uint32_t) ch->cc);
749  memcpy (&cam[1], ch->addr_prefix, strlen (ch->addr_prefix) + 1);
750  GNUNET_MQ_send (ch->mq, env);
751  for (struct GNUNET_TRANSPORT_AddressIdentifier *ai = ch->ai_head; NULL != ai;
752  ai = ai->next)
754  for (struct GNUNET_TRANSPORT_QueueHandle *qh = ch->queue_head; NULL != qh;
755  qh = qh->next)
756  send_add_queue (qh);
757 }
#define GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_MSG
transport tells communicator it wants to transmit
static void send_add_queue(struct GNUNET_TRANSPORT_QueueHandle *qh)
Send message to the transport service about queue qh being now available.
#define GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE
transport tells communicator it wants a queue
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
struct GNUNET_TRANSPORT_QueueHandle * next
Kept in a DLL.
#define GNUNET_MQ_hd_fixed_size(name, code, str, ctx)
struct GNUNET_TRANSPORT_AddressIdentifier * next
Kept in a DLL.
#define GNUNET_MESSAGE_TYPE_TRANSPORT_COMMUNICATOR_BACKCHANNEL_INCOMING
Transport signalling incoming backchannel message to a communicator.
struct GNUNET_TRANSPORT_QueueHandle * queue_head
DLL of queues we offer.
static void error_handler(void *cls, enum GNUNET_MQ_Error error)
Function called on MQ errors.
#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
static struct GNUNET_CADET_MessageHandler handlers[]
Handlers, for diverse services.
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
#define GNUNET_MESSAGE_TYPE_TRANSPORT_INCOMING_MSG_ACK
transport acknowledges processing an incoming message
const char * addr_prefix
Address prefix to use.
Message handler for a specific message type.
static struct GNUNET_TRANSPORT_AddressIdentifier * ai
Handle to the operation that publishes our address.
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
static void send_msg(void *cls)
Function called to notify a client about the socket begin ready to queue more data.
struct GNUNET_MQ_Handle * mq
Queue to talk to the transport service.
struct GNUNET_TRANSPORT_AddressIdentifier * ai_head
Head of DLL of addresses this communicator offers to the transport service.
#define GNUNET_MESSAGE_TYPE_TRANSPORT_NEW_COMMUNICATOR
Message sent to indicate to the transport which address prefix is supported by a communicator.
static void send_add_address(struct GNUNET_TRANSPORT_AddressIdentifier *ai)
Send message to the transport service about address ai being now available.
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
const struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
enum GNUNET_TRANSPORT_CommunicatorCharacteristics cc
Characteristics of the communicator.
Handle returned to identify the internal data structure the transport API has created to manage a mes...
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
Internal representation of an address a communicator is currently providing for the transport service...
Here is the call graph for this function:
Here is the caller graph for this function:

◆ send_add_address()

static void send_add_address ( struct GNUNET_TRANSPORT_AddressIdentifier ai)
static

Send message to the transport service about address ai being now available.

Parameters
aiaddress to add

Definition at line 349 of file transport_api2_communication.c.

References GNUNET_TRANSPORT_AddressIdentifier::address, GNUNET_TRANSPORT_AddressIdentifier::ch, env, GNUNET_TRANSPORT_AddressIdentifier::expiration, GNUNET_MESSAGE_TYPE_TRANSPORT_ADD_ADDRESS, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_TIME_relative_hton(), GNUNET_TRANSPORT_CommunicatorHandle::mq, and GNUNET_TRANSPORT_AddressIdentifier::nt.

Referenced by GNUNET_TRANSPORT_communicator_address_add(), and reconnect().

350 {
351  struct GNUNET_MQ_Envelope *env;
352  struct GNUNET_TRANSPORT_AddAddressMessage *aam;
353 
354  if (NULL == ai->ch->mq)
355  return;
356  env = GNUNET_MQ_msg_extra (aam,
357  strlen (ai->address) + 1,
359  aam->expiration = GNUNET_TIME_relative_hton (ai->expiration);
360  aam->nt = htonl ((uint32_t) ai->nt);
361  memcpy (&aam[1], ai->address, strlen (ai->address) + 1);
362  GNUNET_MQ_send (ai->ch->mq, env);
363 }
struct GNUNET_TRANSPORT_CommunicatorHandle * ch
Transport handle where the address was added.
#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
struct GNUNET_TIME_Relative expiration
When does the address expire? (Expected lifetime of the address.)
struct GNUNET_TIME_RelativeNBO GNUNET_TIME_relative_hton(struct GNUNET_TIME_Relative a)
Convert relative time to network byte order.
Definition: time.c:622
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
struct GNUNET_MQ_Handle * mq
Queue to talk to the transport service.
enum GNUNET_NetworkType nt
Network type for the address.
#define GNUNET_MESSAGE_TYPE_TRANSPORT_ADD_ADDRESS
inform transport to add an address of this peer
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
Here is the call graph for this function:
Here is the caller graph for this function:

◆ send_del_address()

static void send_del_address ( struct GNUNET_TRANSPORT_AddressIdentifier ai)
static

Send message to the transport service about address ai being no longer available.

Parameters
aiaddress to delete

Definition at line 373 of file transport_api2_communication.c.

References GNUNET_TRANSPORT_AddressIdentifier::aid, GNUNET_TRANSPORT_AddressIdentifier::ch, env, GNUNET_MESSAGE_TYPE_TRANSPORT_DEL_ADDRESS, GNUNET_MQ_msg, GNUNET_MQ_send(), and GNUNET_TRANSPORT_CommunicatorHandle::mq.

Referenced by GNUNET_TRANSPORT_communicator_address_remove().

374 {
375  struct GNUNET_MQ_Envelope *env;
376  struct GNUNET_TRANSPORT_DelAddressMessage *dam;
377 
378  if (NULL == ai->ch->mq)
379  return;
381  dam->aid = htonl (ai->aid);
382  GNUNET_MQ_send (ai->ch->mq, env);
383 }
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:67
struct GNUNET_TRANSPORT_CommunicatorHandle * ch
Transport handle where the address was added.
#define GNUNET_MESSAGE_TYPE_TRANSPORT_DEL_ADDRESS
inform transport to delete an address of this peer
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
struct GNUNET_MQ_Handle * mq
Queue to talk to the transport 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:353
uint32_t aid
Internal UUID for the address used in communication with the transport service.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ send_add_queue()

static void send_add_queue ( struct GNUNET_TRANSPORT_QueueHandle qh)
static

Send message to the transport service about queue qh being now available.

Parameters
qhqueue to add

Definition at line 393 of file transport_api2_communication.c.

References GNUNET_TRANSPORT_QueueHandle::address, GNUNET_TRANSPORT_QueueHandle::ch, GNUNET_TRANSPORT_QueueHandle::cs, env, GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_SETUP, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_TRANSPORT_CommunicatorHandle::mq, GNUNET_TRANSPORT_QueueHandle::mtu, GNUNET_TRANSPORT_QueueHandle::nt, GNUNET_TRANSPORT_QueueHandle::peer, and GNUNET_TRANSPORT_QueueHandle::queue_id.

Referenced by GNUNET_TRANSPORT_communicator_mq_add(), and reconnect().

394 {
395  struct GNUNET_MQ_Envelope *env;
396  struct GNUNET_TRANSPORT_AddQueueMessage *aqm;
397 
398  if (NULL == qh->ch->mq)
399  return;
400  env = GNUNET_MQ_msg_extra (aqm,
401  strlen (qh->address) + 1,
403  aqm->qid = htonl (qh->queue_id);
404  aqm->receiver = qh->peer;
405  aqm->nt = htonl ((uint32_t) qh->nt);
406  aqm->mtu = htonl (qh->mtu);
407  aqm->cs = htonl ((uint32_t) qh->cs);
408  memcpy (&aqm[1], qh->address, strlen (qh->address) + 1);
409  GNUNET_MQ_send (qh->ch->mq, env);
410 }
enum GNUNET_NetworkType nt
Network type of the communciation queue.
char * address
Address used by the communication queue.
uint32_t queue_id
ID for this queue when talking to the transport service.
struct GNUNET_TRANSPORT_CommunicatorHandle * ch
Handle this queue belongs to.
enum GNUNET_TRANSPORT_ConnectionStatus cs
Communication status of the queue.
#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
#define GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_SETUP
inform transport that a queue was setup to talk to some peer
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
struct GNUNET_MQ_Handle * mq
Queue to talk to the transport service.
struct GNUNET_PeerIdentity peer
Which peer we can communciate with.
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
uint32_t mtu
Maximum transmission unit for the queue.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ send_del_queue()

static void send_del_queue ( struct GNUNET_TRANSPORT_QueueHandle qh)
static

Send message to the transport service about queue qh being no longer available.

Parameters
qhqueue to delete

Definition at line 420 of file transport_api2_communication.c.

References GNUNET_TRANSPORT_QueueHandle::ch, env, GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_TEARDOWN, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_TRANSPORT_CommunicatorHandle::mq, GNUNET_TRANSPORT_QueueHandle::peer, and GNUNET_TRANSPORT_QueueHandle::queue_id.

Referenced by GNUNET_TRANSPORT_communicator_mq_del().

421 {
422  struct GNUNET_MQ_Envelope *env;
423  struct GNUNET_TRANSPORT_DelQueueMessage *dqm;
424 
425  if (NULL == qh->ch->mq)
426  return;
428  dqm->qid = htonl (qh->queue_id);
429  dqm->receiver = qh->peer;
430  GNUNET_MQ_send (qh->ch->mq, env);
431 }
uint32_t queue_id
ID for this queue when talking to the transport service.
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:67
struct GNUNET_TRANSPORT_CommunicatorHandle * ch
Handle this queue belongs to.
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
struct GNUNET_MQ_Handle * mq
Queue to talk to the transport service.
struct GNUNET_PeerIdentity peer
Which peer we can communciate with.
#define GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_TEARDOWN
inform transport that a queue was torn down
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
Here is the call graph for this function:
Here is the caller graph for this function:

◆ disconnect()

static void disconnect ( struct GNUNET_TRANSPORT_CommunicatorHandle ch)
static

Disconnect from the transport service.

Purges all flow control entries as we will no longer receive the ACKs. Purges the ack pending entries as the transport will no longer expect the confirmations.

Parameters
chservice to disconnect from

Definition at line 443 of file transport_api2_communication.c.

References GNUNET_TRANSPORT_CommunicatorHandle::ap_head, GNUNET_TRANSPORT_CommunicatorHandle::ap_tail, GNUNET_TRANSPORT_CommunicatorHandle::fc_head, GNUNET_TRANSPORT_CommunicatorHandle::fc_tail, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_MQ_destroy(), GNUNET_SYSERR, GNUNET_TRANSPORT_CommunicatorHandle::mq, FlowControl::next, and AckPending::next.

Referenced by error_handler(), GNUNET_TRANSPORT_communicator_disconnect(), and handle_incoming_ack().

444 {
445  struct FlowControl *fcn;
446  struct AckPending *apn;
447 
448  for (struct FlowControl *fc = ch->fc_head; NULL != fc; fc = fcn)
449  {
450  fcn = fc->next;
452  fc->cb (fc->cb_cls, GNUNET_SYSERR);
453  GNUNET_free (fc);
454  }
455  for (struct AckPending *ap = ch->ap_head; NULL != ap; ap = apn)
456  {
457  apn = ap->next;
459  GNUNET_free (ap);
460  }
461  if (NULL == ch->mq)
462  return;
463  GNUNET_MQ_destroy (ch->mq);
464  ch->mq = NULL;
465 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
Information we track per packet to enable flow control.
struct AckPending * ap_tail
DLL of messages awaiting transmission confirmation (ack).
struct FlowControl * fc_head
DLL of messages awaiting flow control confirmation (ack).
Information we track per message to tell the transport about success or failures. ...
#define GNUNET_SYSERR
Definition: gnunet_common.h:79
struct GNUNET_MQ_Handle * mq
Queue to talk to the transport service.
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:824
struct FlowControl * fc_tail
DLL of messages awaiting flow control confirmation (ack).
struct AckPending * next
Kept in a DLL.
struct FlowControl * next
Kept in a DLL.
struct AckPending * ap_head
DLL of messages awaiting transmission confirmation (ack).
#define GNUNET_free(ptr)
Wrapper around free.
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

Function called on MQ errors.

Definition at line 472 of file transport_api2_communication.c.

References ch, disconnect(), GNUNET_ERROR_TYPE_INFO, GNUNET_log, and reconnect().

Referenced by reconnect().

473 {
475 
477  "MQ failure %d, reconnecting to transport service.\n",
478  error);
479  disconnect (ch);
480  /* TODO: maybe do this with exponential backoff/delay */
481  reconnect (ch);
482 }
static struct GNUNET_CADET_Channel * ch
Channel handle.
Definition: gnunet-cadet.c:117
Opaque handle to the transport service for communicators.
static void disconnect(struct GNUNET_TRANSPORT_CommunicatorHandle *ch)
Disconnect from the transport service.
static void reconnect(struct GNUNET_TRANSPORT_CommunicatorHandle *ch)
(re)connect our communicator to the transport service
#define GNUNET_log(kind,...)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ handle_incoming_ack()

static void handle_incoming_ack ( void *  cls,
const struct GNUNET_TRANSPORT_IncomingMessageAck *  incoming_ack 
)
static

Transport service acknowledged a message we gave it (with flow control enabled).

Tell the communicator.

Parameters
clsour struct GNUNET_TRANSPORT_CommunicatorHandle *
incoming_ackthe ack

Definition at line 493 of file transport_api2_communication.c.

References ch, disconnect(), GNUNET_TRANSPORT_CommunicatorHandle::fc_head, GNUNET_TRANSPORT_CommunicatorHandle::fc_tail, GNUNET_break, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_OK, FlowControl::next, and reconnect().

496 {
498 
499  for (struct FlowControl *fc = ch->fc_head; NULL != fc; fc = fc->next)
500  {
501  if ((fc->id == incoming_ack->fc_id) &&
502  (0 == memcmp (&fc->sender,
503  &incoming_ack->sender,
504  sizeof (struct GNUNET_PeerIdentity))))
505  {
507  fc->cb (fc->cb_cls, GNUNET_OK);
508  GNUNET_free (fc);
509  return;
510  }
511  }
512  GNUNET_break (0);
513  disconnect (ch);
514  /* TODO: maybe do this with exponential backoff/delay */
515  reconnect (ch);
516 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
static struct GNUNET_CADET_Channel * ch
Channel handle.
Definition: gnunet-cadet.c:117
#define GNUNET_OK
Named constants for return values.
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...
Information we track per packet to enable flow control.
Opaque handle to the transport service for communicators.
static void disconnect(struct GNUNET_TRANSPORT_CommunicatorHandle *ch)
Disconnect from the transport service.
struct FlowControl * fc_head
DLL of messages awaiting flow control confirmation (ack).
static void reconnect(struct GNUNET_TRANSPORT_CommunicatorHandle *ch)
(re)connect our communicator to the transport service
The identity of the host (wraps the signing key of the peer).
struct FlowControl * fc_tail
DLL of messages awaiting flow control confirmation (ack).
struct FlowControl * next
Kept in a DLL.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:

◆ check_create_queue()

static int check_create_queue ( void *  cls,
const struct GNUNET_TRANSPORT_CreateQueue *  cq 
)
static

Transport service wants us to create a queue.

Check if cq is well-formed.

Parameters
clsour struct GNUNET_TRANSPORT_CommunicatorHandle *
cqthe queue creation request
Returns
GNUNET_OK if smt is well-formed

Definition at line 528 of file transport_api2_communication.c.

References GNUNET_MQ_check_zero_termination, and GNUNET_OK.

529 {
530  (void) cls;
532  return GNUNET_OK;
533 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
#define GNUNET_MQ_check_zero_termination(m)
Insert code for a "check_" function that verifies that a given variable-length message received over ...

◆ handle_create_queue()

static void handle_create_queue ( void *  cls,
const struct GNUNET_TRANSPORT_CreateQueue *  cq 
)
static

Transport service wants us to create a queue.

Tell the communicator.

Parameters
clsour struct GNUNET_TRANSPORT_CommunicatorHandle *
cqthe queue creation request

Definition at line 543 of file transport_api2_communication.c.

References ch, env, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE_FAIL, GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE_OK, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_OK, GNUNET_TRANSPORT_CommunicatorHandle::mq, GNUNET_TRANSPORT_CommunicatorHandle::mq_init, and GNUNET_TRANSPORT_CommunicatorHandle::mq_init_cls.

544 {
546  const char *addr = (const char *) &cq[1];
547  struct GNUNET_TRANSPORT_CreateQueueResponse *cqr;
548  struct GNUNET_MQ_Envelope *env;
549 
550  if (GNUNET_OK != ch->mq_init (ch->mq_init_cls, &cq->receiver, addr))
551  {
553  "Address `%s' invalid for this communicator\n",
554  addr);
556  }
557  else
558  {
560  }
561  cqr->request_id = cq->request_id;
562  GNUNET_MQ_send (ch->mq, env);
563 }
static struct GNUNET_CADET_Channel * ch
Channel handle.
Definition: gnunet-cadet.c:117
#define GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE_OK
Response from communicator: will try to create queue.
#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:78
Opaque handle to the transport service for communicators.
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
struct GNUNET_MQ_Handle * mq
Queue to talk to the transport service.
#define GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE_FAIL
Response from communicator: address bogus, will not try to create queue.
#define GNUNET_log(kind,...)
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
GNUNET_TRANSPORT_CommunicatorMqInit mq_init
Function to call when the transport service wants us to initiate a communication channel with another...
Here is the call graph for this function:

◆ check_send_msg()

static int check_send_msg ( void *  cls,
const struct GNUNET_TRANSPORT_SendMessageTo *  smt 
)
static

Transport service wants us to send a message.

Check if smt is well-formed.

Parameters
clsour struct GNUNET_TRANSPORT_CommunicatorHandle *
smtthe transmission request
Returns
GNUNET_OK if smt is well-formed

Definition at line 575 of file transport_api2_communication.c.

References GNUNET_MQ_check_boxed_message, and GNUNET_OK.

576 {
577  (void) cls;
579  return GNUNET_OK;
580 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
#define GNUNET_MQ_check_boxed_message(m)
Insert code for a "check_" function that verifies that a given variable-length message received over ...

◆ send_ack()

static void send_ack ( struct GNUNET_TRANSPORT_CommunicatorHandle ch,
int  status,
const struct GNUNET_PeerIdentity receiver,
uint64_t  mid 
)
static

Notify transport service about status of a message with mid sent to receiver.

Parameters
chhandle
statusGNUNET_OK on success, GNUNET_SYSERR on failure
receiverwhich peer was the receiver
midmessage that the ack is about

Definition at line 593 of file transport_api2_communication.c.

References env, GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_MSG_ACK, GNUNET_MQ_msg, GNUNET_MQ_send(), and GNUNET_TRANSPORT_CommunicatorHandle::mq.

Referenced by handle_send_msg(), and send_ack_cb().

597 {
598  struct GNUNET_MQ_Envelope *env;
599  struct GNUNET_TRANSPORT_SendMessageToAck *ack;
600 
602  ack->status = htonl (status);
603  ack->mid = mid;
604  ack->receiver = *receiver;
605  GNUNET_MQ_send (ch->mq, env);
606 }
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:67
uint16_t status
See PRISM_STATUS_*-constants.
#define GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_MSG_ACK
communicator tells transports that message was sent
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
struct GNUNET_MQ_Handle * mq
Queue to talk to the transport 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:353
Here is the call graph for this function:
Here is the caller graph for this function:

◆ send_ack_cb()

static void send_ack_cb ( void *  cls)
static

Message queue transmission by communicator was successful, notify transport service.

Parameters
clsan struct AckPending *

Definition at line 616 of file transport_api2_communication.c.

References GNUNET_TRANSPORT_CommunicatorHandle::ap_head, GNUNET_TRANSPORT_CommunicatorHandle::ap_tail, AckPending::ch, ch, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_OK, AckPending::mid, AckPending::receiver, and send_ack().

Referenced by handle_send_msg().

617 {
618  struct AckPending *ap = cls;
620 
622  send_ack (ch, GNUNET_OK, &ap->receiver, ap->mid);
623  GNUNET_free (ap);
624 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
static struct GNUNET_CADET_Channel * ch
Channel handle.
Definition: gnunet-cadet.c:117
struct GNUNET_PeerIdentity receiver
Which peer is this about?
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
Opaque handle to the transport service for communicators.
struct AckPending * ap_tail
DLL of messages awaiting transmission confirmation (ack).
Information we track per message to tell the transport about success or failures. ...
static void send_ack(struct GNUNET_TRANSPORT_CommunicatorHandle *ch, int status, const struct GNUNET_PeerIdentity *receiver, uint64_t mid)
Notify transport service about status of a message with mid sent to receiver.
struct GNUNET_TRANSPORT_CommunicatorHandle * ch
Communicator this entry belongs to.
uint64_t mid
More-or-less unique ID for the message.
struct AckPending * ap_head
DLL of messages awaiting transmission confirmation (ack).
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ handle_send_msg()

static void handle_send_msg ( void *  cls,
const struct GNUNET_TRANSPORT_SendMessageTo *  smt 
)
static

Transport service wants us to send a message.

Tell the communicator.

Parameters
clsour struct GNUNET_TRANSPORT_CommunicatorHandle *
smtthe transmission request

Definition at line 634 of file transport_api2_communication.c.

References GNUNET_TRANSPORT_CommunicatorHandle::ap_head, GNUNET_TRANSPORT_CommunicatorHandle::ap_tail, AckPending::ch, ch, env, GNUNET_CONTAINER_DLL_insert, GNUNET_ERROR_TYPE_INFO, GNUNET_log, GNUNET_MQ_msg_copy(), GNUNET_MQ_notify_sent(), GNUNET_MQ_send(), GNUNET_new, GNUNET_NO, mh, AckPending::mid, GNUNET_TRANSPORT_QueueHandle::mq, GNUNET_TRANSPORT_QueueHandle::next, GNUNET_TRANSPORT_QueueHandle::peer, GNUNET_TRANSPORT_CommunicatorHandle::queue_head, GNUNET_TRANSPORT_QueueHandle::queue_id, AckPending::receiver, send_ack(), and send_ack_cb().

635 {
637  const struct GNUNET_MessageHeader *mh;
638  struct GNUNET_MQ_Envelope *env;
639  struct AckPending *ap;
640  struct GNUNET_TRANSPORT_QueueHandle *qh;
641 
642  for (qh = ch->queue_head; NULL != qh; qh = qh->next)
643  if ((qh->queue_id == smt->qid) &&
644  (0 == memcmp (&qh->peer,
645  &smt->receiver,
646  sizeof (struct GNUNET_PeerIdentity))))
647  break;
648  if (NULL == qh)
649  {
650  /* queue is already gone, tell transport this one failed */
652  "Transmission failed, queue no longer exists.\n");
653  send_ack (ch, GNUNET_NO, &smt->receiver, smt->mid);
654  return;
655  }
656  ap = GNUNET_new (struct AckPending);
657  ap->ch = ch;
658  ap->receiver = smt->receiver;
659  ap->mid = smt->mid;
661  mh = (const struct GNUNET_MessageHeader *) &smt[1];
662  env = GNUNET_MQ_msg_copy (mh);
664  GNUNET_MQ_send (qh->mq, env);
665 }
static struct GNUNET_CADET_Channel * ch
Channel handle.
Definition: gnunet-cadet.c:117
struct GNUNET_MQ_Envelope * GNUNET_MQ_msg_copy(const struct GNUNET_MessageHeader *hdr)
Create a new envelope by copying an existing message.
Definition: mq.c:653
struct GNUNET_PeerIdentity receiver
Which peer is this about?
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
static void send_ack_cb(void *cls)
Message queue transmission by communicator was successful, notify transport service.
uint32_t queue_id
ID for this queue when talking to the transport service.
static struct GNUNET_CADET_Handle * mh
Cadet handle.
Definition: gnunet-cadet.c:92
struct GNUNET_TRANSPORT_QueueHandle * next
Kept in a DLL.
#define GNUNET_NO
Definition: gnunet_common.h:81
#define GNUNET_new(type)
Allocate a struct or union of the given type.
struct GNUNET_TRANSPORT_QueueHandle * queue_head
DLL of queues we offer.
Opaque handle to the transport service for communicators.
void GNUNET_MQ_notify_sent(struct GNUNET_MQ_Envelope *ev, GNUNET_SCHEDULER_TaskCallback cb, void *cb_cls)
Call a callback once the envelope has been sent, that is, sending it can not be canceled anymore...
Definition: mq.c:774
struct AckPending * ap_tail
DLL of messages awaiting transmission confirmation (ack).
Information we track per message to tell the transport about success or failures. ...
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
struct GNUNET_PeerIdentity peer
Which peer we can communciate with.
The identity of the host (wraps the signing key of the peer).
#define GNUNET_log(kind,...)
static void send_ack(struct GNUNET_TRANSPORT_CommunicatorHandle *ch, int status, const struct GNUNET_PeerIdentity *receiver, uint64_t mid)
Notify transport service about status of a message with mid sent to receiver.
struct GNUNET_MQ_Handle * mq
The queue itself.
struct GNUNET_TRANSPORT_CommunicatorHandle * ch
Communicator this entry belongs to.
Header for all communications.
uint64_t mid
More-or-less unique ID for the message.
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
Handle returned to identify the internal data structure the transport API has created to manage a mes...
struct AckPending * ap_head
DLL of messages awaiting transmission confirmation (ack).
Here is the call graph for this function:

◆ check_backchannel_incoming()

static int check_backchannel_incoming ( void *  cls,
const struct GNUNET_TRANSPORT_CommunicatorBackchannelIncoming *  bi 
)
static

Transport service gives us backchannel message.

Check if bi is well-formed.

Parameters
clsour struct GNUNET_TRANSPORT_CommunicatorHandle *
bithe backchannel message
Returns
GNUNET_OK if smt is well-formed

Definition at line 677 of file transport_api2_communication.c.

References GNUNET_MQ_check_boxed_message, and GNUNET_OK.

680 {
681  (void) cls;
683  return GNUNET_OK;
684 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
#define GNUNET_MQ_check_boxed_message(m)
Insert code for a "check_" function that verifies that a given variable-length message received over ...

◆ handle_backchannel_incoming()

static void handle_backchannel_incoming ( void *  cls,
const struct GNUNET_TRANSPORT_CommunicatorBackchannelIncoming *  bi 
)
static

Transport service gives us backchannel message.

Handle it.

Parameters
clsour struct GNUNET_TRANSPORT_CommunicatorHandle *
bithe backchannel message

Definition at line 694 of file transport_api2_communication.c.

References _, ch, GNUNET_ERROR_TYPE_INFO, GNUNET_log, GNUNET_TRANSPORT_CommunicatorHandle::notify_cb, and GNUNET_TRANSPORT_CommunicatorHandle::notify_cb_cls.

697 {
699 
700  if (NULL != ch->notify_cb)
701  ch->notify_cb (ch->notify_cb_cls,
702  &bi->pid,
703  (const struct GNUNET_MessageHeader *) &bi[1]);
704  else
705  GNUNET_log (
707  _ ("Dropped backchanel message: handler not provided by communicator\n"));
708 }
static struct GNUNET_CADET_Channel * ch
Channel handle.
Definition: gnunet-cadet.c:117
GNUNET_TRANSPORT_CommunicatorNotify notify_cb
Function to call when the transport service receives messages for a communicator (i.e.
Opaque handle to the transport service for communicators.
#define _(String)
GNU gettext support macro.
Definition: platform.h:208
#define GNUNET_log(kind,...)
Header for all communications.