From: Christian Grothoff Date: Wed, 7 Nov 2018 18:25:35 +0000 (+0100) Subject: get new libgnunettransportcommunicator to build X-Git-Tag: v0.11.0~238^2~14^2~13 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=59e432288a4d83a371a9a3efaba2376b44873473;p=oweals%2Fgnunet.git get new libgnunettransportcommunicator to build --- 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 @@ -3050,15 +3050,25 @@ 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. @@ -841,6 +841,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. */ 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 @@ -89,6 +89,11 @@ struct AckPending */ struct AckPending *prev; + /** + * Communicator this entry belongs to. + */ + struct GNUNET_TRANSPORT_CommunicatorHandle *ch; + /** * Which peer is this about? */ @@ -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. @@ -167,6 +172,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. */ @@ -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;