summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2018-11-07 19:25:35 +0100
committerChristian Grothoff <christian@grothoff.org>2018-11-07 19:25:35 +0100
commit59e432288a4d83a371a9a3efaba2376b44873473 (patch)
treef89957b703d69b55b079138b99a091841f411018 /src
parent4103a2bf2aef3fb3a6059a99e0a941bc35406cfb (diff)
get new libgnunettransportcommunicator to build
Diffstat (limited to 'src')
-rw-r--r--src/include/gnunet_protocols.h14
-rw-r--r--src/include/gnunet_transport_communication_service.h1
-rw-r--r--src/transport/Makefile.am12
-rw-r--r--src/transport/transport.h26
-rw-r--r--src/transport/transport_api2_communication.c161
5 files changed, 144 insertions, 70 deletions
diff --git a/src/include/gnunet_protocols.h b/src/include/gnunet_protocols.h
index 898ad6258..16105d5a8 100644
--- a/src/include/gnunet_protocols.h
+++ b/src/include/gnunet_protocols.h
@@ -3051,14 +3051,24 @@ extern "C"
#define GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE 1206
/**
+ * Response from communicator: will try to create queue.
+ */
+#define GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE_OK 1207
+
+/**
+ * Response from communicator: address bogus, will not try to create queue.
+ */
+#define GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE_FAIL 1208
+
+/**
* @brief transport tells communicator it wants to transmit
*/
-#define GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_MSG 1207
+#define GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_MSG 1209
/**
* @brief communicator tells transports that message was sent
*/
-#define GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_MSG_ACK 1208
+#define GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_MSG_ACK 1210
/**
diff --git a/src/include/gnunet_transport_communication_service.h b/src/include/gnunet_transport_communication_service.h
index d93d5134e..b1a248e51 100644
--- a/src/include/gnunet_transport_communication_service.h
+++ b/src/include/gnunet_transport_communication_service.h
@@ -42,6 +42,7 @@ extern "C"
#endif
#include "gnunet_util_lib.h"
+#include "gnunet_ats_service.h"
/**
* Version number of the transport communication API.
diff --git a/src/transport/Makefile.am b/src/transport/Makefile.am
index d0db6b141..c6c02c6ed 100644
--- a/src/transport/Makefile.am
+++ b/src/transport/Makefile.am
@@ -149,6 +149,7 @@ endif
lib_LTLIBRARIES = \
libgnunettransport.la \
+ libgnunettransportcommunicator.la \
$(TESTING_LIBS)
libgnunettransporttesting_la_SOURCES = \
@@ -187,6 +188,17 @@ libgnunettransport_la_LDFLAGS = \
$(GN_LIB_LDFLAGS) $(WINFLAGS) \
-version-info 4:0:2
+
+
+libgnunettransportcommunicator_la_SOURCES = \
+ transport_api2_communication.c
+libgnunettransportcommunicator_la_LIBADD = \
+ $(top_builddir)/src/util/libgnunetutil.la \
+ $(GN_LIBINTL)
+libgnunettransportcommunicator_la_LDFLAGS = \
+ $(GN_LIB_LDFLAGS) $(WINFLAGS) \
+ -version-info 0:0:0
+
libexec_PROGRAMS = \
$(WLAN_BIN) \
$(WLAN_BIN_DUMMY) \
diff --git a/src/transport/transport.h b/src/transport/transport.h
index e68536bcc..5662d6c4d 100644
--- a/src/transport/transport.h
+++ b/src/transport/transport.h
@@ -769,7 +769,7 @@ struct GNUNET_TRANSPORT_AddQueueMessage
{
/**
- * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_ADD_QUEUE.
+ * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_SETUP.
*/
struct GNUNET_MessageHeader header;
@@ -799,7 +799,7 @@ struct GNUNET_TRANSPORT_DelQueueMessage
{
/**
- * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_DEL_QUEUE.
+ * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_TEARDOWN.
*/
struct GNUNET_MessageHeader header;
@@ -828,9 +828,9 @@ struct GNUNET_TRANSPORT_CreateQueue
struct GNUNET_MessageHeader header;
/**
- * Always zero.
+ * Unique ID for the request.
*/
- uint32_t reserved GNUNET_PACKED;
+ uint32_t request_id GNUNET_PACKED;
/**
* Receiver that can be addressed via the queue.
@@ -842,6 +842,24 @@ struct GNUNET_TRANSPORT_CreateQueue
/**
+ * Transport tells communicator that it wants a new queue.
+ */
+struct GNUNET_TRANSPORT_CreateQueueResponse
+{
+
+ /**
+ * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE_OK or #GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE_FAIL.
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Unique ID for the request.
+ */
+ uint32_t request_id GNUNET_PACKED;
+};
+
+
+/**
* Inform communicator about transport's desire to send a message.
*/
struct GNUNET_TRANSPORT_SendMessageTo
diff --git a/src/transport/transport_api2_communication.c b/src/transport/transport_api2_communication.c
index d446516bd..e5be53150 100644
--- a/src/transport/transport_api2_communication.c
+++ b/src/transport/transport_api2_communication.c
@@ -90,6 +90,11 @@ struct AckPending
struct AckPending *prev;
/**
+ * Communicator this entry belongs to.
+ */
+ struct GNUNET_TRANSPORT_CommunicatorHandle *ch;
+
+ /**
* Which peer is this about?
*/
struct GNUNET_PeerIdentity receiver;
@@ -134,17 +139,17 @@ struct GNUNET_TRANSPORT_CommunicatorHandle
/**
* DLL of messages awaiting transmission confirmation (ack).
*/
- struct AckPending *ac_tail;
+ struct AckPending *ap_tail;
/**
* DLL of queues we offer.
*/
- struct QueueHandle *queue_head;
+ struct GNUNET_TRANSPORT_QueueHandle *queue_head;
/**
* DLL of queues we offer.
*/
- struct QueueHandle *queue_tail;
+ struct GNUNET_TRANSPORT_QueueHandle *queue_tail;
/**
* Our configuration.
@@ -168,6 +173,11 @@ struct GNUNET_TRANSPORT_CommunicatorHandle
void *mq_init_cls;
/**
+ * Queue to talk to the transport service.
+ */
+ struct GNUNET_MQ_Handle *mq;
+
+ /**
* Maximum permissable queue length.
*/
unsigned long long max_queue_length;
@@ -202,6 +212,17 @@ struct GNUNET_TRANSPORT_CommunicatorHandle
*/
struct GNUNET_TRANSPORT_QueueHandle
{
+
+ /**
+ * Kept in a DLL.
+ */
+ struct GNUNET_TRANSPORT_QueueHandle *next;
+
+ /**
+ * Kept in a DLL.
+ */
+ struct GNUNET_TRANSPORT_QueueHandle *prev;
+
/**
* Handle this queue belongs to.
*/
@@ -308,7 +329,7 @@ send_add_address (struct GNUNET_TRANSPORT_AddressIdentifier *ai)
env = GNUNET_MQ_msg_extra (aam,
strlen (ai->address) + 1,
GNUNET_MESSAGE_TYPE_TRANSPORT_ADD_ADDRESS);
- aam->expiration = GNUNET_TIME_relative_to_nbo (ai->expiration);
+ aam->expiration = GNUNET_TIME_relative_hton (ai->expiration);
aam->nt = htonl ((uint32_t) ai->nt);
memcpy (&aam[1],
ai->address,
@@ -334,7 +355,7 @@ send_del_address (struct GNUNET_TRANSPORT_AddressIdentifier *ai)
return;
env = GNUNET_MQ_msg (dam,
GNUNET_MESSAGE_TYPE_TRANSPORT_DEL_ADDRESS);
- dam.aid = htonl (ai->aid);
+ dam->aid = htonl (ai->aid);
GNUNET_MQ_send (ai->ch->mq,
env);
}
@@ -352,18 +373,18 @@ send_add_queue (struct GNUNET_TRANSPORT_QueueHandle *qh)
struct GNUNET_MQ_Envelope *env;
struct GNUNET_TRANSPORT_AddQueueMessage *aqm;
- if (NULL == ai->ch->mq)
+ if (NULL == qh->ch->mq)
return;
env = GNUNET_MQ_msg_extra (aqm,
- strlen (ai->address) + 1,
- GNUNET_MESSAGE_TYPE_TRANSPORT_ADD_QUEUE);
- aqm.receiver = qh->peer;
- aqm.nt = htonl ((uint32_t) qh->nt);
- aqm.qid = htonl (qh->qid);
+ strlen (qh->address) + 1,
+ GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_SETUP);
+ aqm->receiver = qh->peer;
+ aqm->nt = htonl ((uint32_t) qh->nt);
+ aqm->qid = htonl (qh->queue_id);
memcpy (&aqm[1],
- ai->address,
- strlen (ai->address) + 1);
- GNUNET_MQ_send (ai->ch->mq,
+ qh->address,
+ strlen (qh->address) + 1);
+ GNUNET_MQ_send (qh->ch->mq,
env);
}
@@ -380,13 +401,13 @@ send_del_queue (struct GNUNET_TRANSPORT_QueueHandle *qh)
struct GNUNET_MQ_Envelope *env;
struct GNUNET_TRANSPORT_DelQueueMessage *dqm;
- if (NULL == ai->ch->mq)
+ if (NULL == qh->ch->mq)
return;
env = GNUNET_MQ_msg (dqm,
- GNUNET_MESSAGE_TYPE_TRANSPORT_DEL_QUEUE);
- dqm.qid = htonl (qh->qid);
- dqm.receiver = qh->peer;
- GNUNET_MQ_send (ai->ch->mq,
+ GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_TEARDOWN);
+ dqm->qid = htonl (qh->queue_id);
+ dqm->receiver = qh->peer;
+ GNUNET_MQ_send (qh->ch->mq,
env);
}
@@ -444,7 +465,8 @@ error_handler (void *cls,
struct GNUNET_TRANSPORT_CommunicatorHandle *ch = cls;
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "MQ failure, reconnecting to transport service.\n");
+ "MQ failure %d, reconnecting to transport service.\n",
+ error);
disconnect (ch);
/* TODO: maybe do this with exponential backoff/delay */
reconnect (ch);
@@ -460,7 +482,7 @@ error_handler (void *cls,
*/
static void
handle_incoming_ack (void *cls,
- struct GNUNET_TRANSPORT_IncomingMessageAck *incoming_ack)
+ const struct GNUNET_TRANSPORT_IncomingMessageAck *incoming_ack)
{
struct GNUNET_TRANSPORT_CommunicatorHandle *ch = cls;
@@ -470,7 +492,7 @@ handle_incoming_ack (void *cls,
{
if ( (fc->id == incoming_ack->fc_id) &&
(0 == memcmp (&fc->sender,
- incoming_ack->sender,
+ &incoming_ack->sender,
sizeof (struct GNUNET_PeerIdentity))) )
{
GNUNET_CONTAINER_DLL_remove (ch->fc_head,
@@ -499,11 +521,12 @@ handle_incoming_ack (void *cls,
*/
static int
check_create_queue (void *cls,
- struct GNUNET_TRANSPORT_CreateQueue *cq)
+ const struct GNUNET_TRANSPORT_CreateQueue *cq)
{
uint16_t len = ntohs (cq->header.size) - sizeof (*cq);
const char *addr = (const char *) &cq[1];
+ (void) cls;
if ( (0 == len) ||
('\0' != addr[len-1]) )
{
@@ -522,11 +545,13 @@ check_create_queue (void *cls,
*/
static void
handle_create_queue (void *cls,
- struct GNUNET_TRANSPORT_CreateQueue *cq)
+ const struct GNUNET_TRANSPORT_CreateQueue *cq)
{
struct GNUNET_TRANSPORT_CommunicatorHandle *ch = cls;
const char *addr = (const char *) &cq[1];
-
+ struct GNUNET_TRANSPORT_CreateQueueResponse *cqr;
+ struct GNUNET_MQ_Envelope *env;
+
if (GNUNET_OK !=
ch->mq_init (ch->mq_init_cls,
&cq->receiver,
@@ -535,8 +560,17 @@ handle_create_queue (void *cls,
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Address `%s' invalid for this communicator\n",
addr);
- // TODO: do we notify the transport!?
+ env = GNUNET_MQ_msg (cqr,
+ GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE_FAIL);
}
+ else
+ {
+ env = GNUNET_MQ_msg (cqr,
+ GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE_OK);
+ }
+ cqr->request_id = cq->request_id;
+ GNUNET_MQ_send (ch->mq,
+ env);
}
@@ -550,11 +584,12 @@ handle_create_queue (void *cls,
*/
static int
check_send_msg (void *cls,
- struct GNUNET_TRANSPORT_SendMessageTo *smt)
+ const struct GNUNET_TRANSPORT_SendMessageTo *smt)
{
uint16_t len = ntohs (smt->header.size) - sizeof (*smt);
const struct GNUNET_MessageHeader *mh = (const struct GNUNET_MessageHeader *) &smt[1];
+ (void) cls;
if (ntohs (mh->size) != len)
{
GNUNET_break (0);
@@ -584,9 +619,9 @@ send_ack (struct GNUNET_TRANSPORT_CommunicatorHandle *ch,
env = GNUNET_MQ_msg (ack,
GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_MSG_ACK);
- ack->status = htonl (GNUNET_OK);
- ack->mid = ap->mid;
- ack->receiver = ap->receiver;
+ ack->status = htonl (status);
+ ack->mid = mid;
+ ack->receiver = *receiver;
GNUNET_MQ_send (ch->mq,
env);
}
@@ -623,18 +658,18 @@ send_ack_cb (void *cls)
*/
static void
handle_send_msg (void *cls,
- struct GNUNET_TRANSPORT_SendMessageTo *smt)
+ const struct GNUNET_TRANSPORT_SendMessageTo *smt)
{
struct GNUNET_TRANSPORT_CommunicatorHandle *ch = cls;
const struct GNUNET_MessageHeader *mh;
struct GNUNET_MQ_Envelope *env;
struct AckPending *ap;
- struct QueueHandle *qh;
+ struct GNUNET_TRANSPORT_QueueHandle *qh;
for (qh = ch->queue_head;NULL != qh; qh = qh->next)
if ( (qh->queue_id == smt->qid) &&
(0 == memcmp (&qh->peer,
- &smt->target,
+ &smt->receiver,
sizeof (struct GNUNET_PeerIdentity))) )
break;
if (NULL == qh)
@@ -653,7 +688,7 @@ handle_send_msg (void *cls,
ap->receiver = smt->receiver;
ap->mid = smt->mid;
GNUNET_CONTAINER_DLL_insert (ch->ap_head,
- cp->ap_tail,
+ ch->ap_tail,
ap);
mh = (const struct GNUNET_MessageHeader *) &smt[1];
env = GNUNET_MQ_msg_copy (mh);
@@ -679,7 +714,7 @@ reconnect (struct GNUNET_TRANSPORT_CommunicatorHandle *ch)
struct GNUNET_TRANSPORT_IncomingMessageAck,
ch),
GNUNET_MQ_hd_var_size (create_queue,
- GNUNET_MESSAGE_TYPE_TRANSPORT_CREATE_QUEUE,
+ GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE,
struct GNUNET_TRANSPORT_CreateQueue,
ch),
GNUNET_MQ_hd_var_size (send_msg,
@@ -689,7 +724,7 @@ reconnect (struct GNUNET_TRANSPORT_CommunicatorHandle *ch)
GNUNET_MQ_handler_end()
};
- ch->mq = GNUNET_CLIENT_connect (cfg,
+ ch->mq = GNUNET_CLIENT_connect (ch->cfg,
"transport",
handlers,
&error_handler,
@@ -798,32 +833,15 @@ GNUNET_TRANSPORT_communicator_receive (struct GNUNET_TRANSPORT_CommunicatorHandl
struct GNUNET_TRANSPORT_IncomingMessage *im;
uint16_t msize;
- if (NULL == ai->ch->mq)
+ if (NULL == ch->mq)
return GNUNET_SYSERR;
- if (NULL != cb)
- {
- struct FlowControl *fc;
-
- im->fc_on = htonl (GNUNET_YES);
- im->fc_id = ai->ch->fc_gen++;
- fc = GNUNET_new (struct FlowControl);
- fc->sender = *sender;
- fc->id = im->fc_id;
- fc->cb = cb;
- fc->cb_cls = cb_cls;
- GNUNET_CONTAINER_DLL_insert (ch->fc_head,
- ch->fc_tail,
- fc);
- }
- else
+ if ( (NULL == cb) &&
+ (GNUNET_MQ_get_length (ch->mq) >= ch->max_queue_length) )
{
- if (GNUNET_MQ_get_length (ch->mq) >= ch->max_queue_length)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Dropping message: transprot is too slow, queue length %u exceeded\n",
- ch->max_queue_length);
- return GNUNET_NO;
- }
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "Dropping message: transprot is too slow, queue length %llu exceeded\n",
+ ch->max_queue_length);
+ return GNUNET_NO;
}
msize = ntohs (msg->size);
@@ -839,7 +857,22 @@ GNUNET_TRANSPORT_communicator_receive (struct GNUNET_TRANSPORT_CommunicatorHandl
memcpy (&im[1],
msg,
msize);
- GNUNET_MQ_send (ai->ch->mq,
+ if (NULL != cb)
+ {
+ struct FlowControl *fc;
+
+ im->fc_on = htonl (GNUNET_YES);
+ im->fc_id = ch->fc_gen++;
+ fc = GNUNET_new (struct FlowControl);
+ fc->sender = *sender;
+ fc->id = im->fc_id;
+ fc->cb = cb;
+ fc->cb_cls = cb_cls;
+ GNUNET_CONTAINER_DLL_insert (ch->fc_head,
+ ch->fc_tail,
+ fc);
+ }
+ GNUNET_MQ_send (ch->mq,
env);
return GNUNET_OK;
}
@@ -927,9 +960,9 @@ GNUNET_TRANSPORT_communicator_address_add (struct GNUNET_TRANSPORT_CommunicatorH
ai->address = GNUNET_strdup (address);
ai->nt = nt;
ai->expiration = expiration;
- ai->aid = handle->aid_gen++;
- GNUNET_CONTAINER_DLL_insert (handle->ai_head,
- handle->ai_tail,
+ ai->aid = ch->aid_gen++;
+ GNUNET_CONTAINER_DLL_insert (ch->ai_head,
+ ch->ai_tail,
ai);
send_add_address (ai);
return ai;