From 33fe964b466bb0b03a9d176fd1e95e1e24771f2b Mon Sep 17 00:00:00 2001 From: Bart Polot Date: Fri, 15 Nov 2013 15:24:46 +0000 Subject: [PATCH] - add tunnel callback for retransmissions --- src/mesh/gnunet-service-mesh_channel.c | 6 +- src/mesh/gnunet-service-mesh_tunnel.c | 99 +++++++++++++++++++++----- src/mesh/gnunet-service-mesh_tunnel.h | 16 +++-- 3 files changed, 95 insertions(+), 26 deletions(-) diff --git a/src/mesh/gnunet-service-mesh_channel.c b/src/mesh/gnunet-service-mesh_channel.c index beef94f80..1f4e39ec9 100644 --- a/src/mesh/gnunet-service-mesh_channel.c +++ b/src/mesh/gnunet-service-mesh_channel.c @@ -1197,7 +1197,7 @@ GMCH_send_data (struct MeshChannel *ch, } else { - GMT_send_prebuilt_message (&msg->header, ch->t, ch, fwd); + GMT_send_prebuilt_message (&msg->header, ch->t, ch, fwd, NULL, NULL); } } @@ -1569,7 +1569,7 @@ GMCH_handle_local_create (struct MeshClient *c, msgcc.port = msg->port; msgcc.opt = msg->opt; - GMT_send_prebuilt_message (&msgcc.header, t, ch, GNUNET_YES); + GMT_send_prebuilt_message (&msgcc.header, t, ch, GNUNET_YES, NULL, NULL); } return GNUNET_OK; } @@ -1948,7 +1948,7 @@ GMCH_send_prebuilt_message (const struct GNUNET_MessageHeader *message, return; } - GMT_send_prebuilt_message (message, ch->t, ch, fwd); + GMT_send_prebuilt_message (message, ch->t, ch, fwd, NULL, NULL); } diff --git a/src/mesh/gnunet-service-mesh_tunnel.c b/src/mesh/gnunet-service-mesh_tunnel.c index fb8d7ded6..26fe909e7 100644 --- a/src/mesh/gnunet-service-mesh_tunnel.c +++ b/src/mesh/gnunet-service-mesh_tunnel.c @@ -136,21 +136,21 @@ struct MeshTunnel3 /** * Queued messages, to transmit once tunnel gets connected. */ - struct MeshTunnelQueue *tq_head; - struct MeshTunnelQueue *tq_tail; + struct MeshTunnelDelayed *tq_head; + struct MeshTunnelDelayed *tq_tail; }; /** - * Struct used to queue messages in a tunnel. + * Struct used to save messages in a non-ready tunnel to send once connected. */ -struct MeshTunnelQueue +struct MeshTunnelDelayed { /** * DLL */ - struct MeshTunnelQueue *next; - struct MeshTunnelQueue *prev; + struct MeshTunnelDelayed *next; + struct MeshTunnelDelayed *prev; /** * Channel. @@ -164,6 +164,28 @@ struct MeshTunnelQueue }; +/** + * Handle for messages queued but not yet sent. + */ +struct MeshTunnel3Queue +{ + /** + * Connection queue handle, to cancel if necessary. + */ + struct MeshConnectionQueue *q; + + /** + * Continuation to call once sent. + */ + GMT_sent cont; + + /** + * Closure for @c cont. + */ + void *cont_cls; +}; + + /******************************************************************************/ /******************************* GLOBALS ***********************************/ /******************************************************************************/ @@ -533,8 +555,8 @@ tunnel_get_connection (struct MeshTunnel3 *t) static void send_queued_data (struct MeshTunnel3 *t) { - struct MeshTunnelQueue *tq; - struct MeshTunnelQueue *next; + struct MeshTunnelDelayed *tq; + struct MeshTunnelDelayed *next; unsigned int room; LOG (GNUNET_ERROR_TYPE_DEBUG, @@ -580,7 +602,7 @@ queue_data (struct MeshTunnel3 *t, struct MeshChannel *ch, const struct GNUNET_MessageHeader *msg) { - struct MeshTunnelQueue *tq; + struct MeshTunnelDelayed *tq; uint16_t size = ntohs (msg->size); if (MESH_TUNNEL3_READY == t->state) @@ -589,7 +611,7 @@ queue_data (struct MeshTunnel3 *t, return; } - tq = GNUNET_malloc (sizeof (struct MeshTunnelQueue) + size); + tq = GNUNET_malloc (sizeof (struct MeshTunnelDelayed) + size); tq->ch = ch; memcpy (&tq[1], msg, size); @@ -1954,6 +1976,30 @@ GMT_send_connection_acks (struct MeshTunnel3 *t) } +/** + * Callback called when a queued message is sent. + * + * Calculates the average time and connection packet tracking. + * + * @param cls Closure (TunnelQueue handle). + * @param c Connection this message was on. + * @param type Type of message sent. + * @param fwd Was this a FWD going message? + * @param size Size of the message. + */ +static void +message_sent (void *cls, + struct MeshConnection *c, + struct MeshConnectionQueue *q, + uint16_t type, int fwd, size_t size) +{ + struct MeshTunnel3Queue *qt = cls; + + GNUNET_assert (NULL != qt->cont); + qt->cont (qt->cont_cls, GMC_get_tunnel (c), qt, type, size); + GNUNET_free (qt); +} + /** * Sends an already built message on a tunnel, encrypting it and * choosing the best connection. @@ -1962,13 +2008,18 @@ GMT_send_connection_acks (struct MeshTunnel3 *t) * @param t Tunnel on which this message is transmitted. * @param ch Channel on which this message is transmitted. * @param fwd Is this a fwd message on @c ch? + * @param cont Continuation to call once message is really sent. + * @param cont_cls Closure for @c cont. + * + * @return Handle to cancel message. NULL if @c cont is NULL. */ -void +struct MeshTunnel3Queue * GMT_send_prebuilt_message (const struct GNUNET_MessageHeader *message, struct MeshTunnel3 *t, - struct MeshChannel *ch, - int fwd) + struct MeshChannel *ch, int fwd, + GMT_sent cont, void *cont_cls) { + struct MeshTunnel3Queue *q; struct MeshConnection *c; struct GNUNET_MESH_Encrypted *msg; size_t size = ntohs (message->size); @@ -1980,7 +2031,8 @@ GMT_send_prebuilt_message (const struct GNUNET_MessageHeader *message, if (MESH_TUNNEL3_READY != t->state) { queue_data (t, ch, message); - return; + /* FIXME */ + return NULL; } LOG (GNUNET_ERROR_TYPE_DEBUG, "GMT Send on Tunnel %s\n", GMT_2s (t)); @@ -1988,7 +2040,8 @@ GMT_send_prebuilt_message (const struct GNUNET_MessageHeader *message, { LOG (GNUNET_ERROR_TYPE_DEBUG, " loopback!\n"); handle_decrypted (t, message, fwd); - return; + /* FIXME: call cont? */ + return NULL; /* Already delivered, cannot cancel */ } iv = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, UINT32_MAX); @@ -2001,7 +2054,7 @@ GMT_send_prebuilt_message (const struct GNUNET_MessageHeader *message, if (NULL == c) { GNUNET_break (GNUNET_YES == t->destroy); - return; + return NULL; } type = ntohs (message->type); switch (type) @@ -2021,8 +2074,18 @@ GMT_send_prebuilt_message (const struct GNUNET_MessageHeader *message, } fwd = GMC_is_origin (c, GNUNET_YES); - /* FIXME allow channels to cancel */ - GMC_send_prebuilt_message (&msg->header, c, fwd, NULL, NULL); + + if (NULL == cont) + { + (void) GMC_send_prebuilt_message (&msg->header, c, fwd, NULL, NULL); + return NULL; + } + q = GNUNET_new (struct MeshTunnel3Queue); + q->q = GMC_send_prebuilt_message (&msg->header, c, fwd, &message_sent, q); + q->cont = cont; + q->cont_cls = cont_cls; + + return q; } /** diff --git a/src/mesh/gnunet-service-mesh_tunnel.h b/src/mesh/gnunet-service-mesh_tunnel.h index 2c57b9e14..89a86ee6c 100644 --- a/src/mesh/gnunet-service-mesh_tunnel.h +++ b/src/mesh/gnunet-service-mesh_tunnel.h @@ -93,6 +93,9 @@ struct MeshTunnel3; #include "gnunet-service-mesh_connection.h" #include "gnunet-service-mesh_peer.h" +/** + * Handle for messages queued but not yet sent. + */ struct MeshTunnel3Queue; /** @@ -101,13 +104,12 @@ struct MeshTunnel3Queue; * @param cls Closure. * @param t Tunnel this message was on. * @param type Type of message sent. - * @param fwd Was this a FWD going message? * @param size Size of the message. */ typedef void (*GMT_sent) (void *cls, struct MeshTunnel3 *t, struct MeshTunnel3Queue *q, - uint16_t type, int fwd, size_t size); + uint16_t type, size_t size); /******************************************************************************/ @@ -357,12 +359,16 @@ GMT_send_connection_acks (struct MeshTunnel3 *t); * @param t Tunnel on which this message is transmitted. * @param ch Channel on which this message is transmitted. * @param fwd Is this a fwd message on @c ch? + * @param cont Continuation to call once message is really sent. + * @param cls Closure for @c cont. + * + * @return Handle to cancel message. NULL if @c cont is NULL. */ -void +struct MeshTunnel3Queue * GMT_send_prebuilt_message (const struct GNUNET_MessageHeader *message, struct MeshTunnel3 *t, - struct MeshChannel *ch, - int fwd); + struct MeshChannel *ch, int fwd, + GMT_sent cont, void *cls); /** * Is the tunnel directed towards the local peer? -- 2.25.1